Docs · Model Context Protocol

LinkedIn MCP server

Connect Claude — or any MCP client — to LinkedIn itself: search for people, read a profile, pull someone's posts, walk an account's connections, and read the outreach workspace behind them. One HTTP endpoint, bearer-token auth, and the exact request and response envelopes below.

Endpointhttps://topclozer.com/api/mcp

Updated 2026-09-29 · Server version 2.0.0 · Protocol 2025-06-18

What is the TopClozer LinkedIn MCP server?

TopClozer is a hosted LinkedIn MCP server: one remote endpoint, https://topclozer.com/api/mcp, with 65 tools for Claude, Cursor, ChatGPT, VS Code or any other client that speaks MCP over HTTP. Of those, 43 reach LinkedIn through a LinkedIn account connected to your workspace: 28 read it — people, companies, posts, jobs, profiles, the inbox, the network — and 15 propose an action (an invite, a message, an InMail, a comment, a reaction, a follow, a post) that waits until a person approves it. The other 22 work on the workspace itself, on our server. To connect Claude, create a workspace API key in the app and add the endpoint with that key as a bearer token: one claude mcp add command in Claude Code, or a custom connector in Claude Desktop.

Endpoint
https://topclozer.com/api/mcp
Transport
Streamable HTTP — JSON-RPC 2.0 over HTTP POST with JSON responses. No SSE stream: a GET asking for text/event-stream answers 405. Protocol 2025-06-18 (2025-03-26 and 2024-11-05 also accepted).
Auth
Workspace API key as a bearer token: Authorization: Bearer tcz_live_…. Also accepted: an X-Api-Key header, or ?key= in the URL for clients that accept only a URL. No OAuth.
Tools
65. 43 read LinkedIn through a connected account: search_linkedin_people, get_linkedin_profile, get_linkedin_posts, list_linkedin_connections, get_account_seat, get_my_profile, get_profile_viewers, get_ssi, get_profile_sections, check_reachability, get_company, get_post, list_post_comments, list_post_reactions, get_profile_activity, list_sent_invitations, list_received_invitations, list_followers, list_following, list_conversations, get_conversation, list_recent_messages, search_linkedin_companies, search_linkedin_posts, search_linkedin_jobs, search_linkedin_url, find_company_people, lookup_search_filter, propose_connection_request, propose_message, propose_profile_visit, propose_inmail, propose_reply, propose_withdraw_invitation, propose_accept_invitation, propose_ignore_invitation, propose_follow, propose_unfollow, propose_endorsement, propose_post_reaction, propose_comment, propose_post and propose_message_reaction. 22 work on your workspace: list_sender_accounts, connect_linkedin_account, get_approval, list_approvals, list_do_not_contact, add_do_not_contact, get_usage, list_campaigns, get_stats, list_leads, get_inbox, list_tasks, pause_campaign, search_capabilities, search_products, get_product, install_product, list_installations, list_projects, get_project_context, check_credits and get_platform_usage. Only connect_linkedin_account, propose_connection_request, propose_message, propose_profile_visit, propose_inmail, propose_reply, propose_withdraw_invitation, propose_accept_invitation, propose_ignore_invitation, propose_follow, propose_unfollow, propose_endorsement, propose_post_reaction, propose_comment, propose_post, propose_message_reaction, add_do_not_contact, pause_campaign and install_product change anything, and none of them writes to LinkedIn.
Rate limit
LinkedIn tools: 30 calls per 5 minutes per workspace, then HTTP 429 with Retry-After. Workspace tools are not limited.
Clients
Setup guides for Claude (Claude Code and Claude Desktop), Cursor, ChatGPT and VS Code. Any client that adds a remote MCP server over HTTP works; one that requires SSE or OAuth will not connect.
Price
Free tier ($0) includes the hosted MCP endpoint, with every tool it serves. No LinkedIn account is connected for you. All tiers

What this is

