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

PyPI Python 3.11+ License: MIT MCP Registry GitHub stars

Demo de terminal de linkedin-api-mcp: un agente llama a search_people para encontrar un miembro, luego send_message para enviarle un mensaje, y luego lee la conversación de vuelta para confirmar que el mensaje realmente llegó. 14 herramientas, 68 pruebas, licencia MIT.

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.

Add to Cursor Add to VS Code

Todos los clientes

Cliente¿Deeplink?
Claude Codeno, comando de una línea
Claude Desktopno
Cursorsí, arriba
VS Codesí, arriba
Codex CLIno
Zedno
Windsurfno (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.

  1. Una sola vez: instala la compilación de Chromium que el servidor maneja.
    uvx --from linkedin-api-mcp patchright install chromium
    
  2. Inicia sesión en linkedin.com en un navegador normal.
  3. Abre DevTools (F12 o Cmd+Opt+I) → Application → Cookies → https://www.linkedin.com.
  4. Busca la fila llamada li_at y 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.

  1. Guárdala:
    uvx linkedin-api-mcp auth
    
    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.
  2. Verifica que LinkedIn la acepta antes de conectar un cliente:
    uvx linkedin-api-mcp --test
    
    Imprime la configuración redactada del servidor y confirma que la sesión está activa. Nunca imprime la cookie en sí.

Herramientas

HerramientaDescripción
get_profileObtiene el perfil de un miembro (titular, acerca de, experiencia, educación, habilidades) por URL o identificador público.
get_my_profileObtiene el perfil de la cuenta con la que este servidor ha iniciado sesión.
search_peopleBusca miembros de LinkedIn por palabra clave.
get_inboxLista las vistas previas recientes de hilos de mensajes.
get_conversationObtiene el historial completo de mensajes de un hilo, por id.
search_conversationsBusca 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_companyObtiene una página de empresa (acerca de, tamaño, sector, publicaciones recientes).
search_companiesBusca empresas de LinkedIn por palabra clave.
search_jobsBusca ofertas de empleo por palabra clave y ubicación opcional.
get_jobObtiene una oferta de empleo completa.
search_postsBusca publicaciones del feed de LinkedIn por palabra clave.
linkedin_statusComprueba 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.

EstadoHerramienta / comportamientoNota
Verificado en vivoget_my_profile, get_profile, search_people, get_company, search_companies, search_jobs, search_posts, get_inboxSe llamó con una cuenta real y devolvió datos reales.
Verificado en vivosend_message ✏️Se envió un mensaje real y luego se leyó el hilo de vuelta para confirmar que llegó.
Aún no verificadoconnect ✏️, get_conversation, search_conversations, get_job, linkedin_statusImplementado y probado, pero aún no ejercitado manualmente con una cuenta real.
Brecha conocidaconversation_id desde get_inboxDevuelve 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 conocidaRecuentos de reacciones y comentarios en search_postsDevuelven null.
Brecha conocidaexperience y education en get_profileLinkedIn 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:

    AjusteValor por defectoVariable de entornoEfecto
    Intervalo mínimo entre acciones2 segundosLINKEDIN_MIN_INTERVALLas llamadas se espacian respecto a la anterior, no se ejecutan una tras otra.
    Acciones por hora móvil120LINKEDIN_MAX_PER_HOURUna vez alcanzado, las llamadas posteriores fallan inmediatamente con un error rate_limited en 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_message demuestra la entrega antes de informar éxito. Sondea la conversación hasta que el texto enviado realmente aparece, y lanza send_unconfirmed en 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.