MCP Server for LinkedIn: Every Tool, Prompt, and Chained Workflow

A walkthrough of the LinkedIn MCP server — four install routes, the profile, company, job and messaging tools with a copy-paste prompt for each, and three chained workflows from account research to a sent connection request.

Key takeaways
  • It drives a real Chromium browser logged into your own account rather than calling undocumented APIs, so it browses LinkedIn the way you would. Rate limits are built in, and LinkedIn’s terms still prohibit automated tools, so keep usage normal rather than bulk.
  • uvx is the install to choose. The @latest tag auto-updates each time the client launches, while the one-click MCP Bundle has to be re-downloaded for every release.
  • Job tools are the sleeper feature. search_jobs and get_job_details work as buying signals: what a company is hiring for tells you what they are about to spend on.
  • The value is in chaining, not single calls. Company profile to employee list to person profile to a drafted connection request runs as one session, and the same shape covers job-signal prospecting and competitor-post engagement.

What It Is and How to Install It

Source: github.com/stickerdaniel/linkedin-mcp-server

License: Apache 2.0

Stars: 1.9k

An MCP server that lets Claude and any MCP-compatible AI assistant read and interact with LinkedIn data through your own logged-in browser session. No scraped APIs. No third-party credentials. Your browser, your session, your data.

Four install methods: uvx (recommended), Claude Desktop MCP Bundle, Docker, or local development clone.

What this is

The MCP server controls a real Chromium browser logged into your LinkedIn account. When Claude calls a tool, the browser navigates LinkedIn, reads the page, and returns the data to Claude in structured form.

It does not use undocumented APIs. It does not bypass authentication. It browses LinkedIn exactly the way you would, just without you having to do it.

LinkedIn TOS prohibit automated tools. With normal usage (not bulk scraping), no users have been banned for using this MCP. Rate limits are built in: tool calls are serialised so concurrent requests queue rather than run in parallel.

The 4 install methods

Method 1: uvx (recommended for most users)

Prerequisite: install uv

Add to your Claude Desktop MCP config:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["linkedin-scraper-mcp@latest"],
      "env": {
        "UV_HTTP_TIMEOUT": "300"
      }
    }
  }
}

The @latest tag auto-updates on each client launch. The server prepares the Patchright Chromium browser cache in the background. On first tool call requiring auth, it opens a LinkedIn login window.

Method 2: Claude Desktop MCP Bundle (one-click install)

  1. Download the .mcpb file from: github.com/stickerdaniel/linkedin-mcp-server/releases/latest
  2. Click the downloaded file to install in Claude Desktop
  3. MCP Bundles do not auto-update. Download and install the latest .mcpb for each new release.

Method 3: Docker

# Step 1: Create browser profile on host (one-time setup)
uvx linkedin-scraper-mcp@latest --login

# Step 2: Add to Claude Desktop MCP config
{
  "mcpServers": {
    "linkedin": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "~/.linkedin-mcp:/home/pwuser/.linkedin-mcp",
        "stickerdaniel/linkedin-mcp-server:latest"
      ]
    }
  }
}

Docker creates a fresh session on each startup. Run --login again if you encounter auth issues.

Method 4: Local clone (for development)

git clone https://github.com/stickerdaniel/linkedin-mcp-server
cd linkedin-mcp-server
curl -LsSf https://astral.sh/uv/install.sh | sh
uv sync
uv run -m linkedin_mcp_server --login
uv run -m linkedin_mcp_server

Login and authentication

On first run, the server opens a browser window for you to log in manually. The browser profile is saved to ~/.linkedin-mcp/profile/ and persists across sessions.

If LinkedIn shows a captcha challenge:

uvx linkedin-scraper-mcp@latest --login

This opens a browser window where you can solve captchas manually (5 minute timeout for 2FA, captcha, etc.).

Rate limiting and safety

Tool calls are serialised: concurrent requests queue instead of running in parallel. This protects the shared LinkedIn browser session.

Built-in pacing:

  • Delay between LinkedIn calls: 1.5 +/- 0.5 seconds default
  • Delay distribution: beta (right-skewed), mathematically harder for bot detectors to fingerprint than uniform random

Tuning:

# Increase timeout if pages fail to load
--timeout 10000  # browser page operations (ms, default 5000)
--tool-timeout 300  # per-tool execution (seconds, default 180)

# Increase delay between calls
--delay-between-linkedin-calls 3000
--delay-jitter 1000

Profile and People Tools: get_person_profile, search_people, get_my_profile

