A Model Context Protocol (MCP) server that enables interaction with LinkedIn through Claude and other AI assistants. This server allows you to scrape LinkedIn profiles, companies, jobs, and perform job searches.
Example.Use.mp4
- Profile Scraping (
get_person_profile
): Get detailed information from LinkedIn profiles including work history, education, skills, and connections - Company Analysis (
get_company_profile
): Extract company information with comprehensive details - Job Details (
get_job_details
): Retrieve specific job posting details using direct LinkedIn job URLs - Session Management (
close_session
): Properly close browser sessions and clean up resources
- Job Search (
search_jobs
): Currently experiencing ChromeDriver compatibility issues with LinkedIn's search interface - Recommended Jobs (
get_recommended_jobs
): Has Selenium method compatibility issues due to outdated scraping methods - Company Profiles: Some companies may have restricted access or may return empty results (need further investigation)
- Python 3.12 or higher
- Chrome browser installed
- ChromeDriver matching your Chrome version (we'll help you set this up)
- A LinkedIn account
# 1. Clone the repository
git clone https://github.com/stickerdaniel/linkedin-mcp-server
cd linkedin-mcp-server
# 2. Install UV if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. Install the project and all dependencies
uv sync
If you want to contribute or modify the code:
# Install with development dependencies
uv sync --group dev
# Install pre-commit hooks
uv run pre-commit install
ChromeDriver is required for Selenium to interact with Chrome. You need to install the version that matches your Chrome browser.
-
Check your Chrome version:
- Open Chrome and go to the menu (three dots) > Help > About Google Chrome
- Note the version number (e.g., 123.0.6312.87)
-
Download matching ChromeDriver:
- Go to ChromeDriver Downloads / Chrome for Testing (Chrome-Version 115+)
- Download the version that matches your Chrome version
- Extract the downloaded file
-
Make ChromeDriver accessible:
- Option 1: Place it in a directory that's in your PATH (e.g.,
/usr/local/bin
on macOS/Linux) - Option 2: Set the CHROMEDRIVER environment variable to the path where you placed it:
export CHROMEDRIVER=/path/to/chromedriver # macOS/Linux # OR set CHROMEDRIVER=C:\path\to\chromedriver.exe # Windows
- Option 3: The server will attempt to auto-detect or prompt you for the path when run
- Option 1: Place it in a directory that's in your PATH (e.g.,
After installation, run:
# Start the server (first time setup)
uv run main.py --no-lazy-init --no-headless
# Normal operation (lazy initialization)
uv run main.py
# Debug mode with visible browser and direct startup
uv run main.py --no-headless --debug --no-lazy-init
# Skip setup prompts (for automation)
uv run main.py --no-setup
-
The server will automatically:
- Display the configuration needed for Claude Desktop
- Copy it to your clipboard for easy pasting
-
Add to Claude Desktop:
- Open Claude Desktop and go to Settings > Developer > Edit Config
- Paste the configuration provided by the server
Example Claude Desktop configuration:
{ "mcpServers": { "linkedin-scraper": { "command": "uv", "args": ["--directory", "/path/to/linkedin-mcp-server", "run", "main.py", "--no-setup"], "env": { "LINKEDIN_EMAIL": "[email protected]", "LINKEDIN_PASSWORD": "your_password" } } } }
- Lazy initialization (default behavior):
- The server uses lazy initialization, meaning it will only create the Chrome driver and log in when a tool is actually used
- You can set environment variables for non-interactive use:
export [email protected] export LINKEDIN_PASSWORD=your_password
- Alternatively, you can run the server once manually. You'll be prompted for credentials, which will then be stored securely in your system's keychain (macOS Keychain, Windows Credential Locker, etc.).
Configuration values are loaded with the following precedence (highest to lowest):
-
Command-line arguments:
uv run main.py --no-headless --debug
-
Environment variables:
export [email protected] export LINKEDIN_PASSWORD=your_password export CHROMEDRIVER=/path/to/chromedriver
Note: Environment variables always override credentials stored in the system keychain
-
System keychain: Securely stored credentials from previous sessions
-
Default values: Built-in fallback values
Option | Description |
---|---|
--no-headless |
Run Chrome with a visible browser window |
--debug |
Enable debug mode with additional logging |
--no-setup |
Skip configuration setup prompts |
--no-lazy-init |
Initialize Chrome driver immediately (instead of on first use) |
Your LinkedIn credentials are stored securely using your system's native keychain/credential manager:
- macOS: macOS Keychain
- Windows: Windows Credential Locker
- Linux: Native keyring (varies by distribution)
Credentials are managed as follows:
- First, the application checks for credentials in environment variables
- Next, it checks the system keychain for stored credentials
- If no credentials are found, you'll be prompted to enter them (in interactive mode)
- Entered credentials are securely stored in your system keychain for future use
If you need to change your stored credentials, run the application with the --no-lazy-init
flag and when prompted about login failure, select "Yes" to try with different credentials.
The ChromeDriver path is found in this order:
- From the
CHROMEDRIVER
environment variable - Auto-detected from common locations
- Manually specified when prompted (if auto-detection fails)
Once specified, the ChromeDriver path is used for the current session but not stored persistently.
- After adding the configuration to Claude Desktop, restart Claude Desktop. The tools should be listed in the settings icon menu.
- Start a conversation with Claude
- You'll see tools available in the tools menu (settings icon)
- You can now ask Claude to retrieve LinkedIn profiles, companies, and job details
- "Can you tell me about Daniel's work experience? His LinkedIn profile is https://www.linkedin.com/in/stickerdaniel/"
- "Get details about this job posting: https://www.linkedin.com/jobs/view/1234567890"
- "Tell me about the company Google based on their LinkedIn page."
- Your LinkedIn credentials are securely stored in your system's native keychain/credential manager with user-only permissions
- Credentials are never exposed to Claude or any other AI and are only used for the LinkedIn login to scrape data
- The server runs on your local machine, not in the cloud
- All LinkedIn scraping happens through your account - be aware that profile visits are visible to other users
Job Search (search_jobs
) Not Working:
- This tool currently has ChromeDriver compatibility issues
- Use direct job URLs with
get_job_details
instead - LinkedIn's search interface has anti-automation measures
Recommended Jobs (get_recommended_jobs
) Errors:
- Contains outdated Selenium methods (
find_elements_by_class_name
) - LinkedIn has updated their DOM structure
If you encounter ChromeDriver errors:
- Ensure your Chrome browser is updated
- Download the matching ChromeDriver version
- Set the CHROMEDRIVER path correctly
- Try running with administrator/sudo privileges if permission issues occur
If login fails:
- Verify your LinkedIn credentials
- Check if your account has two-factor authentication enabled
- Try logging in manually to LinkedIn first, then run the server
- Check your LinkedIn mobile app for a login request after running the server
- Try to run the server with
--no-headless
to see where the login fails - Try to run the server with
--debug
to see more detailed logs
If Claude cannot connect to the server:
- Ensure the server is running when you start it manually
- Verify the configuration in Claude Desktop is correct
- Restart Claude Desktop
This project is licensed under the MIT License
- Based on the LinkedIn Scraper by joeyism
- Uses the Model Context Protocol (MCP) for integration with AI assistants
Note: This tool is for personal use only. Use responsibly and in accordance with LinkedIn's terms of service. Web scraping may violate LinkedIn's terms of service.