LinkedIn MCP Server (Salesbot) is a remote MCP server that gives an AI agent 50 tools, among them add_contacts_to_campaign, add_crm_field, add_crm_stage. It answers at https://app.salesbot.cz/api/mcp over streamable HTTP, and it listed its tools to an anonymous client, so no sign-in was needed for that. Our probes reached it 10 of 10 times since 5 September 2026; the last check, on 18 October 2026, succeeded.
Human-in-the-loop LinkedIn outreach and a built-in sales CRM for AI agents. Safety-gated, anti-spam.
Description as the publisher wrote it.
| Tool | What it does |
|---|---|
add_contacts_to_campaign | Add selected contacts (by ID) to an existing campaign. Blacklist of domains/companies, duplicate checks and manual exclusion are applied automatically. Campaign steps (visit → connect → message) are then scheduled per template and daily lim Inputs: campaign_id, contact_ids |
add_crm_field | Add a custom field to CRM leads (e.g. 'Budget' of type number). type: text | number | date | url (default text). A key is generated from the label. Inputs: label, type |
add_crm_stage | Add a new pipeline stage. Provide a label (e.g. 'Negotiation'); a key is generated from it. Optional hex color (e.g. '#22c55e'). Appended to the end of the pipeline. Inputs: label, color |
approve_message | Approve a draft and hand it to the campaign executor for sending (respecting daily limits and allowed hours). Optionally pass edited_messages to overwrite specific drafts before approval. By default each draft is verified by a second-pass q Inputs: campaign_contact_id, edited_messages, skip_gpt_check |
complete_task | Mark a CRM task done (or reopen/cancel it). Pass the task_id; status defaults to 'done'. Use after a follow-up is handled. Inputs: task_id, status |
connect_linkedin | Generate a secure LinkedIn connect (or reconnect) link the user opens in their browser to authenticate. Use when get_linkedin_status shows not connected/blocked, or after an ACCOUNT_NOT_CONNECTED/ACCOUNT_BLOCKED error. Returns a white-label Inputs: profile_id, reconnect |
create_campaign | Create a NEW campaign (saved as 'draft' — it does NOT start sending until the user activates it in the app). Provide a name, the profile_id to send from, and an ordered list of steps. Each step has an action ('connect', 'message' or 'visit' Inputs: name, profile_id, description, daily_limit, sender_context, steps |
create_task | Create a follow-up task, optionally linked to a lead (e.g. 'Send pricing PDF to Jane on Thursday'). Pro plan only. Inputs: title, contact_id, due_at, details |
delete_crm_field | Remove a custom field definition by key. Values already stored on leads stay in place but are no longer shown. Inputs: key |
delete_crm_stage | Delete a pipeline stage by key. Leads currently in it are moved to reassign_to (or the first remaining stage). You can't delete the last remaining stage. Inputs: key, reassign_to |
enrich_contacts | Enrich existing contacts with their full LinkedIn profile data via the connected LinkedIn account (Unipile) — headline, location, current company & position, full experience, education and skills are scraped from each contact's profile URL Inputs: contact_ids, profile_id |
export_crm | Export the user's CRM (leads with pipeline stage and key fields) as CSV text to save to a file or spreadsheet. Returns up to `limit` rows; for very large databases use the in-app 'Download CRM Backup (CSV)' button. Inputs: limit |
generate_campaign_message | Generate (or regenerate) an AI personalized message draft for a specific campaign_contact and step, using the template and lead profile. The message is NOT sent — it is stored as a draft with status 'pending_approval' and waits for review ( Inputs: campaign_contact_id, step_id, custom_instructions |
get_chat_messages | Read the messages of a single LinkedIn conversation in real time (newest last). Use the chat_id from list_inbox_chats. `is_sender=true` marks messages sent by the account owner (you). Use this to understand context before composing a reply Inputs: chat_id, profile_id, limit, cursor |
get_contact_profile | Return the full contact profile from the database — name (with Czech vocative), headline, company, role, location, language, current campaign status and interaction history. Used as context for personalized messages or next-step decisions. Inputs: contact_id |
get_daily_limits | Check remaining daily quota for a profile. Returns current usage vs limits, ramp-up status, allowed hours, and whether actions are currently allowed. profile_id is optional — if omitted, the user's active (or first) profile is used; if no p Inputs: profile_id |
get_job_posting_details | Get full details of a LinkedIn job posting, including the hiring team — the recruiter or hiring manager who posted it. Use this after search_job_postings to find the exact person to reach out to at a company that is hiring. Also returns app Inputs: job_id |
get_lead_context | Fetch the full CRM context for a lead before writing a pitch or follow-up: profile, current pipeline stage, custom fields, saved outreach messages (email/LI drafts & follow-ups), recent conversation summaries (with pain points), open tasks, Inputs: contact_id, notes_limit |
get_linkedin_status | Check whether the user's LinkedIn account is connected and active. Returns the connection state and, if not connected/blocked, how to fix it. Call this first when another tool returns code ACCOUNT_NOT_CONNECTED or ACCOUNT_BLOCKED. profile_i Inputs: profile_id |
list_campaigns | List your campaigns with ID, name, status (draft/running/paused), description and lead counts. Use this to obtain campaign_id when adding leads, generating messages or approving drafts. Inputs: status |
list_contacts | List contacts in a specific lead list with ID, name, headline, company, profile URL, gender and current status (e.g. invite_sent, connected, replied). The AI picks IDs from this list for further tools. Inputs: list_id, limit, offset |
list_crm_fields | List the custom fields defined on CRM leads (key, label, type). Set their values per lead with set_lead_fields. |
list_crm_stages | List the CRM pipeline stages (key, label, order, color) and how many leads are in each. Stages are user-configurable — rename/add/delete them with the other crm_stage tools. |
list_inbox_chats | List recent LinkedIn inbox conversations (chats) in real time. Returns chat_id (used by get_chat_messages / reply_to_chat), the other attendee's provider id, unread count and last-message timestamp. Message preview text is not always provid Inputs: profile_id, limit, cursor |
list_lead_lists | List the authenticated user's contact groups (lead lists) with their list_id, name, description and contact count. Use list_id with list_contacts to retrieve the contacts in a specific group. |
list_lead_messages | List the stored outreach messages saved on a CRM lead (email/LI drafts and follow-ups), newest first. Use to pull the copy back out of the CRM before sending it via the right channel. Optionally filter by channel or kind. Inputs: contact_id, channel, kind, limit |
list_pending_approvals | Return all AI drafts waiting for approval (messages_approved=false). Each draft includes the contact name, headline, company and generated text. Used as input for bulk review by an AI assistant which can iterate through drafts and approve/r Inputs: campaign_id, limit |
list_tasks | List your CRM tasks. Filter by status (open/done/cancelled, default open) and/or a specific contact. Returns task id, title, due date, status and the linked lead's name. Use to see what follow-ups are outstanding. Inputs: status, contact_id, limit |
log_crm_note | Save a structured summary of a conversation into the CRM for a lead. Analyze the chat/context yourself, then call this with a concise summary, the prospect's pain points, and overall sentiment. Builds durable context for future personalized Inputs: contact_id, summary, pain_points, sentiment |
mark_chat_read | Mark a LinkedIn conversation as read (by chat_id). Useful after the AI has processed/answered a thread so it does not re-surface as unread. Inputs: chat_id, profile_id |
publish_linkedin_post | Create a LinkedIn post on behalf of a connected profile. By default the post is saved as a 'draft' in the LinkedIn Posts page so the user can review/edit it before publishing. Set auto_publish=true to publish immediately — that path still r Inputs: profile_id, text, external_link, as_organization, auto_publish |
reject_message | Reject the current drafts on a campaign_contact with textual feedback (e.g. 'too formal, shorten to 2 sentences'). Resets generation_status to 'pending' so a new version is generated based on your feedback, which again waits for approval. Inputs: campaign_contact_id, reason |
rename_crm_stage | Rename a stage's label and/or change its color, by key (use list_crm_stages to get keys). The stage key and the leads in it are unchanged. Inputs: key, label, color |
reply_to_chat | Send a reply into an existing LinkedIn conversation (by chat_id). Only sends within the user's allowed sending hours/days (never at night) — outside them it returns OUTSIDE_ALLOWED_HOURS. When the user's human-in-the-loop setting is ON (def Inputs: chat_id, message, profile_id |
save_lead_message | Store a generated outreach message on a CRM lead so it becomes durable context — e.g. an email, an email follow-up, a LinkedIn message or LI follow-up. The CRM is a 'sponge': you save the copy here, then read it back later (get_lead_context Inputs: contact_id, channel, kind, subject, body, status |
scrape_website | Fetch the readable text of a PUBLIC web page so you can use it as context when writing/editing messages (e.g. read a prospect's website or an article). Returns plain text (HTML stripped, truncated) plus any contact emails found on the page Inputs: url, max_chars |
search_google_xray | Google X-Ray search for public LinkedIn profiles via Google operators (site:linkedin.com/in). Useful when you don't want to consume LinkedIn search limits. Found profiles are saved into your contacts (in a 'Google X-Ray' list, deduplicated Inputs: jobTitle, location, keywords, excludeWords, limit |
search_job_postings | Search LinkedIn job postings by keywords, location, seniority, job type, and more. Returns job offers with company info — great for finding companies that are actively hiring for a specific role. Uses the connected LinkedIn account (Classic Inputs: keywords, location, locationId, seniority, job_type, presence |
search_linkedin_navigator | Scrape a Sales Navigator (or standard LinkedIn) search URL and return raw LinkedIn search results. This tool does not save the results as Salesbot contacts. For each profile you want to keep or add to a campaign, call upsert_linkedin_contac Inputs: search_url, limit |
search_linkedin_people | Search people on LinkedIn by title and location. Returns raw LinkedIn search results; it does not save them as Salesbot contacts. For each profile you want to keep or add to a campaign, call upsert_linkedin_contact with its profile URL to o Inputs: title, location, locationId, network, limit |
search_web, send_connection_request, send_linkedin_message, set_deal_stage, set_lead_fields, start_campaign, stop_campaign, update_campaign_settings, update_contact, upsert_linkedin_contact
Every block below points at https://app.salesbot.cz/api/mcp. Pick your client and copy.
claude mcp add --transport http linkedin-mcp-server-salesbot https://app.salesbot.cz/api/mcp
{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://app.salesbot.cz/api/mcp"]
}
}
}{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"url": "https://app.salesbot.cz/api/mcp"
}
}
}{
"servers": {
"linkedin-mcp-server-salesbot": {
"type": "http",
"url": "https://app.salesbot.cz/api/mcp"
}
}
}{
"context_servers": {
"linkedin-mcp-server-salesbot": {
"url": "https://app.salesbot.cz/api/mcp"
}
}
}{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"serverUrl": "https://app.salesbot.cz/api/mcp"
}
}
}{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"url": "https://app.salesbot.cz/api/mcp"
}
}
}name: LinkedIn MCP Server (Salesbot)
version: 0.0.1
schema: v1
mcpServers:
- name: LinkedIn MCP Server (Salesbot)
type: streamable-http
url: https://app.salesbot.cz/api/mcp{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"httpUrl": "https://app.salesbot.cz/api/mcp"
}
}
}{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"type": "http",
"url": "https://app.salesbot.cz/api/mcp"
}
}
}{
"mcpServers": {
"linkedin-mcp-server-salesbot": {
"url": "https://app.salesbot.cz/api/mcp"
}
}
}goose://extension?url=https%3A%2F%2Fapp.salesbot.cz%2Fapi%2Fmcp&type=streamable_http&id=linkedin-mcp-server-salesbot&name=LinkedIn%20MCP%20Server%20%28Salesbot%29
It answered our last check on 18 October 2026 in 316 ms. Over 10 checks since 5 September 2026 it answered 10. Status here comes from Neuronto's own probes, not from the publisher.
Yes. It is published by salesbot.cz and served from app.salesbot.cz, the vendor's own domain: https://app.salesbot.cz/api/mcp.
50, as returned by the server's own tools/list on 31 August 2026: add_contacts_to_campaign, add_crm_field, add_crm_stage, approve_message, complete_task, connect_linkedin, create_campaign, create_task, and 42 more.
It answered our last check on 18 October 2026 in 316 ms. Over 10 checks since 5 September 2026 it answered 10.
Put the server under mcpServers in ~/.cursor/mcp.json with the URL https://app.salesbot.cz/api/mcp. The exact JSON is above, with the same setup for Claude Code, Claude Desktop, VS Code, Windsurf, Zed, Gemini CLI and the rest.
It listed its tools to an anonymous client, so reading the tool list needs no key. Individual tools can still ask for credentials in their own inputs.
Publisher: cz.salesbot. Endpoint host: app.salesbot.cz. ARD identifier: urn:air:cz.salesbot:mcp:linkedin-mcp-server.
First indexed 31 August 2026. The tools are exactly what the server returned; nothing on this page
is inferred from its name. Ranking in Neuronto search is never for sale.