EN
LinkedInLinkedIn MCP Server

LinkedIn MCP Server: build LinkedIn features into your product with an AI coding agent

Give Codex, Cursor, Claude Code or Gemini CLI an agent that understands the Unipile LinkedIn API. It reads the endpoints, writes messaging, profile search, invitations, Sales Navigator and Recruiter features into your project, and tests them on a Development application, through the hosted Unipile MCP server.
Codex
Cursor
Claude Code
Gemini CLI
Windsurf
Any MCP client
Start with a Development application. 7-day free trial, no credit card.
Your coding agent
Unipile MCP connected
Sarah
Add LinkedIn messaging and Sales Navigator search to my ATS. Recruiters connect their own LinkedIn account from Settings.
Read endpointPOST /v2/auth/linkschema loaded
Added POST /api/accounts/connect on the backend: it creates the hosted auth link and returns the URL. The Settings page opens it and stores the account ID on the recruiter.
3 files changed · tested on the Development app
Now the Sales Navigator search on the candidate sourcing page.
Run requestPOST /v2/{account_id}/linkedin/sales-navigator/search/people200 OK
Writing the search service
Describe the next feature…
The short answer

Does LinkedIn have an official MCP server?

No. LinkedIn does not publish a Model Context Protocol server, and its developer program does not open messaging, search or Recruiter to third-party products. The Unipile MCP server is a hosted third-party server generated from the Unipile API: your coding agent reads the LinkedIn endpoints and writes the integration into your product, where each user connects their own LinkedIn account through Hosted Auth and your code acts on behalf of that authenticated user.

The server URL

LinkedIn MCP server URLLive
https://developer.unipile.com/mcp?branch=v2.0
AuthHeader X-API-KEY with a scoped Account API key, over streamable HTTP. One URL for LinkedIn and eight other channels.
AccountsYour Development application's test accounts while you build; in production, the LinkedIn account each user connected through Hosted Auth.
ClientsCodex, Cursor, Claude Code, Gemini CLI, Windsurf, or any MCP client over streamable HTTP.

How one prompt becomes code in your project

1
You describe the featureAdd LinkedIn people search to the sourcing page, then retrieve the selected profile.
2
The agent reads the LinkedIn endpoints
Read endpointPOST /v2/{account_id}/linkedin/search/peopleschema loaded
3
It writes the code and tests it on your Development applicationAdded searchPeople() and getProfile() in linkedin.service.ts, wired to the sourcing page. Ran both on the Development app: 25 results, profile opened.
The whole Unipile API, readable by your coding agent
Prompts, not glue code

What your coding agent builds on LinkedIn

Pick an integration job. Each transcript shows the prompt you give the agent, the LinkedIn endpoints it reads and runs through the Unipile MCP server, and what lands in your project. Paths are complete, on the API base URL https://api.unipile.com, with a scoped key in the X-API-KEY header.
Cursor · ats-appDevelopment app
Sync each recruiter's LinkedIn inbox into my ATS and let them reply from the candidate page, InMail included.
Search endpoints"chats messages send"3 matches
Run requestGET /v2/{account_id}/chats12 chats
Created linkedin/inbox-sync.ts (chats and messages upserted on the candidate, cursor pagination) and POST /candidates/:id/reply, which calls the send route with the chat's own account ID. Ran the sync on the Development app: 12 chats, 87 messages imported.3 files changed · tested on the Development app

A LinkedIn inbox inside your product, from one prompt

The agent reads the chat and message contracts, writes the sync job and the reply endpoint in your stack, and runs the first requests on your Development application. InMail goes through the same routes when the connected account has a Recruiter or Sales Navigator seat.
Endpoints the agent uses
GET/v2/{account_id}/chatsGET/v2/{account_id}/chats/{chat_id}/messagesPOST/v2/{account_id}/chats/{chat_id}/messages/send
Common mistake: Mixing IDs. A message is always sent on the account that owns the chat; keep account_id and chat_id together from the list call to the send call.
LinkedIn messaging API guide
Claude Code · crm-appDevelopment app
Implement Unipile Hosted Auth so each user connects their own LinkedIn account from Settings, and store the account ID on the user.
Read endpointPOST /v2/auth/linkschema loaded
Run requestPOST /v2/auth/link201 · link
Added POST /api/accounts/connect on the backend: it creates the auth link with your key and returns the hosted URL. The Settings button opens it, and the callback stores the new account_id on the user. Verified on the Development app with a test LinkedIn account.4 files changed · connect flow tested end to end

Your users connect their own LinkedIn account, your app gets an account ID

Hosted Auth is the page Unipile serves to your users so they link their LinkedIn Classic, Recruiter or Sales Navigator account themselves. The agent wires the link creation on your backend, the redirect on your frontend and the storage of the account ID, which every later LinkedIn request needs.
Endpoints the agent uses
POST/v2/auth/linkGET/v2/accounts/{account_id}POST/v2/auth/checkpoint
Common mistake: Creating the auth link from the browser. The link is created on your server with your key; the frontend only receives the hosted URL.
Implement Hosted Auth with an agent
Codex · sourcing-appDevelopment app
Add LinkedIn people search to the sourcing page with the classic filters, then retrieve the selected profile.
Read endpointPOST /v2/{account_id}/linkedin/search/peopleschema loaded
Run requestGET /v2/{account_id}/users/{user_id}200 OK
Added searchPeople(filters) and getProfile(id) in linkedin.service.ts, the results grid with the API's pagination cursor, and the profile drawer. Tested on the Development app: 25 results, profile opened with headline, location and current company.4 files changed · tested on the Development app

Search with LinkedIn's own filters, then read the profile

People, company, post and job searches use the filters the user already has on LinkedIn. The agent reads the search parameters route to build the filter form, calls the search once, and fetches only the profile the user opens. Results are what the authenticated user can see from their own session.
Endpoints the agent uses
GET/v2/{account_id}/linkedin/search/parametersPOST/v2/{account_id}/linkedin/search/peopleGET/v2/{account_id}/users/{user_id}
Common mistake: Fetching every profile of a results page. Show the search results, then call the profile route only for the one the user opens.
LinkedIn profile API guide
Cursor · ats-appDevelopment app
Let recruiters send a connection request with a note from the candidate page, and show their pending invitations.
Read endpointPOST /v2/{account_id}/users/me/relation-requestsschema loaded
Run requestGET /v2/{account_id}/users/me/relation-requests7 pending
Added POST /candidates/:id/invite (calls the relation request route with the note, 300 characters max) and the pending invitations list on the recruiter dashboard. Quota errors from the API are shown to the recruiter instead of retried. Tested on the Development app.3 files changed · tested on the Development app

Invitations from the user's account, inside LinkedIn's weekly quota

Connection requests, follows, pending and accepted invitations: the network routes act on the account the user connected and stay within the quota LinkedIn applies to that account. Your product exposes them as user actions, one request at a time.
Endpoints the agent uses
POST/v2/{account_id}/users/me/relation-requestsGET/v2/{account_id}/users/me/relation-requestsGET/v2/{account_id}/users/{user_id}/relations
Common mistake: Retrying an invitation on a quota error. Surface the limit to the user; the quota is LinkedIn's, per account and per week.
LinkedIn API: invitations and networking
Gemini CLI · prospecting-appDevelopment app
Add Sales Navigator lead search to the prospecting page and let the user save results to one of their lead lists.
Run requestGET /v2/{account_id}/linkedin/sales-navigator/search/parametersfilters
Run requestPOST /v2/{account_id}/linkedin/sales-navigator/search/people143 leads
Built the filter form from the search parameters route, the lead search with cursor pagination, and "Save to list" on the lead-lists save route. The page checks the account's contracts first and hides the feature when no Sales Navigator seat is found. Tested on the Development app.5 files changed · tested on the Development app

Sales Navigator search and lead lists, on the user's own seat

