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.
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:testy 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
| Variable | Requerida | Descripción |
|---|---|---|
UNIPILE_API_KEY | Sí | Tu clave API de Unipile (desde el panel de control de Unipile) |
UNIPILE_DSN | Sí | 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ámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
text | string | sí | — | Cuerpo de la publicación, máximo 3000 caracteres |
media | string[] | no | [] | Rutas de archivos locales o URLs (jpg, png, gif, webp, mp4) |
mentions | string[] | no | [] | Nombres de empresas para mencionar con @ (resueltos automáticamente) |
dry_run | boolean | no | true | Vista 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ámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
post_url | string | sí | — | URL de la publicación de LinkedIn o URN sin procesar (urn:li:activity:... o urn:li:ugcPost:...) |
text | string | sí | — | Texto del comentario |
dry_run | boolean | no | true | Vista previa sin publicar |
linkedin_react
Reacciona a una publicación de LinkedIn. Esta acción es inmediata: no hay dry_run.
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
post_url | string | sí | — | URL de la publicación de LinkedIn o URN sin procesar |
reaction_type | string | no | "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:
- La IA llama a la herramienta con
dry_run: true(el valor predeterminado) - Ves la vista previa: texto final, recuento de caracteres, validación de medios, menciones resueltas, advertencias
- Confirmas o pides cambios
- La IA llama de nuevo con
dry_run: false - 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
mediade la vista previa con"valid": falsey 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
- Regístrate para obtener una cuenta de Unipile
- En el panel de control, conecta tu cuenta de LinkedIn
- Copia tu clave API y DSN desde la configuración del panel de control
- 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.