LinkedIn MCP Server
Give MCP-compatible assistants access to LinkedIn through a locally authenticated browser session.
The evidence clearly documents local execution, a default 127.0.0.1 HTTP bind, browser-profile and cookie locations, proxy routing scope, automatic import behavior, and a reduced Docker authentication-cookie subset. Proxy passwords can be supplied through environment variables, and CI actions are commit-pinned. Sending a message is marked as confirmation-gated, and terminal logout also requests confirmation. Deductions apply because browser-session import is enabled by default and reads LinkedIn cookies from an everyday browser, while connection requests and other write operations are not shown to share a comprehensive call-time confirmation policy. Python dependencies use lower bounds rather than a fully pinned set, and the recommended installation deliberately resolves @latest at every launch. Sent messages and connection requests have no practical rollback, while logout discards a session, so rollback is thin. The independent-project disclaimer, trademark statement, author identity, email, and license attribution justify full source-attribution credit.
The README, project metadata, CLI options, fixtures, and CI are broadly consistent about the local browser-session model, supported Python versions, and major operating modes. The supplied tests also show deliberate cross-process lease and multi-platform browser-behavior coverage. Self-consistency is reduced because feature status mixes an unexplained “working” label with issue references, and the README describes a broader feature set than the short package description. Dependencies, version floors, installer, and browser setup are identified, but availability still relies on runtime downloads, @latest resolution, LinkedIn page structure, and external login challenges. Failure guidance is unusually thorough and actionable, covering authentication, timeouts, browser contention, proxies, container misdetection, browser-version conflicts, and DLL problems, which justifies full marks for failure messages.
The material explicitly serves developers, Claude Desktop users, generic MCP clients, Docker deployments, local development, and both stdio and HTTP operation, with scenario-specific configuration. The tool catalog and CLI reference establish useful boundaries, and several read tools require explicit section selection. Deductions apply because LinkedIn terms, rate or account restrictions, and a complete confirmation boundary for every state-changing tool are not documented. Tool names and filters support reasonably precise selection, but complete input schemas, ambiguity handling, and model invocation guidance are absent, limiting capability-boundary and trigger-precision scores.
The README has clear organization, a tool catalog, several installation routes, a detailed CLI reference, examples, and extensive troubleshooting. Package, executable, and tool naming are coherent. Concurrent-use constraints, cookie-import limitations, proxy hazards, browser-cache growth, platform differences, and login challenges are documented thoroughly, justifying full known-limitations credit. Apache-2.0 metadata matches the complete LICENSE. A package version and Releases-based changelog route exist, but no actual changelog content or compatibility policy appears in the supplied files, so versioning is not thorough. The author, email, issue tracker, and repository provide a maintenance path, but there is no demonstrated team ownership, support commitment, or dedicated security contact; the publisher's registry status remains unknown rather than adverse.
The tools cover profiles, companies, jobs, feeds, and messages and expose logged-in LinkedIn browser data to general MCP clients, providing strong marginal value. Tool descriptions and explicit section selection improve usability, but no response schemas, representative outputs, pagination semantics, or field-stability commitments are supplied, so output usability is only adequate. The project is free and local, but users bear browser downloads, persistent-session management, login handling, frequent upgrades, scraping maintenance, verification challenges, and cache growth; the benefit appears favorable but is not comprehensively quantified.
Project metadata, the README, CI, and test-support code cross-corroborate claims about versions, dependencies, testing workflow, local sessions, cross-process locking, and browser-identity checks. Several uncertain features are also tied to issue references. Claim traceability is reduced because the supplied evidence omits the primary server and tool implementations, response schemas, full test cases, and CI results; badges and “working” labels alone do not establish functional outcomes. The documentation often distinguishes constraints from recommendations, but some operational, safety, and feature-status statements remain assertions without consistently labeling their evidentiary basis or separating inference from demonstrated fact.
- Automatic import reads LinkedIn cookies from a local browser and stores a valid session under ~/.linkedin-mcp; users should review host trust boundaries, filesystem permissions, and account risk before enabling it.
- send_message and connect_with_person create external social effects. Only message sending is explicitly described as confirmation-gated, and the repository offers no rollback guarantee for a sent message or connection request.
- The recommended @latest configuration resolves new code at launch, reducing reproducibility and widening the supply-chain update surface. High-assurance deployments should establish their own balance between prompt updates and reviewed version pinning.
- The project depends on browser automation and authenticated sessions and may be affected by LinkedIn page changes, verification challenges, account policies, and service terms; the supplied material does not comprehensively assess those risks.
- This assessment reviewed only the supplied static files. It did not run the server, tests, browser, or LinkedIn operations and did not independently validate README feature labels such as “working.”
What does this agent do, and when should you use it?
LinkedIn MCP Server is an open-source MCP service built with Python, FastMCP, and Patchright that operates through the user's own LinkedIn browser session. It exposes tools for profiles, companies, jobs, feeds, posts, connections, and messages, including selected write operations such as sending messages and handling connection requests. The server uses stdio by default and also supports Streamable HTTP, with documented installation paths for uvx, a Claude Desktop MCP Bundle, Docker, and local development. Authentication and page access occur in Chromium, with the browser profile stored under ~/.linkedin-mcp/profile/ and managed browser downloads cached under ~/.linkedin-mcp/patchright-browsers/. It is an independent project rather than an official LinkedIn or Microsoft integration, and adopters must accept that automated access can violate LinkedIn's terms and put an account at risk.
An MCP client invokes a named tool, and the server uses Patchright Chromium with a saved or imported LinkedIn session to navigate the relevant pages. get_person_profile and get_my_profile retrieve explicitly selected sections such as experience, education, skills, projects, contact information, and posts; get_company_profile, get_company_posts, search_companies, and get_company_employees support company research. search_jobs, get_saved_jobs, and get_job_details cover job discovery, while get_feed and search_posts retrieve feed and post content. get_inbox, get_conversation, search_conversations, and send_message handle messaging, with confirmation required for send_message; connect_with_person can send or accept connection requests. Calls are serialized through a queue to protect the shared browser session, and close_session shuts the session down and releases resources.
- A job seeker searches by keyword and location with search_jobs, then retrieves full listings through get_job_details.
- A recruiter or business researcher uses search_people, get_person_profile, and get_company_employees to investigate candidates and company personnel.
- A salesperson gathers account context with search_companies, get_company_profile, and get_company_posts before outreach.
- A user reviewing LinkedIn correspondence lists recent threads with get_inbox and finds relevant messages with search_conversations.
- An individual asks an assistant to inspect the home feed, find recent posts, or send a confirmed message or connection request.
What are this agent's strengths and limitations?
- Its tool set spans profiles, companies, employees, jobs, posts, the home feed, connections, and messages, enabling multi-step LinkedIn research workflows.
- It offers uvx, Claude Desktop MCP Bundle, Docker, and source-based deployment, plus both stdio and Streamable HTTP transports.
- It uses the user's local browser session rather than requiring credentials to be hosted by the project and can import sessions from several Chromium-based browsers.
- Browser access is serialized across calls and processes, with configurable waiting, minimum-hold, and idle-shutdown behavior.
- LinkedIn's User Agreement prohibits automated access; the project explicitly warns that accounts may be restricted or banned and provides no account-safety guarantee.
- Operation depends on LinkedIn's page structure and a real Chromium session, so layout changes, captchas, login confirmations, expired sessions, and slow networks can cause failures.
- Several tools point to open GitHub issues rather than being labeled working, including profile retrieval, connection handling, people search, and message sending.
- Concurrency is deliberately serialized, so multiple clients may encounter a browser-is-busy response and need to wait or retry.
- The system persists browser profiles and cookie-related state locally and maintains a Chromium cache that can grow across releases.
How do you install or deploy this agent?
The recommended path requires uv. Add this entry to an MCP client configuration:
{"mcpServers":{"mcp-server-linkedin":{"command":"uvx","args":["mcp-server-linkedin@latest"],"env":{"UV_HTTP_TIMEOUT":"300"}}}}
The first authentication-dependent call prepares Patchright Chromium and opens a LinkedIn login window. To establish the session beforehand, run uvx mcp-server-linkedin@latest --login. If a supported Chromium-based browser already has a live LinkedIn session, run uvx mcp-server-linkedin@latest --import-from-browser. Claude Desktop users can instead download and open the latest .mcpb release artifact. Docker installation requires a writable ~/.linkedin-mcp mount and a one-time container run with --login --login-viewer.
How do you use this agent?
After configuring the MCP client and authenticating, invoke the tool matching the task. For example, call search_jobs with keyword and location filters, then pass a returned posting to get_job_details; for profiles, call get_person_profile and explicitly request sections such as experience, education, skills, or posts. Confirm the intended content before invoking send_message. Retry if the first request reports that browser setup or authentication is still in progress. For slow pages use --timeout 10000, and for long complete calls use --tool-timeout 300. An HTTP client can start the service with uvx mcp-server-linkedin@latest --transport streamable-http --host 127.0.0.1 --port 8080 --path /mcp and connect to http://localhost:8080/mcp.
How does this agent compare with similar options?
The README presents Unipile as the managed alternative. This project is free, open source, and runs locally with the user's browser session; Unipile provides a hosted API for LinkedIn Classic, Sales Navigator, and Recruiter while managing authentication, sessions, and infrastructure.