Lead and account searches with the full Sales Navigator filter set, saved lead lists and account lists. The feature works with the seat the user connected: their filters, their lists, their InMail credits. No browser session, no extension, the same server URL.
Endpoints the agent uses
GET/v2/{account_id}/linkedin/sales-navigator/search/parametersPOST/v2/{account_id}/linkedin/sales-navigator/search/peoplePOST/v2/{account_id}/linkedin/sales-navigator/lead-lists/{list_id}/save
Common mistake: Assuming every LinkedIn account has a seat. List the contracts with GET /v2/{account_id}/linkedin/contracts first, and select one when there are several.
Sales Navigator API guide
Claude Code · ats-appDevelopment app
Sync our Recruiter projects and pipelines into the ATS, and check job slot credits before publishing a posting.
Run requestGET /v2/{account_id}/linkedin/recruiter/projectsproject list
Run requestPOST /v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipeline34 candidates
Added the Recruiter sync job (projects, pipeline stages and candidates upserted on the ATS), the job slots credits check before publish, and contract selection when the account has several. Tested on the Development app with a Recruiter test contract.5 files changed · tested on the Development app

Recruiter projects, pipelines and job postings in your ATS

Projects, pipeline candidates, talent pool search, applicants and resumes, job postings and job slot credits: the Recruiter routes answer on the contract the user selected. An ATS gets the whole Recruiter surface without a Recruiter-specific integration.
Endpoints the agent uses
GET/v2/{account_id}/linkedin/recruiter/projectsPOST/v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipelineGET/v2/{account_id}/linkedin/recruiter/job-slots-credits
Common mistake: Calling Recruiter routes on a Classic account. They answer only on a Recruiter contract; check GET /v2/{account_id}/linkedin/contracts before showing the feature.
Recruiter search API guide
Real routes, complete paths

What the server exposes for LinkedIn

The server exposes the Unipile API itself, so what your coding agent can build on LinkedIn is what the API does, not a reduced list. On a connected LinkedIn account, 119 of the 179 operations apply, grouped below with a build prompt for each family. An operation is one HTTP method on one path of the Unipile API v2. Paths below are complete, on the API base URL https://api.unipile.com, with the scoped key in the X-API-KEY header.
119operations usable on a LinkedIn account, out of 179 in the API
3LinkedIn account types: Classic, Recruiter, Sales Navigator
1server URL and one scoped key, for LinkedIn and the eight other channels
0endpoints to guess: the agent reads the exact schema before it writes code
25 operations
Messages and conversations List the inbox, read a thread, start a chat, send, forward or react. InMail goes through the same routes on a Recruiter or Sales Navigator seat.
GET/v2/{account_id}/chats
GET/v2/{account_id}/chats/{chat_id}/messages
POST/v2/{account_id}/chats/{chat_id}/messages/send
"Sync the LinkedIn inbox into the candidate timeline and add a reply box."
14 operations
Profiles, invitations, network Read a profile, send or accept a connection request, list pending invitations, followers and relations, follow a member.
GET/v2/{account_id}/users/{user_id}
POST/v2/{account_id}/users/me/relation-requests
GET/v2/{account_id}/users/{user_id}/relations
"Show the sender's profile next to each conversation, with the connection status."
6 operations
LinkedIn search People, companies, posts and jobs search with the classic LinkedIn filters, or from a LinkedIn search URL the user already built.
POST/v2/{account_id}/linkedin/search/people
POST/v2/{account_id}/linkedin/search/companies
GET/v2/{account_id}/linkedin/search/parameters
"Add a people search with the classic LinkedIn filters to the sourcing page."
20 operations
Posts, comments, reactions List a member's posts, read comments and reactions, publish a post, comment or reply from the connected account.
GET/v2/{account_id}/users/{user_id}/posts
GET/v2/{account_id}/posts/{post_id}/comments
POST/v2/{account_id}/posts
"List the comments on the user's last post and let them reply from the app."
10 operations
Sales Navigator Lead and account searches with Sales Navigator filters, saved lead lists and account lists, on the user's own Sales Navigator seat.
POST/v2/{account_id}/linkedin/sales-navigator/search/people
GET/v2/{account_id}/linkedin/sales-navigator/lead-lists
POST/v2/{account_id}/linkedin/sales-navigator/lead-lists/{list_id}/save
"Add Sales Navigator lead search and save results to the user's lead lists."
25 operations
Recruiter Projects, talent pool search, pipelines, saved candidates, applicants and their resumes, job postings from a Recruiter contract.
GET/v2/{account_id}/linkedin/recruiter/projects
POST/v2/{account_id}/linkedin/recruiter/search/people
POST/v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipeline
"Sync Recruiter projects and pipeline candidates into the ATS."
10 operations
Job postings Create, edit, publish and close job postings, check the budget, list applicants and read their resumes, from the user's LinkedIn account.
GET/v2/{account_id}/linkedin/jobs
POST/v2/{account_id}/linkedin/jobs/{job_id}/applicants
POST/v2/{account_id}/linkedin/jobs/{job_id}/publish
"Show applicants and resumes for each job posting on the ATS job page."
9 operations
Company pages and account Company profiles, the pages the user manages, InMail credits, Recruiter contracts, skill endorsements, and a passthrough for any other LinkedIn call.
GET/v2/{account_id}/linkedin/company/{company_id}
GET/v2/{account_id}/linkedin/inmail-credits
GET/v2/{account_id}/linkedin/company/pages
"Display the account's InMail credits and contracts on the Settings page."
One complete request, exactly as the agent runs it
POSThttps://api.unipile.com/v2/{account_id}/chats/{chat_id}/messages/sendX-API-KEY: your-scoped-api-key200 OK
The server follows every Unipile API release, so a new LinkedIn route reaches your agent the day it ships. In production your product calls the same routes on the account each user connected through Hosted Auth, as user actions in your UI. Same routes as the Unipile LinkedIn API, in the code the agent writes or through the official SDKs.·API reference
LinkedInSeats and contracts

