LinkedIn Actions MCP
# 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.
## 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.
## Desenvolvimento
```bash
uv sync --all-groups
uv run patchright install chromium
uv run pytest
uv run fastmcp dev src/linkedin_actions_mcp/server.py
```
Copie `.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.
## Segurança
- transporte local por `stdio`;
- validação do domínio da vaga e do arquivo PDF;
- 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.
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.