LinkedIn Actions MCP
This server enables LinkedIn publishing, job applications, and service-request workflows through MCP with previews and explicit confirmation.
Publish text or image posts to LinkedIn via the official API; previews by default, publishes with
confirmed=true, needingLINKEDIN_ACCESS_TOKENandLINKEDIN_AUTHOR_URN.Apply to LinkedIn jobs in a local persistent browser, attach a resume, and submit only with
confirmed=true; incomplete forms return a blocker and are not marked sent.List and read LinkedIn service requests as read-only operations.
Submit service proposals with a preview by default; sends only when
confirmed=true.Run locally over
stdio(or Streamable HTTP on a private tailnet address at/mcp), keeping browser profile and secrets local.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LinkedIn Actions MCPpublish a text post on LinkedIn saying we're hiring, confirmed"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LinkedIn Actions MCP
Servidor MCP local da CodeSpec focado somente nas ações que faltam ao MCP de leitura:
publicar posts de texto ou imagem pela API oficial do LinkedIn;
preparar e enviar candidaturas simplificadas usando uma sessão local do navegador;
listar, ler e responder solicitações da página de Serviços com confirmação explícita.
Limites importantes
A API pública do LinkedIn permite publicação quando o aplicativo possui os escopos necessários. Não existe uma API pública geral para um candidato se inscrever em vagas de terceiros. Por isso, a candidatura usa um navegador local persistente e nunca expõe a sessão por HTTP.
O servidor usa stdio, armazena o perfil do navegador apenas na máquina do usuário e não envia
cookies, tokens ou currículos para serviços intermediários.
Para staging privado, também pode usar Streamable HTTP vinculado exclusivamente ao endereço da tailnet. Não vincule o servidor a uma interface pública.
Related MCP server: LinkedIn Poster
Desenvolvimento
uv sync --all-groups
uv run patchright install chromium
uv run pytest
uv run fastmcp dev src/linkedin_actions_mcp/server.pyCopie .env.example para .env somente se for usar a API oficial de publicação. Nunca envie o
arquivo .env ao Git.
Staging pela tailnet
Defina LINKEDIN_TRANSPORT=http, LINKEDIN_HOST com o IP Tailscale local e mantenha a porta fora
da internet pública. O endpoint Streamable HTTP será /mcp.
Ferramentas
publish_linkedin_post
Cria uma prévia por padrão. Para publicar, informe confirmed=true. Requer
LINKEDIN_ACCESS_TOKEN e LINKEDIN_AUTHOR_URN. Para imagem, informe image_path e,
opcionalmente, image_alt_text; o servidor inicializa o upload, envia o arquivo e cria o post
pela API oficial, sem navegador.
apply_to_linkedin_job
Abre a vaga no navegador local e anexa o currículo quando o formulário solicitar. Sem
confirmed=true, prepara o fluxo sem enviar. Se houver perguntas ou etapas incompletas, retorna
um bloqueio legível e não declara a candidatura como enviada.
Solicitações de serviços
list_linkedin_service_requests e read_linkedin_service_request são operações somente de
leitura. submit_linkedin_service_proposal retorna uma prévia por padrão e somente envia quando
confirmed=true. Configure LINKEDIN_SERVICE_REQUESTS_URL com a página de administração das
solicitações da conta. Como o LinkedIn não oferece API pública para essa área, essas ferramentas
usam o mesmo perfil local persistente do navegador e podem exigir manutenção de seletores quando
a interface do LinkedIn mudar.
Segurança
transporte local por
stdio;validação do domínio da vaga e do arquivo PDF;
validação do domínio das solicitações e das faixas de horas;
confirmação explícita antes de candidatura ou proposta;
segredos apenas por variáveis de ambiente;
nenhuma credencial em logs;
CI com lint, testes e auditoria de dependências;
Dependabot semanal para dependências e GitHub Actions.
Licença
Apache-2.0.
Available Tools
2 toolsapply_to_linkedin_jobC
Abre uma vaga, anexa o currículo e envia somente quando o formulário estiver completo.
| Name | Required | Description | Default |
|---|---|---|---|
| answers | No | ||
| job_url | Yes | ||
| confirmed | No | ||
| resume_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions opening, attaching, and submitting only when complete, but it does not disclose what happens if the form is incomplete, how the 'answers' parameter is used, whether confirmation is required (despite the 'confirmed' parameter), or any authentication or rate-limit constraints. The behavior is under-specified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, which is efficient. However, it lacks structure and front-loading of key information. It does not separate the core action from caveats, and it omits essential parameter context, making it under-specified rather than simply concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the tool has four parameters with one required, and the workflow involves opening a job, attaching a resume, and submitting a form. The description does not explain the expected behavior when the form is incomplete, the role of the 'answers' and 'confirmed' parameters, or what the output represents. For an action with this complexity, the description is inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining the parameters. It does not mention job_url, resume_path, answers, or confirmed at all. The description provides no meaning for any parameter, leaving the agent to infer everything from the schema alone, which is insufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action: opens a job, attaches a resume, and submits when the form is complete. This clearly identifies the tool's purpose as applying to a LinkedIn job. However, it does not explicitly differentiate from the sibling tool 'publish_linkedin_post', though the names make the distinction obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when applying to a job and when the form is complete, but it provides no explicit guidance on when to use it versus alternatives. It does not mention prerequisites, such as needing a valid job URL or resume path, or any conditions that would make this tool inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_linkedin_postC
Cria uma prévia ou publica texto e imagem no LinkedIn pela API oficial.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| confirmed | No | ||
| image_path | No | ||
| visibility | No | PUBLIC | |
| image_alt_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Não há annotations, então a descrição deveria revelar o comportamento de publicação externa, incluindo riscos e a necessidade de confirmação. Ela apenas menciona 'prévia ou publica', mas não explica que a publicação é provavelmente irreversível, nem como o fluxo de confirmação funciona via parâmetro 'confirmed'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A descrição é curta, direta e vai ao ponto, sem encher linguiça ou repetir o nome da ferramenta. Porém, é tão enxuta que omite informações essenciais, o que impede uma nota máxima nessa dimensão.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Para uma ferramenta que publica conteúdo externo, com 5 parâmetros e modo de prévia/publicação, uma única frase é insuficiente. Faltam instruções sobre confirmação, visibilidade, upload de imagem e o que o retorno significa, mesmo considerando que existe output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Com 0% de cobertura de descrição no schema, a descrição deveria compensar explicando os parâmetros, mas só menciona 'texto e imagem'. Não esclarece o papel de 'confirmed', 'visibility' ou 'image_alt_text', deixando o agente sem informação suficiente para invocar a ferramenta corretamente.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A descrição afirma claramente a ação ('cria uma prévia ou publica') e o recurso ('texto e imagem no LinkedIn'), o que diferencia a ferramenta do sibling apply_to_linkedin_job, que é voltado a candidaturas a vagas. Não é tautológica e transmite o propósito principal em uma frase específica.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A descrição não oferece orientação sobre quando usar a prévia versus a publicação real, nem menciona alternativas ou condições de uso. O contexto de uso fica apenas implícito pelo nome da ferramenta, sem explicitar em que situações ela deve ser preferida.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
apply_to_linkedin_job - First observed
publish_linkedin_post
TDQS
Scored across 2 tools
publish_linkedin_post and apply_to_linkedin_job target completely different workflows: content publishing versus job applications. There is no overlap in purpose, inputs, or side effects, so an agent can confidently select the right tool.
Both tools follow the same verb_noun pattern with consistent snake_case naming: publish_linkedin_post and apply_to_linkedin_job. The LinkedIn domain is uniformly reflected in each name.
Two tools feels thin for a server labeled LinkedIn Actions, but each tool covers a meaningful high-level action. The count is on the borderline rather than clearly over- or under-scoped.
The two core actions are present, but notable gaps remain: there is no way to search or list jobs before applying, and no update/delete/get for published posts. Agents can complete basic workflows but cannot manage or extend them.
Maintenance
Related MCP Connectors
- linkedinOAuthio.reachium
LinkedIn campaigns, content, leads and inbox from your AI client. Scoped, revocable keys.
LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts, jobs, quotas, webhooks.
Draft, schedule and publish LinkedIn posts, reply to comments and read analytics via 2pr.io.
LinkedIn API as MCP tools to retrieve profile data and publish content. Powered by HAPI MCP.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables posting text and media content directly to LinkedIn from Claude Desktop with support for authentication and visibility controls.11MIT
- FlicenseNot gradedqualityDmaintenanceEnables ChatGPT and Claude Desktop to post text content directly to your LinkedIn profile using the official LinkedIn UGC Posts API with OAuth 2.0 authentication.-
- AlicenseAqualityDmaintenanceEnables posting content, sharing articles, and managing LinkedIn profile through natural language using the official LinkedIn REST API with OAuth 2.0.78 npmMIT
- AlicenseAqualityBmaintenanceEnables local-only use of LinkedIn's official API to authenticate via OAuth, publish text posts, and read or reply to comments with explicit confirmation. Keeps access tokens in the OS keychain and avoids scraping or browser automation.4MIT