The Model Context Protocol is how an AI client discovers and calls tools on a server it did not ship with. This server puts three things behind that protocol. The first is LinkedIn: the model can search for people matching an ICP, read a profile down to its work history and latest post, pull a member's recent posts and list an account's first-degree connections — each call running through a connected sender account in your workspace, seeing exactly what that account sees. The second is the outreach workspace itself: campaigns and their funnel numbers, lead lists, the unified inbox across every sender, the approval queue, and one tool that pauses a campaign. The third is the catalogue behind it: searching products and capabilities, reading a project's context, checking credits and usage, and recording an installation.

Everything reads except connect_linkedin_account, propose_connection_request, propose_message, propose_profile_visit, propose_inmail, propose_reply, propose_withdraw_invitation, propose_accept_invitation, propose_ignore_invitation, propose_follow, propose_unfollow, propose_endorsement, propose_post_reaction, propose_comment, propose_post, propose_message_reaction, add_do_not_contact, pause_campaign and install_product, and none of those acts on LinkedIn: the propose_* tools queue an invite, a message, a comment, a reaction or a post for a person to approve, and the rest change only this workspace. There is no tool that sends anything on its own, and there is not going to be one — the reasoning is under what it does not do.

It is a real endpoint, not a waitlist. https://topclozer.com/api/mcp answers an unauthenticated GET with what it is and which tools it exposes, so you can check it before wiring credentials:

discovery
curl -s https://topclozer.com/api/mcp

{
  "server": "topclozer-mcp",
  "version": "2.0.0",
  "protocolVersion": "2025-06-18",
  "transport": "http",
  "auth": "Authorization: Bearer <workspace API key>",
  "tools": [
    "search_linkedin_people", "get_linkedin_profile", "get_linkedin_posts",
    "list_linkedin_connections", "get_account_seat", "get_my_profile",
    "get_profile_viewers", "get_ssi", "get_profile_sections",
    "check_reachability", "get_company", "get_post",
    "list_post_comments", "list_post_reactions", "get_profile_activity",
    "list_sent_invitations", "list_received_invitations", "list_followers",
    "list_following", "list_conversations", "get_conversation",
    "list_recent_messages", "search_linkedin_companies", "search_linkedin_posts",
    "search_linkedin_jobs", "search_linkedin_url", "find_company_people",
    "lookup_search_filter", "list_sender_accounts", "connect_linkedin_account",
    "propose_connection_request", "propose_message", "propose_profile_visit",
    "propose_inmail", "propose_reply", "propose_withdraw_invitation",
    "propose_accept_invitation", "propose_ignore_invitation", "propose_follow",
    "propose_unfollow", "propose_endorsement", "propose_post_reaction",
    "propose_comment", "propose_post", "propose_message_reaction",
    "get_approval", "list_approvals", "list_do_not_contact",
    "add_do_not_contact", "get_usage", "list_campaigns",
    "get_stats", "list_leads", "get_inbox",
    "list_tasks", "pause_campaign", "search_capabilities",
    "search_products", "get_product", "install_product",
    "list_installations", "list_projects", "get_project_context",
    "check_credits", "get_platform_usage"
  ],
  …
}

What it can do

65 tools on two surfaces. The 43 LinkedIn tools reach a live session through a connected sender account and share a rate limit; the 22 workspace tools work on our own database — your outreach and your catalogue, projects and credits — and are unlimited. Each name links to its full reference — arguments, response shape, error cases:

Reads LinkedIn

