Skip to main content
Glama
leandrojacome

LinkedIn Actions MCP

README.md
# 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

B3/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues