LinkedIn MCP Skill
Browser-automated LinkedIn integration that scrapes profiles, searches jobs, sends messages, and analyzes companies through a persistent authenticated session.
When to Use This Skill
- Profile Research: Fetch detailed person profiles including experience, education, and skills
- Job Search: Search and retrieve job listings with filters
- Company Analysis: Get company profiles, employee counts, and recent posts
- People Search: Find professionals by role, location, company, or keywords
- Messaging: Send connection requests or messages to existing connections
- Inbox Management: Read conversations and search message history
When Not To Use
- For general web scraping or non-LinkedIn sites -- use the playwright or browser skills instead
- For job board aggregation across multiple platforms -- handle manually or use dedicated aggregators
- For LinkedIn Ads management or campaign creation -- not supported by this tool
- For bulk automated outreach or spam -- violates LinkedIn ToS; this skill is for targeted research
- For data that requires LinkedIn Premium or Sales Navigator -- session uses your account tier
Architecture
┌─────────────────────────────────┐
│ Claude Code / Skill Invocation │
└──────────────┬──────────────────┘
│ MCP Protocol (stdio)
▼
┌─────────────────────────────────┐
│ LinkedIn Scraper MCP Server │
│ (uvx / Patchright) │
└──────────────┬──────────────────┘
│ Browser Automation
▼
┌─────────────────────────────────┐
│ Chromium (Patchright-managed) │
│ Persistent profile at │
│ ~/.linkedin-mcp/profile/ │
└──────────────┬──────────────────┘
│ HTTPS
▼
┌─────────────────────────────────┐
│ LinkedIn.com │
└─────────────────────────────────┘
Authentication
No API key required. The server uses browser-based login with a persistent Chromium profile stored at ~/.linkedin-mcp/profile/. On first use, the browser opens a login page; after authenticating once, the session persists across restarts.
A private Patchright Chromium is a scoped exception, not a policy breach. This skill drives
its own Patchright-managed browser instead of the browsercontainer GPU sidecar because
LinkedIn ties a session to a persistent per-site profile — cookies, device fingerprint, and
login state that must survive restarts, or every call re-triggers a login prompt or CAPTCHA. The
shared sidecar's session model is not built for that kind of long-lived, single-site auth state
shared across unrelated tasks, so it is not a substitute here (see the notebooklm skill's
equivalent exception for its own OAuth browser). This is a per-site auth-persistence requirement,
not general-purpose scraping or automation, so the container's sidecar-only browser policy does
not apply to it. The ToS risk stands regardless of browser choice: LinkedIn prohibits automated
scraping and bulk messaging, so keep usage to targeted, low-volume research and
account-holder-authorised messaging (see When Not To Use below) — routing through the sidecar
would not remove that risk, only the profile-persistence problem is specific to the local browser.
Tools
| Tool |
Description |
get_person_profile |
Fetch a person's full LinkedIn profile by URL or public identifier |
connect_with_person |
Send a connection request with optional message |
get_sidebar_profiles |
Get "People also viewed" sidebar profiles from a profile page |
get_inbox |
Retrieve recent inbox conversations |
get_conversation |
Fetch messages from a specific conversation thread |
search_conversations |
Search inbox by keyword |
send_message |
Send a message to an existing connection |
get_company_profile |
Fetch company details: size, industry, headquarters, description |
get_company_posts |
Retrieve recent posts from a company page |
search_jobs |
Search job listings with keyword, location, and filter parameters |
search_people |
Search for people by name, title, company, location |
get_job_details |
Fetch full details of a specific job posting |
close_session |
Gracefully close the browser session |
Examples
# Fetch a person's profile
get_person_profile({
"url": "https://www.linkedin.com/in/satyanadella/"
})
# Search for jobs
search_jobs({
"keywords": "machine learning engineer",
"location": "San Francisco Bay Area",
"job_type": "full-time"
})
# Search for people at a company
search_people({
"keywords": "VP Engineering",
"company": "Anthropic"
})
# Get company profile and recent posts
get_company_profile({
"url": "https://www.linkedin.com/company/anthropic/"
})
# Send a connection request
connect_with_person({
"profile_url": "https://www.linkedin.com/in/example/",
"message": "Would love to connect regarding our shared interest in AI safety."
})
Environment Variables
| Variable |
Required |
Description |
LINKEDIN_TIMEOUT |
No |
Request timeout in milliseconds (default: 30000) |
CHROME_PATH |
No |
Path to Chromium binary (auto-detected by Patchright if omitted) |
Setup
# Install via uvx (recommended)
uvx linkedin-scraper-mcp
# Or add to MCP config
# The server will prompt for browser login on first run
Troubleshooting
Login Session Expired:
# Remove persistent profile and re-authenticate
rm -rf ~/.linkedin-mcp/profile/
# Restart the MCP server -- browser will open login page
Browser Not Found:
# Install Patchright browsers
uvx patchright install chromium
# Or specify Chrome path explicitly
export CHROME_PATH="$(which chromium-browser || which chromium)"
Rate Limiting / CAPTCHA:
- LinkedIn may throttle automated browsing; reduce request frequency
- If CAPTCHA appears, solve it manually in the browser window
- The persistent session reduces CAPTCHA frequency significantly
Timeout Errors:
# Increase timeout for slow connections
export LINKEDIN_TIMEOUT=60000
Integration with Other Skills
Combine with:
perplexity-research: Cross-reference LinkedIn profiles with web research
gemini-url-context: Expand company blog posts found via LinkedIn
report-builder: Generate hiring pipeline or competitive analysis reports
1---2name: linkedin3description: LinkedIn integration via MCP for profile scraping, job search, messaging, company analysis, and people search. Uses Patchright browser automation with persistent session for authenticated access without API keys. Use when searching LinkedIn profiles, jobs, companies, or managing LinkedIn messaging.4---56# LinkedIn MCP Skill78Browser-automated LinkedIn integration that scrapes profiles, searches jobs, sends messages, and analyzes companies through a persistent authenticated session.910## When to Use This Skill1112- **Profile Research**: Fetch detailed person profiles including experience, education, and skills13- **Job Search**: Search and retrieve job listings with filters14- **Company Analysis**: Get company profiles, employee counts, and recent posts15- **People Search**: Find professionals by role, location, company, or keywords16- **Messaging**: Send connection requests or messages to existing connections17- **Inbox Management**: Read conversations and search message history1819## When Not To Use2021- For general web scraping or non-LinkedIn sites -- use the playwright or browser skills instead22- For job board aggregation across multiple platforms -- handle manually or use dedicated aggregators23- For LinkedIn Ads management or campaign creation -- not supported by this tool24- For bulk automated outreach or spam -- violates LinkedIn ToS; this skill is for targeted research25- For data that requires LinkedIn Premium or Sales Navigator -- session uses your account tier2627## Architecture2829```30┌─────────────────────────────────┐31│ Claude Code / Skill Invocation │32└──────────────┬──────────────────┘33 │ MCP Protocol (stdio)34 ▼35┌─────────────────────────────────┐36│ LinkedIn Scraper MCP Server │37│ (uvx / Patchright) │38└──────────────┬──────────────────┘39 │ Browser Automation40 ▼41┌─────────────────────────────────┐42│ Chromium (Patchright-managed) │43│ Persistent profile at │44│ ~/.linkedin-mcp/profile/ │45└──────────────┬──────────────────┘46 │ HTTPS47 ▼48┌─────────────────────────────────┐49│ LinkedIn.com │50└─────────────────────────────────┘51```5253## Authentication5455No API key required. The server uses browser-based login with a persistent Chromium profile stored at `~/.linkedin-mcp/profile/`. On first use, the browser opens a login page; after authenticating once, the session persists across restarts.5657> **A private Patchright Chromium is a scoped exception, not a policy breach.** This skill drives58> its own Patchright-managed browser instead of the `browsercontainer` GPU sidecar because59> LinkedIn ties a session to a **persistent per-site profile** — cookies, device fingerprint, and60> login state that must survive restarts, or every call re-triggers a login prompt or CAPTCHA. The61> shared sidecar's session model is not built for that kind of long-lived, single-site auth state62> shared across unrelated tasks, so it is not a substitute here (see the `notebooklm` skill's63> equivalent exception for its own OAuth browser). This is a per-site auth-persistence requirement,64> not general-purpose scraping or automation, so the container's sidecar-only browser policy does65> not apply to it. The ToS risk stands regardless of browser choice: LinkedIn prohibits automated66> scraping and bulk messaging, so keep usage to targeted, low-volume research and67> account-holder-authorised messaging (see When Not To Use below) — routing through the sidecar68> would not remove that risk, only the profile-persistence problem is specific to the local browser.6970## Tools7172| Tool | Description |73|------|-------------|74| `get_person_profile` | Fetch a person's full LinkedIn profile by URL or public identifier |75| `connect_with_person` | Send a connection request with optional message |76| `get_sidebar_profiles` | Get "People also viewed" sidebar profiles from a profile page |77| `get_inbox` | Retrieve recent inbox conversations |78| `get_conversation` | Fetch messages from a specific conversation thread |79| `search_conversations` | Search inbox by keyword |80| `send_message` | Send a message to an existing connection |81| `get_company_profile` | Fetch company details: size, industry, headquarters, description |82| `get_company_posts` | Retrieve recent posts from a company page |83| `search_jobs` | Search job listings with keyword, location, and filter parameters |84| `search_people` | Search for people by name, title, company, location |85| `get_job_details` | Fetch full details of a specific job posting |86| `close_session` | Gracefully close the browser session |8788## Examples8990```python91# Fetch a person's profile92get_person_profile({93 "url": "https://www.linkedin.com/in/satyanadella/"94})9596# Search for jobs97search_jobs({98 "keywords": "machine learning engineer",99 "location": "San Francisco Bay Area",100 "job_type": "full-time"101})102103# Search for people at a company104search_people({105 "keywords": "VP Engineering",106 "company": "Anthropic"107})108109# Get company profile and recent posts110get_company_profile({111 "url": "https://www.linkedin.com/company/anthropic/"112})113114# Send a connection request115connect_with_person({116 "profile_url": "https://www.linkedin.com/in/example/",117 "message": "Would love to connect regarding our shared interest in AI safety."118})119```120121## Environment Variables122123| Variable | Required | Description |124|----------|----------|-------------|125| `LINKEDIN_TIMEOUT` | No | Request timeout in milliseconds (default: 30000) |126| `CHROME_PATH` | No | Path to Chromium binary (auto-detected by Patchright if omitted) |127128## Setup129130```bash131# Install via uvx (recommended)132uvx linkedin-scraper-mcp133134# Or add to MCP config135# The server will prompt for browser login on first run136```137138## Troubleshooting139140**Login Session Expired:**141```bash142# Remove persistent profile and re-authenticate143rm -rf ~/.linkedin-mcp/profile/144# Restart the MCP server -- browser will open login page145```146147**Browser Not Found:**148```bash149# Install Patchright browsers150uvx patchright install chromium151152# Or specify Chrome path explicitly153export CHROME_PATH="$(which chromium-browser || which chromium)"154```155156**Rate Limiting / CAPTCHA:**157- LinkedIn may throttle automated browsing; reduce request frequency158- If CAPTCHA appears, solve it manually in the browser window159- The persistent session reduces CAPTCHA frequency significantly160161**Timeout Errors:**162```bash163# Increase timeout for slow connections164export LINKEDIN_TIMEOUT=60000165```166167## Integration with Other Skills168169Combine with:170- `perplexity-research`: Cross-reference LinkedIn profiles with web research171- `gemini-url-context`: Expand company blog posts found via LinkedIn172- `report-builder`: Generate hiring pipeline or competitive analysis reports