linkedin-safe-mcp
linkedin-safe-mcp
Un servidor MCP que da a los agentes de IA (Claude Code, Codex, Claude Desktop, Cursor, …) superpoderes de LinkedIn — sin poner en riesgo tu cuenta de LinkedIn:
Publicar en LinkedIn — texto, enlaces e imágenes mediante la API oficial de LinkedIn (OAuth, conforme a los Términos de servicio), además de comentarios y "me gusta".
Buscar empleos — filtros por palabra clave/ubicación/remoto/experiencia/fecha mediante los endpoints públicos de invitado de LinkedIn. Sin inicio de sesión ni cookies: tu cuenta nunca está involucrada.
Gestionar una búsqueda de empleo — un rastreador de solicitudes local en SQLite (interesado → solicitado → en entrevista → oferta) con notas y capturas de cada oferta, para que un agente pueda gestionar tu pipeline y redactar cartas de presentación personalizadas incluso después de que una oferta sea retirada.
¿Por qué este diseño?
LinkedIn no ofrece una API oficial de búsqueda de empleo, y las rutas no oficiales (API interna de Voyager
con tu cookie de sesión li_at, navegadores headless en tu sesión iniciada) violan el Acuerdo de usuario de LinkedIn §8.2
y suelen provocar restricciones de cuenta. Este servidor divide deliberadamente la diferencia:
Preocupación | Cómo se maneja | Riesgo para la cuenta |
Publicaciones, comentarios, "me gusta" | API REST oficial, tu propia app de OAuth, | Ninguno — sancionado |
Búsqueda de empleo y detalles | Endpoints de invitado (las páginas de empleos sin sesión), limitados por IP | Ninguno — no se usan credenciales |
Seguimiento del pipeline | SQLite local en tu máquina | Ninguno — nunca toca LinkedIn |
Easy Apply, mensajes directos, lectura del feed | Intencionalmente no incluidos — imposibles sin acceso que viole los Términos de servicio | — |
Requisitos
Python 3.11+ y uv
Solo para publicar: una app de desarrollador de LinkedIn gratuita y autogestionada (configuración de 5 minutos abajo). La búsqueda de empleo y el rastreador funcionan sin configuración.
Instalación y conexión a tu agente
Clona/copia este directorio y luego regístralo en tu cliente MCP. <REPO> abajo es
la ruta absoluta a este proyecto.
Claude Code
claude mcp add linkedin \
--env LINKEDIN_CLIENT_ID=your_client_id \
--env LINKEDIN_CLIENT_SECRET=your_client_secret \
-- uv run --directory <REPO> linkedin-safe-mcpO en el .mcp.json de un proyecto:
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["run", "--directory", "<REPO>", "linkedin-safe-mcp"],
"env": {
"LINKEDIN_CLIENT_ID": "your_client_id",
"LINKEDIN_CLIENT_SECRET": "your_client_secret"
}
}
}
}Codex (~/.codex/config.toml)
[mcp_servers.linkedin]
command = "uv"
args = ["run", "--directory", "<REPO>", "linkedin-safe-mcp"]
env = { LINKEDIN_CLIENT_ID = "your_client_id", LINKEDIN_CLIENT_SECRET = "your_client_secret" }Claude Desktop (claude_desktop_config.json) — la misma forma JSON que el .mcp.json
de arriba.
Las variables LINKEDIN_CLIENT_* solo se necesitan para publicar; omítelas si solo
quieres búsqueda de empleo + seguimiento.
Habilitar la publicación (configuración única de la app de LinkedIn)
Ve a https://www.linkedin.com/developers/apps → Create app (requiere asociar cualquier Página de LinkedIn; puedes crear una trivial).
En la pestaña Products de la app, añade Share on LinkedIn y Sign In with LinkedIn using OpenID Connect.
En la pestaña Auth, añade la URL de redirección
http://localhost:8765/callback.Copia el Client ID y el Client Secret en las variables de entorno mostradas arriba.
Autentícate una vez — cualquiera de las dos formas funciona:
En una terminal:
uv run --directory <REPO> linkedin-safe-mcp authO simplemente pide a tu agente que publique algo; llamará a la herramienta
loginy te dará la URL de autorización.
Los tokens se almacenan en ~/.linkedin-mcp/tokens.json (modo 0600) y duran ~60 días;
LinkedIn no emite tokens de actualización para apps autogestionadas, así que vuelve a ejecutar
el inicio de sesión cuando caduque (auth_status le dice al agente exactamente cuándo).
Herramientas
Herramienta | ¿Necesita autenticación? | Qué hace |
| – | Informa del estado de configuración/autenticación con los siguientes pasos exactos |
| – | Flujo OAuth en navegador / elimina los tokens almacenados |
| ✓ | Nombre, correo electrónico, URN de persona de la cuenta conectada |
| ✓ | Publica una entrada: texto (+hashtags), enlace opcional o imagen local; |
| ✓ | Elimina una de tus publicaciones (URN o URL de la publicación) |
| ✓ | Comenta una publicación (URN o URL de la publicación) |
| ✓ | Da "me gusta" a una publicación (URN o URL de la publicación) |
| – | Filtros: ubicación, remoto/híbrido/presencial, tiempo de publicación, niveles de experiencia, tipos de empleo, solo Easy-Apply, orden; hasta 50 resultados |
| – | Publicación completa: descripción, seniority, tipo, salario si se indica, número de solicitantes, URL de solicitud externa |
| – | Guarda una oferta en el rastreador local |
| – | Una oferta con historial / visión general del pipeline con recuentos de estados |
| – | interesado → solicitado → en entrevista → oferta / rechazado / retirado / archivado, con notas |
| – | Añade una nota / elimina una oferta |
Cosas que los agentes pueden hacer con esto: "encuentra roles de ingeniero principal remotos publicados esta semana, guarda los prometedores, redacta cartas de presentación personalizadas a partir de las descripciones guardadas, marca los que he solicitado y publica un resumen de mi trabajo de código abierto."
Configuración
Variable de entorno | Valor por defecto | Propósito |
| – | Credenciales de la app de LinkedIn (solo para publicar) |
|
| Dónde viven los tokens y la base de datos del rastreador |
|
| Puerto de devolución de llamada OAuth (debe coincidir con la URL de redirección de la app) |
|
| Cabecera |
|
|
|
| un UA de Chrome | UA para solicitudes de empleo de invitado |
Notas de comportamiento y límites
Publicación: LinkedIn limita las publicaciones de miembros a 150 solicitudes/día y rechaza duplicados exactos de publicaciones recientes (422). Los caracteres reservados en el texto de la publicación se escapan automáticamente para la API versionada, de modo que los paréntesis no causen errores; los hashtags se conservan.
Búsqueda de empleo: los endpoints de invitado están limitados por IP (HTTP 429). El servidor almacena en caché los resultados (búsquedas de 10 min / detalles de oferta de 6 h), reintenta con retroceso y espacia las búsquedas de varias páginas; ante un 429 persistente devuelve un error claro de "espera un minuto" al agente. Mantén
limitmoderado.Postura de scraping: la búsqueda de empleo de invitado lee las mismas páginas públicas que un visitante sin sesión, a ritmos humanos, con caché para minimizar la carga. Aun así, LinkedIn podría cambiar o bloquear estos endpoints en cualquier momento — los analizadores están fijados por pruebas de fixtures para que las roturas se detecten de forma clara, y los errores de las herramientas siguen siendo accionables por el agente.
Desarrollo
uv sync # install deps (Python ≥3.11)
uv run pytest # 48 tests: parsers vs live fixtures, payloads, OAuth, tracker,
# plus an end-to-end stdio smoke test that spawns the real server
uv run ruff check src tests && uv run ruff format --check src testsEstructura: src/linkedin_mcp/ — server.py (superficie de herramientas) · api/ (REST oficial:
publicaciones, acciones sociales, subidas, backend dual rest/ugc) · auth/ (OAuth + almacén de tokens) ·
jobs/ (cliente de invitado, analizadores HTML, mapeos de filtros) · tracker/
(almacén SQLite) · cli.py (serve | auth | status | logout).
Hoja de ruta
Publicar en PyPI (comando de una línea
uvx linkedin-safe-mcp)Tipos de reacción más allá de "me gusta"; publicaciones con varias imágenes; publicaciones con encuestas
Proveedores opcionales de datos de empleo de terceros bajo el mismo esquema de herramientas
Transporte
streamable-httppara uso remoto/alojado(Considerado, solo opt-in, desactivado por defecto) un proveedor Voyager basado en cookies para funciones personalizadas — con advertencias claras, ya que viola los Términos de servicio de LinkedIn
Licencia
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
MCP server for LeadDelta — manage LinkedIn connections and CRM data via AI assistants.
GetJobzi MCP server for job search, application tracking, and career forecasting.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AmmYoo7/linkedin-safe-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server