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.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"timkulbaev-mcp-linkedin": {
"command": "npx",
"args": []
}
}
}Extract design specs and assets
An Open-Sourced UI to install and manage MCP servers for Windows, Linux and macOS.
Build, validate, and deploy multi-agent AI solutions on the ADAS platform. Design skills with tools, manage solution lifecycle, and connect from any AI environm
MCP Bundles: Create custom bundles of tools and connect providers with OAuth or API keys. Use one MCP server across thousands of integrations, with programmatic