Profile and people tools. These are the tools most relevant for GTM engineers doing prospect research, account research, and ICP qualification.

get_person_profile

What it does

Gets a specific person's LinkedIn profile with explicit section selection. Returns structured data for each requested section. The sections you can request: experience, education, interests, honors, languages, certifications, skills, projects, contact_info, posts.

Detail modes:

  • basic (default): truncates each section to 2,000 characters. Captures the most important content while staying within LLM context limits.
  • full: returns the complete raw page text.

Copy-paste prompt

Get the LinkedIn profile for [NAME or PROFILE URL].

Sections I need: experience, education, contact_info, posts
Detail level: basic

Return:
- Current role, company, and seniority
- Career history: titles, companies, durations
- Contact info if available
- 3 most recent posts with the topic and engagement

Then: based on this profile, tell me whether this person matches my ICP:
- Target title: [TITLES]
- Target company type: [SaaS / B2B agency / other]
- Qualification signal: [what makes them worth contacting]

search_people

What it does

Searches LinkedIn for people matching a query. Returns a list of profiles with name, headline, location, and profile URL.

Copy-paste prompt

Search LinkedIn for people matching my ICP.

Search query: "[JOB TITLE] [COMPANY TYPE OR LOCATION]"

For each result return:
- Name, current title, current company
- Location
- Profile URL

Filter out:
- Open to work profiles
- Student profiles with no real company
- Titles that are close but not quite right: [DISQUALIFIERS]

Return the top 20 matches that most closely fit:
- Title: [TARGET TITLES]
- Company type: [TARGET COMPANY TYPES]

get_my_profile

What it does

Gets your own LinkedIn profile. Useful for loading your personal brand context into Claude before writing connection requests or posts in your voice.

Copy-paste prompt

Get my own LinkedIn profile.

Sections I need: experience, about, contact_info

After reading my profile:
1. Summarise my professional positioning in 2 sentences
2. Identify the 3 strongest proof points from my experience to use in cold outreach
3. Extract my writing voice from my about section
4. List any credentials or case studies I can reference in connection notes

Store this as context for all outreach I write in this session.

get_profile_recommendations

What it does

Extracts profile URLs from LinkedIn's sidebar recommendation sections on a profile page: "More profiles for you", "Explore premium profiles", "People you may know". Returns a list of profile URLs for further research.

Copy-paste prompt

Given this LinkedIn profile: [PROFILE URL]

Extract all profile recommendations from the sidebar sections:
- More profiles for you
- People you may know
- Explore premium profiles

For each recommended profile URL:
1. Call get_person_profile with sections: experience, contact_info
2. Score against my ICP: [DESCRIBE ICP]
3. Return only the ones that score as Tier 1 or Tier 2

Output as a table: name, title, company, profile URL, ICP tier, reason for tier.

Company Tools: get_company_profile, search_companies, get_company_employees, get_company_posts

Company tools. Use these for account research, competitive intelligence, and finding decision makers inside target companies.

get_company_profile

What it does

Gets a specific company's LinkedIn profile. Returns company description, size, industry, headquarters, specialities, website, and recent activity.

Copy-paste prompt

Get the LinkedIn company profile for [COMPANY NAME or COMPANY URL].

Return:
- What they do in one sentence
- Company size (headcount range)
- Industry
- Headquarters location
- Website
- Any recent activity visible on the profile

Then tell me:
1. Does this company match my ICP? [DESCRIBE ICP]
2. The one pain point most relevant to what I sell: [YOUR OFFER]
3. The best opening angle for cold outreach based on what their profile says about them

search_companies

What it does

Searches LinkedIn for companies matching a query. Returns a list of company profiles with name, description, size, and LinkedIn URL.

Copy-paste prompt

Search LinkedIn for companies matching my target account criteria.

Search query: "[INDUSTRY] [COMPANY TYPE] [LOCATION]"

For each result return:
- Company name, size, industry, and location
- LinkedIn URL
- One-line description of what they do

Filter for:
- Company size: [EMPLOYEE RANGE]
- Industry: [TARGET INDUSTRIES]
- Location: [GEOGRAPHIES]

Exclude:
- Companies I have already contacted: [LIST OR SAY NONE]
- Companies that are clearly not a fit: [DISQUALIFIERS]

Return the top 15 matches.

get_company_employees

What it does

Gets a list of employees at a specific company. Returns employee names, titles, and profile URLs. Best for finding the right decision maker inside a target account.

Copy-paste prompt

Get employees at [COMPANY NAME or COMPANY URL].

