Skip to main content

linkedin-api-mcp

Disclaimer: This is an independent, community project. It is not affiliated with, authorized by, endorsed by, or sponsored by LinkedIn Corporation or Microsoft. "LinkedIn" is a registered trademark of LinkedIn Corporation and is used here only descriptively to identify the third-party service this software interoperates with.

An MCP server for LinkedIn. It drives a real, headless browser (patchright, an undetected fork of Playwright) using your own logged-in LinkedIn session cookie — there is no scraping API, no credential stuffing, no bypass of LinkedIn's login. Your agent gets tools to read profiles, companies, jobs and posts, and — deliberately separated out — two tools that take real actions on your behalf: sending a message and sending a connection request.

Every action goes through a single browser session, one at a time, paced against limits you control. See Rate limits below.

Install

Requires Python 3.11+. The server is published for uv, so nothing needs a persistent virtualenv:

# One-time: install the Chromium build patchright drives.
uvx --from linkedin-api-mcp patchright install chromium

# One-time: store your session cookie in the OS keyring.
uvx linkedin-api-mcp auth

# Verify the cookie works before wiring it into a client.
uvx linkedin-api-mcp --test

--test prints the server's redacted configuration and confirms LinkedIn accepts the stored session — it never prints the cookie itself.

Getting your session cookie

LinkedIn doesn't offer an API key for this kind of access, so the server uses the same session cookie your browser already holds:

  1. Log in to linkedin.com in a normal browser.
  2. Open DevTools (F12 or Cmd+Opt+I) → ApplicationCookieshttps://www.linkedin.com.
  3. Find the row named li_at and copy its Value.
  4. Run uvx linkedin-api-mcp auth and paste it in when prompted (the terminal will not echo it back).

[!WARNING] This cookie is your LinkedIn login. Anyone who has it can act as you on LinkedIn — read your messages, message your connections, see everything your account can see — without needing your password, and it does not expire when you change one. Never paste it into a chat, a commit, an issue, a screenshot, or anywhere other than linkedin-api-mcp auth. If you ever suspect it has leaked, log out of that session from LinkedIn's Settings → Sign in & security page, which invalidates it immediately.

By default the cookie is stored in your OS keyring (Keychain, Windows Credential Manager, or Secret Service on Linux), never written to a config file. For CI or a throwaway environment, set LINKEDIN_COOKIE instead and skip auth entirely — the environment variable takes priority when both are set.

Tools

Tool Description
get_profile Fetch a member's profile (headline, about, experience, education, skills) by URL or public identifier.
get_my_profile Fetch the profile of the account this server is logged in as.
search_people Search LinkedIn members by keyword.
get_inbox List recent message thread previews.
get_conversation Fetch the full message history of one thread, by id.
search_conversations Search your message threads by participant or keyword.
send_message Write. Sends a real message to another member from your account.
connect Write. Sends a real connection invitation to another member from your account.
get_company Fetch a company page (about, size, industry, recent posts).
search_companies Search LinkedIn companies by keyword.
search_jobs Search job postings by keyword and optional location.
get_job Fetch one job posting in full.
search_posts Search LinkedIn feed posts by keyword.
linkedin_status Check session validity and current usage against the rate limits below.

send_message and connect are the only two tools that change anything — everything else only reads what your account can already see. Both are visible to another real person the moment they run: there is no draft, preview, or undo step.

Client configuration

All three clients spawn the same command over stdio; only the file differs.

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["linkedin-api-mcp"]
    }
  }
}

Claude Code

claude mcp add linkedin -- uvx linkedin-api-mcp

or add the same block as above to .mcp.json.

Cursor

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["linkedin-api-mcp"]
    }
  }
}

If you'd rather not rely on the keyring in a given client (e.g. a sandboxed environment), pass the cookie directly instead of running auth:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["linkedin-api-mcp"],
      "env": { "LINKEDIN_COOKIE": "your-li_at-value" }
    }
  }
}

Anywhere you do this, treat that config file with the same care as the cookie itself — don't commit it, and restrict its permissions.

FAQ

Is this safe to use? Will I get banned?

This tool controls a real browser session; it doesn't exploit undocumented APIs or bypass authentication. LinkedIn's User Agreement prohibits automated access, and accounts using automated tools can be restricted or banned. Use at your own risk; there is no guarantee of account safety. If you encounter any issues, let me know in the Discussions.

What if my agents execute too many actions?

Tool calls run sequentially through a queue. You are responsible for the volume of automation you run; use it sparingly and prompt your agents responsibly.

Rate limits

The queue answer above is enforced, not just claimed — every tool call, including linkedin_status, passes through the same ActionQueue before it touches the browser:

Setting Default Env var Effect
Minimum interval between actions 2 seconds LINKEDIN_MIN_INTERVAL Calls are paced against the previous one, not run back-to-back.
Actions per rolling hour 120 LINKEDIN_MAX_PER_HOUR Once hit, further calls fail immediately with a rate_limited error rather than queueing or sleeping.

Both are read from the environment at startup. The ceiling is local to this server — it exists to stop a looping agent from generating a burst of LinkedIn traffic, not because LinkedIn told us these numbers. Lowering them is always safe; raising them is you deciding you're willing to accept more risk than the defaults assume. Call linkedin_status to see current usage against both before running a batch of actions.

Other environment variables the server reads: LINKEDIN_COOKIE (overrides the keyring), LINKEDIN_HEADLESS (default true), LINKEDIN_NAV_TIMEOUT_MS (default 30000).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

linkedin_api_mcp-0.0.1.tar.gz (151.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

linkedin_api_mcp-0.0.1-py3-none-any.whl (51.6 kB view details)

Uploaded Python 3

File details

Details for the file linkedin_api_mcp-0.0.1.tar.gz.

File metadata

  • Download URL: linkedin_api_mcp-0.0.1.tar.gz
  • Upload date:
  • Size: 151.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for linkedin_api_mcp-0.0.1.tar.gz
Algorithm Hash digest
SHA256 ed6878ce9b652122e9aa1f226cdbc1c014e7076cde535a4bd0447dfb8613ed26
MD5 f8f78365f2546a88e0bbfb26cc459a11
BLAKE2b-256 7179efe338019e511ffcd58dad0c05f3e7610c5926458063c4c02fcd81af6922

See more details on using hashes here.

Provenance

The following attestation bundles were made for linkedin_api_mcp-0.0.1.tar.gz:

Publisher: publish.yml on JohannsenLum/linkedin-api-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file linkedin_api_mcp-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for linkedin_api_mcp-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 219709493e3b256b3808e7b832a3e9d3012ef020982e0490f14c92b10fe4b2a8
MD5 b44f3e6574752b7bd0a30030fb3d3c4b
BLAKE2b-256 180bc69c19d1072b95af8cb2d07190ac009a265af439c70120fd6d14eb6e5c58

See more details on using hashes here.

Provenance

The following attestation bundles were made for linkedin_api_mcp-0.0.1-py3-none-any.whl:

Publisher: publish.yml on JohannsenLum/linkedin-api-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page