Sales Navigator MCP and Recruiter MCP, on the same server

LinkedIn publishes no Sales Navigator MCP server and no Recruiter MCP server, and most LinkedIn MCP servers stop at the classic profile. The Unipile server exposes the Sales Navigator and Recruiter routes of the LinkedIn API to your coding agent, so a prospecting or sourcing feature ships with the seat or contract the connected account already has. No browser session, no extension, the same server URL.
Sales Navigator10 routes + contracts + InMail
Lead and account searches with the full Sales Navigator filter set, searches from a Sales Navigator URL the user already built, saved lead lists and account lists. Your feature works with the user's lists, their filters and their InMail credits. What the seat unlocks
People and company searches with Sales Navigator filtersPOST /v2/{account_id}/linkedin/sales-navigator/search/peoplePOST /v2/{account_id}/linkedin/sales-navigator/search/companiesPOST /v2/{account_id}/linkedin/sales-navigator/search (from a Sales Navigator URL)
Lead lists and account lists: browse and saveGET /v2/{account_id}/linkedin/sales-navigator/lead-listsPOST /v2/{account_id}/linkedin/sales-navigator/lead-lists/{list_id}POST /v2/{account_id}/linkedin/sales-navigator/lead-lists/{list_id}/saveGET /v2/{account_id}/linkedin/sales-navigator/account-lists
Search parameters and InMail creditsGET /v2/{account_id}/linkedin/sales-navigator/search/parametersGET /v2/{account_id}/linkedin/inmail-credits
Requires a Sales Navigator seat on the connected LinkedIn account. Without it, the account answers on the classic search and messaging routes only. "Add a lead list browser to the prospecting page and flag leads who changed jobs." Sales Navigator MCP: the full page Sales Navigator API guide
Recruiter25 routes
Projects, pipelines, saved candidates, talent pool search, applicants and their resumes, job postings and job slot credits. An ATS gets the whole Recruiter surface without a Recruiter-specific integration. What the contract unlocks
Projects and pipelines: list, create, edit, save a candidateGET /v2/{account_id}/linkedin/recruiter/projectsPOST /v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipelinePOST /v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipeline/candidate/save
Recruiter people search, from filters or from a Recruiter URLPOST /v2/{account_id}/linkedin/recruiter/search/peoplePOST /v2/{account_id}/linkedin/recruiter/search (from a Recruiter URL)POST /v2/{account_id}/linkedin/recruiter/projects/{project_id}/talent-pool/search
Applicants, resumes, job postings and job slot creditsPOST /v2/{account_id}/linkedin/recruiter/projects/{project_id}/talent-pool/applicantsGET /v2/{account_id}/linkedin/recruiter/projects/{project_id}/talent-pool/applicants/{applicant_profile_id}/resumeGET /v2/{account_id}/linkedin/recruiter/jobsGET /v2/{account_id}/linkedin/recruiter/job-slots-credits
Requires a Recruiter contract on the connected account. If the account has several contracts, your code lists them with GET /v2/{account_id}/linkedin/contracts and selects one with POST /v2/{account_id}/linkedin/contracts/{contract_id}/select. "Add talent pool search to the ATS and let recruiters save candidates to a project." LinkedIn Recruiter MCP: the full page Recruiter search API guide
Access follows the subscription of the connected account. A Classic account gets messaging, profiles, invitations, posts and classic search. A Sales Navigator seat adds the lead and account routes. A Recruiter contract adds the project and pipeline routes. All paths are on https://api.unipile.com, and your code can check what the account has with GET /v2/{account_id}/linkedin/contracts.
Quick start