search_linkedin_peopleSearch LinkedIn for people matching an ICP, through a connected sender accountread-only
get_linkedin_profileRead one LinkedIn profile: identity, current role, followers, job-change signal and latest postread-only
get_linkedin_postsRecent posts by a LinkedIn member or company page, newest firstread-only
list_linkedin_connectionsFirst-degree connections of a connected sender accountread-only
get_account_seatWhat the connected LinkedIn seat includes: Premium, Sales Navigator, Recruiter, Open Profile, InMail credits left, company pages it can message asread-only
get_my_profileThe connected account's own LinkedIn profile: name, headline, location, public URL, emailread-only
get_profile_viewersWho viewed the connected account's profile recently, as LinkedIn lists itread-only
get_ssiThe connected account's LinkedIn Social Selling Index: overall score and the four pillarsread-only
get_profile_sectionsOne LinkedIn profile in depth: experience, education, skills (with endorsement ids), languages, certifications, projects, recommendations, contact inforead-only
check_reachabilityBefore reaching out: degree of connection, pending invitation, whether a connection request, a message or an InMail can go to this person — and whether the do-not-contact list or another account of the workspace already covers themread-only
get_companyA LinkedIn company page: description, industry, size, headquarters, followers, website, employee growthread-only
get_postOne LinkedIn post: text, author, reactions, comments, reposts, and whether the account can react or commentread-only
list_post_commentsComments on a LinkedIn post, or replies to one comment — with each commenter's headline and degreeread-only
list_post_reactionsWho reacted to a LinkedIn post (or one of its comments), with each person's headline and degree — the warmest leads a post producesread-only
get_profile_activityWhat a member has been doing on LinkedIn: the comments they wrote or the posts they reacted toread-only
list_sent_invitationsConnection requests the account sent that are still pending — the ones to withdraw before they hurt the accept rateread-only
list_received_invitationsConnection requests the account received and has not answered, with each inviter's headline and noteread-only
list_followersFollowers of the connected account, or of another member or companyread-only
list_followingMembers and pages the connected account followsread-only
list_conversationsThe account's LinkedIn conversations, newest first — classic, Sales Navigator, Recruiter and company-page inboxesread-only
get_conversationOne LinkedIn conversation: who is in it (headline, degree) and its messages, oldest firstread-only
list_recent_messagesThe latest LinkedIn messages across all of the account's conversations, newest firstread-only
search_linkedin_companiesSearch LinkedIn companies by keywords, location, industry and headcount — classic or Sales Navigatorread-only
search_linkedin_postsSearch LinkedIn posts by keywords — the conversations a market is having this weekread-only
search_linkedin_jobsSearch LinkedIn job postings — the companies hiring for a role are the companies with the budgetread-only
search_linkedin_urlRun a search a person built in LinkedIn or Sales Navigator and copied the URL of — people, companies, posts or jobs, filters intactread-only
find_company_peopleThe people at one company who match a role — decision makers, a department, a title — through the account's searchread-only
lookup_search_filterThe ids LinkedIn's typed search filters take, for a name: a location, industry, company, school, job title, skill…read-only

Proposes on LinkedIn — a person approves each one

propose_connection_requestPropose a LinkedIn connection request. It is NOT sent: it waits in the workspace's Approvals queue until a person approves it, then goes out under the account's Smart Limits.writes
propose_messagePropose a LinkedIn message to a 1st-degree connection. It is NOT sent: it waits in Approvals until a person approves (and may edit) it.writes
propose_profile_visitPropose visiting a LinkedIn profile as the account — the person will see it in "Who viewed your profile". NOT done until approved.writes
propose_inmailPropose an InMail to someone outside the account's network. NOT sent: it waits in Approvals. Spends an InMail credit when sent, unless the person has an Open Profile.writes
propose_replyPropose a reply in an existing LinkedIn conversation. NOT sent: it waits in Approvals.writes
propose_withdraw_invitationPropose withdrawing a pending connection request. NOT done until approved. LinkedIn then blocks re-inviting that person for about three weeks.writes
propose_accept_invitationPropose accepting a connection request the account received. NOT done until approved.writes
propose_ignore_invitationPropose ignoring a connection request the account received. NOT done until approved.writes
propose_followPropose following a LinkedIn member — a softer first touch than an invitation. NOT done until approved.writes
propose_unfollowPropose unfollowing a LinkedIn member. NOT done until approved.writes
propose_endorsementPropose endorsing one of a member's skills. NOT done until approved. The person is notified.writes
propose_post_reactionPropose reacting to a LinkedIn post or one of its comments. NOT done until approved.writes
propose_commentPropose a comment on a LinkedIn post, or a reply to a comment on it. NOT posted until approved. Public and permanent.writes
propose_postPropose a post on the account's own feed, optionally scheduled. NOT published until approved — and not before publish_at.writes
propose_message_reactionPropose reacting to a LinkedIn message with an emoji. NOT done until approved.writes

