Skip to main content
Profile and company data — read 20 September 2026

eliasbiondo/linkedin-mcp-server

Read-only LinkedIn scraping through a browser you sign into yourself: profiles section by section, company pages, job postings, people search. No write path at all, and no commits in six months. Your own LinkedIn account, signed in by hand in a browser window the server opens. No API key, no OAuth, no pasted credential.

Browser sessionMedium account riskStalev0.1.0
Last read
✓ Read from the repository, not from a directory listing✓ Write actions separated from read actions✓ Status derived from the last code change, not the maintainer's word✓ Every source URL published below
7 tools registered
0 write to LinkedIn
188 GitHub stars, 20 September 2026
3 clients documented
Where it fits

What it is built for, and the jobs it cannot do

The second card is the one a repository README never contains. Both are written from the project's own documentation and source, read on 20 September 2026.

Use it for

A developer who wants read-only LinkedIn data — profiles, company pages, job postings — pulled into Claude Desktop or Cursor as structured JSON, on a throwaway account, and who is comfortable running and patching Python from source. The section-by-section profile scraping is the genuinely useful part: you can ask for just experience and education instead of pulling an entire profile.

Do not use it for

Anything that writes to LinkedIn — posting, commenting, reacting, connection requests, messaging and InMail are all absent by design. Not for Sales Navigator or Recruiter. Not for production or unattended deployment: no commits in six months, no tests, no CI, no releases, a known concurrency bug that can cross-contaminate responses between callers, and an interactive login that blocks clean headless provisioning. Not for anyone who cannot afford to lose the account being used.

Publisher
Elias Biondo — individual, community project — not affiliated with LinkedIn or Microsoft.
Licence
MITopen source
Version
0.1.0
Runs
Self-hosted
Transport
stdio and Streamable HTTP
Last read

Hosting and transport are as the project documents them: Runs from a local clone. No hosted option and no Docker image.

Authentication — the thing that decides everything else

Your own LinkedIn account, signed in by hand in a browser window the server opens. No API key, no OAuth, no pasted credential.

A real browser signed in to your LinkedIn account, driven by the server — on your machine, or on a vendor’s.

What this route cannot do, however well the server is written

It can reach everything you can, which is the point and the problem. Section 8.2 of the User Agreement bars bots and scraping by any means, and enforcement lands on the account rather than on the software.

Medium account risk

The account is exposed in one direction. Either the server reads LinkedIn automatically without writing anything, which the User Agreement prohibits but which produces no activity anyone can report; or it writes through the approved API, where the exposure is what gets published rather than whether the account survives.

What it does with the credential

A login flag opens a visible Chromium window; you complete the sign-in yourself, including any two-factor step or checkpoint. The authenticated browser profile is then kept on disk in a dotfolder in your home directory and reused on later runs. A logout flag clears it and a status flag reports whether the session is still valid. You never type or paste a session token yourself.

Account risk is derived from the authentication class and from whether the server writes to LinkedIn — not judged per project. The 5 classes and the rule that maps them are on the LinkedIn MCP server directory; the ceilings LinkedIn enforces on any account, automated or not, are on LinkedIn limits. What this particular server exposes, and what it does with your credentials, is below.

Exposed tools

It reads. It registers no write tool at all

These are the tool names the server registers, as a client sees them. An assistant can call any tool the server exposes once it is connected, so the list below is the whole surface, not a feature summary.

  • get_person_profile
  • search_people
  • get_company_profile
  • get_company_posts
  • get_job_details
  • search_jobs
  • close_browser

All 7 tools it registers are named above.

What it can read

6 read actions, written as what they return rather than as the tool signature.

  • Scrape a person's profile section by section: the main profile always, plus optional experience, education, contact information, interests, honours, languages, posts and recommendations.
  • Keyword search over LinkedIn people results with an optional location filter, against the ordinary people-search page.
  • Company about section — overview, website, industry, size, headquarters, specialties, logo — plus optional posts and open jobs.
  • A company's recent feed posts with engagement metrics.
  • Details for a single job posting.
  • Job search with filters for date posted, job type, experience level, work type, easy apply and sort order.

