Skip to main content
Glama

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 | sh

2. Install the package and its browser

uv tool install linkedin-mcp-automation
linkedin-mcp --install-browsers

Alternatively install from source with git clone https://github.com/developer-tusharchauhan/linkedin-mcp.git, uv sync inside the folder, and run via python -m linkedin_mcp.server instead of the linkedin-mcp command.

3. Register with your MCP client

Client

How

opencode

Add to opencode.json: {"mcp": {"linkedin": {"type": "local", "command": ["linkedin-mcp"], "enabled": true}}}

Claude Desktop / Claude Code / Cursor

Add to your MCP config: {"mcpServers": {"linkedin": {"command": "linkedin-mcp"}}}

VS Code

Add to .vscode/mcp.json a server entry with "command": "linkedin-mcp"

{
  "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), configure command as python -m linkedin_mcp.server after a pip/venv install, or the uv --directory ... python -m form 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 spawn on a Windows machine? Your security policy blocks uv's script shims — the python -m commands 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

login

Open a headed browser window to sign in to LinkedIn and save the session

check_session

Check whether the persisted session is still valid

create_post

Publish a post to your feed

edit_post

Replace the text of one of your existing posts (matched by text)

delete_post

Delete one of your posts (matched by text; requires confirm)

get_my_profile

Read name, headline, about, experience, education, skills

update_headline

Replace your profile headline

update_about

Replace your About / Summary section

update_experience

Add a new experience (job) entry

update_education

Add a new education entry

search_jobs

Search LinkedIn jobs with filters

get_job_details

Fetch full details for a job URL

easy_apply

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-browsers

Then 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 venv then uv pip install linkedin-mcp-automation, and use python -m linkedin_mcp.server (activate the venv for your MCP client) plus python -m patchright install chromium to 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 chromium

First run — sign in

The server ships with no credentials. On first use, call the login tool:

  1. A Chromium window opens.

  2. Sign in to LinkedIn (including 2FA / captcha if prompted).

  3. The session is saved to ~/.linkedin-mcp/profile and 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 .exe shims (like linkedin-mcp). If you see Failed to spawn, switch to the python -m form — a venv pip install makes python -m linkedin_mcp.server work 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.

  1. Create a PyPI account and your project (linkedin-mcp-automation).

  2. On the PyPI project page → Publishing → add a Trusted Publisher:

    • GitHub owner: developer-tusharchauhan

    • Repository: linkedin-mcp

    • Workflow name: release.yml

    • Environment: release

  3. 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.md

License

MIT

Available Tools

11 tools
check_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

    A3.7/5.0

    Scored across 11 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      Lets an AI assistant operate LinkedIn through an authenticated browser session, enabling profile management, posting, networking, messaging, job search, and automated applications.
      100
      39 npm
      1
      MIT
    • F
      license
      C
      quality
      C
      maintenance
      Enables 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.
      39
      2
      -
    • A
      license
      A
      quality
      C
      maintenance
      Enables 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.
      19
      Apache 2.0