LinkedIn API MCP
Servidor MCP do LinkedIn que lê perfis, empresas, vagas, publicações e mensagens por meio da sua própria sessão de navegador logada, com limitação de taxa aplicada e proteção contra injeção de prompts.
Documentação
linkedin-api-mcp
Aviso: Este é um projeto independente e comunitário. Não possui afiliação, autorização, endosso ou patrocínio da LinkedIn Corporation ou da Microsoft. "LinkedIn" é uma marca registrada da LinkedIn Corporation e é usada aqui apenas de forma descritiva para identificar o serviço de terceiros com o qual este software interage.
Um servidor MCP para LinkedIn. Ele controla um navegador real e headless (patchright, um fork indetectável do Playwright) usando o seu próprio cookie de sessão do LinkedIn já logado. Não há API de scraping, nem preenchimento de credenciais, nem contorno do login do LinkedIn. Seu agente obtém 12 ferramentas de leitura (perfis, empresas, empregos, postagens, sua caixa de entrada) e duas ferramentas de escrita, mantidas deliberadamente separadas: enviar mensagem e enviar solicitação de conexão. Cada ação passa por uma única sessão de navegador, uma de cada vez, com ritmo controlado por limites que você define. Veja Segurança abaixo.
Documentação: mcp.johannsenlum.com/linkedin
Instalação (um clique)
Existem deeplinks apenas para Cursor e VS Code; nenhum outro cliente possui um formato documentado de link de instalação. Eles preenchem o comando abaixo; nada mais precisa ser preenchido, pois o cookie fica no chaveiro do seu sistema operacional, não em uma variável de ambiente.
Todos os clientes
| Cliente | Deeplink? |
|---|---|
| Claude Code | não, comando de uma linha |
| Claude Desktop | não |
| Cursor | sim, acima |
| VS Code | sim, acima |
| Codex CLI | não |
| Zed | não |
| Windsurf | não (Windsurf só resolve servidores do próprio registro) |
Claude Code
claude mcp add linkedin -- uvx linkedin-api-mcp
Claude Desktop: claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Não existe instalação com um clique para o Claude Desktop (ele instala pacotes .mcpb, não deeplinks). Copie este JSON via Configurações → Desenvolvedor → Editar Configuração:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
Cursor: ~/.cursor/mcp.json
Alternativa ao botão acima, ou se você preferir colar diretamente:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
VS Code: .vscode/mcp.json
Alternativa ao botão acima, ou se você preferir colar diretamente. Observe que o VS Code usa uma chave servers, não mcpServers:
{
"servers": {
"linkedin": {
"type": "stdio",
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
Codex CLI: ~/.codex/config.toml
[mcp_servers.linkedin]
command = "uvx"
args = ["linkedin-api-mcp"]
O schema de configuração do Codex CLI mudou entre versões e este bloco não foi verificado de forma independente contra uma instalação ativa. Se não carregar, o caminho confiável é executar uvx linkedin-api-mcp você mesmo e apontar o Codex para o que seu atual config de servidor stdio espera.
Zed: settings.json
Não existe deeplink para o Zed. Adicione isso em context_servers nas suas configurações do Zed:
{
"context_servers": {
"linkedin": {
"source": "custom",
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
Windsurf: ~/.codeium/windsurf/mcp_config.json
Não existe deeplink para o Windsurf. Ele só resolve servidores do próprio registro, então isso precisa ser colado manualmente via Configurações do Windsurf → Servidores MCP → Editar configuração bruta:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
Se você preferir não depender do chaveiro em um determinado cliente (um ambiente com sandbox ou CI), passe o cookie diretamente em vez de executar auth:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"],
"env": { "LINKEDIN_COOKIE": "your-li_at-value" }
}
}
}
Em qualquer lugar que fizer isso, trate esse arquivo de configuração com o mesmo cuidado que daria ao cookie: não o envie para um repositório e restrinja as permissões dele.
Obtendo seu cookie de sessão
O LinkedIn não oferece uma chave de API para esse tipo de acesso, então o servidor usa o mesmo cookie de sessão que seu navegador já mantém.
- Uma vez: instale a versão do Chromium que o servidor controla.
uvx --from linkedin-api-mcp patchright install chromium - Faça login em linkedin.com em um navegador comum.
- Abra o DevTools (
F12ouCmd+Opt+I) → Application → Cookies →https://www.linkedin.com. - Encontre a linha chamada
li_ate copie o Valor dela.
[!WARNING] Este cookie é o seu login do LinkedIn. Qualquer pessoa que o tenha pode agir como você: ler suas mensagens, enviar mensagens para seus contatos, ver tudo que sua conta pode ver, sem precisar da sua senha. Ele sobrevive a uma troca de senha e não pode ser revogado em nenhuma lista de sessões que o LinkedIn mostra. Nunca cole em um chat, commit, issue, captura de tela ou em qualquer outro lugar que não seja
linkedin-api-mcp auth.
- Armazene-o:
Cole o valor quando solicitado; o terminal não o ecoará. Por padrão, ele é armazenado no chaveiro do seu sistema operacional (Keychain, Gerenciador de Credenciais do Windows, ou Secret Service no Linux), nunca gravado em um arquivo de configuração.uvx linkedin-api-mcp auth - Verifique se o LinkedIn aceita antes de conectar um cliente:
Imprime a configuração redigida do servidor e confirma que a sessão está ativa. Ele nunca imprime o cookie em si.uvx linkedin-api-mcp --test
Ferramentas
| Ferramenta | Descrição |
|---|---|
get_profile | Busca o perfil de um membro (cabeçalho, sobre, experiência, formação, habilidades) por URL ou identificador público. |
get_my_profile | Busca o perfil da conta na qual este servidor está logado. |
search_people | Pesquisa membros do LinkedIn por palavra-chave. |
get_inbox | Lista prévias recentes de threads de mensagens. |
get_conversation | Busca o histórico completo de mensagens de um thread, por ID. |
search_conversations | Pesquisa seus threads de mensagens por participante ou palavra-chave. |
send_message ✏️ | Escrita. Envia uma mensagem real a outro membro usando sua conta. |
connect ✏️ | Escrita. Envia um convite de conexão real a outro membro usando sua conta. |
get_company | Busca uma página de empresa (sobre, tamanho, setor, postagens recentes). |
search_companies | Pesquisa empresas do LinkedIn por palavra-chave. |
search_jobs | Pesquisa vagas de emprego por palavra-chave e localização opcional. |
get_job | Busca uma vaga de emprego completa. |
search_posts | Pesquisa postagens do feed do LinkedIn por palavra-chave. |
linkedin_status | Verifica validade da sessão e uso atual em relação aos limites de taxa em Segurança. |
14 ferramentas: 12 de leitura, 2 de escrita. send_message e connect são as únicas que alteram algo, e ambas ficam visíveis para outra pessoa real no momento em que são executadas: não há rascunho, prévia ou etapa de desfazer. Tudo o mais apenas lê o que sua conta já pode ver. Coberto por 68 testes.
O que é verificado e o que não é
Este é um projeto recente. Em vez de afirmar que tudo funciona, aqui está o que foi realmente verificado em uma conta ativa e o que não foi.
| Status | Ferramenta / comportamento | Observação |
|---|---|---|
| Verificado ao vivo | get_my_profile, get_profile, search_people, get_company, search_companies, search_jobs, search_posts, get_inbox | Chamados contra uma conta real e retornaram dados reais. |
| Verificado ao vivo | send_message ✏️ | Uma mensagem real foi enviada e o thread foi lido de volta para confirmar a entrega. |
| Ainda não verificado | connect ✏️, get_conversation, search_conversations, get_job, linkedin_status | Implementados e testados, mas ainda não exercitados em uma conta ativa manualmente. |
| Lacuna conhecida | conversation_id de get_inbox | Retorna null. O LinkedIn vincula linhas da caixa de entrada a objetos JS em memória, não a URLs, então não há ID para ler da página. |
| Lacuna conhecida | Contagens de reações e comentários em search_posts | Retornam null. |
| Lacuna conhecida | experience e education em get_profile | O LinkedIn carrega essas seções apenas ao rolar; atualmente retornam vazios. |
Segurança
-
Uma fila de ações serializada. Cada chamada de ferramenta, incluindo
linkedin_status, passa pela mesma fila antes de tocar o navegador: uma ação por vez, nunca em paralelo. -
Um intervalo mínimo e um teto por hora, ambos aplicados, não apenas prometidos:
Configuração Padrão Variável de ambiente Efeito Intervalo mínimo entre ações 2 segundos LINKEDIN_MIN_INTERVALChamadas são espaçadas em relação à anterior, não executadas uma atrás da outra. Ações por hora rolante 120 LINKEDIN_MAX_PER_HOURQuando atingido, chamadas adicionais falham imediatamente com um erro rate_limited, em vez de entrar na fila ou dormir.O teto é local a este servidor: existe para impedir que um agente em loop gere uma rajada de tráfego no LinkedIn, não porque o LinkedIn nos informou esses números. Reduzi-los é sempre seguro; aumentá-los é você decidir que está disposto a aceitar mais risco do que os padrões assumem.
-
Proteção contra injeção de prompt em todo texto livre extraído. Qualquer coisa lida de uma página do LinkedIn (um cabeçalho, uma seção "sobre", uma mensagem) passa pelo seu agente como dado. Ele é isolado antes de seu agente ver, para que texto em um perfil ou mensagem não possa se passar por instrução.
-
O cookie fica no chaveiro do seu sistema operacional, não em um arquivo de configuração, por padrão. Veja Obtendo seu cookie de sessão.
-
send_messagecomprova a entrega antes de reportar sucesso. Ele verifica a conversa até que o texto enviado realmente apareça, e levantasend_unconfirmedem vez de um falso{"sent": true}se não aparecer.
Outras variáveis de ambiente que o servidor lê: LINKEDIN_COOKIE (substitui o
chaveiro), LINKEDIN_HEADLESS (padrão true), LINKEDIN_NAV_TIMEOUT_MS (padrão
30000).
Perguntas frequentes
É seguro usar? Serei banido?
Esta ferramenta controla uma sessão de navegador real; não explora APIs não documentadas nem ignora autenticação. O Contrato de Usuário do LinkedIn proíbe acesso automatizado, e contas que usam ferramentas automatizadas podem ser restringidas ou banidas. Use por sua conta e risco; não há garantia de segurança da conta. Se encontrar qualquer problema, me avise nas Discussões.
E se meus agentes executarem muitas ações?
Chamadas de ferramentas são executadas sequencialmente por meio de uma fila. Você é responsável pelo volume de automação que executa; use com moderação e oriente seus agentes de forma responsável.
Licença
MIT © 2026 Johannsen Lum.
Use, altere, redistribua, construa algo comercial em cima dele: a única condição é que você mantenha o aviso de direitos autorais e o texto da licença. Ele é fornecido sem garantia de qualquer tipo.
Contribuições são aceitas sob a mesma licença.
Contribuindo
Issues e pull requests são bem-vindos: github.com/JohannsenLum/linkedin-api-mcp. As alterações são registradas em CHANGELOG.md.
Executando os testes
Instale as dependências de desenvolvimento e execute o pytest a partir da raiz do repositório:
pip install -e ".[dev]"
python -m pytest -q
A suíte de testes padrão não precisa de Chromium, de uma conta do LinkedIn,
LINKEDIN_COOKIE ou acesso à rede. As interações com o navegador são substituídas pelos
test doubles em tests/fakes.py, que analisam HTML pré-definido e expõem
a pequena superfície do Playwright usada pelas ferramentas. Para um exemplo de teste de análise, veja
tests/test_people_parsing.py.
Este é um projeto independente, não afiliado à LinkedIn Corporation. Consulte o aviso de isenção no topo deste documento.