mcp-linkedin

Publica publicaciones, comentarios y reacciones de LinkedIn a través de Unipile — dry_run por defecto por seguridad.

Documentación

mcp-linkedin

Un servidor MCP que permite a los asistentes de IA publicar en LinkedIn en tu nombre.

mcp-linkedin MCP server

Qué hace

Este es un servidor de Protocolo de Contexto de Modelo (MCP) que envuelve la API de Unipile para dar a los asistentes de IA (Claude Code, Claude Desktop o cualquier cliente compatible con MCP) la capacidad de crear publicaciones, comentarios y reacciones en LinkedIn. La IA escribe el contenido; esta herramienta gestiona la publicación. Todas las acciones de publicación están en modo de vista previa por defecto: nada se publica sin confirmación explícita.

Características

  • 3 herramientas: publicar, comentar, reaccionar
  • Ejecución de prueba por defecto (vista previa antes de publicar)
  • Da "me gusta" automáticamente a las publicaciones inmediatamente después de publicarlas
  • Adjuntos multimedia (archivos locales o URLs — imágenes y video)
  • Menciones de empresas @ (resueltas automáticamente mediante Unipile)
  • Funciona con Claude Code, Claude Desktop y cualquier cliente MCP

Requisitos previos

  • Node.js 18+ — utiliza módulos ES, node:test y await de nivel superior
  • Cuenta de Unipile — Unipile es el servicio que se conecta a la API de LinkedIn. Regístrate, conecta tu cuenta de LinkedIn y obtén tu clave API y DSN desde el panel de control.

Instalación

git clone https://github.com/timkulbaev/mcp-linkedin.git
cd mcp-linkedin
npm install

Configuración

Claude Code

Añade a ~/.claude/mcp.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-linkedin/index.js"],
      "env": {
        "UNIPILE_API_KEY": "your-unipile-api-key",
        "UNIPILE_DSN": "apiXX.unipile.com:XXXXX"
      }
    }
  }
}

Claude Desktop

Añade a ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "linkedin": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-linkedin/index.js"],
      "env": {
        "UNIPILE_API_KEY": "your-unipile-api-key",
        "UNIPILE_DSN": "apiXX.unipile.com:XXXXX"
      }
    }
  }
}

Reinicia Claude Code o Claude Desktop después de editar la configuración.

Variables de entorno

VariableRequeridaDescripción
UNIPILE_API_KEYSíTu clave API de Unipile (desde el panel de control de Unipile)
UNIPILE_DSNSíTu DSN de Unipile (p. ej., api16.unipile.com:14648)

Estas se pasan mediante la configuración de MCP, no mediante un archivo .env. El servidor las lee desde process.env al iniciarse.

Herramientas

linkedin_publish

Crea una publicación original en LinkedIn.

dry_run tiene como valor predeterminado true. Llama primero con dry_run: true para obtener una vista previa, luego llama de nuevo con dry_run: false para publicar realmente.

ParámetroTipoRequeridoPredeterminadoDescripción
textstringsí—Cuerpo de la publicación, máximo 3000 caracteres
mediastring[]no[]Rutas de archivos locales o URLs (jpg, png, gif, webp, mp4)
mentionsstring[]no[]Nombres de empresas para mencionar con @ (resueltos automáticamente)
dry_runbooleannotrueVista previa sin publicar

Respuesta de vista previa (dry_run: true):

{
  "status": "preview",
  "post_text": "Hello LinkedIn!",
  "character_count": 16,
  "character_limit": 3000,
  "media": [],
  "mentions": [],
  "warnings": [],
  "ready_to_publish": true
}

Respuesta de publicación (dry_run: false):

{
  "status": "published",
  "post_id": "7437514186450104320",
  "post_text": "Hello LinkedIn!",
  "posted_at": "2026-03-11T15:06:04.849Z",
  "auto_like": "liked"
}

Después de publicar, guarda el post_id y construye la URL de la publicación:

https://www.linkedin.com/feed/update/urn:li:activity:{post_id}/

linkedin_comment

Publica un comentario en una publicación existente de LinkedIn.

dry_run tiene como valor predeterminado true.

