Skip to content

selvin-paul-raj/Linkedin-MCP-Server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

LinkedIn MCP Server

License: MIT Python 3.12+ LinkedIn API

Complete LinkedIn automation toolkit. Scrape profiles, manage posts, read any LinkedIn content, and automate interactions via MCP (Model Context Protocol).


πŸ“˜ Table of Contents


Overview

linkedin-mcp is a fully featured MCP server that provides automation tools for LinkedIn.
It supports browser-based scraping and API-based operations for content management, media uploads, and reactions.

Repository: Linkedin MCP Server


Features

πŸ” Scraping (Browser-Based)

  • Extract full LinkedIn profiles
  • Scrape company pages
  • Read job listings
  • Read ANY LinkedIn post
  • Extract images, videos, engagement metrics

πŸ“ API-Based Post Management

  • Create, update, delete LinkedIn posts
  • Add or remove reactions
  • Upload images and documents
  • Supports all official LinkedIn REST API features

🧩 MCP Integration

  • Works with Claude Desktop and any MCP-compatible client
  • 17 total tools included

πŸ§ͺ Testing

  • 50+ tests
  • Covers scraping, API, and MCP tools

Quickstart

Install

git clone https://github.com/selvin-paul-raj/Linkedin-MCP-Server.git
cd Linkedin-MCP-Server

# create environment config
cp .env.example .env

# install dependencies
pip install -e .

Run

# Standard MCP server
uv run linkedin-mcp

# Debug mode (shows browser)
uv run main.py --debug --no-headless --no-lazy-init

# HTTP mode
uv run main.py --transport streamable-http

Authentication

1. Scraping (LinkedIn Cookie)

Get your li_at cookie:

  1. Log in to LinkedIn in Chrome
  2. Press F12
  3. Application β†’ Cookies β†’ https://www.linkedin.com
  4. Copy the li_at cookie value
  5. Add to .env:
LINKEDIN_COOKIE=li_at=YOUR_COOKIE_VALUE

2. API (OAuth Access Token)

Add these fields to .env:

LINKEDIN_CLIENT_ID=your_id
LINKEDIN_CLIENT_SECRET=your_secret
LINKEDIN_ACCESS_TOKEN=your_access_token
LINKEDIN_API_VERSION=202510

Quick OAuth Link

https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&scope=w_member_social%20r_liteprofile%20r_emailaddress

Exchange auth code:

curl -X POST https://www.linkedin.com/oauth/v2/accessToken \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=YOUR_CODE" \
  -d "redirect_uri=YOUR_REDIRECT_URI" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "client_secret=YOUR_CLIENT_SECRET"

Usage

Read any LinkedIn post

{
  "tool": "read_linkedin_post",
  "input": "https://www.linkedin.com/posts/...activity-123456..."
}

Create a post

{
  "tool": "create_linkedin_post",
  "input": {
    "text": "Excited to announce our new product launch! πŸš€",
    "visibility": "PUBLIC"
  }
}

Upload image

{
  "tool": "upload_linkedin_image",
  "input": { "image_url": "https://example.com/image.jpg" }
}

Claude Desktop Integration

Add this to claude_desktop_config.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "uv",
      "args": [
        "--directory",
        "D:\\MCP\\linkedin-mcp",
        "run",
        "linkedin-mcp"
      ],
      "env": {
        "LINKEDIN_COOKIE": "li_at=YOUR_COOKIE",
        "LINKEDIN_ACCESS_TOKEN": "YOUR_TOKEN"
      }
    }
  }
}

Available Tools

πŸ“– Content Reading

  • read_linkedin_post

🌐 Scraping

  • get_person_profile
  • get_company_profile
  • get_job_details
  • search_jobs
  • search_recommended_jobs
  • close_session

πŸ“ Post Management

  • create_linkedin_post
  • update_linkedin_post
  • delete_linkedin_post

πŸ–ΌοΈ Media

  • upload_linkedin_image
  • get_linkedin_image

πŸ’™ Reactions

  • add_linkedin_reaction
  • remove_linkedin_reaction
  • get_linkedin_reactions

πŸ‘€ Profile & Auth

  • get_linkedin_profile
  • validate_linkedin_credentials

More details. See TOOLS_REFERENCE.md.


Project Structure

linkedin-mcp/
β”œβ”€β”€ linkedin_mcp_server/
β”‚   β”œβ”€β”€ server.py
β”‚   β”œβ”€β”€ cli.py
β”‚   β”œβ”€β”€ config/
β”‚   β”œβ”€β”€ drivers/
β”‚   └── tools/
β”œβ”€β”€ tests/
β”‚   β”œβ”€β”€ unit/
β”‚   β”œβ”€β”€ integration/
β”œβ”€β”€ scripts/
β”œβ”€β”€ .env.example
β”œβ”€β”€ pyproject.toml
β”œβ”€β”€ README.md
└── TOOLS_REFERENCE.md

Testing

# unit tests
uv run pytest tests/unit -v

# integration tests
uv run pytest tests/integration -v

# all tests
uv run pytest tests/ -v

Quick API test:

uv run python scripts/test_api.py

Troubleshooting

❌ "426 Client Error: Upgrade Required"

Fix:

LINKEDIN_API_VERSION=202510

❌ "LINKEDIN_COOKIE required"

Get fresh cookie from Chrome.

❌ "401 Unauthorized"

Generate a new access token.

ChromeDriver issues

pip install --upgrade selenium webdriver-manager

API Versioning

Current default:

202510

Check latest: https://learn.microsoft.com/en-us/linkedin/marketing/versioning

Update:

LINKEDIN_API_VERSION=202511

Restart the server.


Contributing

git clone https://github.com/selvin-paul-raj/Linkedin-MCP-Server.git
cd Linkedin-MCP-Server
uv sync
uv run pytest tests/ -v
uv run ruff format .
uv run pre-commit run --all-files

Pull requests welcome.


License

MIT License. See the LICENSE file.


Disclaimer

This tool is for educational and automation purposes. Follow LinkedIn TOS, API terms, and usage limits. Use responsibly.


Built with ❀️ for LinkedIn automation

Releases

No releases published

Packages

 
 
 

Contributors

Languages