linkedin-mcp
This server gives AI assistants control over your LinkedIn account through your own logged-in browser session.
Posting: Publish new posts, edit or delete existing posts.
Profile: Read your full profile and update headline, About, experience, and education.
Jobs: Search jobs with keyword/location/date/type/setting filters and fetch full job details.
Easy Apply: Inspect application forms (dry-run) and submit applications with explicit confirmation.
Session management: Log in once in a real browser, persist and validate the session.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@linkedin-mcp Search for Data Engineer jobs posted this week, remote"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LinkedIn MCP Server
A custom Model Context Protocol server that gives AI assistants control of your LinkedIn account through your own logged-in browser session.
Publish posts, read and edit your profile, search jobs, and apply via Easy Apply — all from a chat conversation with any MCP-compatible client (opencode, Claude, Cursor, and more).
⚠️ Disclaimer: This project automates your real LinkedIn account in a browser. LinkedIn's User Agreement (§8.2) prohibits bots, scraping, and automation. Use at your own risk; aggressive or mass automation can lead to account restriction. All browser actions run locally on your machine.
Quick Start (first-timers)
The 5-minute path from nothing to your first LinkedIn post via AI. Requires only uv, a terminal, and a LinkedIn account.
1. Install uv (skip if you already have it)
# Windows (PowerShell)
irm https://astral.sh/uv/install.ps1 | iex
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh2. Install the package and its browser
uv tool install linkedin-mcp-automation
linkedin-mcp --install-browsersAlternatively install from source with
git clone https://github.com/developer-tusharchauhan/linkedin-mcp.git,uv syncinside the folder, and run viapython -m linkedin_mcp.serverinstead of thelinkedin-mcpcommand.
3. Register with your MCP client
Client | How |
opencode | Add to |
Claude Desktop / Claude Code / Cursor | Add to your MCP config: |
VS Code | Add to |
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["--directory", "YOUR_PATH/linkedin-mcp", "run", "python", "-m", "linkedin_mcp.server"]
}
}
}On Windows, if your client does not resolve
linkedin-mcp(e.g. binding to App Control policy), configurecommandaspython -m linkedin_mcp.serverafter a pip/venv install, or theuv --directory ... python -mform above for a source install.
4. Restart your MCP client, then in the chat:
Run the login tool.A Chromium window opens — sign in to LinkedIn there (complete 2FA/captcha if asked). After that, session is saved and you can say things like:
"Read my LinkedIn profile"
"Publish this post on LinkedIn: I just shipped my first MCP server!"
"Search for Data Engineer jobs posted this week, remote"
"Check this job and dry-run the Easy Apply form: "
Seeing
Failed to spawnon a Windows machine? Your security policy blocks uv's script shims — thepython -mcommands above already work around it. Just restart the client.
Related MCP server: LinkedIn MCP Server
Features
Posting — publish posts to your LinkedIn feed, edit or delete existing posts
Profile — read your full profile, edit headline / About, add experience & education entries
Jobs — search jobs with keyword, location, date, and type filters; fetch full job details
Easy Apply — dry-run form inspection first, consent-gated submission
Session persistence — sign in once, reuse the session indefinitely
Tools
Tool | Description |
| Open a headed browser window to sign in to LinkedIn and save the session |
| Check whether the persisted session is still valid |
| Publish a post to your feed |
| Replace the text of one of your existing posts (matched by text) |
| Delete one of your posts (matched by text; requires confirm) |
| Read name, headline, about, experience, education, skills |
| Replace your profile headline |
| Replace your About / Summary section |
| Add a new experience (job) entry |
| Add a new education entry |
| Search LinkedIn jobs with filters |
| Fetch full details for a job URL |
| Inspect (dry-run) or submit an Easy Apply form |
Requirements
uv (Python package manager)
A LinkedIn account
Installation
Choose one — A is the fastest and requires no Git or source checkout.
Option A — Install from PyPI
# installs the linkedin-mcp command + deps (mcp, patchright)
uv tool install linkedin-mcp-automation
# one-time: download the Chromium browser that drives LinkedIn
linkedin-mcp --install-browsersThen register the linkedin-mcp command with your MCP client (no path needed):
{ "mcpServers": { "linkedin": { "command": "linkedin-mcp" } } }Prefer a venv over an isolated tool?
uv venvthenuv pip install linkedin-mcp-automation, and usepython -m linkedin_mcp.server(activate the venv for your MCP client) pluspython -m patchright install chromiumto set up the browser.
Option B — From source (contributors)
git clone https://github.com/developer-tusharchauhan/linkedin-mcp.git
cd linkedin-mcp
uv sync
uv run patchright install chromiumFirst run — sign in
The server ships with no credentials. On first use, call the login tool:
A Chromium window opens.
Sign in to LinkedIn (including 2FA / captcha if prompted).
The session is saved to
~/.linkedin-mcp/profileand reused automatically.
Easy Apply auto-fill
Before submitting applications, create ~/.linkedin-mcp/answers.json mapping question labels to your answers. Keys are matched case-insensitively against form labels:
{
"phone": "+44 7xxx xxx xxxx",
"city": "London",
"years of python experience": "3",
"willing to relocate": "yes"
}Registering with an MCP client
Installed from PyPI (Option A)? The command is just linkedin-mcp:
{
"mcpServers": {
"linkedin": { "command": "linkedin-mcp" }
}
}For opencode:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"linkedin": { "type": "local", "command": ["linkedin-mcp"], "enabled": true }
}
}Running from source (Option B)? Point at the checkout — works from any directory:
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/linkedin-mcp", "run", "python", "-m", "linkedin_mcp.server"]
}
}
}Windows / corporate machines: some security policies (App Control / AppLocker) block generated
.exeshims (likelinkedin-mcp). If you seeFailed to spawn, switch to thepython -mform — a venv pip install makespython -m linkedin_mcp.serverwork from any directory — and restart your MCP client.
Releasing a new version
The repo includes a GitHub Actions workflow (.github/workflows/release.yml) that builds and publishes to PyPI automatically when a v* tag is pushed.
Create a PyPI account and your project (
linkedin-mcp-automation).On the PyPI project page → Publishing → add a Trusted Publisher:
GitHub owner:
developer-tusharchauhanRepository:
linkedin-mcpWorkflow name:
release.ymlEnvironment:
release
Tag and push — the workflow builds and publishes for you:
git tag v0.1.0 git push origin v0.1.0(Trigger it manually anytime via Actions → Release to PyPI → Run workflow.)
Manual alternative (one-off): run uv publish locally with UV_PUBLISH_TOKEN set to a PyPI API token.
Example usage
Once connected, just ask your assistant:
"Publish a post on LinkedIn about my new project"
"Read my LinkedIn profile"
"Update my headline to: Software Engineer | AI & Data"
"Search for Senior Data Engineer jobs posted this week, remote"
"Check this job and dry-run the Easy Apply form: https://www.linkedin.com/jobs/view/1234567890"
It is recommended to inspect (dry_run) before submitting any application.
How it works
Patchright (a stealth-patched Playwright fork) drives a persistent Chromium profile.
A process-wide lock serializes tool calls — one browser at a time.
LinkedIn selectors are matched against the current DOM; if LinkedIn changes markup, some tools may need a selector refresh.
Project layout
linkedin-mcp/
├── pyproject.toml # dependencies + entrypoint
├── src/linkedin_mcp/
│ ├── server.py # MCP server: registers all tools
│ ├── browser.py # persistent browser session management
│ └── linkedin.py # automation routines
└── README.mdLicense
MIT
Available Tools
11 toolscheck_sessionA
Return whether the persisted LinkedIn session is still valid.
Inputs: no named parameters.
create_postB
Publish a post to the authenticated user's LinkedIn feed.
Args: text: The full text of the post to publish.
Inputs: text (required).
easy_applyA
Inspect or submit an Easy Apply job application.
Args: url: LinkedIn job URL containing an Easy Apply button. dry_run: If True, inspect the form fields and return unanswered questions without submitting. Must be False for the application to actually be submitted. confirm: Must be True alongside dry_run=False to actually submit. Extra safety gate.
Inputs: url (required), confirm, dry_run.
get_job_detailsA
Fetch full details for a specific LinkedIn job listing URL.
Args: url: Full LinkedIn job URL (e.g. https://www.linkedin.com/jobs/view/1234567890).
Inputs: url (required).
get_my_profileA
Return the authenticated user's full profile: name, headline, about, experience, education, skills.
Inputs: no named parameters.
loginA
Open a headed LinkedIn sign-in window (first-time use or re-login).
Args: wait_seconds: Max seconds to wait for manual sign-in (default: 600).
Inputs: wait_seconds.
search_jobsA
Search LinkedIn jobs and return structured results.
Args: keywords: Job search keywords (e.g. "Senior Data Engineer"). location: Location filter (e.g. "New York"). date_posted: One of 'day', 'week', 'month'. job_type: One of full_time, part_time, contract, temporary, internship, other. work_setting: One of remote, hybrid, onsite. limit: Max results to return (default 10).
Inputs: keywords (required), limit, job_type, location, +2 more.
update_aboutA
Replace the profile About / Summary section.
Args: about: The new About text.
Inputs: about (required).
update_educationC
Add a new education entry to the profile.
Args: school: School or university name. degree: Degree (e.g. "Bachelor of Science"). field_of_study: Field of study (e.g. "Computer Science"). start: Start year or date string. end: End year or date string. description: Description / notes.
Inputs: school (required), end, start, degree, +2 more.
update_experienceB
Add a new experience entry to the profile.
Args: title: Job title. company: Company / organisation name. start: Start date label (e.g. "Jan 2023" or "2023-01-01"). end: End date label (leave blank for present role). description: Role description. employment_type: One of full_time, part_time, contract, temporary, internship, other. location: Location string.
Inputs: title (required), company (required), end, start, +3 more.
update_headlineC
Replace the profile headline with new text.
Args: headline: The new headline string to set.
Inputs: headline (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Each tool addresses a distinct action: session management, posting, profile reads/writes, job search, job details, and applications. There's no functional overlap—even the profile updates target different sections (headline vs. about vs. experience vs. education) clearly.
Most tools follow a verb_noun pattern (get_, update_, create_, search_, check_session), but 'easy_apply' and 'login' deviate from that convention. Still, names are readable and predictable enough.
11 tools is well-scoped for a LinkedIn automation server. Each tool covers a meaningful operation—auth, posting, profile management, job search, and applying—without unnecessary bloat or obvious missing essential features.
The set covers the primary workflows: post creation, profile retrieval and updates (headline, about, experience, education), job search, job details, and Easy Apply. Gaps include lack of update/delete for existing experience/education entries and no post deletion/editing, but these are not critical for typical automation tasks.
Maintenance
Related MCP Connectors
LinkedIn jobs, companies and people for AI agents, plus messages and invites via your own account.
LinkedIn for AI agents: search people, read profiles, posts and connections via a connected account
LinkedIn actions for AI agents: search, messaging, posts and invites, as hosted MCP tools.
LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts, jobs, quotas, webhooks.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Claude AI to interact with LinkedIn through browser automation, including profile reading, people and job search, company research, post publishing, and profile editing.MIT
- AlicenseAqualityCmaintenanceLets an AI assistant operate LinkedIn through an authenticated browser session, enabling profile management, posting, networking, messaging, job search, and automated applications.10039 npm1MIT
- FlicenseCqualityCmaintenanceEnables an AI agent to drive a real LinkedIn account through a persistent browser session, covering full profile editing, people and content interactions (searching, connecting, messaging, posting, reacting), and job search with step-by-step Easy Apply submissions. It reads data through LinkedIn's internal Voyager API while writing through the actual UI, with a saved answer bank so repeated application questions are resolved automatically.392-
- AlicenseAqualityCmaintenanceEnables AI assistants to browse profiles and companies, manage messages and inboxes, and search jobs, posts, and people through a locally logged-in browser session. All actions run on the user's own machine.19Apache 2.0