LinkedIn Poster MCP
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LinkedIn Poster MCPPost a LinkedIn update announcing our new feature release"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LinkedIn Poster MCP — Publish to LinkedIn via natural language.
Post to LinkedIn without leaving the chat.
A Model Context Protocol server that turns any MCP client into a LinkedIn publisher — text posts, image posts with alt text, profile lookups, and token-health checks, all driven by natural language instead of the LinkedIn API console.
› Post the launch photo to LinkedIn, caption it about our v2 release.
// MCP tool call resolved automatically
{
"tool": "create_image_post",
"caption": "Shipping v2 today",
"images": ["launch.png"]
}
// polling upload status… AVAILABLE
ok post created — urn:li:share:7183…Highlights
Never a blank image | Two transports | Admin dashboard | Bearer-guarded endpoint |
Polls LinkedIn's Images API until status is | Streamable HTTP on Vercel for production, plus a bundled stdio entry for local clients. | Optional panel surfacing auth status and tool call logs at a glance. | Every call to |
Related MCP server: linkedin-mcp
MCP tools
Four tools, one bearer token. Every tool call authenticates through the same Redis-backed token — no per-call re-auth.
Tool | Input | Returns |
|
| created post ID |
|
| created post ID |
| — | name + email |
| — | token validity + expiry |
Architecture
Stateless endpoint, stateful token.
api/
authorize.ts GET start LinkedIn OAuth (CSRF state in Redis)
callback.ts GET exchange code for tokens, store, success page
mcp.ts POST MCP endpoint, bearer-auth, tools
dashboard.ts GET admin dashboard API
frontend/ React + Tailwind + MUI dashboard source -> public/
lib/
config.ts env vars, URLs, Redis client
linkedin-auth.ts token exchange, refresh, access-token helper
linkedin-api.ts profile, create_post, create_image_post
logging.ts structured logs to Redis
errors.ts NotAuthorizedError, LinkedInError
mcp-stdio.mjs esbuild-bundled stdio entryFacts worth remembering:
Tokens live under a single Redis key,
linkedin:tokens./api/mcpis stateless and requiresAuthorization: Bearer <MCP_AUTH_TOKEN>on every request.All LinkedIn calls use raw
fetch()— no LinkedIn SDK dependency.
OAuth flow
One authorization, sixty days of posting.
Client -> /api/authorize -> LinkedIn OAuth -> /callback -> Redis -> MCP toolsStep | What happens |
01 |
|
02 | LinkedIn authenticates the user and redirects back to |
03 |
|
04 | Tools call |
Note: LinkedIn issues a
refresh_tokenonly for apps provisioned with programmatic refresh. On the standard scope set, access tokens last 60 days and the user re-authorizes on expiry —check_auth_statusalways reports the real state.
Image upload
Why posts never render blank.
Register — the server registers the upload and receives a signed
uploadUrl.Upload — image bytes are uploaded directly to that signed URL.
Poll -> post — status is polled until
AVAILABLE, then — and only then — the post is created.
Setup
Prerequisites
Node.js 24+
LinkedIn Developer app with approved scopes:
openid profile email w_member_socialAn Upstash Redis database
Environment variables
Set these in Vercel and in a root .env for local development:
Variable | Purpose |
| LinkedIn app client ID |
| LinkedIn app client secret |
| Must match a whitelisted redirect URL exactly |
| Upstash Redis REST URL |
| Upstash Redis REST token |
| Bearer token MCP clients send to |
These files are git-ignored — never commit secrets.
Local development
npm install
vercel dev # http://localhost:3000/api/...
npm run typecheck # tsc --noEmitRedirect URIs
local http://localhost:3000/api/callback
prod https://<your-app>.vercel.app/api/callbackWhitelist the exact URL in the LinkedIn Developer Portal — LinkedIn matches redirects with no tolerance for query params.
Client setup
Remote or local — pick one.
Type: Custom / MCP server, Streamable HTTP
Endpoint:
https://<your-deployed-url>/api/mcpHeader:
Authorization: Bearer <MCP_AUTH_TOKEN>
Point the client at the bundled entry:
node /path/to/linkedin-post-mcp/mcp-stdio.mjsDeploy
Ship it to Vercel.
vercel # preview
vercel --prod # productionvercel.jsonpinsapi/**to the Node.js runtime.Set the production callback URL for LinkedIn.
After deploying, open
/api/authorizeonce — then every tool works.
Security
What's actually guarded.
Secrets come from environment variables only — nothing is logged.
Endpoint — the MCP endpoint requires a bearer token before protocol handling.
CSRF — OAuth
stateguards against request forgery and is one-time-use with a short TTL.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityDmaintenanceMCP server for posting to LinkedIn, managing drafts, scheduling, commenting, and reacting, all from the terminal.Last updated160MIT
- AlicenseAqualityCmaintenanceA local MCP server that lets Claude log in to LinkedIn and publish image posts to your personal profile feed, backed by LinkedIn's REST Images API and Posts API.Last updated227MIT
- Alicense-qualityCmaintenanceAn MCP server that lets you publish posts to your LinkedIn profile using the official LinkedIn API, with support for markdown formatting and OAuth authentication.Last updatedMIT
- AlicenseAqualityCmaintenanceMCP server that posts to LinkedIn through the LinkedIn API. Enables creating text posts on your LinkedIn profile using natural language from any MCP-compatible client.Last updated3ISC
Related MCP Connectors
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
MCP server for LeadDelta — manage LinkedIn connections and CRM data via AI assistants.
linkedin-humblebrag MCP — wraps StupidAPIs (requires X-API-Key)
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/codebytemirza/linkedin-post-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server