mcp-linkedin
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., "@mcp-linkedinfind recent remote Python developer jobs in Paris"
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.
mcp-linkedin
An MCP (Model Context Protocol) server to search and read LinkedIn job offers without a LinkedIn account.
It lets an AI assistant (Claude, or any MCP client) search for jobs, internships and work-study positions, and turn the Job IDs it finds (for example in LinkedIn email alerts) into complete offer details: title, company, location, seniority level, contract type, number of applicants, direct apply link and full description in Markdown.
Features
No account, no API key: uses LinkedIn's public guest endpoints only.
Job search powered by JobSpy, with filters for location, radius, contract type, remote and age of the offer.
Offer details from a Job ID or any LinkedIn job URL (
/jobs/view/...,?currentJobId=...).Batch lookup of up to 25 offers in one call, with deduplication and randomized pauses to avoid rate limiting.
Built-in resilience: retries with backoff on HTTP 429, in-memory LRU cache (512 offers), clear error messages for expired or missing offers.
Token-friendly output: empty fields are dropped and descriptions are truncated to a configurable length.
Several transports:
streamable-http(default),sseorstdio.Docker-ready, runs as a non-root user, with a
/healthendpoint.
Related MCP server: LinkedIn MCP Server
How it works
┌──────────────┐ MCP (HTTP / stdio) ┌──────────────────┐ HTTPS (guest) ┌──────────────┐
│ MCP client │ ─────────────────────▶ │ mcp-linkedin │ ────────────────▶ │ LinkedIn │
│ (Claude ...) │ ◀───────────────────── │ FastMCP + JobSpy │ ◀──────────────── │ public pages │
└──────────────┘ JSON results └──────────────────┘ HTML parsing └──────────────┘search_jobsdelegates the search to JobSpy.get_linkedin_job(s)fetcheslinkedin.com/jobs-guest/jobs/api/jobPosting/{id}and parses the HTML with BeautifulSoup.
Tools
Tool | Description |
| Search LinkedIn job offers by keywords and filters. |
| Full details of one offer, from a Job ID or a LinkedIn URL. |
| Full details of several offers at once (max 25). |
search_jobs
Parameter | Type | Default | Description |
|
| required | Keywords, e.g. |
|
|
| Search location. |
|
|
| Contract type. |
|
|
| Maximum age of the offers, in hours. |
|
|
| Number of results, clamped between 1 and 50 (about 5 s per page of 10). |
|
|
| Fetch the full description (one extra request per offer, slower). |
|
|
| Remote offers only. |
|
|
| Search radius in kilometers. |
|
|
| Description length limit when |
Tip: work-study ("alternance") is not a LinkedIn job type. Put the word
alternanceinsearch_terminstead.
Returns { "count": int, "jobs": [...] }. Each job contains id, site, title, company, location, date_posted, job_type, job_level, is_remote, url, url_direct and, if requested, description.
get_linkedin_job
Parameter | Type | Description |
|
| Job ID ( |
Returns job_id, url, title, company, location, posted, applicants, seniority_level, employment_type, job_function, industry, apply_url_direct and description (Markdown). English and French LinkedIn labels are both supported.
get_linkedin_jobs
Parameter | Type | Description |
|
| Up to 25 Job IDs or URLs. Duplicates are ignored. |
Returns { "count": int, "jobs": [...], "invalid": [...] | null }, where invalid lists the inputs in which no Job ID could be found.
Getting started
Requirements
Python 3.12+ and uv, or
Docker and Docker Compose
Run locally
git clone https://github.com/ynsz-66/mcp-linkedin.git
cd mcp-linkedin
uv sync
HOST=127.0.0.1 uv run server.pyThe MCP endpoint is then available at http://127.0.0.1:8080/mcp-linkedin.
Run with Docker
cp .env.example .env
docker compose up -d --build
curl http://127.0.0.1:8080/health # {"status":"ok"}The port is bound to 127.0.0.1 only. Put a reverse proxy in front of it if you want to expose the server.
Configuration
All settings are environment variables (see .env.example).
Variable | Default | Description |
|
|
|
|
| HTTP path of the MCP endpoint. |
|
| Bind address ( |
|
| HTTP port. |
|
| Description length limit for |
|
| Python logging level. |
Connecting an MCP client
Claude Code (HTTP)
claude mcp add --transport http linkedin http://127.0.0.1:8080/mcp-linkedinClaude Desktop or any stdio client
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["run", "--directory", "/path/to/mcp-linkedin", "server.py"],
"env": { "MCP_TRANSPORT": "stdio" }
}
}
}Example prompts
"Find Python developer internships posted in Paris in the last 24 hours."
"Here are the job IDs from my LinkedIn alert email, give me the details and the direct apply links."
"Search for remote AI work-study positions in France and summarize the requirements."
Limitations
The server relies on LinkedIn's public, undocumented pages. If LinkedIn changes its HTML, some fields may come back empty. In that case the response contains an explicit
errorfield.LinkedIn rate limits anonymous traffic. Keep
results_wantedand batch sizes reasonable.The cache lives in memory and is cleared when the server restarts.
Disclaimer
This project is not affiliated with, endorsed by or sponsored by LinkedIn. It only reads publicly accessible pages. You are responsible for using it in accordance with LinkedIn's User Agreement and the laws that apply to you. Use it for personal job searching, at a moderate request rate.
Acknowledgements
JobSpy for the job scraping engine.
MCP Python SDK for FastMCP.
This server cannot be deployed
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 for AI agents: inbox, invitations, Sales Navigator search, posts, jobs, quotas, webhooks.
LinkedIn data for AI agents: profiles, companies, jobs, posts, search. Sales research, recruiting.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with LinkedIn by scraping profiles, companies, job postings, and getting personalized job recommendations using authenticated browser automation.1712,613 PyPI3,895Apache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables users to search for jobs, retrieve profiles, and fetch feed posts through the LinkedIn API. It also provides tools for analyzing and extracting data from PDF resumes.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search LinkedIn jobs with built-in rate limiting to prevent IP bans. Supports job search, filtering, company profiles, and job categories through MCP tools.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search, filter, and extract job listings from LinkedIn using an automated headless browser with semantic AI filtering and deduplication.7 npmMIT