Add it to your coding agent in one line

There is no separate LinkedIn server to install: the hosted Unipile MCP server covers LinkedIn under the same URL as every other channel. Point your coding agent at it with a scoped API key, and it reads the LinkedIn endpoints and runs requests against your Development application. The snippets below are the ones from the official documentation.
Cursor~/.cursor/mcp.json
Claude Codeclaude mcp add --transport http …
Codex CLI and IDE extension~/.codex/config.toml
Gemini CLI~/.gemini/settings.json
Windsurf~/.codeium/windsurf/mcp_config.json
~/.cursor/mcp.json
# Register the hosted Unipile MCP server in Claude Code claude mcp add --transport http --scope user \ unipile "https://developer.unipile.com/mcp?branch=v2.0" \ --header "X-API-KEY: your-scoped-api-key" # Verify the connection, or type /mcp inside a session claude mcp list
{ "mcpServers": { "unipile": { "url": "https://developer.unipile.com/mcp?branch=v2.0", "headers": { "X-API-KEY": "your-scoped-api-key" } } } }
{ "mcpServers": { "unipile": { "url": "https://developer.unipile.com/mcp?branch=v2.0", "headers": { "X-API-KEY": "your-scoped-api-key" } } } }
# Codex CLI and the Codex IDE extension share this file [mcp_servers.unipile] url = "https://developer.unipile.com/mcp?branch=v2.0" http_headers = { X-API-KEY = "your-scoped-api-key" } # Verify: codex mcp list
{ "mcpServers": { "unipile": { "httpUrl": "https://developer.unipile.com/mcp?branch=v2.0", "headers": { "X-API-KEY": "your-scoped-api-key" } } } } # Verify: /mcp inside Gemini CLI
Server connected. Try: "Add LinkedIn people search to the sourcing page, then retrieve the selected profile."
1
Start with a Development applicationIn the Unipile dashboard, work in your Development application: connect a test LinkedIn account through Hosted Auth, create a Scope with it and a scoped Account API key for that Scope. Production stays untouched, and an MCP client never gets a global or Service key.
2
Add the server to your coding agentPaste the config for your client, with the scoped key in the X-API-KEY header. Restart the client if it does not pick it up right away.
3
Describe the feature, review the codeDescribe the LinkedIn feature you need. The agent reads the endpoints, writes the code in your project and runs requests on the Development app. Switch the key to Production when the flow passes.
On behalf of the user

Whose LinkedIn account does your integration act on?

