Model Context Protocol

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/mcp
Quickstart

Four 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

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.

read33 / 76

Sees everything. Sends nothing.

write70 / 76

Drafts, lists, edits — all internal.

launch76 / 76

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.

Safeguards

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.

Reference

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.

Campaigns14Show
  • activateCampaignlaunch

    LAUNCH a draft (or paused) campaign: outreach AND lead-magnet types

  • createDraftCampaignwrite

    Create a NEW DRAFT outreach campaign

  • createLeadMagnetCampaignwrite

    Build a DRAFT lead-magnet campaign: hook post + trigger keyword + what to send (a resource…

  • deleteCampaignwrite

    Permanently delete a PAUSED or COMPLETED campaign, including its enrolled leads' progress and…

  • deleteDraftCampaignwrite

    Permanently delete a DRAFT campaign (for example an unwanted draft created by…

  • getCampaignFunnelread

    Get one campaign’s conversion funnel (pass campaign_id from getCampaigns): the stage-by-stage…

  • getCampaignLeadsread

    Per-lead progress for ONE campaign: who accepted, replied, booked, failed (with fail_reason),…

  • getCampaignSenderAccountsread

    List the visitor's connected LinkedIn accounts to choose which one(s) a campaign sends from,…

  • getCampaignSequenceread

    Read ONE campaign's message sequence back in full: every step with its UNTRUNCATED copy (the…

  • getCampaignStatsread

    Find campaigns by name substring (case-insensitive) and return their stats

  • getCampaignsread

    List the workspace's campaigns, paginated: up to 100 per page (default 20) with total,…

  • pauseCampaignwrite

    Pause an ACTIVE campaign

  • updateCampaignwrite

    Edit a LIVE (ACTIVE or PAUSED) campaign

  • updateDraftCampaignwrite

    Edit a DRAFT campaign: rename, change description, swap the lead list, replace sender…

Leads14Show
  • startScrapelaunch

    Start a LinkedIn scrape into a lead list

  • addSearchToLeadListwrite

    Export people matching a Reachium database search into a lead list

  • createLeadListwrite

    Create a new empty lead list in the workspace and return its id for importLeads

  • deleteLeadListwrite

    Permanently delete a lead list and its memberships

  • findLeadsread

    Find specific leads in the workspace: by name or LinkedIn URL (query), by lead list (list_id…

  • getLeadListSampleread

    Sample a lead list to understand who is on it, top companies plus a few headlines, so you can…

  • getLeadListsread

    List the workspace's lead lists with name and lead count

  • getLeadStatsread

    Summarize the visitor's lead totals: exact total plus a breakdown by status / outreach_status…

  • getScrapeJobread

    Check scrape progress

  • importLeadswrite

    Import leads into an existing lead list (lead_list_id from getLeadLists or createLeadList)

  • manageLeadListwrite

    Manage lead lists post-hoc, in four actions

  • removeLeadsFromListwrite

    Remove up to 100 leads from ONE lead list (lead_ids from findLeads)

  • searchDatabaseread

    Search the Reachium people database with human-readable filters: industry/vertical NAMES,…

  • updateLeadwrite

    Update ONE lead: status (new | active | contacted | qualified | lost | unsubscribed), notes,…

Content19Show
  • schedulePostlaunch

    Schedule a saved draft for automatic publishing at an exact future time (ISO-8601, UTC)

  • scheduleSlotlaunch

    Schedule an existing planned/draft content-plan slot for publishing at its PRESET time (from…

  • approvePostwrite

    Mark a finished DRAFT post as 'approved' and bind a LinkedIn account (pass account_id from…

  • attachImageToPostwrite

    Attach an image to a draft, planned, or approved post; refuses scheduled or published posts

  • attachResourceToPostwrite

    Attach an EXISTING document to a post as its lead-magnet resource and mark the post a lead…

  • createDraftPostwrite

    Save a LinkedIn post YOU wrote as a Reachium draft (you author the copy; this only saves it)

  • deleteDraftPostwrite

    Permanently delete a DRAFT, APPROVED, or FAILED post (duplicates, throwaways, dead retries)

  • finalizeAssetwrite

    Second half of the signed-upload flow: validate bytes previously PUT to a requestUploadUrl…

  • getContentread

    Read the visitor's LinkedIn content

  • getPlanSlotsread

    List a plan's OPEN slots (posts still in 'planned' status, up to 50, ordered by…

  • getPostread

    Read ONE post in FULL: the complete body text plus status, type, keyword, bound LinkedIn…

  • getScheduledPostsread

    Read back the publishing calendar: every scheduled (and mid-publish) post in a date window,…

  • getTopPostsread

    Return the visitor's top-performing published posts in a recent window

  • listAssetsread

    The workspace's hosted media library: every asset previously uploaded via uploadAsset,…

  • requestUploadUrlwrite

    Mint a signed HTTP PUT URL so file bytes travel over HTTP instead of through the model

  • revertPostToDraftwrite

    Move a post BACK to draft: approved, scheduled, failed, and stuck-publishing posts all qualify…

  • unschedulePostwrite

    Cancel a SCHEDULED post before it publishes ("cancel that post", "don't send it")

  • updateDraftPostwrite

    Edit an existing draft/planned/approved/scheduled post: replace the body (content), rename it…

  • uploadAssetwrite

    Upload an image and get back a hosted https URL, without touching any post or document

Accounts6Show
  • connectLinkedInAccountwrite

    Connect a brand-new LinkedIn account, or reconnect an existing disconnected one, by minting a…

  • getAccountCapacityread

    Get today’s remaining sending headroom for every LinkedIn account in the workspace: invites…

  • getAccountLimitsread

    Read a LinkedIn account’s daily sending limits (connection requests, messages, reply-agent…

  • getAccountUsageread

    Read today’s send usage (connection invites + messages sent) for every LinkedIn account in the…

  • getLinkedInAccountsread

    List the workspace's connected LinkedIn accounts with status (OK / disconnected / rate-limited…

  • updateAccountLimitswrite

    Update a LinkedIn account’s daily limits and/or its working-hours send window - two…

Documents4Show
  • createDocumentwrite

    Author a NEW Reachium document from markdown YOU write (you write the content; this only saves…

  • deleteDocumentwrite

    Permanently delete a document

  • getDocumentsread

    List the workspace's documents (id, title, status) to pick one for attachResourceToPost or…

  • updateDocumentwrite

    Edit an existing document's title and/or content, replacing whichever field you pass, and/or…

Webhooks4Show
  • createWebhookEndpointwrite

    Create a new outbound webhook endpoint

  • deleteWebhookEndpointwrite

    Permanently delete a webhook endpoint and its delivery history

  • getWebhookEndpointsread

    List the workspace's outbound webhook endpoints, or read one endpoint's recent delivery attempts

  • updateWebhookEndpointwrite

    Edit a webhook endpoint OR run one action on it (never both in the same call)

Conversations4Show
  • sendMessagelaunch

    Send a LinkedIn direct message to a lead who is already a 1st-degree connection of one of this…

  • sendReplylaunch

    Reply to a LinkedIn conversation (pass chat_id from getConversations)

  • getConversationMessagesread

    Read the messages in one LinkedIn conversation (pass chat_id from getConversations)

  • getConversationsread

    List LinkedIn inbox conversations

Workspace11Show
  • generatePlanwrite

    Generate a content plan: creates planned post slots (topic + preset publish time) for the…

  • getBillingStatusread

    Look up the visitor's workspace billing state: plan, trial end date, payment status, agency…

  • getBoostingPoolsread

    List this workspace's boosting pools and its own membership state

  • getBrandProfileread

    Read the workspace's brand profile: company name, industry, target audience, tone of voice,…

  • getCreditBalanceread

    Return the visitor's current credit balance, whether credits are frozen (and the freeze…

  • getPlaybookread

    Reachium's house playbooks: proven knowledge for outreach copywriting, lead-list building,…

  • getWorkspaceInforead

    Look up general info about the visitor's workspace: name, signup date, agency tier label,…

  • getWorkspaceStatsread

    Workspace-wide outreach totals summed across ALL campaigns (no per-campaign cap): requests…

  • manageBoostingPoolwrite

    Manage this workspace's boosting-pool membership

  • manageConnectorwrite

    Manage this workspace's third-party connector integrations (Smartlead, Instantly) and their…

  • upsertBrandProfilewrite

    Update the workspace's brand profile

Limits and errors

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.

MCP endpoint error responses
CodeWhen
401Missing, malformed, revoked or expired key.
429Over 600/min for your IP or 120/min for your key.
405GET — there is no SSE transport. POST only.
400A JSON-RPC batch body. Batching was removed in the 2025-06-18 spec and is rejected.
500Server 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

Alternatives

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