LinkedIn API MCP
Servidor MCP de LinkedIn que lee perfiles, empresas, empleos, publicaciones y mensajes a través de tu propia sesión de navegador iniciada, con limitación de velocidad aplicada y protección contra inyección de prompts.
Documentación
linkedin-api-mcp
Aviso: Este es un proyecto independiente, de la comunidad. No está afiliado, autorizado, respaldado ni patrocinado por LinkedIn Corporation ni Microsoft. "LinkedIn" es una marca registrada de LinkedIn Corporation y se usa aquí únicamente con fines descriptivos para identificar el servicio de terceros con el que este software interactúa.
Un servidor MCP para LinkedIn. Maneja un navegador headless real (patchright, una bifurcación no detectada de Playwright) usando tu propia cookie de sesión de LinkedIn con la sesión iniciada. No hay API de scraping, ni relleno de credenciales, ni evasión del inicio de sesión de LinkedIn. Tu agente tiene 12 herramientas de lectura (perfiles, empresas, empleos, publicaciones, tu bandeja de entrada) y dos herramientas de escritura, mantenidas deliberadamente separadas: enviar un mensaje y enviar una solicitud de conexión. Cada acción pasa por una única sesión de navegador, una a la vez, con un ritmo limitado por controles que tú defines. Consulta Seguridad más abajo.
Documentación: mcp.johannsenlum.com/linkedin
Instalación (un clic)
Existen deeplinks solo para Cursor y VS Code; ningún otro cliente tiene un formato de enlace de instalación documentado. Estos rellenan previamente el comando de abajo; no hay nada más que rellenar, ya que la cookie vive en el llavero de tu sistema operativo, no en una variable de entorno.
Todos los clientes
| Cliente | ¿Deeplink? |
|---|---|
| Claude Code | no, comando de una línea |
| Claude Desktop | no |
| Cursor | sí, arriba |
| VS Code | sí, arriba |
| Codex CLI | no |
| Zed | no |
| Windsurf | no (Windsurf solo resuelve servidores en su propio 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
No existe instalación de un clic para Claude Desktop (instala paquetes .mcpb, no
deeplinks). Copia este JSON mediante Settings → Developer → Edit Config:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
Cursor: ~/.cursor/mcp.json
Alternativa al botón de arriba, o si prefieres pegarlo directamente:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
VS Code: .vscode/mcp.json
Alternativa al botón de arriba, o si prefieres pegarlo directamente. Ten en cuenta que VS
Code usa una clave servers, no 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"]
El esquema de configuración de Codex CLI ha cambiado entre versiones y este bloque no está
verificado de forma independiente contra una instalación en vivo. Si no se carga, la vía
fiable es ejecutar uvx linkedin-api-mcp tú mismo y apuntar Codex a lo que
su configuración actual de servidor stdio espere.
Zed: settings.json
No existe deeplink para Zed. Añade esto bajo context_servers en tu
configuración de Zed:
{
"context_servers": {
"linkedin": {
"source": "custom",
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
Windsurf: ~/.codeium/windsurf/mcp_config.json
No existe deeplink para Windsurf. Solo resuelve servidores de su propio registro, así que esto debe pegarse manualmente mediante Windsurf Settings → MCP Servers → Edit raw config:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"]
}
}
}
Si prefieres no depender del llavero en un cliente concreto (un entorno
sandboxed o CI), pasa la cookie directamente en lugar de ejecutar auth:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-api-mcp"],
"env": { "LINKEDIN_COOKIE": "your-li_at-value" }
}
}
}
Si haces esto en cualquier lugar, trata ese archivo de configuración con el mismo cuidado que la propia cookie: no lo subas a un repositorio y restringe sus permisos.
Cómo obtener tu cookie de sesión
LinkedIn no ofrece una clave API para este tipo de acceso, así que el servidor usa la misma cookie de sesión que tu navegador ya tiene.
- Una sola vez: instala la compilación de Chromium que el servidor maneja.
uvx --from linkedin-api-mcp patchright install chromium - Inicia sesión en linkedin.com en un navegador normal.
- Abre DevTools (
F12oCmd+Opt+I) → Application → Cookies →https://www.linkedin.com. - Busca la fila llamada
li_aty copia su Value.
[!WARNING] Esta cookie es tu inicio de sesión de LinkedIn. Cualquiera que la tenga puede actuar como tú: leer tus mensajes, escribir a tus contactos, ver todo lo que tu cuenta puede ver, sin necesidad de tu contraseña. Sobrevive a un cambio de contraseña y no puede revocarse desde ninguna lista de sesiones que LinkedIn te muestre. Nunca la pegues en un chat, un commit, un issue, una captura de pantalla ni en ningún otro lugar que no sea
linkedin-api-mcp auth.
- Guárdala:
Pega el valor cuando se te solicite; la terminal no lo mostrará de vuelta. Por defecto se guarda en el llavero de tu sistema operativo (Keychain, Windows Credential Manager o Secret Service en Linux), nunca se escribe en un archivo de configuración.uvx linkedin-api-mcp auth - Verifica que LinkedIn la acepta antes de conectar un cliente:
Imprime la configuración redactada del servidor y confirma que la sesión está activa. Nunca imprime la cookie en sí.uvx linkedin-api-mcp --test
Herramientas
| Herramienta | Descripción |
|---|---|
get_profile | Obtiene el perfil de un miembro (titular, acerca de, experiencia, educación, habilidades) por URL o identificador público. |
get_my_profile | Obtiene el perfil de la cuenta con la que este servidor ha iniciado sesión. |
search_people | Busca miembros de LinkedIn por palabra clave. |
get_inbox | Lista las vistas previas recientes de hilos de mensajes. |
get_conversation | Obtiene el historial completo de mensajes de un hilo, por id. |
search_conversations | Busca en tus hilos de mensajes por participante o palabra clave. |
send_message ✏️ | Escritura. Envía un mensaje real a otro miembro desde tu cuenta. |
connect ✏️ | Escritura. Envía una invitación de conexión real a otro miembro desde tu cuenta. |
get_company | Obtiene una página de empresa (acerca de, tamaño, sector, publicaciones recientes). |
search_companies | Busca empresas de LinkedIn por palabra clave. |
search_jobs | Busca ofertas de empleo por palabra clave y ubicación opcional. |
get_job | Obtiene una oferta de empleo completa. |
search_posts | Busca publicaciones del feed de LinkedIn por palabra clave. |
linkedin_status | Comprueba la validez de la sesión y el uso actual respecto a los límites de velocidad en Seguridad. |
14 herramientas: 12 de lectura, 2 de escritura. send_message y connect son las únicas dos que
cambian algo, y ambas son visibles para otra persona real en el momento en que
se ejecutan: no hay paso de borrador, vista previa ni deshacer. Todo lo demás solo lee lo que
tu cuenta ya puede ver. Cubierto por 68 pruebas.
Qué está verificado y qué no
Este es un proyecto de pocos días. En lugar de afirmar que todo funciona, esto es lo que realmente se ha comprobado con una cuenta real, y lo que no.
| Estado | Herramienta / comportamiento | Nota |
|---|---|---|
| Verificado en vivo | get_my_profile, get_profile, search_people, get_company, search_companies, search_jobs, search_posts, get_inbox | Se llamó con una cuenta real y devolvió datos reales. |
| Verificado en vivo | send_message ✏️ | Se envió un mensaje real y luego se leyó el hilo de vuelta para confirmar que llegó. |
| Aún no verificado | connect ✏️, get_conversation, search_conversations, get_job, linkedin_status | Implementado y probado, pero aún no ejercitado manualmente con una cuenta real. |
| Brecha conocida | conversation_id desde get_inbox | Devuelve null. LinkedIn vincula las filas de la bandeja de entrada a objetos JS en memoria en lugar de a URLs, así que no hay id que leer de la página. |
| Brecha conocida | Recuentos de reacciones y comentarios en search_posts | Devuelven null. |
| Brecha conocida | experience y education en get_profile | LinkedIn carga estas secciones solo al hacer scroll; actualmente devuelven vacío. |
Seguridad
-
Una cola de acciones serializada. Cada llamada de herramienta, incluida
linkedin_status, pasa por la misma cola antes de tocar el navegador: una acción a la vez, nunca en paralelo. -
Un intervalo mínimo y un límite por hora, ambos aplicados, no solo declarados:
Ajuste Valor por defecto Variable de entorno Efecto Intervalo mínimo entre acciones 2 segundos LINKEDIN_MIN_INTERVALLas llamadas se espacian respecto a la anterior, no se ejecutan una tras otra. Acciones por hora móvil 120 LINKEDIN_MAX_PER_HOURUna vez alcanzado, las llamadas posteriores fallan inmediatamente con un error rate_limiteden lugar de ponerse en cola o esperar.El límite es local a este servidor: existe para evitar que un agente en bucle genere una ráfaga de tráfico de LinkedIn, no porque LinkedIn nos haya dado estos números. Bajarlos siempre es seguro; subirlos significa que decides que estás dispuesto a aceptar más riesgo del que los valores por defecto asumen.
-
Bloqueo contra inyección de prompts en todo texto libre extraído. Cualquier cosa leída de una página de LinkedIn (un titular, una sección acerca de, un mensaje) pasa por tu agente como datos. Está delimitado antes de que tu agente lo vea, de modo que el texto en un perfil o en un mensaje no puede hacerse pasar por una instrucción.
-
La cookie vive en el llavero de tu sistema operativo, no en un archivo de configuración, por defecto. Consulta Cómo obtener tu cookie de sesión.
-
send_messagedemuestra la entrega antes de informar éxito. Sondea la conversación hasta que el texto enviado realmente aparece, y lanzasend_unconfirmeden lugar de un falso{"sent": true}si no aparece.
Otras variables de entorno que el servidor lee: LINKEDIN_COOKIE (anula el
llavero), LINKEDIN_HEADLESS (por defecto true), LINKEDIN_NAV_TIMEOUT_MS (por defecto
30000).
Preguntas frecuentes
¿Es seguro usar esto? ¿Me van a banear?
Esta herramienta controla una sesión de navegador real; no explota APIs no documentadas ni evita la autenticación. El Acuerdo de usuario de LinkedIn prohíbe el acceso automatizado, y las cuentas que usan herramientas automatizadas pueden ser restringidas o baneadas. Úsalo bajo tu propio riesgo; no hay garantía de seguridad de la cuenta. Si encuentras algún problema, házmelo saber en Discussions.
¿Qué pasa si mis agentes ejecutan demasiadas acciones?
Las llamadas de herramientas se ejecutan secuencialmente a través de una cola. Tú eres responsable del volumen de automatización que ejecutas; úsalo con moderación y da instrucciones a tus agentes de forma responsable.
Licencia
MIT © 2026 Johannsen Lum.
Úsalo, cámbialo, redistribúyelo, construye algo comercial sobre él: la única condición es que mantengas el aviso de copyright y el texto de la licencia. Viene sin ningún tipo de garantía.
Las contribuciones se aceptan bajo la misma licencia.
Contribuciones
Los issues y las pull requests son bienvenidos: github.com/JohannsenLum/linkedin-api-mcp. Los cambios se registran en CHANGELOG.md.
Ejecutar las pruebas
Instala las dependencias de desarrollo y ejecuta pytest desde la raíz del repositorio:
pip install -e ".[dev]"
python -m pytest -q
La suite de pruebas predeterminada no necesita Chromium, una cuenta de LinkedIn,
LINKEDIN_COOKIE, ni acceso a la red. Las interacciones con el navegador se reemplazan por los dobles de prueba en tests/fakes.py, que analizan HTML predefinido y exponen la pequeña superficie de Playwright utilizada por las herramientas. Para un ejemplo de prueba de análisis, consulta tests/test_people_parsing.py.
Este es un proyecto independiente, no afiliado a LinkedIn Corporation. Consulta el aviso legal al inicio de este documento.