Skip to main content
Glama
AmmYoo7

linkedin-safe-mcp

by AmmYoo7

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, w_member_social

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-mcp

O 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)

  1. Ve a https://www.linkedin.com/developers/appsCreate app (requiere asociar cualquier Página de LinkedIn; puedes crear una trivial).

  2. En la pestaña Products de la app, añade Share on LinkedIn y Sign In with LinkedIn using OpenID Connect.

  3. En la pestaña Auth, añade la URL de redirección http://localhost:8765/callback.

  4. Copia el Client ID y el Client Secret en las variables de entorno mostradas arriba.

  5. Autentícate una vez — cualquiera de las dos formas funciona:

    • En una terminal: uv run --directory <REPO> linkedin-safe-mcp auth

    • O simplemente pide a tu agente que publique algo; llamará a la herramienta login y 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

auth_status

Informa del estado de configuración/autenticación con los siguientes pasos exactos

login / logout

Flujo OAuth en navegador / elimina los tokens almacenados

get_my_profile

Nombre, correo electrónico, URN de persona de la cuenta conectada

create_post

Publica una entrada: texto (+hashtags), enlace opcional o imagen local; PUBLIC o CONNECTIONS

delete_post

Elimina una de tus publicaciones (URN o URL de la publicación)

comment_on_post

Comenta una publicación (URN o URL de la publicación)

like_post

Da "me gusta" a una publicación (URN o URL de la publicación)

search_jobs

Filtros: ubicación, remoto/híbrido/presencial, tiempo de publicación, niveles de experiencia, tipos de empleo, solo Easy-Apply, orden; hasta 50 resultados

get_job

Publicación completa: descripción, seniority, tipo, salario si se indica, número de solicitantes, URL de solicitud externa

save_job

Guarda una oferta en el rastreador local

get_saved_job / list_saved_jobs

Una oferta con historial / visión general del pipeline con recuentos de estados

update_job_status

interesado → solicitado → en entrevista → oferta / rechazado / retirado / archivado, con notas

add_job_note / remove_saved_job

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

LINKEDIN_CLIENT_ID / LINKEDIN_CLIENT_SECRET

Credenciales de la app de LinkedIn (solo para publicar)

LINKEDIN_MCP_DIR

~/.linkedin-mcp

Dónde viven los tokens y la base de datos del rastreador

LINKEDIN_REDIRECT_PORT

8765

Puerto de devolución de llamada OAuth (debe coincidir con la URL de redirección de la app)

LINKEDIN_API_VERSION

202606

Cabecera LinkedIn-Version para llamadas /rest/*

LINKEDIN_POSTS_BACKEND

auto

rest, ugc o auto (probar y recordar lo que tu app puede usar)

LINKEDIN_MCP_USER_AGENT

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 limit moderado.

  • 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 tests

Estructura: 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-http para 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

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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