Reads your workspace

list_sender_accountsThe LinkedIn accounts this workspace can act as, with their status, warm-up stage and remaining daily budgetread-only
connect_linkedin_accountConnect a LinkedIn account to this workspace. Returns a sign-in link, valid for 24 hours, for the PERSON to open and sign in to LinkedIn on the provider's hosted page; the account is added when they finish. Give the person the URL. Never ask them for their LinkedIn password, a verification code or a session cookie — they enter those only on that pagewrites
get_approvalThe status of a proposal made with any propose_* tool: pending, approved, sent, rejected, failed or expiredread-only
list_approvalsProposals in this workspace and what became of them: pending, approved, sent, rejected, failed or expiredread-only
list_do_not_contactThe workspace's do-not-contact list: people and companies no account may invite, message or InMailread-only
add_do_not_contactAdd a person or a company to the do-not-contact list. It can only stop outreach, never start it.writes
get_usageHow many LinkedIn tool calls this workspace has made this month, and the rate limit in forceread-only
list_campaignsList all campaigns with performance statsread-only
get_statsGet workspace-wide outreach statsread-only
list_leadsList lead lists and leadsread-only
get_inboxGet unified inbox conversationsread-only
list_tasksList drafts waiting for approvalread-only
pause_campaignPause a campaign by idwrites

Your catalogue, projects and credits

search_capabilitiesSearch what TopClozer products can actually do, and what performs each capability todayread-only
search_productsSearch the TopClozer catalogue by outcome, kind, tier, price, risk or capabilityread-only
get_productOne product in full: capabilities, risk, price, and whether this workspace has bought or installed itread-only
install_productRecord an installation of a product into an AI client or the hosted runner. Writes a row; runs nothing.writes
list_installationsWhat this workspace has installed, where, and what it paid forread-only
list_projectsThe projects in this workspace, with how complete each one's context isread-only
get_project_contextThe reusable company / ICP / offer / voice record an agent should read before it writes anythingread-only
check_creditsThe workspace credit balance and the ledger entries behind itread-only
get_platform_usageWhat this workspace owns and has run: installs, purchases, the hosted seat, credits and the execution ledgerread-only

Quickstart

Two things are needed: a workspace API key (Developer → Create a key (MCP), in the app) and one command. For Claude Code:

claude code
claude mcp add --transport http topclozer https://topclozer.com/api/mcp \
  --header "Authorization: Bearer tcz_live_YOUR_KEY"

Or, to check the endpoint from a shell before involving a client at all:

curl
curl -s https://topclozer.com/api/mcp \
  -H "Authorization: Bearer tcz_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Claude Desktop, the exact config JSON, a first working call and the troubleshooting list live on the Claude setup page.

Authentication

Every call except discovery needs a workspace API key. Keys are minted in the app, shown once, stored only as a SHA-256 hash, and revocable from the same screen. Three ways to present one, in the order the server checks:

  • Authorization: Bearer tcz_live_… — use this one.
  • X-Api-Key: tcz_live_… — for clients that reserve the Authorization header.
  • ?key=tcz_live_… — for clients whose UI accepts a URL and nothing else. It works, but query strings land in access logs, so prefer a header when you have the choice.

A key identifies one workspace; every tool call is scoped to it and cannot see another. An unknown or revoked key gets HTTP 401 with JSON-RPC error -32001 — it never falls back to a browser session, so a stale key fails loudly instead of quietly answering as someone else.

