Connect Claude to LinkedIn. Decide what it’s allowed to do.
A LinkedIn MCP server with 76 tools and a permission model. The tool list your model receives is built from your key’s scopes, so a read key delivers 33 tools and the 6 that can reach another person are absent, not hidden.
MCP endpoint
https://app.reachium.io/api/mcpFour minutes, start to first answer.
1. You need three things
A Reachium workspace with a LinkedIn account connected, workspace owner access — that is who can mint keys — and a Claude account. Nothing installs on your machine.
2. Create a key, and pick read
Workspace settings, new MCP key, scope read. This is the only decision here that matters, and you can change it later. Start read-only. You will get more out of it than you expect.
3. Point Claude at the endpoint
In Claude, add a custom connector using the endpoint above. It registers itself over OAuth — no client secret to paste, nobody emails you a credential. In Claude Code it is one line:
claude mcp add --transport http reachium \
https://app.reachium.io/api/mcp \
--header "Authorization: Bearer YOUR_KEY"4. Ask it something a dashboard cannot answer
“Which campaign has the worst reply rate, and what do the replies that did come back have in common?”
That needs the campaign stats, then the actual threads, then a judgement about what those replies share. Three tools, and the part a language model is genuinely good at. With a read key it cannot send a word while it works.
Scopes are the product.
A key carries one scope, and they stack. Read gets 33 tools. Write gets 70. Launch gets all 76.
What matters is how the limit works. The tool list is built from your key’s scopes — not filtered in a UI, not blocked at call time. An out-of-scope tool is absent from the list your model receives. Give Claude a read key and it never sees sendMessage. It cannot decide to try.
Sees everything. Sends nothing.
Drafts, lists, edits — all internal.
Adds the 6 that reach a person.
The dark segment is the entire difference between write and launch: sendMessage, sendReply, activateCampaign, schedulePost, scheduleSlot, startScrape.
So a read key’s worst case is a wrong answer. A launch key’s worst case is a badly worded message reaching a real person. That is a smaller blast radius, not zero. Scope accordingly.
Scope is a decision you make once. These run every time.
The fair objection to a scope model is that you choose it at key creation and then forget it — and anyone using this for outreach will eventually issue a launch key. So there are two more layers underneath, and they run on the server on every call.
Layer 1
Nothing launches on the first call
The first call to a launch tool does not execute. It returns a plain-English preview of what would happen, plus a short-lived, args-bound token. Only a second call carrying a matching token runs, and the token dies after 5 minutes.
There is a per-key setting that skips this. It applies to the REST surface only — on MCP it is false by construction, because the MCP endpoint never sets the flag that would enable it. Not a per-tool check somebody could forget. A client cannot switch it on, and neither can a prompt.
Layer 2
Hard daily ceilings
Per-workspace caps on every launch action, reserved between validation and the mutation — so a call that fails validation never costs you a slot.
- Scheduling a post
- 75/day
- Replies, metered per LinkedIn account
- 50/day
- New DMs to first-degree leads
- 50/day
- Pausing a campaign
- 50/day
- Starting a scrape
- 40/day
- Activating a campaign
- 25/day
Write tools carry their own ceilings — createDraftPost at 200 a day, updateDraftPost at 500 — counted as attempts, so a loop that keeps failing is throttled too.
Every call is logged
One row per tool call, whether it succeeded or not: workspace_id, key_id, tool, scope, args_keys, target_ids, ok, surface.
So “an agent sent 200 DMs — who authorised that?” has an answer: the key id, and the person it belongs to. The recorded target ids come from the validated arguments rather than the raw request body, so the log reflects what the tool actually operated on.
Read it straight: these are tripwires against a runaway agent, not a promise that nothing can go wrong. A launch key can start a campaign. That is what a launch key is for.
All 76 tools.
Grouped by what they act on, with the scope each one needs. Counts measured against the live server on 17 September 2026. Free to quote with attribution.
Campaigns14ShowHide
activateCampaignlaunchLAUNCH a draft (or paused) campaign: outreach AND lead-magnet types
createDraftCampaignwriteCreate a NEW DRAFT outreach campaign
createLeadMagnetCampaignwriteBuild a DRAFT lead-magnet campaign: hook post + trigger keyword + what to send (a resource…
deleteCampaignwritePermanently delete a PAUSED or COMPLETED campaign, including its enrolled leads' progress and…
deleteDraftCampaignwritePermanently delete a DRAFT campaign (for example an unwanted draft created by…
getCampaignFunnelreadGet one campaign’s conversion funnel (pass campaign_id from getCampaigns): the stage-by-stage…
getCampaignLeadsreadPer-lead progress for ONE campaign: who accepted, replied, booked, failed (with fail_reason),…
getCampaignSenderAccountsreadList the visitor's connected LinkedIn accounts to choose which one(s) a campaign sends from,…
getCampaignSequencereadRead ONE campaign's message sequence back in full: every step with its UNTRUNCATED copy (the…
getCampaignStatsreadFind campaigns by name substring (case-insensitive) and return their stats
getCampaignsreadList the workspace's campaigns, paginated: up to 100 per page (default 20) with total,…
pauseCampaignwritePause an ACTIVE campaign
updateCampaignwriteEdit a LIVE (ACTIVE or PAUSED) campaign
updateDraftCampaignwriteEdit a DRAFT campaign: rename, change description, swap the lead list, replace sender…
Leads14ShowHide
startScrapelaunchStart a LinkedIn scrape into a lead list
addSearchToLeadListwriteExport people matching a Reachium database search into a lead list
createLeadListwriteCreate a new empty lead list in the workspace and return its id for importLeads
deleteLeadListwritePermanently delete a lead list and its memberships
findLeadsreadFind specific leads in the workspace: by name or LinkedIn URL (query), by lead list (list_id…
getLeadListSamplereadSample a lead list to understand who is on it, top companies plus a few headlines, so you can…
getLeadListsreadList the workspace's lead lists with name and lead count
getLeadStatsreadSummarize the visitor's lead totals: exact total plus a breakdown by status / outreach_status…
getScrapeJobreadCheck scrape progress
importLeadswriteImport leads into an existing lead list (lead_list_id from getLeadLists or createLeadList)
manageLeadListwriteManage lead lists post-hoc, in four actions
removeLeadsFromListwriteRemove up to 100 leads from ONE lead list (lead_ids from findLeads)
searchDatabasereadSearch the Reachium people database with human-readable filters: industry/vertical NAMES,…
updateLeadwriteUpdate ONE lead: status (new | active | contacted | qualified | lost | unsubscribed), notes,…
Content19ShowHide
schedulePostlaunchSchedule a saved draft for automatic publishing at an exact future time (ISO-8601, UTC)
scheduleSlotlaunchSchedule an existing planned/draft content-plan slot for publishing at its PRESET time (from…
approvePostwriteMark a finished DRAFT post as 'approved' and bind a LinkedIn account (pass account_id from…
attachImageToPostwriteAttach an image to a draft, planned, or approved post; refuses scheduled or published posts
attachResourceToPostwriteAttach an EXISTING document to a post as its lead-magnet resource and mark the post a lead…
createDraftPostwriteSave a LinkedIn post YOU wrote as a Reachium draft (you author the copy; this only saves it)
deleteDraftPostwritePermanently delete a DRAFT, APPROVED, or FAILED post (duplicates, throwaways, dead retries)
finalizeAssetwriteSecond half of the signed-upload flow: validate bytes previously PUT to a requestUploadUrl…
getContentreadRead the visitor's LinkedIn content
getPlanSlotsreadList a plan's OPEN slots (posts still in 'planned' status, up to 50, ordered by…
getPostreadRead ONE post in FULL: the complete body text plus status, type, keyword, bound LinkedIn…
getScheduledPostsreadRead back the publishing calendar: every scheduled (and mid-publish) post in a date window,…
getTopPostsreadReturn the visitor's top-performing published posts in a recent window
listAssetsreadThe workspace's hosted media library: every asset previously uploaded via uploadAsset,…
requestUploadUrlwriteMint a signed HTTP PUT URL so file bytes travel over HTTP instead of through the model
revertPostToDraftwriteMove a post BACK to draft: approved, scheduled, failed, and stuck-publishing posts all qualify…
unschedulePostwriteCancel a SCHEDULED post before it publishes ("cancel that post", "don't send it")
updateDraftPostwriteEdit an existing draft/planned/approved/scheduled post: replace the body (content), rename it…
uploadAssetwriteUpload an image and get back a hosted https URL, without touching any post or document
Accounts6ShowHide
connectLinkedInAccountwriteConnect a brand-new LinkedIn account, or reconnect an existing disconnected one, by minting a…
getAccountCapacityreadGet today’s remaining sending headroom for every LinkedIn account in the workspace: invites…
getAccountLimitsreadRead a LinkedIn account’s daily sending limits (connection requests, messages, reply-agent…
getAccountUsagereadRead today’s send usage (connection invites + messages sent) for every LinkedIn account in the…
getLinkedInAccountsreadList the workspace's connected LinkedIn accounts with status (OK / disconnected / rate-limited…
updateAccountLimitswriteUpdate a LinkedIn account’s daily limits and/or its working-hours send window - two…
Documents4ShowHide
createDocumentwriteAuthor a NEW Reachium document from markdown YOU write (you write the content; this only saves…
deleteDocumentwritePermanently delete a document
getDocumentsreadList the workspace's documents (id, title, status) to pick one for attachResourceToPost or…
updateDocumentwriteEdit an existing document's title and/or content, replacing whichever field you pass, and/or…
Webhooks4ShowHide
createWebhookEndpointwriteCreate a new outbound webhook endpoint
deleteWebhookEndpointwritePermanently delete a webhook endpoint and its delivery history
getWebhookEndpointsreadList the workspace's outbound webhook endpoints, or read one endpoint's recent delivery attempts
updateWebhookEndpointwriteEdit a webhook endpoint OR run one action on it (never both in the same call)
Conversations4ShowHide
sendMessagelaunchSend a LinkedIn direct message to a lead who is already a 1st-degree connection of one of this…
sendReplylaunchReply to a LinkedIn conversation (pass chat_id from getConversations)
getConversationMessagesreadRead the messages in one LinkedIn conversation (pass chat_id from getConversations)
getConversationsreadList LinkedIn inbox conversations
Workspace11ShowHide
generatePlanwriteGenerate a content plan: creates planned post slots (topic + preset publish time) for the…
getBillingStatusreadLook up the visitor's workspace billing state: plan, trial end date, payment status, agency…
getBoostingPoolsreadList this workspace's boosting pools and its own membership state
getBrandProfilereadRead the workspace's brand profile: company name, industry, target audience, tone of voice,…
getCreditBalancereadReturn the visitor's current credit balance, whether credits are frozen (and the freeze…
getPlaybookreadReachium's house playbooks: proven knowledge for outreach copywriting, lead-list building,…
getWorkspaceInforeadLook up general info about the visitor's workspace: name, signup date, agency tier label,…
getWorkspaceStatsreadWorkspace-wide outreach totals summed across ALL campaigns (no per-campaign cap): requests…
manageBoostingPoolwriteManage this workspace's boosting-pool membership
manageConnectorwriteManage this workspace's third-party connector integrations (Smartlead, Instantly) and their…
upsertBrandProfilewriteUpdate the workspace's brand profile
What you will hit, and what it says.
600 requests a minute per IP, 120 per key. The REST API shares the same buckets — one key, one ceiling, across both fronts.
| Code | When |
|---|---|
| 401 | Missing, malformed, revoked or expired key. |
| 429 | Over 600/min for your IP or 120/min for your key. |
| 405 | GET — there is no SSE transport. POST only. |
| 400 | A JSON-RPC batch body. Batching was removed in the 2025-06-18 spec and is rejected. |
| 500 | Server error. Nothing was executed. |
Mutations are billing-gated at call time rather than at key creation, so a workspace that lapses stops writing immediately and the agent is told why instead of failing silently.
Connecting
OAuth 2.1 with Dynamic Client Registration (RFC 7591) and PKCE S256, discoverable at /.well-known/oauth-authorization-server — or a workspace key as a bearer token. Scopes: read, write, launch, offline_access.
- Claude and Claude Code — OAuth 2.1, or a bearer key.
- Cursor, Cline, Goose — Any client speaking streamable HTTP.
Or skip the agent entirely
The REST API covers 98 operations across 94 paths, described by a published OpenAPI 3.1.0 document. Same keys, same scopes, same rate limits. openapi.json
Does LinkedIn have an MCP server?
No. As of 17 September 2026, LinkedIn does not publish or operate an MCP server, and LinkedIn is not in Anthropic’s connectors directory the way Slack or Notion are. Every LinkedIn MCP server that exists is third-party, and they come in two kinds.
The first runs on your machine and drives a logged-in browser session. The best known is stickerdaniel/linkedin-mcp-server — around 20 tools, well documented, free, and straight in its own README that automating your session can get your account restricted. It has no permission model: whatever it can do, the model can do. If you want to pull a few profiles into a script on a Tuesday, read that repo first. Genuinely.
The second is a product that already holds a LinkedIn connection server-side and exposes it over MCP. This is one of those. You get a remote authenticated endpoint, scoped and revocable keys, server-side caps and an audit log. You also get a bill and a vendor in the middle.
One thing worth being straight about: nobody in either camp has official LinkedIn API access. Reachium reaches LinkedIn through Unipile, which is not a LinkedIn partner and works through your own account session. Anyone telling you their access is sanctioned is selling you something. Choose on permission model and failure modes, not on claimed blessing.
FAQ
- Does LinkedIn have an official MCP server?
- No. LinkedIn does not publish or operate one, and is not listed in Anthropic's connectors directory. Every LinkedIn MCP server available today is third-party — either an open-source server driving a logged-in browser session on your own machine, or a hosted product like this one.
- Can Claude run my LinkedIn outreach for me?
- Within limits you set. Connect Claude or Claude Code to https://app.reachium.io/api/mcp and it can build campaigns, search leads, draft and schedule posts and read your inbox — 76 tools in total. Sending is gated separately: 6 tools can reach a person, they require the launch scope, and on MCP the first call to any of them returns a preview instead of executing.
- Can an AI send LinkedIn messages without my approval?
- Only with a launch key, and not on the first call. Launch tools return a preview and a 5-minute token; only a second call carrying a matching token executes. With a read key the 6 sending tools are absent from the tool list entirely, so there is nothing to approve or decline.
- Will using an MCP server get my LinkedIn account restricted?
- Nobody can promise it will not, and you should distrust anyone who does. Reachium reaches LinkedIn through Unipile, which is not a LinkedIn partner and works through your own account session. What is enforced server-side: LinkedIn's sending limits, plus daily ceilings on every launch action that an agent cannot raise by asking.
- How is this different from the open-source LinkedIn MCP server?
- That one runs locally, drives a logged-in browser session, and exposes every tool on every call with no permission model. This is a hosted endpoint with OAuth 2.1, three cumulative scopes, preview-and-confirm on launch actions, daily caps and a per-call audit log. A different trade, not a compliance claim.
- Does the LinkedIn MCP server work with ChatGPT?
- Not yet. The ChatGPT connector is limited to pilot workspaces. Claude, Claude Code and any client speaking streamable HTTP connect today at https://app.reachium.io/api/mcp.
Getting a key
A workspace owner creates one in settings, and can revoke it there at any time. See plans