What it can write, and where the write lands

Nothing. The server registers no write tool of any kind, on LinkedIn or anywhere else.

Setup — moderate

Installing it, in the project's own commands

Every command and every configuration block below is the project's own, copied unchanged on 20 September 2026. Where a project publishes no config block, this page says so rather than composing one — a snippet written here would be a snippet the maintainer never tested.

From source with uv

Shell
git clone https://github.com/eliasbiondo/linkedin-mcp-server.git
cd linkedin-mcp-server
uv sync
uv run patchright install
uv run linkedin-mcp-server --login
uv run linkedin-mcp-server

The login step opens a visible browser for you to sign in by hand, so it needs a display. On Windows, use "uv run python -m patchright install" if patchright is not found.

HTTP transport instead of stdio

Shell
uv run linkedin-mcp-server --transport streamable-http --host 0.0.0.0 --port 8000

The configuration block

Client config keys are not interchangeable, and a block pasted under the key a different client expects fails silently rather than erroring. That is why the blocks below are the project's own, in the clients it names, rather than one block normalised here.

Run from a local clone with uv

JSON
{
  "mcpServers": {
    "linkedin": {
      "command": "uv",
      "args": [
        "--directory", "/path/to/linkedin-mcp-server",
        "run", "linkedin-mcp-server"
      ]
    }
  }
}
What it needs before it will start

Python 3.12 or later; the uv package manager; Patchright browser binaries, which pull a full Chromium; and a real LinkedIn account. A display is needed at least once, because the login step opens a visible browser. No Docker image, no paid API key, no hosted account, no database.

Clients the project documents

Claude Desktop; Cursor; MCP Inspector. Where the file goes in each Claude surface. The same block in Cursor.

How it talks to the client

stdio by default; streamable-http with a flag, with host and port arguments.

Where the process runs

Runs from a local clone. No hosted option and no Docker image.

What it costs to run

The vendor's own figures, quoted rather than computed

Free. MIT-licensed source with no paid tier, no hosted service and no vendor API key.

Sales Navigator — Not supported

No Sales Navigator code path exists. The only LinkedIn surfaces touched are profile pages, people search, job views, the feed and the login page — verified by grepping the full source, which returns zero hits.

Recruiter — Not supported

No Recruiter, Talent or hiring-seat code path exists anywhere in the source.

None of the figures above are LinkedIn's. They are third-party prices in the currency and the tiering each project publishes, read on 20 September 2026 and quoted rather than converted.

Repository signals, read 20 September 2026

Nobody has changed the code in months

196 days between the last code change and the day these figures were read. Between 90 days and a year since the last code change. It may still work; nobody has checked.

How far the project has got

Early-stage solo project, effectively a two-day build. 18 commits over two calendar days, no commits since, no tags, no releases, no CI, and no tests directory although the project configuration names one and the README documents a test command. Not published to PyPI. The code itself is unusually tidy for its age — a layered architecture with a dependency-injection container, typed dataclasses, lint and pre-commit configuration — so the weakness is maintenance and verification, not craftsmanship.

How this status was decided

Active means code changed within 90 days of the observation date; stale means up to 365 days. It is measured from the last change to code, not to the README, and never from the maintainer's own adjective. Anything past a year is dropped from this directory rather than published as dormant.

Stars
188 — 37 forks.
Last commit
— The repository was created on 7 March 2026 and the entire 18-commit history lands across two days. No commits in the roughly six months since.
Open issues
2 — Issue #6: concurrent tool calls share one browser page and can return another request's profile data. Issue #1: a request for read-only message tools, not implemented. 0 open pull requests.
Status
Stale
Observed

Every figure in this section was read from GitHub on , and star and issue counts move daily. The issue count is the Issues tab, not the API field of the same name — that one counts pull requests as issues and overstates every repository in this directory.