ParámetroTipoRequeridoPredeterminadoDescripción
post_urlstringsí—URL de la publicación de LinkedIn o URN sin procesar (urn:li:activity:... o urn:li:ugcPost:...)
textstringsí—Texto del comentario
dry_runbooleannotrueVista previa sin publicar

linkedin_react

Reacciona a una publicación de LinkedIn. Esta acción es inmediata: no hay dry_run.

ParámetroTipoRequeridoPredeterminadoDescripción
post_urlstringsí—URL de la publicación de LinkedIn o URN sin procesar
reaction_typestringno"like"Uno de: like, celebrate, support, love, insightful, funny

Cómo funciona

                    ┌──────────────────────────────────┐
                    │           mcp-linkedin            │
AI Assistant  ──►   │                                  │
(via MCP stdio)     │  Posts/Comments/Reactions  ──►  Unipile API  ──►  LinkedIn
                    └──────────────────────────────────┘
  • El asistente de IA llama a las herramientas mediante el protocolo JSON-RPC de MCP a través de stdio
  • Llama a la API de Unipile que gestiona el OAuth de LinkedIn: no se necesita gestión de tokens

Flujo de publicación seguro

El valor predeterminado de dry_run existe para evitar publicaciones accidentales. El flujo previsto:

  1. La IA llama a la herramienta con dry_run: true (el valor predeterminado)
  2. Ves la vista previa: texto final, recuento de caracteres, validación de medios, menciones resueltas, advertencias
  3. Confirmas o pides cambios
  4. La IA llama de nuevo con dry_run: false
  5. La publicación se hace pública

dry_run es true por defecto. La IA no puede publicar sin establecerlo explícitamente en false, lo que requiere pasar primero por el paso de vista previa.

Gestión de medios

  • Pasa rutas de archivos locales (/path/to/image.jpg) o URLs (https://example.com/img.png)
  • Las URLs se descargan a /tmp/mcp-linkedin-media/ y se limpian después de publicar (tanto si tiene éxito como si falla)
  • Formatos admitidos: jpg, jpeg, png, gif, webp (imágenes), mp4 (video)
  • Cada archivo se valida antes de subirlo: debe existir, no estar vacío y ser de un tipo admitido
  • Los archivos fallidos aparecen en el array media de la vista previa con "valid": false y un mensaje de error

Menciones de empresas @

  • Pasa nombres de empresas como cadenas: mentions: ["Microsoft", "OpenAI"]
  • El servidor convierte cada nombre a formato slug y lo busca mediante la búsqueda de empresas de LinkedIn de Unipile
  • Las empresas resueltas se inyectan como marcadores de posición {{0}}, {{1}} en el texto de la publicación: LinkedIn los renderiza como menciones @ clicables
  • Si un nombre de empresa aparece en el texto de la publicación, se reemplaza en su lugar; si no, el marcador de posición se añade al final
  • Los nombres no resueltos aparecen como advertencias en la vista previa. La publicación aún puede publicarse sin ellos.

Pruebas

npm test       # 28 unit tests, zero extra dependencies (Node.js built-in test runner)
npm run lint   # Biome linter

Estructura del proyecto

mcp-linkedin/
  index.js                    Entry point (stdio transport)
  package.json
  src/
    server.js                 MCP server and tool registration
    unipile-client.js         Unipile API wrapper (posts, comments, reactions)
    media-handler.js          URL download and file validation
    tools/
      publish.js              linkedin_publish handler
      comment.js              linkedin_comment handler
      react.js                linkedin_react handler
  tests/
    unit.test.js              28 unit tests

Cómo obtener una cuenta de Unipile

  1. Regístrate para obtener una cuenta de Unipile
  2. En el panel de control, conecta tu cuenta de LinkedIn
  3. Copia tu clave API y DSN desde la configuración del panel de control
  4. Pégalos en la configuración de MCP (consulta Configuración arriba)

Unipile tiene un nivel gratuito que cubre el uso básico.

Licencia

MIT — consulta LICENCIA.

Créditos

Creado por Timur Kulbaev. Utiliza el Protocolo de Contexto de Modelo de Anthropic y la API de Unipile.