mcp-linkedin

Publique posts, comentários e reações no LinkedIn via Unipile — dry_run por padrão para segurança.

Documentação

mcp-linkedin

Um servidor MCP que permite que assistentes de IA publiquem no LinkedIn em seu nome.

mcp-linkedin MCP server

O que faz

Este é um servidor Model Context Protocol (MCP) que encapsula a API Unipile para dar a assistentes de IA (Claude Code, Claude Desktop ou qualquer cliente compatível com MCP) a capacidade de criar posts, comentários e reações no LinkedIn. A IA escreve o conteúdo; esta ferramenta cuida da publicação. Todas as ações de publicação usam o modo de pré-visualização por padrão — nada é publicado sem confirmação explícita.

Recursos

  • 3 ferramentas: publicar, comentar, reagir
  • Execução de teste por padrão (pré-visualização antes de publicar)
  • Curtidas automáticas em posts imediatamente após a publicação
  • Anexos de mídia (arquivos locais ou URLs — imagens e vídeo)
  • @Menções de empresas (resolvidas automaticamente via Unipile)
  • Funciona com Claude Code, Claude Desktop e qualquer cliente MCP

Pré-requisitos

  • Node.js 18+ — usa módulos ES, node:test e await de nível superior
  • Conta Unipile — Unipile é o serviço que conecta à API do LinkedIn. Cadastre-se, conecte sua conta do LinkedIn e obtenha sua chave de API e DSN no painel.

Instalação

git clone https://github.com/timkulbaev/mcp-linkedin.git
cd mcp-linkedin
npm install

Configuração

Claude Code

Adicione ao ~/.claude/mcp.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-linkedin/index.js"],
      "env": {
        "UNIPILE_API_KEY": "your-unipile-api-key",
        "UNIPILE_DSN": "apiXX.unipile.com:XXXXX"
      }
    }
  }
}

Claude Desktop

Adicione ao ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "linkedin": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-linkedin/index.js"],
      "env": {
        "UNIPILE_API_KEY": "your-unipile-api-key",
        "UNIPILE_DSN": "apiXX.unipile.com:XXXXX"
      }
    }
  }
}

Reinicie o Claude Code ou o Claude Desktop após editar a configuração.

Variáveis de ambiente

VariávelObrigatóriaDescrição
UNIPILE_API_KEYSimSua chave de API Unipile (do painel Unipile)
UNIPILE_DSNSimSeu DSN Unipile (ex.: api16.unipile.com:14648)

Elas são passadas via configuração MCP, não por um arquivo .env. O servidor as lê de process.env na inicialização.

Ferramentas

linkedin_publish

Cria um post original no LinkedIn.

dry_run tem como padrão true. Chame com dry_run: true primeiro para obter uma pré-visualização e depois chame novamente com dry_run: false para publicar de fato.

ParâmetroTipoObrigatórioPadrãoDescrição
textstringsim—Corpo do post, máximo de 3000 caracteres
mediastring[]não[]Caminhos de arquivos locais ou URLs (jpg, png, gif, webp, mp4)
mentionsstring[]não[]Nomes de empresas para @mencionar (resolvidos automaticamente)
dry_runbooleannãotruePré-visualizar sem publicar

Resposta da pré-visualização (dry_run: true):

{
  "status": "preview",
  "post_text": "Hello LinkedIn!",
  "character_count": 16,
  "character_limit": 3000,
  "media": [],
  "mentions": [],
  "warnings": [],
  "ready_to_publish": true
}

Resposta da publicação (dry_run: false):

{
  "status": "published",
  "post_id": "7437514186450104320",
  "post_text": "Hello LinkedIn!",
  "posted_at": "2026-03-11T15:06:04.849Z",
  "auto_like": "liked"
}

Após publicar, salve o post_id e construa a URL do post:

https://www.linkedin.com/feed/update/urn:li:activity:{post_id}/

linkedin_comment

Publica um comentário em um post existente no LinkedIn.

