LinkedIn Agent MCP
Enables AI assistants to connect to LinkedIn, accessing profiles and companies, searching for jobs and people, managing saved jobs, updating job-search profile settings, and inspecting analytics.
README
LinkedIn Agent MCP
<p align="left"> <a href="https://pypi.org/project/linkedin-scraper-mcp/" target="_blank"><img src="https://img.shields.io/pypi/v/linkedin-scraper-mcp?color=blue" alt="PyPI"></a> <a href="https://github.com/iushv/linkedin-agent-mcp/actions/workflows/ci.yml" target="_blank"><img src="https://github.com/iushv/linkedin-agent-mcp/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI Status"></a> <a href="https://github.com/iushv/linkedin-agent-mcp/actions/workflows/release.yml" target="_blank"><img src="https://github.com/iushv/linkedin-agent-mcp/actions/workflows/release.yml/badge.svg?branch=main" alt="Release"></a> <a href="https://github.com/iushv/linkedin-agent-mcp/blob/main/LICENSE" target="_blank"><img src="https://img.shields.io/badge/License-Apache%202.0-brightgreen?labelColor=32383f" alt="License"></a> </p>
Through this LinkedIn Agent MCP, AI assistants like Claude can connect to your LinkedIn. Access profiles and companies, search for jobs and people, manage saved jobs, update job-search profile settings, and inspect analytics.
Attribution
This project was originally bootstrapped from Daniel Sticker's LinkedIn MCP work and has since been extended into a broader LinkedIn automation and job-search manager. Credit for the original foundation goes to Daniel Sticker and the original linkedin-mcp-server project.
Installation Methods
https://github.com/user-attachments/assets/eb84419a-6eaf-47bd-ac52-37bc59c83680
Usage Examples
Research the background of this candidate https://www.linkedin.com/in/ayushkumar-exl/
Get this company profile for partnership discussions https://www.linkedin.com/company/inframs/
Suggest improvements for my CV to target this job posting https://www.linkedin.com/jobs/view/4252026496
What has Anthropic been posting about recently? https://www.linkedin.com/company/anthropicresearch/
Features & Tool Status
| Tool | Description | Status |
|---|---|---|
get_person_profile |
Get profile info with explicit section selection (experience, education, interests, honors, languages, contact_info) | Working |
get_company_profile |
Extract company information with explicit section selection (posts, jobs) | Working |
get_company_posts |
Get recent posts from a company's LinkedIn feed | Working |
search_jobs |
Search for jobs with keywords and location filters | Working |
get_job_details |
Get detailed information about a specific job posting | Working |
search_people |
Search LinkedIn members by keywords, current company, past company, and location; supports `match_mode=auto | strict |
get_company_people |
Find people at a target company with optional past-company and title filters | Working |
save_job |
Save a LinkedIn job to the current account's queue | Working |
get_saved_jobs |
List the current account's saved jobs with pagination metadata | Working |
update_profile_headline |
Update the logged-in profile headline with preview support | Working |
set_open_to_work |
Enable or disable Open To Work preferences with preview support | Working |
add_profile_skills |
Add new skills to the logged-in profile with preview support | Working |
set_featured_skills |
Best-effort featured-skill ordering flow | Experimental |
get_job_recommendations |
Read LinkedIn's personalized job recommendations feed | Working |
close_session |
Close browser session and clean up resources | Working |
[!IMPORTANT] Breaking change: LinkedIn recently made some changes to prevent scraping. The newest version uses Patchright with persistent browser profiles instead of Playwright with session files. Old
session.jsonfiles andLINKEDIN_COOKIEenv vars are no longer supported. Run--loginagain to create a new profile + cookie file that can be mounted in docker. 02/2026
Structured Helper Fields
Some tools return additive structured fields alongside the existing raw text output.
search_jobskeepssections.search_resultsand also returnsjobs, a structured list withtitle,company,location,job_id, andurlwhen those values can be resolved from the current LinkedIn DOM.search_peopleandget_company_peoplereturn paginatedresultsarrays with normalizedPersonCardfields andfilters_applied/warningsmetadata.search_people.match_modecontrols whether the tool stays strict, broadens automatically, or runs a broad company/background search immediately.get_saved_jobsandget_job_recommendationsreturn paginatedjobsarrays with normalizedJobCardfields.- Profile-write tools (
update_profile_headline,set_open_to_work,add_profile_skills,set_featured_skills) support preview-first flows viadry_runorconfirm=falseand return structured write envelopes with additivedata. get_my_post_analyticsreturns the standard read envelope and exposes parsed posts atdata.posts. Each post object includesauthor,url,text_preview,time_ago,reactions,comments,reposts, andimpressions.
<br/> <br/>
🚀 uvx Setup (Recommended - Universal)
Prerequisites: Install uv and run uvx patchright install chromium to set up the browser.
Installation
Step 1: Create a session (first time only)
uvx linkedin-scraper-mcp --login
This opens a browser for you to log in manually (5 minute timeout for 2FA, captcha, etc.). The browser profile is saved to ~/.linkedin-mcp/profile/.
Step 2: Client Configuration:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-scraper-mcp"]
}
}
}
[!NOTE] Sessions may expire over time. If you encounter authentication issues, run
uvx linkedin-scraper-mcp --loginagain
uvx Setup Help
<details> <summary><b>🔧 Configuration</b></summary>
Transport Modes:
- Default (stdio): Standard communication for local MCP servers
- Streamable HTTP: For web-based MCP server
- If no transport is specified, the server defaults to
stdio - An interactive terminal without explicit transport shows a chooser prompt
CLI Options:
--login- Open browser to log in and save persistent profile--no-headless- Show browser window (useful for debugging scraping issues)--log-level {DEBUG,INFO,WARNING,ERROR}- Set logging level (default: WARNING)--transport {stdio,streamable-http}- Optional: force transport mode (default: stdio)--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--logout- Clear stored LinkedIn browser profile--timeout MS- Browser timeout for page operations in milliseconds (default: 5000)--user-data-dir PATH- Path to persistent browser profile directory (default: ~/.linkedin-mcp/profile)--chrome-path PATH- Path to Chrome/Chromium executable (for custom browser installations)
Basic Usage Examples:
# Create a session interactively
uvx linkedin-scraper-mcp --login
# Run with debug logging
uvx linkedin-scraper-mcp --log-level DEBUG
HTTP Mode Example (for web-based MCP clients):
uvx linkedin-scraper-mcp --transport streamable-http --host 127.0.0.1 --port 8080 --path /mcp
Runtime server logs are emitted by FastMCP/Uvicorn.
Test with mcp inspector:
- Install and run mcp inspector
bunx @modelcontextprotocol/inspector - Click pre-filled token url to open the inspector in your browser
- Select
Streamable HTTPasTransport Type - Set
URLtohttp://localhost:8080/mcp - Connect
- Test tools
</details>
<details> <summary><b>❗ Troubleshooting</b></summary>
Installation issues:
- Ensure you have uv installed:
curl -LsSf https://astral.sh/uv/install.sh | sh - Check uv version:
uv --version(should be 0.4.0 or higher)
Session issues:
- Browser profile is stored at
~/.linkedin-mcp/profile/ - Make sure you have only one active LinkedIn session at a time
Login issues:
- LinkedIn may require a login confirmation in the LinkedIn mobile app for
--login - You might get a captcha challenge if you logged in frequently. Run
uvx linkedin-scraper-mcp --loginwhich opens a browser where you can solve it manually.
Timeout issues:
- If pages fail to load or elements aren't found, try increasing the timeout:
--timeout 10000 - Users on slow connections may need higher values (e.g., 15000-30000ms)
- Can also set via environment variable:
TIMEOUT=10000
Custom Chrome path:
- If Chrome is installed in a non-standard location, use
--chrome-path /path/to/chrome - Can also set via environment variable:
CHROME_PATH=/path/to/chrome
</details>
<br/> <br/>
🐳 Docker Setup
Prerequisites: Make sure you have Docker installed and running.
Authentication
Docker runs headless (no browser window), so you need to create a browser profile locally first and mount it into the container.
Step 1: Create profile using uvx (one-time setup)
uvx linkedin-scraper-mcp --login
This opens a browser window where you log in manually (5 minute timeout for 2FA, captcha, etc.). The browser profile is saved to ~/.linkedin-mcp/profile/.
Step 2: Configure Claude Desktop with Docker
{
"mcpServers": {
"linkedin": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "~/.linkedin-mcp:/home/pwuser/.linkedin-mcp",
"iushv/linkedin-agent-mcp:latest"
]
}
}
}
[!NOTE] Sessions may expire over time. If you encounter authentication issues, run
uvx linkedin-scraper-mcp --loginagain locally.
[!NOTE] Why can't I run
--loginin Docker? Docker containers don't have a display server. Create a profile on your host using the uvx setup and mount it into Docker.
Docker Setup Help
<details> <summary><b>🔧 Configuration</b></summary>
Transport Modes:
- Default (stdio): Standard communication for local MCP servers
- Streamable HTTP: For a web-based MCP server
- If no transport is specified, the server defaults to
stdio - An interactive terminal without explicit transport shows a chooser prompt
CLI Options:
--log-level {DEBUG,INFO,WARNING,ERROR}- Set logging level (default: WARNING)--transport {stdio,streamable-http}- Optional: force transport mode (default: stdio)--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--logout- Clear stored LinkedIn browser profile--timeout MS- Browser timeout for page operations in milliseconds (default: 5000)--user-data-dir PATH- Path to persistent browser profile directory (default: ~/.linkedin-mcp/profile)--chrome-path PATH- Path to Chrome/Chromium executable (rarely needed in Docker)
[!NOTE]
--loginand--no-headlessare not available in Docker (no display server). Use the uvx setup to create profiles.
HTTP Mode Example (for web-based MCP clients):
docker run -it --rm \
-v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp \
-p 8080:8080 \
iushv/linkedin-agent-mcp:latest \
--transport streamable-http --host 0.0.0.0 --port 8080 --path /mcp
Runtime server logs are emitted by FastMCP/Uvicorn.
Test with mcp inspector:
- Install and run mcp inspector
bunx @modelcontextprotocol/inspector - Click pre-filled token url to open the inspector in your browser
- Select
Streamable HTTPasTransport Type - Set
URLtohttp://localhost:8080/mcp - Connect
- Test tools
</details>
<details> <summary><b>❗ Troubleshooting</b></summary>
Docker issues:
- Make sure Docker is installed
- Check if Docker is running:
docker ps
Login issues:
- Make sure you have only one active LinkedIn session at a time
- LinkedIn may require a login confirmation in the LinkedIn mobile app for
--login - You might get a captcha challenge if you logged in frequently. Run
uvx linkedin-scraper-mcp --loginwhich opens a browser where you can solve captchas manually. See the uvx setup for prerequisites.
Timeout issues:
- If pages fail to load or elements aren't found, try increasing the timeout:
--timeout 10000 - Users on slow connections may need higher values (e.g., 15000-30000ms)
- Can also set via environment variable:
TIMEOUT=10000
Custom Chrome path:
- If Chrome is installed in a non-standard location, use
--chrome-path /path/to/chrome - Can also set via environment variable:
CHROME_PATH=/path/to/chrome
</details>
<br/> <br/>
📦 Claude Desktop (DXT Extension)
Prerequisites: Claude Desktop and Docker installed & running
One-click installation for Claude Desktop users:
- Download the DXT extension
- Double-click to install into Claude Desktop
- Create a session:
uvx linkedin-scraper-mcp --login
[!NOTE] Sessions may expire over time. If you encounter authentication issues, run
uvx linkedin-scraper-mcp --loginagain.
DXT Extension Setup Help
<details> <summary><b>❗ Troubleshooting</b></summary>
First-time setup timeout:
-
Claude Desktop has a ~60 second connection timeout
-
If the Docker image isn't cached, the pull may exceed this timeout
-
Fix: Pre-pull the image before first use:
docker pull iushv/linkedin-agent-mcp:2.3.0 -
Then restart Claude Desktop
Docker issues:
- Make sure Docker is installed
- Check if Docker is running:
docker ps
Login issues:
- Make sure you have only one active LinkedIn session at a time
- LinkedIn may require a login confirmation in the LinkedIn mobile app for
--login - You might get a captcha challenge if you logged in frequently. Run
uvx linkedin-scraper-mcp --loginwhich opens a browser where you can solve captchas manually. See the uvx setup for prerequisites.
Timeout issues:
- If pages fail to load or elements aren't found, try increasing the timeout:
--timeout 10000 - Users on slow connections may need higher values (e.g., 15000-30000ms)
- Can also set via environment variable:
TIMEOUT=10000
</details>
<br/> <br/>
🐍 Local Setup (Develop & Contribute)
Prerequisites: Git and uv installed
Installation
# 1. Clone repository
git clone https://github.com/iushv/linkedin-agent-mcp
cd linkedin-agent-mcp
# 2. Install UV package manager (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. Install dependencies
uv sync
uv sync --group dev
# 4. Install Patchright browser
uv run patchright install chromium
# 5. Install pre-commit hooks
uv run pre-commit install
# 6. Create a session (first time only)
uv run -m linkedin_mcp_server --login
# 7. Start the server
uv run -m linkedin_mcp_server
Local Setup Help
<details> <summary><b>🔧 Configuration</b></summary>
CLI Options:
--login- Open browser to log in and save persistent profile--no-headless- Show browser window (useful for debugging scraping issues)--log-level {DEBUG,INFO,WARNING,ERROR}- Set logging level (default: WARNING)--transport {stdio,streamable-http}- Optional: force transport mode (default: stdio)--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--logout- Clear stored LinkedIn browser profile--timeout MS- Browser timeout for page operations in milliseconds (default: 5000)--status- Check if current session is valid and exit--user-data-dir PATH- Path to persistent browser profile directory (default: ~/.linkedin-mcp/profile)--slow-mo MS- Delay between browser actions in milliseconds (default: 0, useful for debugging)--user-agent STRING- Custom browser user agent--viewport WxH- Browser viewport size (default: 1280x720)--chrome-path PATH- Path to Chrome/Chromium executable (for custom browser installations)--help- Show help
Note: Most CLI options have environment variable equivalents. See
.env.examplefor details.
HTTP Mode Example (for web-based MCP clients):
uv run -m linkedin_mcp_server --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcp
Live smoke test:
uv run -m linkedin_mcp_server --transport streamable-http --host 127.0.0.1 --port 8080 --path /mcp
uv run python scripts/test_live_tools.py --url http://127.0.0.1:8080/mcp
Target specific tools, add pacing, or retry read_conversation after timeouts:
uv run python scripts/test_live_tools.py \
--url http://127.0.0.1:8080/mcp \
--read-only \
--tool get_conversations \
--tool read_conversation \
--read-sleep 3 \
--read-conversation-retries 2 \
--retry-backoff-seconds 8 \
--json-out output/live-smoke.json
Run only the write dry-run tools:
uv run python scripts/test_live_tools.py \
--url http://127.0.0.1:8080/mcp \
--write-only
Run a focused read_conversation check against a known thread id:
uv run python scripts/test_live_tools.py \
--url http://127.0.0.1:8080/mcp \
--focus-read-conversation \
--thread-id abc123
Claude Desktop:
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["--directory", "/path/to/linkedin-agent-mcp", "run", "-m", "linkedin_mcp_server"]
}
}
}
stdio is used by default for this config.
</details>
<details> <summary><b>❗ Troubleshooting</b></summary>
Login issues:
- Make sure you have only one active LinkedIn session at a time
- LinkedIn may require a login confirmation in the LinkedIn mobile app for
--login - You might get a captcha challenge if you logged in frequently. The
--logincommand opens a browser where you can solve it manually.
Scraping issues:
- Use
--no-headlessto see browser actions and debug scraping problems - Add
--log-level DEBUGto see more detailed logging
Session issues:
- Browser profile is stored at
~/.linkedin-mcp/profile/ - Use
--logoutto clear the profile and start fresh
Python/Patchright issues:
- Check Python version:
python --version(should be 3.12+) - Reinstall Patchright:
uv run patchright install chromium - Reinstall dependencies:
uv sync --reinstall
Timeout issues:
- If pages fail to load or elements aren't found, try increasing the timeout:
--timeout 10000 - Users on slow connections may need higher values (e.g., 15000-30000ms)
- Can also set via environment variable:
TIMEOUT=10000
Custom Chrome path:
- If Chrome is installed in a non-standard location, use
--chrome-path /path/to/chrome - Can also set via environment variable:
CHROME_PATH=/path/to/chrome
</details>
Feel free to open an issue or PR!
<br/> <br/>
Acknowledgements
Built with FastMCP and Patchright.
⚠️ Use in accordance with LinkedIn's Terms of Service. Web scraping may violate LinkedIn's terms. This tool is for personal use only.
License
This project is licensed under the Apache 2.0 license.
<br>
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。