loading…
Search for a command to run...
loading…
LinkedIn publishing, commenting, and reacting via Unipile API. Dry-run by default, SKILL.md included, CLI-first design for AI automation workflows.
LinkedIn publishing, commenting, and reacting via Unipile API. Dry-run by default, SKILL.md included, CLI-first design for AI automation workflows.
An MCP server that lets AI assistants publish to LinkedIn on your behalf.
This is a Model Context Protocol (MCP) server that wraps the Unipile API to give AI assistants (Claude Code, Claude Desktop, or any MCP-compatible client) the ability to create posts, comments, and reactions on LinkedIn. The AI writes the content; this tool handles the publishing. All publishing actions default to preview mode — nothing goes live without explicit confirmation.
node:test, and top-level awaitgit clone https://github.com/timkulbaev/mcp-linkedin.git
cd mcp-linkedin
npm install
Add to ~/.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"
}
}
}
}
Add to ~/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"
}
}
}
}
Restart Claude Code or Claude Desktop after editing the config.
| Variable | Required | Description |
|---|---|---|
UNIPILE_API_KEY |
Yes | Your Unipile API key (from the Unipile dashboard) |
UNIPILE_DSN |
Yes | Your Unipile DSN (e.g. api16.unipile.com:14648) |
These are passed via the MCP config, not a .env file. The server reads them from process.env at startup.
Creates an original LinkedIn post.
dry_run defaults to true. Call with dry_run: true first to get a preview, then call again with dry_run: false to actually publish.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
text |
string | yes | — | Post body, max 3000 characters |
media |
string[] | no | [] |
Local file paths or URLs (jpg, png, gif, webp, mp4) |
mentions |
string[] | no | [] |
Company names to @mention (auto-resolved) |
dry_run |
boolean | no | true |
Preview without publishing |
Preview response (dry_run: true):
{
"status": "preview",
"post_text": "Hello LinkedIn!",
"character_count": 16,
"character_limit": 3000,
"media": [],
"mentions": [],
"warnings": [],
"ready_to_publish": true
}
Publish response (dry_run: false):
{
"status": "published",
"post_id": "7437514186450104320",
"post_text": "Hello LinkedIn!",
"posted_at": "2026-03-11T15:06:04.849Z",
"auto_like": "liked"
}
After publish, save the post_id and construct the post URL:
https://www.linkedin.com/feed/update/urn:li:activity:{post_id}/
Posts a comment on an existing LinkedIn post.
dry_run defaults to true.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
post_url |
string | yes | — | LinkedIn post URL or raw URN (urn:li:activity:... or urn:li:ugcPost:...) |
text |
string | yes | — | Comment text |
dry_run |
boolean | no | true |
Preview without posting |
Reacts to a LinkedIn post. This action is immediate — there is no dry_run.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
post_url |
string | yes | — | LinkedIn post URL or raw URN |
reaction_type |
string | no | "like" |
One of: like, celebrate, support, love, insightful, funny |
┌──────────────────────────────────┐
│ mcp-linkedin │
AI Assistant ──► │ │
(via MCP stdio) │ Posts/Comments/Reactions ──► Unipile API ──► LinkedIn
└──────────────────────────────────┘
The dry_run default exists to prevent accidental publishing. The intended flow:
dry_run: true (the default)dry_run: falsedry_run is true by default. The AI cannot publish without explicitly setting it to false, which requires going through the preview step first.
/path/to/image.jpg) or URLs (https://example.com/img.png)/tmp/mcp-linkedin-media/ and cleaned up after publish (whether it succeeds or fails)media array with "valid": false and an error messagementions: ["Microsoft", "OpenAI"]{{0}}, {{1}} placeholders in the post text — LinkedIn renders these as clickable @mentionsnpm test # 28 unit tests, zero extra dependencies (Node.js built-in test runner)
npm run lint # Biome linter
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
Unipile has a free tier that covers basic usage.
MIT — see LICENSE.
Built by Timur Kulbaev. Uses the Model Context Protocol by Anthropic and the Unipile API.
Run in your terminal:
claude mcp add timkulbaev-mcp-linkedin -- npx Yes, timkulbaev/mcp-linkedin MCP is free — one-click install via Unyly at no cost.
No, timkulbaev/mcp-linkedin runs without API keys or environment variables.
Self-hosted: the server runs locally on your machine via the install command above.
Open timkulbaev/mcp-linkedin on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Extract design specs and assets
by FigmaEnables AI agents to read, write, and edit Office documents via LibreOffice with token-efficient design. Supports multiple formats including DOCX, XLSX, PPTX, a
by passerbyflutterSearch and retrieve company logos by brand or domain. Customize size, format, and theme to match your design needs. Accelerate design, prototyping, and content
by NOVA-3951Enables GUI automation for controlling PIX4Dmatic on Windows through MCP. Supports launching, focusing, capturing screenshots, sending hotkeys, clicking UI elem
by jangjo123Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All design MCPs