Connect Claude to your LinkedIn CRM with MCP
Swimlane ships an MCP server: point Claude, Cursor or the OpenAI API at your workspace and ask for the work instead of writing the calls. Setup, five real examples, and the guardrails.
By Swimlane 4 min read
An API is a thing you write code against. An MCP server is the same surface handed to an AI assistant, so you describe the outcome and it makes the calls.
Swimlane’s is at https://api.getswimlane.com/mcp. It exposes the whole product as tools — sourcing imports, contacts, lists, tags, pipelines, reminders, campaigns, the background queue and your daily usage — authenticated with the same API token, and rate-limited and logged like any other call.
Setup
Create a token in Settings → API, then register the server with your client. The Settings page prints these snippets with your host already filled in.
Claude Code
claude mcp add --transport http swimlane \
https://api.getswimlane.com/mcp \
--header "Authorization: Bearer wpa_your_token"
Claude Desktop — claude_desktop_config.json
{
"mcpServers": {
"swimlane": {
"type": "http",
"url": "https://api.getswimlane.com/mcp",
"headers": {"Authorization": "Bearer wpa_your_token"}
}
}
}
Cursor — ~/.cursor/mcp.json takes the same mcpServers shape without the type. VS Code — .vscode/mcp.json uses servers instead of mcpServers. OpenAI — a tools[] entry on the Responses API:
{
"type": "mcp",
"server_label": "swimlane",
"server_url": "https://api.getswimlane.com/mcp",
"headers": {"Authorization": "Bearer wpa_your_token"},
"require_approval": "never"
}
Five things worth asking for
These are not hypotheticals — each names the tools the assistant reaches for.
1. Source a list without opening LinkedIn
“Take everyone who commented on this post, put them in a list called Webinar commenters, and keep it filling:
https://www.linkedin.com/posts/…”
One start_import call with source: post_engagement and recurring: true. You get back the list; the contacts arrive over the next few minutes as the background worker scrapes them, and the list keeps topping itself up every couple of hours. Ask “is it done yet?” and it reads list_queue_tasks.
2. The Monday morning question
“What are my campaigns doing, and is anything stuck?”
list_campaigns, then get_campaign_stats on each. If one has gone quiet, the interesting part is what comes next: get_account_usage puts every daily counter next to its ceiling, and list_queue_tasks shows what failed. “Your Acme sequence sent nothing since Tuesday because the daily invitation limit has been at 20/20 each morning” is a better answer than a chart.
3. Draft a sequence and read it back in English
“Draft a three-step sequence for the Engaged with Acme list: invite, wait three days, message the ones who connected, tag the rest.”
list_lists to find the list, create_campaign to open a draft, replace_campaign_steps to lay out the branching tree. The flow rules live in the tool’s own description, so the assistant gets branchKey right rather than inventing a branch that silently ends the sequence.
It stops at the draft. Starting it is a separate tool, which is the point — read the steps in the app first.
4. Find the contacts that can never be messaged
“In the Imported from CSV list, which contacts have no LinkedIn profile? Tag them
needs-profile.”
search_contacts scoped to the list, then it reads linkedinId on each row and set_contact_tags on the ones that are empty. This is the failure that otherwise shows up weeks later as campaign steps quietly landing in failed: without a LinkedIn identity, a contact is a CRM record and nothing else.
5. Reminders in one sentence
“Remind me to follow up with Sofia Marchetti in two weeks about the pricing question.”
search_contacts for Sofia, create_reminder on her record, due in fourteen days. It lands in the app next to the conversation, not in a note you will never reopen.
The guardrails
- Two tools send.
start_campaignandresume_campaignput real invitations and messages in front of real people, from your own LinkedIn account. Their descriptions say so, and they are marked as such so your client can ask before running them. Leave that approval prompt on. - The token is you. It acts as its owner, on that person’s LinkedIn session, inside that person’s workspace — so it never sees a teammate’s campaigns, and the daily limits that protect the account apply exactly as they do in the app.
- Every tool call is an API call. It counts against the 100-per-minute limit and appears in Settings → API with its method, path and status. Nothing an assistant does through the server is invisible to you afterwards.
- Destructive tools are marked. Deleting a contact, a campaign or a recurring import carries the annotation that tells a well-behaved client to confirm first.
- It is read-heavy by design. Most of the catalogue is read-only: search, stats, quotas, queue. The best use of it is answering questions about a workspace you would otherwise click through.
What it does not do
It has no access to your inbox contents. Message templates are part of a campaign, but conversations are not exposed — an assistant can tell you that someone replied, not what they wrote.
There is no notion of “draft this and send it now” either: composing a message to one person still happens in the app, where you can see the thread.
If you would rather write the calls yourself, everything above is plain HTTP too — see what the public API can actually do, or the reference at api.getswimlane.com/docs.