Treat the key like a password

It grants read access to your leads and inbox and the ability to pause campaigns. Put it in your client's config or your environment, not in a repo. If it leaks, revoke it in Settings — revocation takes effect on the next call.

Protocol details

JSON-RPC 2.0 over HTTP POST. Protocol version 2025-06-18 (the 2025-03-26 and 2024-11-05 versions are also accepted during the handshake). Methods implemented:

  • initialize — answered before auth so a client can complete the handshake and surface a clean 401 on the first real call rather than an opaque connection failure.
  • notifications/* — acknowledged with 202 and an empty body. Notifications carry no id and must not be answered with a result.
  • ping — returns an empty result.
  • tools/list — all 65 tools with their input schemas. Requires a key.
  • tools/call — runs one tool. Requires a key.

A call and its envelope:

tools/call
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": { "name": "get_stats", "arguments": {} }
}

// response
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      { "type": "text", "text": "{\n  \"senders\": 4,\n  \"campaigns\": 3,\n  …\n}" }
    ]
  }
}

Tool results come back as MCP content blocks: a single text block whose body is the tool's JSON, pretty-printed. Parse that string; it is not returned as structured content.

Error codes

CodeWhen
-32001No key, or an unknown/revoked key. Sent with HTTP 401.
-32002The workspace has spent its 30 LinkedIn tool calls for the current 5-minute window. Sent with HTTP 429 and a Retry-After header.
-32601Method not found — anything outside the five methods above.
-32000An unexpected failure inside a tool. A failure the caller can act on — no connected account, an unresolvable profile — is not an error at all: it is a normal result carrying isError: true and a sentence explaining what to do.

What it does not do

The short version of the boundary, so nobody installs this expecting the other half:

  • No sending without a person. No tool sends an invite, a message, a reply, a follow or a like by itself. An agent can propose any of them — and an InMail, a comment, a reaction, a profile visit or a post — with the propose_* tools; the proposal waits in the console's Approvals and goes out only after a person approves it, under the account's Smart Limits. The do-not-contact list and the one-person-one-account rule are checked on both sides of the approval. Sending is the irreversible action, and an agent having a bad hour should not be able to burn an account.
  • The LinkedIn tools are rate limited — 30 calls per 5 minutes, per workspace, shared across them and enforced with a 429. An agent retrying in a loop is the request pattern that gets an account restricted; this is the limit that stops the loop reaching LinkedIn.
  • No LinkedIn without an account. The LinkedIn tools need a connected sender account in the workspace. Without one they return a readable error rather than silently returning nothing.
  • No raw LinkedIn requests. Some LinkedIn APIs hand an agent an escape hatch to call any LinkedIn endpoint. This one does not: it would walk around every limit and approval above.
  • No campaign creation or editing, no lead import, no resume — pause is the only change an agent can make to a campaign.
  • No MCP resources or prompts. The server advertises the tools capability only.
  • No SSE stream and no server-initiated notifications. A GET asking for text/event-stream answers 405.
  • No OAuth. Authentication is a workspace API key; there is no authorization-server metadata to discover.
  • No paging or filters on list_leads and get_inbox — they return the full set and you filter client-side.

Where the REST API fits

The REST API is the same product surface for code rather than for a model, and it takes the same key.

The account an agent drives

The install nobody warns you about: the tools operate a workspace, and a workspace only sends from a connected LinkedIn account. Pointing automation at your own profile is against LinkedIn's User Agreement and is the usual way a profile ends up restricted — which is why most teams put a separate account behind the automation.

We do not sell accounts, so there is no pitch here, only the two honest routes: rent a managed verified account when you want it operated and replaced if it goes down, or buy an aged account outright when you want to own it. The trade-offs are laid out on accounts for agents.

Setup, per client

Nothing here is Claude-specific. Any client that can add a remote MCP server over HTTP connects to the same endpoint with the same key — but the config differs enough between them to be worth writing down separately, and each of these was checked against that client's own documentation rather than recalled.

Everything else takes the same endpoint and a way to send the key, and needs no page of its own:

Claude Code
One command: claude mcp add --transport http. Documented on the Claude page.
Claude Desktop
A config block, also on the Claude page.
Windsurf, Zed, Cline, Roo
All take a remote MCP server over HTTP. The Cursor config is the closest template — a url plus an Authorization header.
n8n and Make
Either an MCP client node or a plain HTTP request with the JSON-RPC body from the tool reference. The endpoint does not care which.
Your own agent
JSON-RPC 2.0 over HTTP POST. The envelopes are on the tool reference; there is no SDK to install.

Clients that let you set headers should send Authorization: Bearer; clients whose dialog accepts only a URL can use the ?key= form — ChatGPT is the notable one, and its page explains the trade-off. If your client requires an SSE transport or OAuth, it will not connect; see the limits above.

FAQ

Is there an official LinkedIn MCP server?

LinkedIn does not publish one. What exists are third-party servers sitting in front of a LinkedIn automation product or an unofficial API — this one included, and it is worth knowing that before you wire anything up. What differs between them is mostly what happens to the LinkedIn account. A server that asks you for a session cookie is asking you to point automation at your own profile, which breaks LinkedIn's User Agreement and is the ordinary way a profile ends up restricted. This server runs every LinkedIn call through a sender account connected to your workspace, rate limits those calls, and gives an agent no way to act on LinkedIn by itself: it reads, or it proposes, and a person approves.

Can Claude send LinkedIn messages through this?

Not by itself. Claude can search for people, read their profiles, posts and inbox, and propose an invite, a message, an InMail, a comment or a reaction — every proposal lands in the console's Approvals, and nothing reaches LinkedIn until a person approves it there; it then goes out under the account's Smart Limits. That boundary is deliberate, not a gap we are about to close quietly: sending is the irreversible action, and an agent with a bad hour should not be able to burn an account.

Does this need my own LinkedIn account?

It needs a LinkedIn account for the outreach to send from, and using your personal profile for automated outreach is against LinkedIn's User Agreement and is how profiles get restricted. Most teams connect a separate account instead — rented and managed, or bought outright. We do not sell accounts; the honest options are compared on the accounts-for-agents page.

What are the rate limits?

The LinkedIn tools share a budget of 30 calls per 5 minutes, counted per workspace rather than per key, and spending it returns HTTP 429 with a Retry-After header. One search call returns up to 50 profiles, so the budget stretches further than the number suggests. The workspace tools are not limited — they read our own database. Separately, the sending controls inside the product still govern outbound: a per-sender weekly invite cap, a warm-up ramp for new accounts, a working-hours window in the workspace timezone and a randomised gap between two actions on the same sender. Those apply no matter who or what triggers the outreach, and no tool can raise them.

Is the transport SSE or Streamable HTTP?

It is HTTP POST with a JSON body and a JSON response — the subset of Streamable HTTP that every MCP client supports. There is no SSE stream: a GET with Accept: text/event-stream returns 405, because the server has no server-initiated messages to push. Clients that require a stream will not connect; clients that use plain request/response will.

What does it cost?

The hosted MCP endpoint, with every tool it serves, is in the Free tier, at $0 — there is no separate API charge. The paid tiers are on the pricing page. Plans do not include a LinkedIn account; that is a separate decision, covered on accounts for agents.

Does this scrape LinkedIn?

Not in the sense people usually mean. There is no crawler and no headless browser pretending to be a visitor. Calls go through a LinkedIn account that is connected to your workspace, and they return what that account is able to see — the same data, and the same limits, as the person logged into it. That is why the account matters so much, and why an account with no Sales Navigator seat gets the narrower search.

Next: every other LinkedIn MCP server, compared · the Claude install · the tool reference · pricing