While you build, on the test accounts of your Development application. In production, on the LinkedIn account each user connected through Hosted Auth, inside workflows that user starts and controls.
1 · Your coding agent Codex, Cursor, Claude Code Reads the contract, writes the code
2 · Unipile MCP server Hosted, scoped API key Runs test requests on your Development app
3 · Unipile API The LinkedIn routes Scopes the action to one account ID
4 · LinkedIn LinkedIn Classic, Recruiter, Sales Navigator LinkedIn's own rules and quotas apply
5 · The user's account The user Connected through Hosted Auth Their inbox, their network, their limits
Connected account · ats-appConnected
The userLinkedIn
Sarah MitchellLinkedIn · Sales Navigator seat · linked by the user through Hosted Auth
Account IDacc_7f3…c91, the only identifier your code stores
ScopeWorkspace 42 · scoped Account API key
SessionHeld by Unipile, never exposed to your app
StatusConnected · status changes arrive by webhook
ReconnectDisconnect
Data stays in the user's sessionMessages, profiles and search results are routed through the authenticated user's own LinkedIn session. Unipile keeps no independent archive, index or database of LinkedIn profiles or conversations: each request runs on a user-initiated action.
An independent technical intermediaryUnipile is an independent technical intermediary, not a LinkedIn partner. Each request is relayed to the account one end user connected through Hosted Auth, on behalf of that user, bounded by what that user can already do from their own session.
LinkedIn sets the limits, you respect themInvitation quotas, messaging volumes and InMail credits are defined by LinkedIn. Unipile relays the live usage signals so your product can pause or inform the user. How often it acts on an account remains a customer-side decision.
Honest limits

What LinkedIn limits still apply

The server does not lift LinkedIn's rules and does not promise volume. The API gives your product the account's real signals so the feature you ship works inside them, the way the account owner would.
What LinkedIn enforces
Invitation quotas per account and per weekConnection requests are capped by LinkedIn for each account. Your product sends one per user action and surfaces the limit when LinkedIn returns it.
Messaging volumes and InMail creditsMessages go to existing connections or open profiles. InMail spends the credits of the Sales Navigator or Recruiter seat, visible with GET /v2/{account_id}/linkedin/inmail-credits.
Search pagination and daily search limitsClassic search is paginated and rationed by LinkedIn; Sales Navigator and Recruiter seats get deeper results. Your code pages with the cursor the API returns, within what the account is allowed to see.
Seats and contractsSales Navigator and Recruiter routes answer only if the connected account holds the subscription. Check the contracts before showing the feature.
Checkpoints at connection timeLinkedIn may ask the account owner for a code or an in-app confirmation when the account is linked. Hosted Auth walks the user through it, and the checkpoint routes let your app submit the code; your code never sees a password.
What to build into your product
Writes are user actionsSend, invite, comment, post, save to a list: each one is triggered by the user in your UI, never by a background loop.
One Scope and one scoped key per tenantA workspace only sees the accounts assigned to its Scope. The global key stays on your backend for administration, and the account owner can disconnect at any time.
Read the usage signals and back offUnipile relays rate-limit responses, quota errors and provider states as they happen. Treat a limit as a stop, not as a retry.
Handle reconnect and checkpoint statesMap the account status to your UI (connected, needs a code, needs reconnection) so users know what to do, and never retry a checkpoint in a loop.
Use webhooks for anything continuousIf your product must react to every new message, subscribe to webhooks and let the event bring the message, instead of polling the inbox.
Four ways to connect a product to LinkedIn

How the LinkedIn MCP options compare

Every LinkedIn MCP server is third-party, so the real question for a product team is how each one reaches LinkedIn, on whose account, and what you can ship with it. The four families you will find, side by side.
Unipile MCP server Community open-source servers Public-data marketplaces No-code MCP bridges
How it reaches LinkedIn Unipile MCP serverThe LinkedIn account each of your users connects through Hosted Auth, then the LinkedIn API routes Community open-source serversYour own LinkedIn login on your machine, driven by a browser session Public-data marketplacesPublic pages, no account, results served from a data collection pipeline No-code MCP bridgesTheir LinkedIn app connection and a set of predefined actions
LinkedIn surfaces Unipile MCP serverClassic, Sales Navigator, Recruiter, plus company pages and job postings Community open-source serversClassic profile only Public-data marketplacesPublic profiles, companies and posts No-code MCP bridgesA handful of actions on the company page or personal profile
Read, or read and act Unipile MCP serverRead and act: messages, invitations, posts, comments, lists, projects, as features of your product Community open-source serversMostly read, a few writes depending on the project Public-data marketplacesRead only No-code MCP bridgesPredefined writes, little reading
Hosting and clients Unipile MCP serverHosted, one URL, any coding agent over HTTP: Codex, Cursor, Claude Code, Gemini CLI, Windsurf Community open-source serversSelf-hosted, local or Docker, usually one client at a time Public-data marketplacesHosted, token per client No-code MCP bridgesHosted, one generated URL per configuration
Other channels on the same server Unipile MCP serverEight: WhatsApp, Instagram, Telegram, Gmail, Outlook, IMAP, Google and Outlook calendars Community open-source serversNone Public-data marketplacesOther public data sources No-code MCP bridgesThousands of apps, each with a shallow action set
Pricing model Unipile MCP serverPer connected account, whatever the request volume, 7-day free trial Community open-source serversFree, you host and maintain it Public-data marketplacesPer credit or per result No-code MCP bridgesPer task or per action
Whose terms your product works under Unipile MCP serverEach user's own account and LinkedIn subscription, in workflows the user initiates and controls from your product Community open-source serversYour personal account, at your own risk Public-data marketplacesThe marketplace's data collection terms No-code MCP bridgesThe bridge's terms and its LinkedIn app permissions
Categories are described generically on purpose. What sets the Unipile server apart is the account model: your product reads and acts as the user who connected the account, including on Sales Navigator and Recruiter, behind a single server URL shared with eight other channels.

