linkedin-mcp

linkedin-mcp

Automates LinkedIn job search and Easy Apply using Playwright and Claude Code, with tools for login, job search, form filling, and batch applications.

Category
Visit Server

README

linkedin-mcp

An MCP server that automates LinkedIn job search and Easy Apply using Playwright + Claude Code. Search for jobs matching your skill set, auto-fill application forms from your profile, and track applications in a local database — all from a Claude conversation.

What it does

Tool Description
linkedin_login Open a browser to log in to LinkedIn. Run once — session is saved.
search_jobs Search LinkedIn jobs with smart scoring against your resume skills.
get_job_details Fetch the full job description from a LinkedIn job URL.
easy_apply_poc Inspect a job's Easy Apply form fields without submitting.
easy_apply_submit Navigate all form steps, fill from your profile, and submit.
batch_easy_apply Search + apply to multiple jobs in one go, with dry-run safety.

Prerequisites

  • Python 3.11+
  • Claude Code (or any MCP-compatible client)
  • A LinkedIn account

Setup

1. Clone and install dependencies

git clone https://github.com/Shrushti8/linkedin-mcp.git
cd linkedin-mcp
pip install -r requirements.txt
playwright install chromium

2. Create your credentials file

cp .env.example .env
# Edit .env and fill in your LinkedIn email, password, and resume path

3. Create your profile

Run the interactive setup script — it asks you all the questions and generates profile.json:

python setup.py

Or copy profile.template.json to profile.json and fill it in manually.

profile.json is gitignored and stays local to your machine.

4. Add the MCP server to Claude Code

Add this to your claude_desktop_config.json (or Claude Code MCP settings):

{
  "mcpServers": {
    "linkedin": {
      "command": "python",
      "args": ["/absolute/path/to/linkedin-mcp/server.py"]
    }
  }
}

5. Log in to LinkedIn

In a Claude conversation, call the linkedin_login tool. A browser window opens — log in manually (or it auto-fills if you set LINKEDIN_EMAIL/LINKEDIN_PASSWORD in .env). Your session is saved to the session/ folder for all future calls.

Usage examples

Search for jobs:

search_jobs(keywords="Senior Data Engineer", days=1, easy_apply_only=true)

Inspect a form before applying:

easy_apply_poc(url="https://www.linkedin.com/jobs/view/1234567890")

Apply to a single job (dry run first):

easy_apply_submit(url="...", dry_run=true)
easy_apply_submit(url="...", dry_run=false)

Batch apply to top 5 Easy Apply jobs:

batch_easy_apply(limit=5, keywords="Data Engineer", days=1)

How job scoring works

Each job gets a resume_score based on how many keywords from your resume_score_weights (in profile.json) appear in the job title and description. Big-name companies get a +3 bonus. Results are sorted by score descending.

You can tune the weights in profile.json to match your own skill set.

How form filling works

easy_apply_submit uses a longest-keyword-match approach against your profile.json:

  • Text fields are matched by label (e.g. "years of python experience" → your Python YOE)
  • Salary/CTC fields use your current_ctc_lpa and expected_ctc_lpa
  • Yes/No questions are reasoned about using your notice period, bond preference, relocation preference, and skills you don't have
  • Jobs with questions the tool can't answer are returned in needs_user_input — never submitted blind

Privacy

Your personal data (profile.json, .env, session/, applications.db) is gitignored and never committed. See .gitignore.

Troubleshooting

Tool behavior didn't change after editing a file?
The MCP server loads Python once at startup. After any code edit, reconnect the server: in Claude Code, go to /mcp → linkedin → Reconnect.

Redirected to login page during search?
Your session expired. Run linkedin_login again to refresh it.

profile.json not found warning?
Run python setup.py to create your profile.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured