@mhdd_24/linkedin-mcp
v1.0.0
Published
MCP server for posting to LinkedIn via the LinkedIn API using an OAuth access token
Maintainers
Readme
@mhdd_24/linkedin-mcp
MCP server that posts to LinkedIn through the LinkedIn API. Use it from Cursor, Claude Desktop, VS Code Copilot, or any MCP-compatible client.
You type natural language — the assistant calls create_post for you. No manual member ID setup; your LinkedIn OAuth access token resolves identity automatically.
Full documentation: docs/WIKI.md
How it works (30 seconds)
You (chat) → MCP client → linkedin-mcp → LinkedIn userinfo (access token)
→ LinkedIn ugcPosts API
→ Text post on your profile
- Access token calls
userinfo→ returnsmemberId,name,email - Author URN is built from
memberId— not hardcoded - Visibilities come from config — validated before posting
create_postvalidates visibility, POSTs the share, returns the post URN
Prerequisites
| Requirement | Notes |
|-------------|-------|
| Node.js 18+ | Uses native fetch |
| LinkedIn OAuth access token | Member token with required scopes (see below) |
| Default visibility (optional) | DEFAULT_VISIBILITY so you don't pass it every time |
Required OAuth scopes
| Scope | Purpose |
|-------|---------|
| openid | OpenID Connect identity |
| profile | Display name |
| email | Email address |
| w_member_social | Create posts on your profile |
Obtain a token via the LinkedIn OAuth 2.0 Authorization Code flow.
Install
Option A — npm (recommended after publish)
npm install -g @mhdd_24/linkedin-mcpThis installs the linkedin-mcp CLI and compiles dist/ via the package prepack script.
Option B — npx (no global install)
npx @mhdd_24/linkedin-mcpDownloads and runs the latest published version on each invocation.
Option C — clone and build (contributors)
git clone https://github.com/Mhdd-24/Linkedin-MCP.git
cd Linkedin-MCP
npm install
npm run build
node dist/index.jsConfigure your MCP client
Cursor
Edit Cursor Settings → MCP or ~/.cursor/mcp.json:
{
"mcpServers": {
"linkedin": {
"command": "npx",
"args": ["-y", "@mhdd_24/linkedin-mcp"],
"env": {
"LINKEDIN_ACCESS_TOKEN": "<your-oauth-access-token>",
"DEFAULT_VISIBILITY": "PUBLIC"
}
}
}
}After global install, you can use:
"command": "linkedin-mcp"Local development:
"command": "node",
"args": ["/path/to/linkedin-mcp/dist/index.js"]Restart Cursor (or toggle the MCP server off/on) after saving.
Claude Desktop
%APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"linkedin": {
"command": "npx",
"args": ["-y", "@mhdd_24/linkedin-mcp"],
"env": {
"LINKEDIN_ACCESS_TOKEN": "<your-oauth-access-token>",
"DEFAULT_VISIBILITY": "PUBLIC"
}
}
}
}Environment variables
| Variable | Required | Default | Purpose |
|----------|----------|---------|---------|
| LINKEDIN_ACCESS_TOKEN | Yes* | — | OAuth access token for userinfo + posting |
| DEFAULT_VISIBILITY | No | PUBLIC | Default audience for create_post |
| LINKEDIN_API_BASE_URL | No | https://api.linkedin.com | LinkedIn API host |
* Or pass accessToken on each tool call.
Aliases: LI_ACCESS_TOKEN, accessToken, defaultVisibility, etc. (see WIKI).
Never commit access tokens. Put them only in MCP env or a local .env (for npm run dev).
Tools
| Tool | Purpose |
|------|---------|
| whoami | Test token — shows memberId, name, email, author URN |
| list_visibilities | Lists valid post visibility values |
| create_post | Create a text post on your LinkedIn profile |
Usage
Step 1 — Verify setup (optional)
In chat:
Run whoami on the linkedin MCP.
Expected: your LinkedIn identity and author URN.
Step 2 — See valid visibilities (optional)
list_visibilities
Examples: PUBLIC, CONNECTIONS
Step 3 — Create a post
Post to LinkedIn: Just shipped a new feature! Excited to share what we've been building.
Create a LinkedIn post with visibility PUBLIC: Happy to announce our open-source MCP server for LinkedIn integration.
create_post parameters
| Parameter | Required | Example |
|-----------|----------|---------|
| text | Yes | "Just shipped a new feature!" |
| visibility | No* | "PUBLIC" |
| accessToken | No | Only if not in env |
* Optional when DEFAULT_VISIBILITY is set in MCP config.
What happens after npm install?
- Package files land in
node_modules/@mhdd_24/linkedin-mcp/(or global prefix if-g). prepack/ publish includes compileddist/— no local build needed for end users.- The
linkedin-mcpbin points todist/index.js. - Your MCP client runs that entry over stdio (stdin/stdout = MCP protocol; logs go to stderr).
- On startup:
validateEnv()warns if access token is missing. - Tools are registered; the server waits for
CallToolrequests from the AI.
After publishing to npm (maintainers)
- Bump version in
package.jsonandsrc/config/linkedin.config.ts(LI.SERVER.VERSION). - Build and test:
npm run buildthen test with localmcp.json. - Publish:
npm publish --access public(logged in as package owner). - Users update by restarting MCP —
npxpicks up the new version automatically. - Global install users:
npm update -g @mhdd_24/linkedin-mcp.
Current package version: 1.0.0.
See WIKI — Publishing for the full checklist.
Troubleshooting
| Problem | Fix |
|---------|-----|
| MCP server won't start | Check Node.js 18+ is installed |
| No access token provided | Set LINKEDIN_ACCESS_TOKEN or pass accessToken on the tool |
| Invalid visibility | Run list_visibilities; use an exact match (case-insensitive) |
| visibility is required | Set DEFAULT_VISIBILITY in env or pass visibility on create_post |
| userinfo failed: 401 | Token expired or invalid — refresh your OAuth token |
| Post failed: 403 | Token missing w_member_social scope |
More detail: docs/WIKI.md § Troubleshooting.
License
ISC