I am looking for the decision maker who [DESCRIBE FUNCTION: owns GTM / manages the sales team / controls the tech stack].

For each employee returned:
1. Check if their title matches: [TARGET TITLES]
2. Flag the most senior person with buying authority for my offer
3. Return: name, title, seniority level, profile URL

Then: call get_person_profile on the top match with sections: experience, contact_info, posts
Use the profile to write a connection note under 200 characters that references something specific about them.

get_company_posts

What it does

Gets recent posts published by a company on LinkedIn. Returns post content, engagement metrics, and timestamps. Use this to understand what a company is currently talking about before reaching out.

Copy-paste prompt

Get recent posts from [COMPANY NAME or COMPANY URL].

For each post return:
- Post topic and key message
- Engagement: likes, comments, shares
- Date posted
- Whether this post signals a buying trigger relevant to my offer: [DESCRIBE OFFER]

After reviewing the posts:
1. The most recent topic this company is focused on
2. Whether there is a recent signal that makes now a good time to reach out
3. A connection note opening line that references the most relevant post without sounding like I was watching their feed

Job Tools: get_job_details, search_jobs (Used as Buying Signals)

Job tools. Less directly relevant for GTM engineers than profile and company tools, but useful for two specific use cases: (1) job postings as buying signals for outbound, and (2) competitive intelligence on what skills companies are hiring for.

get_job_details

What it does

Gets full details of a specific LinkedIn job posting. Returns job title, company, description, requirements, location, and application details.

GTM use case: a company actively hiring for VP of Sales, Head of Growth, or SDR Manager is a strong buying signal. The job posting tells you what pain they are trying to solve, which is exactly what to reference in your opening line.

Copy-paste prompt (buying signal use case)

Get the job posting at this URL: [LINKEDIN JOB URL]

After reading the job description:
1. What pain is this company trying to solve by making this hire?
2. What tools or processes does the job description mention they already use?
3. What would make this hire unnecessary? (that is what I sell: [DESCRIBE OFFER])
4. Write a cold email opening line under 25 words that references the job posting without being creepy about it
5. Write a connection note under 200 characters referencing the role they are hiring for

search_jobs

What it does

Searches LinkedIn for job postings matching a query. Returns a list of jobs with title, company, location, and posting URL.

GTM use case: find every company currently hiring for a role that signals a buying window for your offer. A company hiring 5 SDRs is about to need everything an SDR team needs.

Copy-paste prompt (signal prospecting use case)

Search LinkedIn jobs for the hiring signal that indicates a company needs what I sell.

Job search query: "[ROLE TITLE that signals buying intent e.g. VP of Sales, Head of Outbound, RevOps Manager]"
Location: [GEOGRAPHY]

For each job result:
1. Get the company name and LinkedIn URL
2. Check company size: only keep companies between [SIZE RANGE] employees
3. Return: company name, size, job title, job URL, date posted

For the top 10 matches:
- Call get_company_profile to confirm ICP fit
- Call get_company_employees to find the hiring manager or decision maker

Output a prospecting table: company, size, decision maker name, title, profile URL, job signal.

Messaging Tools: list_conversations, get_conversation, send_message

Messaging tools. Use these to read your LinkedIn inbox and send messages directly from Claude. The most powerful use case: combine account research with message sending in one session. Research the prospect, write a personalised message based on their profile and recent posts, send it without leaving Claude.

list_conversations

What it does

Lists recent LinkedIn inbox conversations with name, message preview, timestamp, and unread flag. Pass unread_only=true to filter to unread messages only.

Copy-paste prompt

List my LinkedIn conversations.

Filter: unread_only=true

For each unread conversation:
1. Who is it from: name, title (look up if not visible)
2. What did they say (preview)
3. Classify the intent: positive reply / negative / neutral / auto-reply / needs follow-up
4. Recommended next action: reply now / get_conversation for more context / no action needed

Return a prioritised list: positive replies first, then needs follow-up, then neutral.

get_conversation

What it does

Gets the full message thread for a specific LinkedIn conversation. Returns all messages with sender, timestamp, and content.

Copy-paste prompt

Get the full conversation thread with [NAME or CONVERSATION URL].

After reading the thread:
1. Where in the conversation are we? (first reply / in discussion / going cold)
2. What did I say and what did they say back?
3. What is the right next message given where we are?
4. Write the next message under 150 characters that moves toward [GOAL: booking a call / sharing the resource / answering their question]

Do not pitch in the message. Match the tone of the conversation so far.

send_message

What it does

Sends a LinkedIn message to a specific person. Requires the recipient's profile URL or conversation ID.

