LinkedIn for AI assistants (MCP) — profiles, people/job/company search, feed & messaging as structured JSON, plus gated writes (connect/message/post/react/comment) via LinkedIn's API instead of DOM-clicking. Stealth-browser engine, 22 tools, built-in safety layer. Claude · Cursor · any MCP client.
claude mcp add linkedin-mcp -- npx -y linkedin-mcp-tools{
"mcpServers": {
"linkedin-mcp": {
"command": "npx",
"args": ["-y", "linkedin-mcp-tools"]
}
}
}Resumen de MCP Servers
<div align="center">
# 🔗 LinkedIn MCP
### LinkedIn for AI assistants — structured data via a real, stealth browser session
[](https://github.com/devag7/linkedin-mcp/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/linkedin-mcp-tools)
[](LICENSE)
[](https://www.typescriptlang.org/)
[](https://modelcontextprotocol.io/)
[](https://glama.ai/mcp/servers/devag7/linkedin-mcp)
**Give Claude, Cursor, and any MCP client access to LinkedIn — profiles, people/job/company search, feed, messaging, and your network — as clean structured JSON.**
**22 tools** · reads + **gated writes** (connect, message, post, react, comment) · a real **safety layer** (daily caps, human pacing, circuit breaker) · **166 tests**.
> ⚠️ Automating LinkedIn violates its User Agreement and can get an account restricted. **No tool is ban-proof — and this one says so up front.** Use a secondary account; read [Account safety](#-account-safety) and [DISCLAIMER.md](DISCLAIMER.md) first.
</div>
---
## Why this exists
LinkedIn's internal **Voyager API** (the one its own web app uses) returns rich, structured JSON — but it sits behind **Cloudflare bot-management**, which rejects plain HTTP requests (a stateless `fetch` or `curl` gets stuck in an endless redirect, even with a valid cookie). The only reliable way to read LinkedIn data programmatically in 2026 is from inside a **real browser** that clears the challenge.
**This project's approach:**
1. Drive a real Chrome via [**patchright**](https://github.com/Kaliiiiiiiiii-Vinyzu/patchright) (an undetected Playwright fork) so Cloudflare's challenge is solved with a genuine browser fingerprint.
2. Query Voyager **from inside the authenticated page** — same-origin, the exact network path LinkedIn's own SPA uses → **structured JSON, not scraped DOM text**.
That last point is the edge over DOM-scraping tools: in-page API calls are **locale-independent and resilient to UI redesigns**, so they don't break on a moved CSS selector or a translated label.
---
## ✨ What's good here
| | |
|---|---|
| 🧩 **Structured JSON** | In-page Voyager API calls return normalized data, shaped into compact objects — not brittle innerText scraping. |
| ✍️ **Writes are API calls, not button-clicking** | `connect` / `message` / `post` / `react` / `comment` POST straight to Voyager — the **exact requests the web app sends, captured and verified live**. No hunting for a "Connect" button under a sticky navbar, no composer-dialog race. Every write returns a **structured status** (`ok` / `duplicate` / `already_connected` / `restricted` / `quota_exhausted` / …) — never a blind "sent: true". |
| 🛡️ **Safety layer built in** | Serial queue, human-paced jittered delays, per-action **daily budgets**, account **warmup ramp**, and a **circuit breaker** that hard-stops on any checkpoint/captcha. (Risk reduction — *not* a safety guarantee.) |
| 🔥 **One warm session** | A single persistent browser per process (cookies + Cloudflare clearance survive restarts). Explicit `close_session`, signal-handled teardown — no zombie Chrome. |
| 🌍 **Locale-independent** | API + embedded-JSON parsing, not English-only DOM selectors — survives UI redesigns and translations. |
| 🔒 **Local & private** | Session stored under `~/.linkedin-mcp/` with `0700/0600` perms; no cookies/tokens to paste, none ever logged. |
---
## How it compares
| | DOM-scraping LinkedIn MCPs | **This** |
|---|---|---|
| Reads | scraped page text (brittle, locale-bound) | **structured API JSON** |
| Writes (connect/message/post) | click rendered buttons (break on sticky navbars, dialog races, localized labels) | **direct Voyager `POST`, captured + verified live** |
| Write feedback | "clicked it" → hope | **structured status** (ok / duplicate / restricted / quota_exhausted / …) |
| Resilience | breaks on UI tweaks / translations | **API + embedded-JSON, locale-proof** |
| Safety (caps, pacing, circuit breaker) | none | **✅ built-in, 166 tests** |
| Zombie browser processes | common | **✅ reaped on close** |
| Language | Python | TypeScript + official MCP SDK |
We hit LinkedIn's own API from inside the challenge-passed browser — reads *and*
writes — so you get the structured response and a real status, not parsed HTML
and a hopeful click.
## 📦 Status
**Stable — v2, all 22 tools shipping.** Full transparency on exactly where every piece stands:
| Area | State |
|---|---|
| Stealth browser engine (patchright) | ✅ built, **live-proven** |
| In-page Voyager fetch (the core mechanism) | ✅ **live-verified** (returns structured JSON) |
| Safety layer (queue / pacer / budgets / circuit-breaker) | ✅ built, 166 unit tests |
| **Profile** — `get_profile`, `get_my_profile` (name, headline, summary, experience, education, skills, certifications, languages) | ✅ live-verified |
| **Feed / notifications** — `get_feed`, `get_notifications` | ✅ live-verified |
| **Jobs / messaging** — `search_jobs`, `get_job_details`, `get_inbox`, `get_conversation` | ✅ live-verified |
| **People / companies** — `search_people`, `search_companies`, `get_company`, `get_company_posts`, `get_company_employees` (DOM fallback) | ✅ live-verified |
| **Network** — `get_pending_invitations` (received + sent) | ✅ |
| **Session** — `whoami`, `health_check` (live Voyager probe + budget headroom), `close_session` | ✅ |
| **Write tools** — `connect_with_person`, `send_message`, `create_post`, `react_to_post`, `comment_on_post` | ✅ all 5 endpoints captured + live-verified on a burner; gated (`confirm:true` + daily caps), structured statuses. ⚠️ These take real, often irreversible actions — keep the gate on and use a throwaway account. |
**22 tools.** typecheck + 166 tests green.
**Login is headful, the server is headless.** The one-time `--login` opens a real
Chrome window (to clear Cloudflare and let you solve any captcha/2FA). After that
the persistent profile carries the clearance, so the server runs **headless** —
verified returning live data. Use a **residential IP**; datacenter/VPN IPs are
often pre-flagged by Cloudflare regardless of headless vs headful.
---
## 🚀 Quick start
**1. Log in once** (opens a real Chrome window — sign in, solve any captcha/2FA):
```bash
npx -y linkedin-mcp-tools@latest --login
```
Needs Google Chrome installed (or run `npx patchright install chrome` once). Your
session — Cloudflare clearance and all — persists to `~/.linkedin-mcp/profile/`.
**2. Point your MCP client at it.** Claude Desktop / Cursor / Claude Code config:
```json
{
"mcpServers": {
"linkedin": {
"command": "npx",
"args": ["-y", "linkedin-mcp-tools@latest"]
}
}
}
```
Then just ask: *"Get my LinkedIn profile and summarize my experience"* or *"Find 5
recruiters at Google."*
<details>
<summary><b>From source / contributing</b></summary>
```bash
git clone https://github.com/devag7/linkedin-mcp.git
cd linkedin-mcp
npm install
npm run setup:browser # installs the Chrome patchright drives
npm run login # log in once
npm run spike # verify: fetches your profile as JSON
npm run build # produces dist/
```
MCP config: `"command": "node", "args": ["/absolute/path/to/dist/index.js"]`.
</details>
### Headless / server deployment
The one-time `--login` needs a window; the server then runs **headless** (verified
returning live data). Run `--login` on a machine with a display (or via VNC),
copy `~/.linkedin-mcp/profile/` to your server, and run there:
```bash
LINKEDIN_HEADLESS=true npx -y linkedin-mcp-tools@latest # no display needed
```
Use a **residential IP** — datacenter/VPN IPs are frequently pre-flagged by
Cloudflare regardless of headless vs headful.
---
## 🛡️ Account safety
**Read this.** Automating LinkedIn violates its User Agreement and **can get your account restricted or banned** — no tool can prevent that, including this one. The built-in safety features (daily caps, human pacing, warmup, circuit breaker) **reduce risk; they do not eliminate it.**
Defaults err conservative:
- Connections **20/day**, messages **50/day**, likes+comments **50/day** combined, follows **30/day** — combined write cap **150/24h**.
- Profile views **80/day**, searches **30/day**.
- New-account **warmup ramp** over the first weeks; **pending-invite ceiling** and **acceptance-rate** pauses.
- Reads paced 4–12s apart, writes 45–150s, with long breaks and a working-hours gate.
- A **circuit breaker** stops automatically on any checkpoint, captcha, or "unusual activity" page — and never tries to solve one.
**Recommendations:** use a **secondary/throwaway account**, run from a **residential IP**, warm it up slowly. See [DISCLAIMER.md](DISCLAIMER.md) for the full legal/ToS notice.
---
## ⚙️ Configuration
| Variable | Default | Description |
|---|---|---|
| `LINKEDIN_HEADLESS` | `true` | Server runs headless. `--login` always opens a real window regardless. Set `false` to watch the browser. |
| `LINKEDIN_CHROME_PATH` | — | Explicit Chrome binary path (else patchright's). |
| `LINKEDIN_PROFILE_DIR` | `~/.linkedin-mcp/profile` | Persistent browser profile. |
| `LINKEDIN_IDLE_TIMEOUT_MS` | `300000` | Close the browser after this idle time (0 disables). |
| `LINKEDIN_CONCURRENCY` | `1` | Serial by default; >1 is ban-risky. |
| `TRANSPORT` | `stdio` | `stdio` (primary) or `http`. |
---
## 🛠 Development
```bash
npm run dev # run from source (stdio)
npm run typecheck
npm test # vitest (safety layer + smoke)
npm run build
```
---
## 📄 License
MILo que la gente pregunta sobre linkedin-mcp
¿Qué es devag7/linkedin-mcp?
+
devag7/linkedin-mcp es mcp servers para el ecosistema de Claude AI. LinkedIn for AI assistants (MCP) — profiles, people/job/company search, feed & messaging as structured JSON, plus gated writes (connect/message/post/react/comment) via LinkedIn's API instead of DOM-clicking. Stealth-browser engine, 22 tools, built-in safety layer. Claude · Cursor · any MCP client. Tiene 2 estrellas en GitHub y se actualizó por última vez today.
¿Cómo se instala linkedin-mcp?
+
Puedes instalar linkedin-mcp clonando el repositorio (https://github.com/devag7/linkedin-mcp) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar devag7/linkedin-mcp?
+
devag7/linkedin-mcp aún no ha sido auditado por nuestro agente de seguridad. Revisa el repositorio original en GitHub antes de usarlo en producción.
¿Quién mantiene devag7/linkedin-mcp?
+
devag7/linkedin-mcp es mantenido por devag7. La última actividad registrada en GitHub es de today, con 0 issues abiertos.
¿Hay alternativas a linkedin-mcp?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega linkedin-mcp en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/devag7-linkedin-mcp)<a href="https://claudewave.com/repo/devag7-linkedin-mcp"><img src="https://claudewave.com/api/badge/devag7-linkedin-mcp" alt="Featured on ClaudeWave: devag7/linkedin-mcp" width="320" height="64" /></a>Más MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
The fastest path to AI-powered full stack observability, even for lean teams.
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!
⭐AI-driven public opinion & trend monitor with multi-platform aggregation, RSS, and smart alerts.🎯 告别信息过载,你的 AI 舆情监控助手与热点筛选工具!聚合多平台热点 + RSS 订阅,支持关键词精准筛选。AI 智能筛选新闻 + AI 翻译 + AI 分析简报直推手机,也支持接入 MCP 架构,赋能 AI 自然语言对话分析、情感洞察与趋势预测等。支持 Docker ,数据本地/云端自持。集成微信/飞书/钉钉/Telegram/邮件/ntfy/bark/slack 等渠道智能推送。