agentic-linkedin
This server gives an AI agent full programmatic control over LinkedIn (reads, writes, messaging, networking, and profile management) with safe plan-then-execute approvals, self-healing, and humanized voice features.
Session & safety: sign in once (
login), check session health (session_status), and run read-only if configured.Reads: get your member info, profiles, feed posts, conversations and history, connections summary, invitations, jobs, and analytics.
Profile management: update headline/about/top skills, add/remove/reorder skills, and delete ghost profile entries.
Posts & engagement: create, edit, delete posts; comment and react; posting is verified by read-back and protected against double-posts.
Messaging: send messages with idempotency keys, recall messages, and react to messages.
Network: send connection requests, accept/ignore/withdraw invitations, follow/unfollow people or companies, endorse skills, and remove connections.
Planning workflow:
plan,dry_run,approve, andrejectso nothing executes until you approve, with previews and diffs.Self-healing: inspect redacted failure artifacts (
show_artifact) and apply reviewed selector fixes at runtime (update_registry).Voice & content quality: get/set/bootstrap per-user voice profiles and audit drafts for AI tells.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@agentic-linkedin Write a post announcing our Series A funding and approve it."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
agentic-linkedin
The LinkedIn MCP that never breaks.
An MCP server that gives an AI agent everything a person can do on LinkedIn: you describe what you want, the agent executes it, and you never touch the site.
Self-healing — selectors and endpoints live as data; provable fixes auto-apply when LinkedIn changes its DOM
Session hygiene — human-like pacing, write budgets, health probes, graceful re-auth; never locks you out
Reliable posting — verify-after-post, persisted dedupe keys, never an auto-retry: nothing double-posts
Humanized content — per-user voice profiles and an AI-tell audit; everything reads like you wrote it
Observable — plan-then-execute with field-level diffs and rendered previews; redacted failure artifacts
Install
npx agentic-linkedinRequires Node 20+. The package is published to npm; the repository lives at github.com/DarkLvrd/linkedin-mcp.
Related MCP server: LinkedIn MCP Server
For normal people (no code, no terminal)
You don't need to know anything about computers to use this. You need three things: a free chat app, one click to connect, and a one-time LinkedIn sign-in.
Easiest: Cherry Studio (one click)
Download Cherry Studio (free) from cherryai.com/download and install it like any app.
Click this one-click install link:
Install agentic-linkedin in Cherry Studio
The app asks you to confirm — accept it. The server is now installed.
Open a chat in Cherry Studio, pick your AI model, and ask it to run the
logintool. A browser window opens — sign in to LinkedIn once.That's it. Talk normally: "post about what I shipped this week" — the AI shows you a preview list first, and nothing posts until you approve.
Also easy: any MCP chat app
Claude Desktop, Cursor, and other MCP apps can add the server with this block (ask the app's help or paste into its MCP settings):
{
"mcpServers": {
"agentic-linkedin": {
"command": "npx",
"args": ["-y", "agentic-linkedin"]
}
}
}Both paths need Node.js installed once (download, install, next-next-finish) — it's what runs the server behind the scenes.
Sign in (once)
Start the server with your MCP client (Claude Desktop, Cursor, …).
Call the
logintool. A browser window opens — sign in to LinkedIn and let it redirect to your feed.The session persists to disk (
~/.agentic-linkedin/session.json) and restores across restarts.
Identity is never stored in the repo or in failure artifacts. Cookie values are redacted from every log, tool output, and artifact by construction.
The workflow: plan-then-execute
Describe what you want. The agent calls plan with the intended writes and
gets back an ordered list with previews:
profile changes show field-level old → new diffs
posts and messages show rendered feed-style previews with their AI-tell audit
a raw toggle always exposes the exact arguments
Nothing executes until you approve the plan. reject cancels it. dry_run
previews without storing anything. During execution every write still passes
the pacing engine: per-sign-in budgets, the hourly ceiling, randomized
human-like delays, and health probes — on a challenge the engine pauses until
you re-authenticate.
Tools
Session:
session_status,loginReads:
get_me,get_profile,get_posts,get_conversations,get_conversation_history,get_connections_summary,get_invitations,get_jobs,get_analyticsProfile:
update_profile,add_skill,remove_skill,reorder_skills,delete_ghost_entryPosts:
create_post,edit_post,delete_post,comment,reactMessaging:
send_message(idempotency-keyed),recall_message,react_to_messageNetwork:
connect,respond_invitation,follow,endorse_skill,remove_connectionPlanning:
plan,dry_run,approve,rejectSelf-healing:
show_artifact,update_registryVoice:
get_voice_profile,set_voice_profile,bootstrap_voice_profile,audit_draft
Configuration (environment variables)
Variable | Default | Purpose |
|
|
|
|
| where the session persists |
|
| persisted post-dedupe keys |
|
| redacted failure artifacts |
|
| runtime selector-registry fixes |
|
| per-user voice profiles |
|
| browser-context writes per sign-in (the authwall threshold) |
|
| total writes per sliding hour |
|
| randomized delay range before writes |
|
| session health-probe interval |
Development
npm ci
npm run check # typecheck + build + full test suiteTests run fully offline: the transport seam is faked, Voyager/SDUI responses are replayed from recorded fixtures, and the binary is exercised end-to-end over stdio. Live LinkedIn actions are never automated in CI.
License
MIT — see LICENSE.
Available Tools
39 toolsadd_skillAdd a skillB
Adds a skill to the profile and returns the verified skills state.
Inputs: name (required).
approveApprove a planA
Executes the actions of a pending plan, in order, through the same gated write path as direct tool calls.
Inputs: planId (required).
audit_draftAudit a draftA
Scans a draft for AI tells (inflated claims, formulaic structure, em-dash overuse, chatbot phrasing, robotic rhythm) and returns suggested fixes — never rewrites.
Inputs: text (required).
bootstrap_voice_profileBootstrap a voice profileA
Derives a starting voice profile from the user's past posts (emoji use and sentence length); tune it afterwards.
Inputs: userId (required), samples (required).
commentComment on a postB
Leaves a text comment on a post.
Inputs: text (required), postId (required).
connectSend a connection requestA
Sends a connection request with a note via the quota-checked endpoint; LinkedIn invite limits surface as clear errors.
Inputs: note (required), profileUrn (required).
create_postCreate a postA
Publishes a text post, verifies it by read-back, and refuses to double-post the same content. Reports verified:false honestly when the read-back cannot confirm.
Inputs: text (required).
delete_ghost_entryDelete a ghost entryC
Removes a profile entry that standard deletes miss, routed through SDUI.
Inputs: urn (required), section (required).
delete_postDelete a postB
Deletes a post through SDUI and verifies it no longer appears in the feed.
Inputs: postId (required).
dry_runDry-run actionsA
Produces the same plan and previews as plan, but nothing is stored and nothing can be approved.
Inputs: actions (required).
edit_postEdit a postA
Replaces a post's text and verifies the edit by read-back.
Inputs: text (required), postId (required).
endorse_skillEndorse a skillC
Endorses a skill on someone's profile.
Inputs: skillId (required), profileUrn (required), vanityName (required).
followFollow or unfollowC
Follows or unfollows a person (SDUI) or a company (Voyager patch).
Inputs: urn (required), kind (required), follow (required).
get_analyticsGet profile analyticsA
Returns profile view counts for the signed-in member.
Inputs: no named parameters.
get_connections_summaryGet connections summaryA
Returns the first-degree connection count.
Inputs: no named parameters.
get_conversation_historyGet conversation historyC
Returns the events of a conversation with id, sender, text, and sent time.
Inputs: conversationUrn (required), limit.
get_conversationsGet conversationsC
Returns recent messaging conversations with participants and last activity.
Inputs: limit.
get_invitationsGet invitationsB
Returns pending connection invitations with id, profile, and sent time.
Inputs: limit.
get_jobsSearch jobsB
Searches jobs by keywords and location id.
Inputs: keywords, locationId.
get_meGet my member infoA
Returns the signed-in member: id, name, headline, vanity name.
Inputs: no named parameters.
get_postsGet feed postsB
Returns recent feed posts with id, author, text, and publish time.
Inputs: limit.
get_profileGet a profileB
Returns a member profile (id, name, headline, location, about) by identifier.
Inputs: identifier (required).
get_voice_profileGet a voice profileA
Returns the voice profile for a user, or an error if none exists yet.
Inputs: userId (required).
loginSign in to LinkedInA
Opens a browser window for a one-time sign-in. Sign in and close the window; the session is then persisted and restored across restarts.
Inputs: no named parameters.
planPlan actionsA
Turns intended writes into an ordered plan with per-action previews (diffs for profile changes, rendered previews for posts/messages, raw args always available). Nothing executes until approve.
Inputs: actions (required).
reactReact to a postA
Leaves a reaction on a post: LIKE, PRAISE, APPRECIATION, EMPATHY, INTEREST, or ENTERTAINMENT.
Inputs: postId (required), reaction (required).
react_to_messageReact to a messageC
Leaves an emoji reaction on a message.
Inputs: emoji (required), messageId (required), conversationUrn (required).
recall_messageRecall a messageB
Recalls (deletes) a message you sent.
Inputs: messageId (required), conversationUrn (required).
rejectReject a planA
Marks a pending plan rejected; nothing executes.
Inputs: planId (required).
remove_connectionRemove a connectionB
Removes a connection by vanity name.
Inputs: vanityName (required).
remove_skillRemove a skillA
Removes a skill by its profile-skill URN and returns the verified skills state.
Inputs: skillUrn (required).
reorder_skillsReorder skillsB
Reorders top skills (newest first) and returns the verified skills state.
Inputs: order (required).
respond_invitationRespond to an invitationB
Accepts, ignores, or withdraws a connection invitation; verified by read-back.
Inputs: action (required), invitationUrn (required).
send_messageSend a messageA
Sends a message in a conversation. Returns the originToken idempotency key — pass it back on a retry so nothing double-sends.
Inputs: text (required), conversationUrn (required), originToken.
session_statusSession statusA
Reports the health of the LinkedIn session (healthy, unhealthy with a reason, or no-session) and whether the server runs read-only.
Inputs: no named parameters.
set_voice_profileSet a voice profileB
Creates or updates the voice profile for a user (tone, vocabulary, emoji, sentence length, stories, notes).
Inputs: userId (required), tone, emoji, notes, +4 more.
show_artifactShow a failure artifactB
Returns a redacted failure artifact (failed request, failed strategies, optional DOM dump).
Inputs: id (required).
update_profileUpdate profileA
Edits headline, about, or top-skills and returns the verified profile (read-back).
Inputs: about, headline, topSkills.
update_registryUpdate the selector registryB
Applies a reviewed selector entry to the runtime overlay — fixes land without a redeploy.
Inputs: selectorId (required), strategies (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 39 tools
Each tool targets a distinct resource and action, with clear separation between posts, comments, reactions, messages, connections, profile editing, skills, session management, and voice profile operations. Even similar-sounding tools like react and react_to_message are clearly differentiated by their target.
The dominant pattern is snake_case verb_noun (create_post, send_message, get_profile), but there are several bare verbs like comment, react, connect, follow, login, plan, approve, and reject, plus non-verb names like session_status and dry_run. The mixed conventions are still readable and not chaotic, but they are inconsistent enough to prevent a higher score.
39 tools is well beyond the 25-tool threshold where a tool set starts to feel heavy. While the domain is broad—covering posts, messaging, connections, profile management, voice, and approval workflows—the sheer count makes it difficult for an agent to efficiently select among many highly specialized operations.
The surface covers core LinkedIn lifecycles well: posts can be created, read, edited, and deleted; messaging has send/recall/history; connections have invite/respond/remove/follow; and profiles support updating, skills management, and endorsements. Minor gaps exist—comments cannot be edited or deleted, reactions cannot be removed, and media/post attachments are unsupported—but these are workable limitations rather than fatal dead ends.
Maintenance
Related MCP Connectors
Full LinkedIn access for AI agents: leads, messaging, and campaigns with activity limits built in.
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
Schedule and publish LinkedIn posts to profiles and company pages from AI agents.
LinkedIn jobs, companies and people for AI agents, plus messages and invites via your own account.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI agents to publish posts, images, comments, and reactions to LinkedIn as the authenticated user, with built-in safety features like daily budgets and deduplication.927 npm1Apache 2.0
- AlicenseAqualityCmaintenanceLets an AI assistant operate LinkedIn through an authenticated browser session, enabling profile management, posting, networking, messaging, job search, and automated applications.10039 npm1MIT
- FlicenseCqualityCmaintenanceEnables an AI agent to drive a real LinkedIn account through a persistent browser session, covering full profile editing, people and content interactions (searching, connecting, messaging, posting, reacting), and job search with step-by-step Easy Apply submissions. It reads data through LinkedIn's internal Voyager API while writing through the actual UI, with a saved answer bank so repeated application questions are resolved automatically.392-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage a LinkedIn account through stealth browser automation, covering profile editing, posting, polls, inbox history, connection management, analytics, and guarded account-boundary operations.MIT