Safety: only send to people who have already connected with you or where you have an existing conversation. Sending unsolicited messages to non-connections is limited by LinkedIn and can trigger restrictions.

Copy-paste prompt (full research-to-send workflow)

Run a full research-to-message workflow for [NAME].

Step 1: get_person_profile
URL: [PROFILE URL]
Sections: experience, about, posts
Detail: basic

Step 2: get_company_profile
URL: [COMPANY URL from their profile]

Step 3: Based on the research, write a message that:
- References something specific from their profile or recent posts
- Under 150 characters
- No pitch
- Opens a conversation, does not close one
- No em dashes

Step 4: Show me the message and ask for my approval before sending.

Step 5: After I approve, send_message to [PROFILE URL] with the approved message.

Chained workflow: inbox triage and reply in one session

Run my LinkedIn inbox triage.

Step 1: list_conversations with unread_only=true

Step 2: For each unread conversation, classify intent:
- Positive: interested or asking a question
- Neutral: not now, keep warm
- Negative: not interested
- Auto-reply: out of office

Step 3: For every positive conversation:
- get_conversation to read the full thread
- Write a reply that moves toward booking a call
- Under 150 characters
- No pitch, match their tone
- Show me the reply and ask for approval before sending

Step 4: After I approve each reply, send_message.

Step 5: Report: N conversations reviewed, N positive, N replied, N no action needed.

Chained Workflows: Account Research, Job Signal Prospecting, Competitor Engagement

The most powerful use of this MCP is chaining tools across a full GTM workflow in a single Claude session. Here are the most useful chains for GTM engineers.

Chain 1: Account research to connection request

Research [COMPANY NAME] and find the right person to contact.

Step 1: get_company_profile [COMPANY URL]
Return: what they do, size, recent posts, any visible signals

Step 2: get_company_employees [COMPANY URL]
Filter for: [TARGET TITLE]
Return the most senior match with a profile URL

Step 3: get_person_profile [PROFILE URL from Step 2]
Sections: experience, about, posts, contact_info

Step 4: Based on the research, write:
- A connection note under 200 characters referencing something specific about them or their company
- A first DM under 150 characters for after they accept

Step 5: Show me both messages. Wait for my approval before sending anything.

Chain 2: Job signal to prospect to message

Find companies showing the hiring signal that indicates they need what I sell.

Step 1: search_jobs
Query: "[ROLE THAT SIGNALS BUYING INTENT]"
Location: [GEOGRAPHY]

Step 2: For the top 10 results:
- get_company_profile to confirm ICP fit (size: [RANGE], industry: [TARGETS])
- Keep only the ICP matches

Step 3: For each ICP match:
- get_company_employees to find the decision maker
- get_person_profile on the decision maker (sections: experience, posts)

Step 4: For each decision maker, write:
- A connection note under 200 characters referencing the job they are hiring for

Step 5: Show me all connection notes. Wait for approval. Then send to each confirmed profile.

Chain 3: Competitor post engagement outreach

Find people engaging with competitor content and reach out.

Step 1: get_company_posts [COMPETITOR COMPANY URL]
Return the 5 most recent posts about [TOPIC RELEVANT TO YOUR OFFER]

Step 2: For the post with the most engagement:
- Note the topic and why it is relevant to what I sell

Step 3: search_people
Query: people who commented on or engage with [COMPETITOR] content
Filter for ICP: [TITLES and COMPANY TYPES]

Step 4: For the top 10 ICP matches:
- get_person_profile (sections: experience, posts)
- Write a connection note under 200 characters referencing the competitor post topic without naming the competitor

Step 5: Show me all connection notes. Wait for approval before sending.

Troubleshooting

Page operations failing (elements not found, navigation hangs):

--timeout 10000  # increase browser page operation timeout (ms, default 5000)

Entire tool calls timing out (multi-section profiles, slow connections, cold-start Chromium):

--tool-timeout 300  # increase per-tool execution timeout (seconds, default 180)

Captcha challenge:

uvx linkedin-scraper-mcp@latest --login

Docker auth stale after re-login on host:

Restart Docker once so it can fresh-bridge from the new source session.

LinkedIn warning about automated tool usage:

Reduce your automation volume. This MCP has no built-in rate limits beyond call serialisation. Use --delay-between-linkedin-calls to slow down.

Stop reading, start testing
Run this on a real list

Free while you set up. Connect a LinkedIn account, import a list, and see the drafts before a single message sends.

21 sales teams & agencies switched to Prosp in last 2 days
5/5 Rated on CapterraCapterra