linkedincli
Profile data, the feed, messaging, connections and engagement, on a session taken from your own browser. No rate limiting, no throttle, no dry run and no confirmation step, and the maintainer forbids running it on a server. A session from your own logged-in browser, replayed against LinkedIn's internal API. No OAuth, no API key, no developer app.
- Last read
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.
A developer or solo operator who wants their own agent to drive their own LinkedIn account from their own machine, and who is comfortable with session-based tooling against a private API. Because every tool is also a CLI subcommand, each one can be tested by hand before an agent is let near it, and the zero-infrastructure footprint makes it trivial to try. Genuinely useful for read-heavy work: your own profile data, your feed and messages, who viewed your profile, and people, company and job search.
Teams, agencies or anything multi-seat — it is single-account, single-machine by design, and the maintainer explicitly forbids running it on a server or a cloud instance. Not for sales or recruiting workflows that need Sales Navigator or Recruiter: neither is supported in any form, and there is no InMail capability. Not for outreach at volume: there is no rate limiting, throttling or safety rail of any kind, and automated connection requests and messages under your own name are exactly what gets accounts restricted. Not for anyone who needs a stable production dependency — it is pre-1.0, the npm release is months stale, and the flagship open issues are that the session dies and that post search does not work.
- Publisher
- Brandon Charleson — independent developer, community project — not affiliated with LinkedIn or Microsoft.
- Licence
- MIT — open source
- Version
- 0.1.6
- Runs
- Self-hosted
- Transport
- stdio
- Repository
- github.com/bcharleson/linkedincli
- Last read
Hosting and transport are as the project documents them: Local machine only, and the README says so at length. A section titled "Local harness only" forbids cloud deployment: a live LinkedIn session must run on the operator's own computer, and cloud agents or remote runners may only install the CLI or call a server already running on that local machine.
A session from your own logged-in browser, replayed against LinkedIn's internal API. No OAuth, no API key, no developer app.
A session taken from your own signed-in browser, replayed against the internal API the LinkedIn website itself uses.
The same reach as a browser session and the same clause against it, with two additions: the session is a credential equivalent to full account access wherever it is stored, and it is invalidated whenever LinkedIn decides the client does not look like a browser.
The server writes to LinkedIn as you, over a route LinkedIn does not sanction. Automated messages and connection requests under a member’s own name are what the enforcement is built to catch, and the account is what it acts on.
You supply your own live LinkedIn session. The documented and supported route reads it out of a local Chrome profile with a login command, which needs a local SQLite binary and prompts for a keychain unlock on first run; it works on macOS and Linux but not on Windows, where Chrome 127 and later block it. The session can also come from environment variables or a stored config file written by the login command. Sessions expire after a few weeks and can be invalidated immediately if the client does not look enough like Chrome — see the risk note, which is the project's own flagship open issue.
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.
17 of its 17 write actions land on LinkedIn under your own account
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.
- profile_me
- profile_view
- profile_contact-info
- profile_skills
- profile_network
- profile_badges
- profile_privacy
- profile_posts
- profile_disconnect
- posts_create
- posts_edit
- posts_delete
- feed_view
- feed_user
- feed_company
- engage_react
- engage_reactions
- engage_comment
- engage_comments-list
- engage_share
- connections_send
- connections_received
- connections_sent
- connections_accept
- connections_reject
- connections_withdraw
- connections_remove
- messaging_conversations
- messaging_conversation-with
- messaging_messages
- messaging_send
- messaging_send-new
- messaging_mark-read
- search_people
- search_companies
- search_jobs
- search_posts
- companies_view
- companies_follow
- companies_unfollow
- jobs_view
- jobs_skills
- analytics_profile-views
All 43 tools it registers are named above. Post search is registered but always fails: the README names the exact broken query and refuses to invent a replacement — "A replacement content-search queryId has not been verified from public/in-repo sources, so this CLI does not invent one." Every tool is also a CLI subcommand, so each can be tested by hand before an agent is let near it.
What it can read
8 read actions, written as what they return rather than as the tool signature.
- Your own profile; any profile by its URL slug; a profile's contact information, skills, network figures, badges, privacy settings and recent posts.
- Your own chronological feed, another member's activity, and a company page's updates.
- Who reacted to a post, and the comments on a post.
- Invitations you received and invitations you sent.
- Your conversations, the conversation with a given person, and the messages in one.
- People search with keyword, title, company, geography and connection-degree filters; company search; job search with remote and experience filters.
- A company profile by its URL slug; a job posting's details and its skill-match insights.
- Who viewed your profile.
What it can write, and where the write lands
17 of the 17 write actions land on LinkedIn itself. Those are the rows that carry the account risk: an automated message, invitation, post or campaign change is activity under your own name, and Section 8.2 of the User Agreement bars sending it by automated means. Section 8.2 of the User Agreement ↗
| Action | Where it lands | What it does |
|---|---|---|
posts_create | Your LinkedIn account | Publishes a text, image or article post to your feed. |
posts_edit | Your LinkedIn account | Rewrites the text of one of your existing posts. |
posts_delete | Your LinkedIn account | Removes one of your posts. |
engage_react | Your LinkedIn account | Reacts to someone else's post as you, in one of six reaction types. |
engage_comment | Your LinkedIn account | Posts a public comment under your name. |
engage_share | Your LinkedIn account | Reposts another post with your commentary. |
connections_send | Your LinkedIn account | Sends a connection request, optionally with a note. |
connections_accept | Your LinkedIn account | Accepts a pending invitation. |
connections_reject | Your LinkedIn account | Rejects or ignores a pending invitation. |
connections_withdraw | Your LinkedIn account | Withdraws a request you sent. |
connections_remove | Your LinkedIn account | Removes an existing connection. |
profile_disconnect | Your LinkedIn account | Removes a connection by public identifier — a second path to the same thing. |
messaging_send | Your LinkedIn account | Sends a message in an existing conversation. |
messaging_send-new | Your LinkedIn account | Opens a new conversation with one or more recipients. |
messaging_mark-read | Your LinkedIn account | Marks a conversation read, which the other party sees as a read receipt. |
companies_follow | Your LinkedIn account | Follows a company page as you. |
companies_unfollow | Your LinkedIn account | Unfollows a company or entity. |
Read the middle column before the third. A write that lands off LinkedIn — a vendor workspace, a CRM, a local file — is undone by deleting a row. A write that lands on LinkedIn has already been seen by another member.
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.
Global install
npm install -g @bcharleson/linkedincliThe package is @bcharleson/linkedincli, but the command it installs is linkedin.
Without installing
npx @bcharleson/linkedincli --helpAuthenticate
linkedin login --from-chromeReads the session out of a local Chrome profile. macOS and Linux only: Chrome 127 and later block it on Windows, and an open issue reports the documented workaround still failing there.
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.
Launch through npx
{
"mcpServers": {
"linkedin": {
"command": "npx",
"args": ["-y", "@bcharleson/linkedincli", "mcp"]
}
}
}Light and local. Node.js 18 or newer and npm — that is the whole mandatory stack. No Docker, no Python, no headless browser or Playwright, no paid API key, no hosted account, no database, no server. Optional, local-only, and needed in practice for sessions to survive: a SQLite binary for the Chrome import, and a browser-impersonating curl build for the transport workaround. Windows cannot use the Chrome import at all.
Claude Code; Cursor; Windsurf; OpenClaw; Any MCP client that can launch a local stdio server. Where the file goes in each Claude surface. The same block in Cursor.
stdio only. The client launches the installed command as a local process, which is the only arrangement the project supports — it forbids running on a server.
Local machine only, and the README says so at length. A section titled "Local harness only" forbids cloud deployment: a live LinkedIn session must run on the operator's own computer, and cloud agents or remote runners may only install the CLI or call a server already running on that local machine.
The vendor's own figures, quoted rather than computed
Free. MIT-licensed open source with no paid tier, no hosted plan and no vendor API key. The only cost is a LinkedIn account; no Premium, Sales Navigator or Recruiter subscription is required for the tools it exposes.
No Sales Navigator tool, surface or lead-list capability exists anywhere in the source. People search hits the standard consumer search, not a Sales Navigator one.
No Recruiter tools, no project or pipeline management, no candidate sourcing beyond ordinary people search.
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.
The code has moved recently
29 days between the last code change and the day these figures were read. Code changed within 90 days of the day this directory was checked.
Early. Created March 2026, still pre-1.0, effectively a single-maintainer project. 57 stars is modest traction. The codebase is small but real: around 30 TypeScript source files, a clean abstraction where one definition serves both the CLI and the MCP tool, typed input schemas on every command, and six test files covering auth, the browser import, redirects, transport and the search gap.
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
- 57 — 18 forks, 0 watchers.
- Last commit
- — Preceding substantive commits are 20 August; before that there is a gap back to March.
- Open issues
- 2 — Both are core-functionality defects: sessions dying on Windows, and post search returning no results. The API reports 3 because it counts an open pull request. A closed issue reads, in full, "yeah this instantly logs me out".
- Status
- Active
- 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.
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.
This drives a real personal LinkedIn account through LinkedIn's private, undocumented internal API, using a session taken from your own browser. It is not an official integration, and the repository's own disclaimer states it "is not affiliated with or endorsed by LinkedIn" and that "the authors are not responsible for any account restrictions that may result from automated usage". The write actions carry the account risk: posting, commenting, reacting, sharing, sending and accepting connection requests, and sending messages all happen under your own name and are indistinguishable from you acting personally. Automated connection requests and messaging are the classic triggers for restrictions, and the tool ships no rate limiting, no throttling, no dry-run mode and no confirmation step — an agent can loop a connection request or a new message as fast as the server answers. The read actions carry less risk but still collect LinkedIn data in a way the User Agreement prohibits. Separately, session stability is a documented, unresolved problem: the default HTTP client presents a network fingerprint that is not Chrome, and LinkedIn frequently detects it and invalidates the session on the first call. The maintainer's two mitigations are explicitly opt-in workarounds, and an open issue reports them still failing on Windows.
The credential is a full LinkedIn session, which is equivalent to full account access: anyone holding it can act as the member without a password or a second factor. It is stored in plaintext in a config file in your home directory, and the README's own client config example puts it in the client's environment block, meaning it typically ends up in a plaintext editor or agent config file that may be synced or committed. There is no encryption at rest and no keychain storage for the tool's own config. To the maintainer's credit: the values are never printed to standard output or error, redirects are never followed so an expired session surfaces as a 3xx rather than leaking through a login redirect, a verify command classifies login and challenge redirects as an invalid session, and the project's central security stance is architectural — the README and its agent guide both insist the session must never leave the local machine and must not be placed in a cloud or remote-runner environment.
2 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.
- The published npm version is 0.1.5 from March 2026 while the repository is 0.1.6, and the published tarball does not contain the session-survival code the README documents. To get those features, build from source.
- The README's other client config block puts the LinkedIn session into the agent config file as environment variables. It is not reproduced here: a live session pasted into an agent config is the exposure this page is describing.
The servers that do a comparable job, and how they differ
Same rows, same sources, same observation date. The first column is this server.
| linkedincliv0.1.6 | stickerdaniel/linkedin-mcp-serverv4.24.4 | eliasbiondo/linkedin-mcp-serverv0.1.0 | |
|---|---|---|---|
| Authenticates with | Session cookie | Browser session | Browser session |
| Account risk | High | High | Medium |
| Writes to LinkedIn | 17 actions | 2 actions | None |
| Tools registered | 43 | 19 | 7 |
| Sales Navigator tools | No | No | No |
| Recruiter tools | No | No | No |
| Runs | Self-hosted | Self-hosted | Self-hosted |
| Last code change | 22 August 2026 — active | 20 September 2026 — active | 8 March 2026 — stale |
| Licence | MIT, open source | Apache-2.0, open source | MIT, open source |
stickerdaniel/linkedin-mcp-server
Browser sessionProfiles, 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.
stdio and Streamable HTTP19 toolsRead 20 September 2026eliasbiondo/linkedin-mcp-server
Browser sessionRead-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.
stdio and Streamable HTTP7 toolsRead 20 September 2026
Every page this profile was read from
7 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.
- github.com/bcharleson/linkedincli
- raw.githubusercontent.com/bcharleson/linkedincli/main/README.md
- raw.githubusercontent.com/bcharleson/linkedincli/main/AGENTS.md
- api.github.com/repos/bcharleson/linkedincli
- api.github.com/repos/bcharleson/linkedincli/issues
- registry.npmjs.org/@bcharleson/linkedincli
- github.com/bcharleson/linkedincli/commits/main
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.
Read the write table before you connect it
17 of this server's actions land on LinkedIn under your own account, on a session cookie. That is high account risk, and the account is what enforcement acts on.