A LinkedIn MCP serveron the official API
Some LinkedIn MCP servers work by driving your logged-in browser session. The LinkedIn User Agreement prohibits that kind of automated access, and it can get an account restricted. This server posts through the official LinkedIn API with OAuth, schedules as well as publishes, and the same tool call posts to X and Bluesky.
Hosted at https://mcp.opentweet.io/mcp. 43 tools.
7-day free trial. Cancel anytime.
Two ways an MCP server can reach LinkedIn
Check which one a server uses before you give it your account.
The first is the official API. An app signs you in with OAuth on linkedin.com, you approve it, and it posts through the LinkedIn posting API. For your own profile that takes only the self-serve Share on LinkedIn product, with no partner review.
The second is your browser. The server either controls a browser you are logged into or reuses the session cookie from one, and then works the LinkedIn website the way a person would. It can reach whatever the website shows, which is why some servers take this route. It is also automated access that the LinkedIn User Agreement prohibits, and the account on the other end of that session is the one that gets restricted.
If a server asked for your session cookie
Sign out of LinkedIn in that browser, which ends that session, and change your password if you pasted the cookie anywhere it could have been copied.Browser session against the official API
The rows that decide whether your LinkedIn account is safe to hand to an agent.
| Browser session | Official API with OAuth | |
|---|---|---|
| What you hand over | Your logged-in browser session or its cookie | Nothing. You approve on linkedin.com |
| How it posts | Automates the LinkedIn website | Calls the LinkedIn posting API |
| Standing with LinkedIn | Automated access the User Agreement prohibits | The self-serve Share on LinkedIn product |
| Risk to the account | Can get the account restricted | Access LinkedIn grants to apps on purpose |
| Where the secret lives | Your config or a local browser profile | A server-side grant. Your config holds an OpenTweet key |
| Scheduling | Posts only while the agent is running | Queued and published at scheduled_date |
The API does less than a logged-in browser. It posts, and that is what this server does on LinkedIn.
Four steps
Get your OpenTweet API key
Sign in and copy the key from the dashboard. This is the only secret that goes near your MCP config, and it is an OpenTweet key, not a LinkedIn credential. Revoking it removes the agent, not your accounts.
Connect LinkedIn in Settings > Accounts
Click Connect LinkedIn, sign in on LinkedIn, and approve. Your password is typed on linkedin.com and never reaches OpenTweet or a config file. No developer app, no API key, no partner application.
Add the server to your client
One line for Claude Code, or the JSON block for Claude Desktop and Cursor. The hosted endpoint is Streamable HTTP, so there is no local process to keep running and no browser to keep logged in.
Tell the agent where a post goes
Pass platforms on the tool call to pin a post, or leave it out and let the account auto cross-post setting decide. Omitting it is not the same as pinning to X. Call opentweet_list_platforms to see what an unpinned post would do.
The config
One line for Claude Code, or the JSON block for Claude Desktop and Cursor.
claude mcp add --transport http opentweet \
https://mcp.opentweet.io/mcp \
--header "Authorization: Bearer ot_your_key"{
"mcpServers": {
"opentweet": {
"type": "streamable-http",
"url": "https://mcp.opentweet.io/mcp",
"headers": { "Authorization": "Bearer ot_your_key" }
}
}
}Notice what is not in there
No LinkedIn email, no LinkedIn password, no session cookie, no LinkedIn developer app credentials. The only secret is an OpenTweet key, and the LinkedIn grant lives server-side where your agent cannot read it.What the agent can actually do
Every posting tool takes a platforms parameter, so LinkedIn is not a separate tool to learn. It is one more value on the tools you already use.
// Schedule one post to LinkedIn only
opentweet_create_tweet({
text: "We moved deploys to Tuesday mornings. Here is what broke first, and what we changed.",
platforms: ["linkedin"],
scheduled_date: "2026-09-22T14:00:00Z"
})
// One draft, all three networks, right now
opentweet_create_tweet({
text: "Release 2.4 is out. Notes in the changelog.",
platforms: ["x", "bluesky", "linkedin"],
publish_now: true
})
// A thread: a reply chain on X, one combined post on LinkedIn
opentweet_create_thread({
tweets: ["Two things I got wrong about queues.", "One: I retried every error.", "Two: I never capped it."],
platforms: ["x", "linkedin"],
scheduled_date: "2026-09-23T15:00:00Z"
})
// Check where an unpinned post would actually land
opentweet_list_platforms({})Omitting platforms is not the same as pinning to X
A call that leaves the parameter out follows your auto cross-post setting at publish time, which may send it to every connected network, LinkedIn included. If an agent is writing posts unattended, pin them explicitly.opentweet_list_platforms reports where an unpinned post would go and which of those targets will actually land.What lands on LinkedIn, exactly
The same rules the composer enforces. A post that breaks one is skipped on LinkedIn with a stated reason and still goes out on the other networks you named.
Per post
- 3,000 characters, counted strictly, so an emoji counts as 2
- Up to 4 images, JPEG, PNG or GIF. Others are converted to JPEG
- Two or more images post as a multi-image post
- Links work. Hashtags and @mentions publish as plain text
- A post with a video is skipped on LinkedIn
What comes back
- One result per network: published, failed, or skipped with a reason
- A LinkedIn post_id is a URN like urn:li:share:7300000000000000000
- Its url opens the post at linkedin.com/feed/update/
- A thread comes back as one LinkedIn post, parts joined by a blank line
What this is, and what it is not
Worth being blunt, because it decides whether this is the right server for you.
Use this if
- You want an agent to post or schedule to your personal LinkedIn profile
- You also post to X or Bluesky and want one tool call for all of them
- You would rather not hand an agent your LinkedIn password or session
- You want a per-network result on every post
Use something else if
- You need to post as a Company Page
- You want the agent to read your feed, messages, or comments
- You want LinkedIn engagement numbers, which are not read back
- You are posting video or document carousels
- You need LinkedIn Articles or newsletters, which have no API for anyone
LinkedIn sign-ins last 60 days with no refresh token, so you reconnect every 60 days in one click. The full walkthrough is here.
Frequently asked questions
How does this MCP server post to LinkedIn?
Through the LinkedIn posting API, on an OAuth sign-in you approve on linkedin.com. It never uses your password, a browser session cookie, or scraping. OpenTweet holds the LinkedIn grant server-side, and your MCP config holds only an OpenTweet API key.
Why not use an MCP server that reuses my logged-in LinkedIn session?
Because of what LinkedIn says about it. The LinkedIn User Agreement prohibits using bots or other unauthorized automated methods to access LinkedIn, and an account caught doing it can be restricted. A server that drives your browser or replays your session cookie is automating the website, and the risk sits on your account, not on the server.
Do I need a LinkedIn developer app or API key?
No. You click Connect LinkedIn in Settings > Accounts, sign in on LinkedIn, and approve. OpenTweet runs on the self-serve Share on LinkedIn product, so there is no developer app, no API key, and no partner application.
Can the agent schedule LinkedIn posts, or only post now?
Both. Pass scheduled_date for a time in the future, or publish_now: true to post immediately. LinkedIn has no scheduling API of its own, so OpenTweet keeps the post in its queue and publishes it at that time.
Can it post to a LinkedIn Company Page?
No. Posts go to the personal profile feed of the member who connected. Company Page posting through the LinkedIn API needs the Community Management API, which requires LinkedIn review, and OpenTweet does not support Company Pages.
Can the agent read my LinkedIn feed, comments, or analytics?
No. On LinkedIn this server publishes and schedules, and nothing is read back: no feed, no comments, no analytics. The analytics tools cover X only.
What happens when the LinkedIn sign-in expires?
LinkedIn sign-ins for self-serve apps last 60 days with no refresh token, so you reconnect every 60 days, in one click. If a sign-in has expired, scheduled LinkedIn posts are held and OpenTweet emails you to reconnect. opentweet_list_platforms also reports which targets will actually land.
Which MCP clients does it work with?
Anything that speaks MCP. Claude Desktop, Claude Code, and Cursor over the hosted Streamable HTTP endpoint at https://mcp.opentweet.io/mcp with an Authorization header, or over the npm package if you prefer a local process.
Related
The LinkedIn scheduler, the cross-posting guide, and the full tool reference.
LinkedIn scheduler
The same LinkedIn publishing from the app: one queue and one calendar with X and Bluesky.
Cross-post from X to LinkedIn
Connect, pick networks, auto cross-post, threads, skips, and the 60-day reconnect, step by step.
Cross-posting, in full
What each network gets, the limits side by side, and what cross-posting does not cover.
Cross-posting docs
The platforms parameter, the results array, and GET /api/v1/cross-posting for per-network limits.
The MCP server
All 43 tools, the hosted endpoint, and installers for every client.
Tool reference
Every tool, its parameters, and what it returns. Including the platforms parameter.
Bluesky MCP server
The same server on the Bluesky side, over atproto OAuth instead of an App Password.
Pricing
From $11.99 a month. The MCP server and LinkedIn are on every plan.
Give your agent LinkedIn without your session
Hosted MCP server, 43 tools, the official LinkedIn API with OAuth on the LinkedIn side. From $11.99 a month with the MCP server on every plan.