LinkedIn MCP Server
An MCP server for LinkedIn REST API v2 that enables AI assistants to create, list, and delete posts, manage events, upload images, comment, and react—featuring OAuth 2.0 with session persistence, local post history tracking, and multiple automated tests
README
LinkedIn MCP Server
A Model Context Protocol (MCP) server that provides AI assistants with access to LinkedIn's official API. Create posts, manage events, and interact with LinkedIn - all through natural language via any MCP-compatible client.
Official API only. No scraping, no unofficial endpoints, no account risk.
Features
Self-Serve Tools (No LinkedIn Approval Required)
| Tool | Description |
|---|---|
linkedin_auth_start |
Start OAuth 2.0 authentication flow |
linkedin_auth_callback |
Complete OAuth with authorization code |
linkedin_auth_logout |
Revoke token and log out |
linkedin_get_my_profile |
Get your LinkedIn profile (name, headline, photo, email) |
linkedin_get_my_email |
Get your email address |
linkedin_get_auth_status |
Check authentication status |
linkedin_get_rate_limits |
View API rate limit usage |
linkedin_create_post |
Create text, article, or image posts |
linkedin_delete_post |
Delete your posts |
linkedin_create_comment |
Comment on posts |
linkedin_react_to_post |
React to posts (like, celebrate, support, love, insightful, funny) |
linkedin_upload_image |
Upload images for posts |
linkedin_list_my_posts |
List posts created through this server with URNs for reference |
linkedin_create_event |
Create LinkedIn events |
linkedin_get_event |
Get event details |
Architecture Highlights
- OAuth 2.0 - Secure authentication with persistent token storage
- Session auto-restore - Survives server restarts without re-authentication (until token expires)
- Post history tracking - Local SQLite log of posts created through the server for easy reference and deletion
- Adaptive rate limiting - Learns LinkedIn's actual limits from response headers
- Automatic retry - Exponential backoff for transient failures (429, 5xx)
- Capability detection - Only exposes tools matching your granted scopes
- API versioning - Handles LinkedIn's monthly API version rotation
Prerequisites
- Node.js 20+
- LinkedIn Developer App (see setup steps below)
LinkedIn App Setup
Step 1: Create a LinkedIn Developer App
- Go to linkedin.com/developers/apps and sign in
- Click Create app
- Fill in the required fields:
- App name: Choose any name (e.g., "My MCP LinkedIn")
- LinkedIn Page: Select your LinkedIn page, or create one if needed
- Privacy policy URL: Can use your website URL or a placeholder
- App logo: Upload any image (required)
- Check the legal agreement box and click Create app
Step 2: Get Your Client ID and Client Secret
- After creating the app, you'll land on the app settings page
- Go to the Auth tab
- Copy the Client ID - you'll need this for configuration
- Copy the Client Secret (click the eye icon to reveal it) - you'll need this too
Step 3: Add the Redirect URL
- Still on the Auth tab, scroll to OAuth 2.0 settings
- Under Authorized redirect URLs for your app, click Add redirect URL
- Enter:
http://localhost:3000/callback - Click Update to save
Important: The redirect URL must match exactly - including the protocol (
http://), port (:3000), and path (/callback). No trailing slash.
Step 4: Enable Required Products
- Go to the Products tab on your app page
- Request access to these two products:
- Sign In with LinkedIn using OpenID Connect - click Request access, review terms, and accept
- Share on LinkedIn - click Request access, review terms, and accept
- Both products are typically approved instantly for self-serve use
Verify: After enabling, go back to the Auth tab. Under OAuth 2.0 scopes, you should see:
openid,profile,w_member_social.
Quick Start
1. Install
git clone https://github.com/souravdasbiswas/linkedin-mcp-server.git
cd linkedin-mcp-server
npm install
npm run build
2. Configure Your MCP Client
For Claude Code (recommended):
claude mcp add linkedin \
-e LINKEDIN_CLIENT_ID=your_client_id \
-e LINKEDIN_CLIENT_SECRET=your_client_secret \
-- node /path/to/linkedin-mcp-server/dist/index.js
Or add manually to ~/.claude.json:
{
"mcpServers": {
"linkedin": {
"command": "node",
"args": ["/path/to/linkedin-mcp-server/dist/index.js"],
"env": {
"LINKEDIN_CLIENT_ID": "your_client_id",
"LINKEDIN_CLIENT_SECRET": "your_client_secret"
}
}
}
}
For Claude Desktop, add to claude_desktop_config.json:
{
"mcpServers": {
"linkedin": {
"command": "node",
"args": ["/path/to/linkedin-mcp-server/dist/index.js"],
"env": {
"LINKEDIN_CLIENT_ID": "your_client_id",
"LINKEDIN_CLIENT_SECRET": "your_client_secret"
}
}
}
}
Replace your_client_id and your_client_secret with the values from Step 2.
3. Authenticate
Once connected, tell your AI assistant:
"Authenticate with LinkedIn"
The assistant will generate an OAuth URL. Here's what happens:
- Open the URL in your browser
- Sign in to LinkedIn and click Allow to authorize the app
- LinkedIn redirects to
http://localhost:3000/callback?code=XXX&state=YYY - Since there's no local server listening, you'll see a "page not found" error - that's expected
- Copy the full URL from your browser's address bar and paste it back to the assistant
- The assistant extracts the
codeandstateparameters and completes authentication
After the first authentication, your session persists across server restarts (token is valid for 60 days). You only need to re-authenticate when the token expires.
4. Use It
Example prompts:
- "Post to LinkedIn: Just shipped a new feature that reduces API latency by 40%"
- "List my LinkedIn posts" - see all posts you've made through the server
- "Delete my last LinkedIn post"
- "Create a LinkedIn event for our team meetup next Friday at 2pm"
- "React to this LinkedIn post with a celebrate reaction"
- "What's my LinkedIn profile info?"
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
LINKEDIN_CLIENT_ID |
Yes | - | LinkedIn app client ID |
LINKEDIN_CLIENT_SECRET |
Yes | - | LinkedIn app client secret |
LINKEDIN_REDIRECT_URI |
No | http://localhost:3000/callback |
OAuth redirect URI |
LINKEDIN_MCP_DATA_DIR |
No | ~/.linkedin-mcp |
Directory for token storage |
LINKEDIN_API_BASE_URL |
No | https://api.linkedin.com |
API base URL (override for testing) |
LINKEDIN_AUTH_BASE_URL |
No | https://www.linkedin.com/oauth/v2 |
Auth base URL |
Development
# Install dependencies
npm install
# Type check
npm run typecheck
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Run with coverage
npm run test:coverage
# Lint
npm run lint
# Dev mode (tsx, no build needed)
npm run dev
Testing Architecture
Tests run entirely against a mock LinkedIn API server - no real API calls are made.
| Layer | What It Tests | Files |
|---|---|---|
| Unit tests | Auth, PKCE, token store, rate limiter, errors, capabilities | tests/unit/ |
| Integration tests | Full MCP protocol flow via in-memory transport | tests/integration/ |
| Contract tests | Request/response shapes match LinkedIn API spec | tests/contract/ |
Project Structure
src/
index.ts # Entry point, stdio transport
server.ts # MCP server wiring
auth/
oauth2.ts # OAuth 2.0 flow + token exchange
token-store.ts # SQLite token persistence + session auto-restore
pkce.ts # PKCE challenge generation (available for public clients)
tools.ts # Auth MCP tools
client/
api-client.ts # HTTP client with retry
rate-limiter.ts # Adaptive rate limiting
version-manager.ts # LinkedIn API versioning
errors.ts # Structured error types
post-history.ts # Local post tracking (SQLite)
capabilities/
detector.ts # Scope-based capability detection
modules/
profile/tools.ts # Profile reading tools
posting/tools.ts # Post creation/management tools
events/tools.ts # Event management tools
types/
linkedin.ts # LinkedIn API type definitions
config.ts # Server configuration types
Limitations
These are LinkedIn API restrictions, not server limitations:
- Cannot read others' profiles - Only the authenticated user's own profile
- Cannot search for people - No public search API
- Cannot send messages - Only available to Sales Navigator partners
- Cannot read feeds -
r_member_socialscope is closed - Cannot access connections - Only connection count with Marketing API approval
- Rate limits - ~500 app calls/day, ~100 per member/day (development tier)
Extending to Pro Tier
If your LinkedIn app has Community Management API or Advertising API approval, the server's capability detection will automatically enable additional modules when you authenticate with the corresponding scopes. The modular architecture supports adding new API modules without modifying the core server.
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。