LinkedIn MCP Server FAQ

The questions people actually type: official or not, the server URL, how the agent tests, Sales Navigator MCP and Recruiter MCP, accounts, code and price.
No. LinkedIn does not publish a Model Context Protocol server, and its developer program does not open messaging, search or Recruiter to third-party products. The Unipile MCP server is a hosted third-party server generated from the Unipile API: your coding agent reads the LinkedIn endpoints and writes the integration into your product, where each user connects their own account and your code acts on behalf of that authenticated user. Unipile is an independent technical intermediary and is not affiliated with, endorsed by, or sponsored by LinkedIn.
There is one URL for the whole Unipile API, LinkedIn included: https://developer.unipile.com/mcp?branch=v2.0, over streamable HTTP, with a scoped Account API key in the X-API-KEY header. There is no separate server per channel. Paste it into Codex, Cursor, Claude Code, Gemini CLI or Windsurf, and the agent discovers the LinkedIn endpoints on its own.
On your Development application. Connect a test LinkedIn account through Hosted Auth, create a Scope with it and a scoped key for that Scope, and give that key to the agent. It runs the real routes (GET /v2/{account_id}/chats, POST /v2/{account_id}/linkedin/search/people) on the test account, checks the responses and fixes the code. Production accounts only enter the picture when your reviewed code ships with its own scoped keys.
Not from LinkedIn: it publishes neither a Sales Navigator MCP server nor a Recruiter MCP server. The Unipile MCP server exposes both, when the connected account holds the seat or contract. A Sales Navigator seat unlocks lead and account searches, lead lists and account lists (POST /v2/{account_id}/linkedin/sales-navigator/search/people, GET /v2/{account_id}/linkedin/sales-navigator/lead-lists). A Recruiter contract unlocks projects, pipelines, talent pool search, applicants and job postings (GET /v2/{account_id}/linkedin/recruiter/projects, POST /v2/{account_id}/linkedin/recruiter/projects/{project_id}/pipeline). Your code lists the account's contracts and selects one.
While you build, the test accounts of your Development application. In production, only the account an end user connected through Hosted Auth and that sits in your Scope: your code receives an account ID, never credentials, and every request runs on behalf of that authenticated user, inside a workflow the user initiates and controls from your product. How often your product acts on an account is a customer-side decision within LinkedIn's limits.
No. LinkedIn's developer program covers a narrow set of partner products and does not expose messaging, search or Recruiter to third parties. The Unipile server works with the LinkedIn account your user connects, through the same LinkedIn API Unipile offers over REST. What you need is a Unipile scoped Account API key, created in the dashboard.
You paste the configuration into your coding agent and describe the LinkedIn feature in plain language. The agent reads the endpoints, writes the code in your project and tests it on the Development app; you review it like any pull request. In production your product calls the same routes over the REST API or the official SDKs, with its own scoped keys.
The MCP server is included in every Unipile plan, with no per-message or per-request fee. Billing is per connected account, whatever the channel: from 49 EUR per month for up to 10 accounts, then 5 EUR per additional account, down to 3 EUR at volume. The 7-day free trial needs no credit card. Full grid on the pricing page.