MCP server for LinkedIn outreach (Claude/ChatGPT/Cursor compatible) — leads, campaigns, inbox, posts via Unipile, with built-in safety limits.
git clone https://github.com/Kubis010/linkedin-mcp-server-salesbot{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"command": "node",
"args": ["/path/to/linkedin-mcp-server-salesbot/dist/index.js"]
}
}
}MCP Servers overview
# LinkedIn MCP Server (Salesbot)
> **What is this?** `linkedin-mcp-server-salesbot` is a **Model Context Protocol (MCP) server for AI‑assisted LinkedIn relationship operations**. It lets AI assistants — **Claude Desktop, ChatGPT, Cursor** — help you research and organize professional contacts, draft deeply personalized messages **for your review and approval**, sync inbox conversations, enrich profiles, and pull web context — all under your direction. It's built for **hyper‑targeted, meaningful outreach** (find 5 ideal contacts, read their recent posts, write 5 thoughtful notes), **not bulk blasting**. Every send is gated by **human‑in‑the‑loop approval** and **enforced, server‑side daily/hourly safety thresholds** that keep your LinkedIn account within safe limits.
It runs as a Supabase Edge Function (Deno + [Hono](https://hono.dev) + [mcp-lite](https://www.npmjs.com/package/mcp-lite)) exposing the MCP **Streamable HTTP** transport. LinkedIn actions go through a third‑party LinkedIn integration provider; LinkedIn credentials are never stored by the AI.
- **Keywords:** model context protocol, mcp server, linkedin api, linkedin automation, claude desktop, cursor, ai agents, sales automation.
- **Compatible clients:** Claude Desktop, Claude API/MCP, Cursor, any MCP Streamable‑HTTP client.
## Quick facts
| | |
|---|---|
| **Endpoint** | `https://app.salesbot.cz/api/mcp` |
| **Transport** | MCP Streamable HTTP (POST + SSE) |
| **Auth header** | `x-mcp-api-key: sb_mcp_…` (a Supabase JWT in `Authorization` also works) |
| **Tool count** | 42 |
| **License** | MIT |
## How do I connect? (Claude Desktop / Cursor)
Add this to your MCP client config. Get the `sb_mcp_…` key in the Salesbot app under **Settings → MCP**.
```json
{
"mcpServers": {
"linkedin-automation": {
"url": "https://app.salesbot.cz/api/mcp",
"headers": {
"x-mcp-api-key": "sb_mcp_YOUR_API_KEY",
"Accept": "application/json, text/event-stream"
}
}
}
}
```
> **Important:** send the key in the **`x-mcp-api-key`** header, **not** `Authorization: Bearer`. The Supabase API gateway rejects unknown Bearer tokens before they reach the server.
## Authentication
- **MCP API key** (`sb_mcp_…`) — long‑lived; generated in the Salesbot app, stored only as a SHA‑256 hash. Send in `x-mcp-api-key`.
- **Supabase JWT** — a signed‑in user session token in `Authorization: Bearer`.
- An active subscription/trial is required.
## How do I authenticate LinkedIn?
The AI can do it without leaving the chat:
1. Call `get_linkedin_status` — reports whether LinkedIn is connected/active/blocked.
2. If not connected, call `connect_linkedin` — returns a white‑labeled `https://auth.salesbot.cz/…` link. The user opens it, completes LinkedIn login, done.
Or connect in the app: **Settings → LinkedIn → Connect**.
## Tools
Each tool returns text content; errors return `{ "ok": false, "code": "<CODE>", "error": "<message>" }`.
### Connection
```json
{ "name": "get_linkedin_status", "input": { "profile_id": "uuid (optional)" } }
{ "name": "connect_linkedin", "input": { "profile_id": "uuid (optional)", "reconnect": "boolean (optional)" } }
```
### Lead discovery
```json
{ "name": "search_linkedin_people", "input": { "title": "string (required)", "location": "string", "locationId": "string", "network": "['S'|'O']", "limit": "number 1-50" } }
{ "name": "search_google_xray", "input": { "jobTitle": "string (required)", "location": "string", "keywords": "string[]", "excludeWords": "string[]", "limit": "number 1-100" } }
{ "name": "search_linkedin_navigator", "input": { "search_url": "string (required)", "limit": "number 1-100" } }
{ "name": "scrape_website", "input": { "url": "string (required)", "max_chars": "number (default 8000, max 20000)" } }
```
### Contacts
```json
{ "name": "get_contact_profile", "input": { "contact_id": "uuid (required)" } }
{ "name": "list_contacts", "input": { "list_id": "uuid (required)", "limit": "number", "offset": "number" } }
```
### Campaigns
```json
{ "name": "list_campaigns", "input": { "status": "draft|running|paused|completed|stopped (optional)" } }
{ "name": "create_campaign", "input": { "name": "string (required)", "profile_id": "uuid (required)", "description": "string", "daily_limit": "number", "sender_context": "string", "steps": "[{ action: 'connect'|'message'|'visit', delay_hours, use_ai, ai_prompt, ai_template, send_without_message }] (required)" } }
{ "name": "update_campaign_settings", "input": { "campaign_id": "uuid (required)", "name": "string", "description": "string", "daily_limit": "number", "sender_context": "string", "auto_approve_messages": "boolean", "status": "running|paused|draft|stopped" } }
{ "name": "start_campaign", "input": { "campaign_id": "uuid (required)" } }
{ "name": "stop_campaign", "input": { "campaign_id": "uuid (required)" } }
{ "name": "add_contacts_to_campaign", "input": { "campaign_id": "uuid (required)", "contact_ids": "uuid[] (required)" } }
```
### AI messaging (write → approve → send)
```json
{ "name": "generate_campaign_message", "input": { "campaign_contact_id": "uuid (required)", "step_id": "uuid (required)", "custom_instructions": "string" } }
{ "name": "list_pending_approvals", "input": { "campaign_id": "uuid", "limit": "number" } }
{ "name": "approve_message", "input": { "campaign_contact_id": "uuid (required)", "edited_messages": "[{step_id, message}]", "skip_gpt_check": "boolean" } }
{ "name": "reject_message", "input": { "campaign_contact_id": "uuid (required)", "reason": "string (required)" } }
```
### Direct LinkedIn actions
```json
{ "name": "send_connection_request", "input": { "linkedin_id": "string (required)", "profile_id": "uuid (required)", "contact_id": "uuid" } }
{ "name": "send_linkedin_message", "input": { "linkedin_id": "string (required)", "message": "string ≤5000 (required)", "profile_id": "uuid (required)" } }
{ "name": "publish_linkedin_post", "input": { "profile_id": "uuid (required)", "text": "string ≤3000 (required)", "external_link": "string", "as_organization": "string", "auto_publish": "boolean" } }
{ "name": "get_daily_limits", "input": { "profile_id": "uuid (optional)" } }
```
### Inbox (real‑time)
```json
{ "name": "list_inbox_chats", "input": { "profile_id": "uuid (optional)", "limit": "number 1-50", "cursor": "string" } }
{ "name": "get_chat_messages", "input": { "chat_id": "string (required)", "profile_id": "uuid (optional)", "limit": "number 1-50", "cursor": "string" } }
{ "name": "reply_to_chat", "input": { "chat_id": "string (required)", "message": "string ≤5000 (required)", "profile_id": "uuid (optional)" } }
{ "name": "mark_chat_read", "input": { "chat_id": "string (required)", "profile_id": "uuid (optional)" } }
```
### CRM (pipeline, notes, tasks)
The CRM is a persistent pipeline separate from contacts. A lead enters it when added to a campaign, or when any of these tools first touch it.
```json
{ "name": "set_deal_stage", "input": { "contact_id": "uuid (required)", "stage": "string (required)", "note": "string" } }
{ "name": "log_crm_note", "input": { "contact_id": "uuid (required)", "summary": "string (required)", "pain_points": "string[]", "sentiment": "positive|neutral|negative" } }
{ "name": "create_task", "input": { "title": "string (required)", "contact_id": "uuid", "due_at": "ISO 8601", "details": "string" } }
{ "name": "list_tasks", "input": { "status": "open|done|cancelled|all", "contact_id": "uuid", "limit": "number" } }
{ "name": "complete_task", "input": { "task_id": "uuid (required)", "status": "done|open|cancelled" } }
{ "name": "get_lead_context", "input": { "contact_id": "uuid (required)", "notes_limit": "number" } }
{ "name": "update_contact", "input": { "contact_id": "uuid (required)", "email": "string", "phone": "string", "location": "string", "company": "string", "position": "string", "headline": "string" } }
{ "name": "set_lead_fields", "input": { "contact_id": "uuid (required)", "fields": "object { field_key: value }" } }
{ "name": "export_crm", "input": { "limit": "number (default 5000, max 20000)" } }
```
### CRM configuration (stages & custom fields)
Pipeline stages and custom fields are user-configurable.
```json
{ "name": "list_crm_stages", "input": {} }
{ "name": "add_crm_stage", "input": { "label": "string (required)", "color": "hex string" } }
{ "name": "rename_crm_stage", "input": { "key": "string (required)", "label": "string", "color": "hex string" } }
{ "name": "delete_crm_stage", "input": { "key": "string (required)", "reassign_to": "string" } }
{ "name": "list_crm_fields", "input": {} }
{ "name": "add_crm_field", "input": { "label": "string (required)", "type": "text|number|date|url" } }
{ "name": "delete_crm_field", "input": { "key": "string (required)" } }
```
## Example call
Request (MCP `tools/call`):
```json
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "get_daily_limits", "arguments": {} } }
```
Success result content (JSON inside the text part):
```json
{ "profile_active": true,
"limits": { "connections": { "used": 0, "limit": 30, "effective_limit": 30 },
"messages": { "used": 0, "limit": 40, "effective_limit": 40 } } }
```
Error result content:
```json
{ "ok": false, "code": "ACCOUNT_NOT_CONNECTED", "error": "Profile has no connected LinkedIn account." }
```
## Error codes
| Code | Meaning |
|------|---------|
| `AUTH_MISSING` / `AUTH_INVALID` / `AUTH_EXPIRED` | missing / wrong / expired key |
| `SUBSCRIPTION_REQUIRED` | trial expired or no active plan |
| `RATE_LIMITED` | too many MCP requests — slow down |
| `ACCOUNT_NOT_CONNECTED` | profile has no connected LinkedIn (call `connect_linkedin`) |
| `ACCOUNT_BLOCKED` | LinkedIn restricted the account (campaigns auto‑paused) |
| `PROFILE_INACTIVE` / `PROFILE_NOT_FOUND` / `ACCESS_DENIED` | profile / ownership |
| `DAWhat people ask about linkedin-mcp-server-salesbot
What is Kubis010/linkedin-mcp-server-salesbot?
+
Kubis010/linkedin-mcp-server-salesbot is mcp servers for the Claude AI ecosystem. MCP server for LinkedIn outreach (Claude/ChatGPT/Cursor compatible) — leads, campaigns, inbox, posts via Unipile, with built-in safety limits. It has 0 GitHub stars and was last updated today.
How do I install linkedin-mcp-server-salesbot?
+
You can install linkedin-mcp-server-salesbot by cloning the repository (https://github.com/Kubis010/linkedin-mcp-server-salesbot) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is Kubis010/linkedin-mcp-server-salesbot safe to use?
+
Kubis010/linkedin-mcp-server-salesbot has not been audited yet by our security agent. Review the original repository on GitHub before using it in production.
Who maintains Kubis010/linkedin-mcp-server-salesbot?
+
Kubis010/linkedin-mcp-server-salesbot is maintained by Kubis010. The last recorded GitHub activity is from today, with 0 open issues.
Are there alternatives to linkedin-mcp-server-salesbot?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy linkedin-mcp-server-salesbot to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/kubis010-linkedin-mcp-server-salesbot)<a href="https://claudewave.com/repo/kubis010-linkedin-mcp-server-salesbot"><img src="https://claudewave.com/api/badge/kubis010-linkedin-mcp-server-salesbot" alt="Featured on ClaudeWave: Kubis010/linkedin-mcp-server-salesbot" width="320" height="64" /></a>More 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 等渠道智能推送。