LinkedIn MCP Server
Project
A Model Context Protocol (MCP) server that provides a practical, capability-aware LinkedIn API toolset to AI agents such as opencode, Claude, Cursor, and other MCP clients.
Table of Contents
- Why another LinkedIn MCP server
- What it provides
- Getting started
- Prompt examples
- Tool reference
- Data & safety notes
- Limitations
- License
Why another LinkedIn MCP server?
| Feature domain | stickerdaniel/linkedin-mcp-server | southleft/linkedin-mcp | linkedin-mcp |
|---|---|---|---|
| OAuth code flow | ✅ Browser-based auth code exchange | ✅ OAuth 2.0 code flow | ✅ Full auth_start → auth_poll → auth_finish with local callback |
| Write preview mode | ❌ (no dry-run default) | ❌ (no dry-run default) | ✅ All write tools default to execute=false preview; execute=true performs actual write |
| Ads/campaign management | ❌ Not supported | ❌ Not supported | ✅ list_ad_accounts, list_campaign_groups, list_campaigns, create_campaign_group, create_campaign, update_campaign |
| Media upload workflow | ❌ Not supported | ❌ Not supported | ✅ initialize_media_upload → finalize_media_upload workflow |
| Comment/reaction tools | ✅ Basic comment and reaction support | ✅ Basic comment and reaction support | ✅ list_comments, create_comment, list_reactions, create_reaction |
| Direct messaging | ✅ (with session browser) / ⚠️ ToS violation via browser scraping | ✅ (with session browser) / ⚠️ ToS violation via browser scraping | ❌ Not included (requires Sales Navigator/partner approval / w_member_social scope) |
What it provides
Current scaffold includes:
- OAuth code flow for interactive browser login (
auth_start->auth_finish) - token bootstrap and refresh helpers
- per-tool capability matrix in
src/linkedin_mcp/tool_catalog.json - raw authenticated helpers for fast endpoint expansion
- wrapped tools for profile, org ACLs, posts, comments, reactions, media upload, and ads
Getting started
You need an MCP-capable client (opencode, Claude Desktop, Cursor, etc).
LinkedIn app registration
- Open the LinkedIn Developer portal and create a new app.
- In app auth settings, add an OAuth redirect URL, for example
http://127.0.0.1:8765/callback. - Copy
Client IDandClient Secretinto your environment. - Under products/scopes, request only what you need now (start with sign-in scopes).
- Ensure the redirect URL in app settings exactly matches
LINKEDIN_REDIRECT_URI.
1. Install
Option A - local editable install (recommended for development)
Requirements: Python 3.10+.
pip install -e .
linkedin-mcp-full
Option B - uvx from source folder
Requirements: uv (uvx) and a local clone of this repository.
uvx --from . linkedin-mcp-full
2. Configure environment
Copy .env.example and set values (or export directly in shell).
Required variables (and usually the only ones you need):
LINKEDIN_CLIENT_IDLINKEDIN_CLIENT_SECRETLINKEDIN_REDIRECT_URI(example:http://127.0.0.1:8765/callback)
3. Register with your MCP client
Example for opencode (~/.config/opencode/opencode.json):
{
"mcp": {
"linkedin": {
"type": "local",
"enabled": true,
"command": ["uvx", "--from", "git+https://github.com/oliverhruby/linkedin-mcp.git", "linkedin-mcp-full"],
"env": {
"LINKEDIN_CLIENT_ID": "{env:LINKEDIN_CLIENT_ID}",
"LINKEDIN_CLIENT_SECRET": "{env:LINKEDIN_CLIENT_SECRET}",
"LINKEDIN_REDIRECT_URI": "{env:LINKEDIN_REDIRECT_URI}"
}
}
}
}
Restart your MCP client after config changes.
Prompt examples
| User prompt | Likely tool call(s) | Expected response |
|---|---|---|
| "Start LinkedIn login" | auth_start |
Authorization URL + state + listener details |
| "Search for company updates" | list_accessible_organizations |
Organization ACL visibility |
| "Create a post preview" | create_post execute=false |
Dry-run request payload |
| "Create the post now" | create_post execute=true |
API write result |
| "List my campaigns" | list_campaigns |
Ad campaigns list |
| "Get ad analytics" | get_ad_analytics |
Ad analytics data |
| "List my reactions" | list_reactions |
Reactions for a social action |
| "Check account capabilities" | list_capabilities |
Per-tool availability with missing scopes/roles |
Tool reference
| Tool | Description | Writes? |
|---|---|---|
auth_start |
Build OAuth URL and optional local callback listener | ✅ session |
auth_poll |
Poll pending OAuth callback state | |
auth_finish |
Exchange auth code for access token | ✅ session |
auth_refresh |
Refresh access token | ✅ session |
auth_set_access_token |
Manual token bootstrap | ✅ session |
auth_set_role_hints |
Set local role hints used for gating | ✅ session |
auth_status |
Show active session metadata | |
auth_clear |
Clear in-memory session and pending OAuth states | ✅ session |
list_tool_catalog |
Show tool capability metadata | |
list_endpoint_manifest |
Show endpoint coverage scaffold | |
list_capabilities |
Show effective per-tool availability | |
can_execute_tool |
Check one tool against current capabilities | |
linkedin_get |
Raw authenticated GET helper | |
linkedin_post |
Raw authenticated POST helper | ✅ |
whoami |
Resolve current principal profile endpoint | |
get_member_profile |
Fetch member profile | |
list_accessible_organizations |
Fetch organization ACL visibility | |
create_post |
Create post (execute=false preview by default) |
✅ |
get_post |
Fetch post by URN | |
delete_post |
Delete post (execute=false preview by default) |
✅ |
list_comments |
Fetch comments for social action path | |
create_comment |
Create comment (execute=false preview by default) |
✅ |
list_reactions |
Fetch reactions for social action path | |
create_reaction |
Create reaction (execute=false preview by default) |
✅ |
delete_reaction |
Delete reaction (execute=false preview by default) |
✅ |
initialize_media_upload |
Initialize media upload workflow (execute=false preview by default) |
✅ |
finalize_media_upload |
Finalize media upload workflow (execute=false preview by default) |
✅ |
list_ad_accounts |
List ad accounts (approval gated) | |
list_campaign_groups |
List ad campaign groups | |
create_campaign_group |
Create ad campaign group (execute=false preview by default) |
✅ |
list_campaigns |
List ad campaigns | |
create_campaign |
Create ad campaign (execute=false preview by default) |
✅ |
update_campaign |
Update ad campaign (execute=false preview by default) |
✅ |
get_ad_analytics |
Fetch ad analytics (approval gated) |
Data & safety notes
- Write tools are explicit and default to dry-run where feasible.
- Capability checks prevent many avoidable permission failures.
- API behavior still depends on LinkedIn app approvals and user/org roles.
Limitations
- This is a scaffold-first implementation, not complete LinkedIn API coverage.
- LinkedIn API availability depends on app-level approvals and account roles.
- Token persistence is currently in-memory; restart requires re-auth or env token.
License
MIT © Oliver Hrubý
Metadata
Release files for linkedin-mcp-full 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| linkedin_mcp_full-0.1.0.tar.gz | 16.8 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| linkedin_mcp_full-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.7 kB
Release files / linkedin_mcp_full-0.1.0.tar.gz
| Download URL | linkedin_mcp_full-0.1.0.tar.gz |
|---|---|
| Size | 16.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7d181e95b4b862c2223204833588b09f6f06f67fe9bf709adb25e3bb0b6f409a
|
|
BLAKE2b-256 checksum How to use checksums |
91083983a73a702016cbfbfb906fe2fc33cdd14656aa1b191b5a773a6dc5d8a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logRelease files / linkedin_mcp_full-0.1.0-py3-none-any.whl
| Download URL | linkedin_mcp_full-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e738f3c45fc20880bef33ad4074756e65577e8f62fb00e2eea8d46ea14efc6e0
|
|
BLAKE2b-256 checksum How to use checksums |
af0a9e5be26bf0b3bc7ff3cc22688f7dbc7337ab8a5f9795cacb19015c0d98ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logSecurity for linkedin-mcp-full 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for linkedin_mcp_full-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.