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.
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:teste 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ável | Obrigatória | Descrição |
|---|---|---|
UNIPILE_API_KEY | Sim | Sua chave de API Unipile (do painel Unipile) |
UNIPILE_DSN | Sim | Seu 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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
text | string | sim | — | Corpo do post, máximo de 3000 caracteres |
media | string[] | não | [] | Caminhos de arquivos locais ou URLs (jpg, png, gif, webp, mp4) |
mentions | string[] | não | [] | Nomes de empresas para @mencionar (resolvidos automaticamente) |
dry_run | boolean | não | true | Pré-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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
post_url | string | sim | — | URL do post do LinkedIn ou URN bruto (urn:li:activity:... ou urn:li:ugcPost:...) |
text | string | sim | — | Texto do comentário |
dry_run | boolean | não | true | Pré-visualizar sem publicar |
linkedin_react
Reage a um post do LinkedIn. Esta ação é imediata — não há dry_run.
| Parâmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
post_url | string | sim | — | URL do post do LinkedIn ou URN bruto |
reaction_type | string | nã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:
- A IA chama a ferramenta com
dry_run: true(o padrão) - Você vê a pré-visualização: texto final, contagem de caracteres, validação de mídia, menções resolvidas, avisos
- Você confirma ou pede alterações
- A IA chama novamente com
dry_run: false - 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
mediada pré-visualização com"valid": falsee 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
- Cadastre-se em uma conta Unipile
- No painel, conecte sua conta do LinkedIn
- Copie sua chave de API e DSN nas configurações do painel
- 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.