MCP server for LinkedIn profile, company, and job scraping with Claude AI integration. Supports direct profile/company/job URL scraping with secure credential storage.
Project description
LinkedIn MCP Server
Through this LinkedIn MCP server, AI assistants like Claude can connect to your LinkedIn. Access profiles and companies, search for jobs, or get job details.
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/stickerdaniel/
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/anthropic/
Features & Tool Status
| Tool | Description | Status |
|---|---|---|
get_person_profile |
Get detailed profile info including work history, education, contacts, interests | Working |
get_company_profile |
Extract company information including employees, affiliated companies | 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 |
close_session |
Close browser session and clean up resources | Working |
[!WARNING] The session file at
~/.linkedin-mcp/session.jsoncontains sensitive authentication data. Keep it secure and do not share it.
🚀 uvx Setup (Recommended - Universal)
Prerequisites: Make sure you have uv and Playwright uvx playwright install chromium installed.
Installation
Step 1: Create a session (first time only)
uvx linkedin-scraper-mcp --get-session
This opens a browser for you to log in manually (5 minute timeout for 2FA, captcha, etc.). The session is saved to ~/.linkedin-mcp/session.json.
Step 2: Run the server
uvx linkedin-scraper-mcp
[!NOTE] Sessions may expire over time. If you encounter authentication issues, run
uvx linkedin-scraper-mcp --get-sessionagain.
uvx Setup Help
🔧 Configuration
Client Configuration:
{
"mcpServers": {
"linkedin": {
"command": "uvx",
"args": ["linkedin-scraper-mcp"]
}
}
}
Transport Modes:
- Default (stdio): Standard communication for local MCP servers
- Streamable HTTP: For web-based MCP server
CLI Options:
--get-session [PATH]- Open browser to log in and save session (default: ~/.linkedin-mcp/session.json)--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}- Set transport mode--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--clear-session- Clear stored LinkedIn session file--timeout MS- Browser timeout for page operations in milliseconds (default: 5000)--chrome-path PATH- Path to Chrome/Chromium executable (for custom browser installations)
Basic Usage Examples:
# Create a session interactively
uvx linkedin-scraper-mcp --get-session
# 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
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
❗ Troubleshooting
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:
- Session is stored at
~/.linkedin-mcp/session.json - 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
--get-session - You might get a captcha challenge if you logged in frequently. Run
uvx linkedin-scraper-mcp --get-sessionwhich 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
🐳 Docker Setup
Prerequisites: Make sure you have Docker installed and running.
Authentication Options
Docker runs headless (no browser window), so you need to authenticate using one of these methods:
Option 1: Cookie Authentication (Simplest)
Get your LinkedIn li_at cookie and pass it to Docker:
{
"mcpServers": {
"linkedin": {
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "LINKEDIN_COOKIE", "stickerdaniel/linkedin-mcp-server"],
"env": {
"LINKEDIN_COOKIE": "your_li_at_cookie_value"
}
}
}
}
To get your li_at cookie:
- Open LinkedIn in your browser in an incognito tab and log in
- Open DevTools (F12) → Application → Cookies → linkedin.com
- Copy the
li_atcookie value
Option 2: Session File (More Reliable)
Create a session file locally, then mount it into Docker.
Step 1: Create session using uvx (one-time setup)
uvx linkedin-scraper-mcp --get-session
This opens a browser window where you log in manually (5 minute timeout for 2FA, captcha, etc.). The session is saved to ~/.linkedin-mcp/session.json.
Step 2: Configure Claude Desktop with Docker
{
"mcpServers": {
"linkedin": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "~/.linkedin-mcp:/home/pwuser/.linkedin-mcp",
"stickerdaniel/linkedin-mcp-server:latest"
]
}
}
}
[!NOTE] Sessions may expire over time. If you encounter authentication issues, run
uvx linkedin-scraper-mcp --get-sessionagain locally, or use a freshli_atcookie.
[!NOTE] Why can't I run
--get-sessionin Docker? Docker containers don't have a display server. You have two options:
- Create a session on your host using the uvx setup and mount it into Docker
- Pass your
li_atcookie viaLINKEDIN_COOKIE(if you encounter auth challenges, use option 1 instead)
Docker Setup Help
🔧 Configuration
Transport Modes:
- Default (stdio): Standard communication for local MCP servers
- Streamable HTTP: For a web-based MCP server
CLI Options:
--log-level {DEBUG,INFO,WARNING,ERROR}- Set logging level (default: WARNING)--transport {stdio,streamable-http}- Set transport mode--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--clear-session- Clear stored LinkedIn session file--timeout MS- Browser timeout for page operations in milliseconds (default: 5000)--chrome-path PATH- Path to Chrome/Chromium executable (rarely needed in Docker)
[!NOTE]
--get-sessionand--no-headlessare not available in Docker (no display server). Use the uvx setup to create sessions.
HTTP Mode Example (for web-based MCP clients):
docker run -it --rm \
-v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp \
-p 8080:8080 \
stickerdaniel/linkedin-mcp-server:latest \
--transport streamable-http --host 0.0.0.0 --port 8080 --path /mcp
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
❗ Troubleshooting
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
--get-session - You might get a captcha challenge if you logged in frequently. Run
uvx linkedin-scraper-mcp --get-sessionwhich 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
📦 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 --get-session
[!NOTE] Sessions may expire over time. If you encounter authentication issues, run
uvx linkedin-scraper-mcp --get-sessionagain.
DXT Extension Setup Help
❗ Troubleshooting
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 stickerdaniel/linkedin-mcp-server: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
--get-session - You might get a captcha challenge if you logged in frequently. Run
uvx linkedin-scraper-mcp --get-sessionwhich 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
🐍 Local Setup (Develop & Contribute)
Prerequisites: Git and uv installed
Installation
# 1. Clone repository
git clone https://github.com/stickerdaniel/linkedin-mcp-server
cd linkedin-mcp-server
# 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 Playwright browser
uv run playwright 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 --get-session
# 7. Start the server
uv run -m linkedin_mcp_server
Local Setup Help
🔧 Configuration
CLI Options:
--get-session [PATH]- Open browser to log in and save session (default: ~/.linkedin-mcp/session.json)--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}- Set transport mode--host HOST- HTTP server host (default: 127.0.0.1)--port PORT- HTTP server port (default: 8000)--path PATH- HTTP server path (default: /mcp)--clear-session- Clear stored LinkedIn session file--timeout MS- Browser timeout for page operations in milliseconds (default: 5000)--session-info- Check if current session is valid and exit--linkedin-cookie COOKIE- LinkedIn session cookie (li_at) for authentication--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
Claude Desktop:
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["--directory", "/path/to/linkedin-mcp-server", "run", "-m", "linkedin_mcp_server"]
}
}
}
❗ Troubleshooting
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
--get-session - You might get a captcha challenge if you logged in frequently. The
--get-sessioncommand 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:
- Session is stored in
~/.linkedin-mcp/session.json - Use
--clear-sessionto clear the session and start fresh
Python/Playwright issues:
- Check Python version:
python --version(should be 3.12+) - Reinstall Playwright:
uv run playwright 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
Feel free to open an issue or PR!
Acknowledgements
Built with LinkedIn Scraper by @joeyism and FastMCP.
⚠️ 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file iflow_mcp_stickerdaniel_linkedin_scraper_mcp-2.3.5-py3-none-any.whl.
File metadata
- Download URL: iflow_mcp_stickerdaniel_linkedin_scraper_mcp-2.3.5-py3-none-any.whl
- Upload date:
- Size: 37.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdfcfd3b37969aaf0d4aee04b02886215901c06ea4c5586e64aaf3f244b8707a
|
|
| MD5 |
6a6b807b78f3ec173e23a9a2416dc451
|
|
| BLAKE2b-256 |
eaae17588dba8c6707edf3c13667813db9c48fc6a05c444a051dc406f7e98316
|