Credential handling and known problems

What to check before you point it at a real account

Both cards below are read from the repository and its own security documentation. A project saying what it does with a session is evidence of intent, not proof of behaviour.

What running it exposes

This is a scraper driving a real, logged-in personal LinkedIn account through a stealth-patched Chromium, not an API client. Every call is made as the account owner. The README carries the author's own disclaimer: "This tool is intended for personal and educational use. Scraping LinkedIn may violate their Terms of Service. Use responsibly and at your own risk." Automated scraping and automated data collection are prohibited by the User Agreement, and enforcement is applied to the account — restriction or permanent ban — rather than to the software. Using a stealth-patched browser is itself an attempt to evade LinkedIn's bot detection, which is an aggravating factor if the account is reviewed. One genuine mitigation: the server exposes no write actions at all. It cannot post, comment, react, connect, message or send InMail, so it cannot damage an account's standing through visible activity or spam reports; the exposure is read volume and automation detection only. People search hits the ordinary search page, which on a free account is subject to LinkedIn's commercial-use limit. Anyone trialling this should point it at a throwaway account.

How it handles your credentials

The persisted browser profile in your home directory contains a live LinkedIn session; anyone with read access to that directory or to the machine can act as the account without a password or a second factor. An unexposed export path writes a cookie file into the same directory, and the code does set restrictive permissions on it. Open issue #6 is a correctness and confidentiality bug: concurrent tool calls share a single browser page and can return another request's profile data, which matters if the server is exposed over HTTP to more than one caller.

3 things that will waste an hour

Small, checkable and specific to this project — a stale package name, a broken link, a manifest that advertises something the code removed.

  • It shares a repository name with stickerdaniel/linkedin-mcp-server, which has twenty times the stars and is actively maintained. Anyone searching for "linkedin-mcp-server" most likely means that one.
  • The PyPI package named linkedin-mcp-server is neither of them: it is a third project by a third author. This one is not on PyPI and must be installed from source.
  • The README documents a pytest workflow for a repository that contains no tests directory.
If this is not the one

The servers that do a comparable job, and how they differ

Same rows, same sources, same observation date. The first column is this server.

eliasbiondo/linkedin-mcp-server compared with its alternatives
 eliasbiondo/linkedin-mcp-serverv0.1.0stickerdaniel/linkedin-mcp-serverv4.24.4Subio Scrapev0.1.0
Authenticates withBrowser sessionBrowser sessionNo account
Account riskMediumHighLow
Writes to LinkedInNone2 actionsNone
Tools registered7197
Sales Navigator toolsNoNoNo
Recruiter toolsNoNoNo
RunsSelf-hostedSelf-hostedSelf-hosted
Last code change8 March 2026 — stale20 September 2026 — active31 August 2026 — active
LicenceMIT, open sourceApache-2.0, open sourceMIT, open source
  • Profiles, companies, jobs, the feed, post search and your own inbox, read through a browser you sign into on your own account. Two tools write — a message and a connection request — and only the message tool takes a confirmation flag.

    High riskActive
    stdio and Streamable HTTP19 toolsRead 20 September 2026
  • Subio Scrape

    No account

    Reads public LinkedIn company and person pages, and a company's public posts when LinkedIn serves them signed out. It never logs in, so it puts no account at risk — and cannot see anything behind the login.

    Low riskActive
    stdio7 toolsRead 20 September 2026
Provenance

Every page this profile was read from

6 pages — the repository, its documentation and, where one exists, the vendor's own pricing page. Nothing on this profile is summarised from another directory or from a blog post about the project.

All of them read on . A repository moves faster than a price does: if a tool list or a command here no longer matches the project, the project changed and this page has not been re-read yet.

Where to next

Check what it cannot reach before you build on it

It can reach everything you can, which is the point and the problem. Section 8.2 of the User Agreement bars bots and scraping by any means, and enforcement lands on the account rather than on the software.