dry_run tem como padrão true.

ParâmetroTipoObrigatórioPadrãoDescrição
post_urlstringsim—URL do post do LinkedIn ou URN bruto (urn:li:activity:... ou urn:li:ugcPost:...)
textstringsim—Texto do comentário
dry_runbooleannãotruePré-visualizar sem publicar

linkedin_react

Reage a um post do LinkedIn. Esta ação é imediata — não há dry_run.

ParâmetroTipoObrigatórioPadrãoDescrição
post_urlstringsim—URL do post do LinkedIn ou URN bruto
reaction_typestringnão"like"Um de: like, celebrate, support, love, insightful, funny

Como funciona

                    ┌──────────────────────────────────┐
                    │           mcp-linkedin            │
AI Assistant  ──►   │                                  │
(via MCP stdio)     │  Posts/Comments/Reactions  ──►  Unipile API  ──►  LinkedIn
                    └──────────────────────────────────┘
  • O assistente de IA chama ferramentas via protocolo JSON-RPC do MCP sobre stdio
  • Chama a API Unipile, que gerencia o OAuth do LinkedIn — sem necessidade de gerenciamento de tokens

Fluxo seguro de publicação

O padrão dry_run existe para evitar publicações acidentais. O fluxo pretendido:

  1. A IA chama a ferramenta com dry_run: true (o padrão)
  2. Você vê a pré-visualização: texto final, contagem de caracteres, validação de mídia, menções resolvidas, avisos
  3. Você confirma ou pede alterações
  4. A IA chama novamente com dry_run: false
  5. O post vai ao ar

dry_run é true por padrão. A IA não pode publicar sem defini-lo explicitamente como false, o que exige passar pela etapa de pré-visualização primeiro.

Tratamento de mídia

  • Passe caminhos de arquivos locais (/path/to/image.jpg) ou URLs (https://example.com/img.png)
  • URLs são baixadas para /tmp/mcp-linkedin-media/ e limpas após a publicação (com sucesso ou falha)
  • Formatos suportados: jpg, jpeg, png, gif, webp (imagens), mp4 (vídeo)
  • Cada arquivo é validado antes do upload: deve existir, não estar vazio e ser de um tipo suportado
  • Arquivos com falha aparecem no array media da pré-visualização com "valid": false e uma mensagem de erro

@Menções de empresas

  • Passe nomes de empresas como strings: mentions: ["Microsoft", "OpenAI"]
  • O servidor transforma cada nome em slug e o pesquisa via busca de empresas do LinkedIn da Unipile
  • Empresas resolvidas são injetadas como placeholders {{0}}, {{1}} no texto do post — o LinkedIn renderiza como @menções clicáveis
  • Se um nome de empresa aparecer no texto do post, ele é substituído no local; se não, o placeholder é anexado
  • Nomes não resolvidos aparecem como avisos na pré-visualização. O post ainda pode ser publicado sem eles.

Testes

npm test       # 28 unit tests, zero extra dependencies (Node.js built-in test runner)
npm run lint   # Biome linter

Estrutura do projeto

mcp-linkedin/
  index.js                    Entry point (stdio transport)
  package.json
  src/
    server.js                 MCP server and tool registration
    unipile-client.js         Unipile API wrapper (posts, comments, reactions)
    media-handler.js          URL download and file validation
    tools/
      publish.js              linkedin_publish handler
      comment.js              linkedin_comment handler
      react.js                linkedin_react handler
  tests/
    unit.test.js              28 unit tests

Como obter uma conta Unipile

  1. Cadastre-se em uma conta Unipile
  2. No painel, conecte sua conta do LinkedIn
  3. Copie sua chave de API e DSN nas configurações do painel
  4. Cole-os na configuração MCP (veja Configuração acima)

A Unipile tem um plano gratuito que cobre o uso básico.

Licença

MIT — veja LICENSE.

Créditos

Desenvolvido por Timur Kulbaev. Usa o Model Context Protocol da Anthropic e a API Unipile.