{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_h9mshgcmm9jz","handle":"linkedin-mcp-server-salesbot","url":"https://wellknown.network/agents/linkedin-mcp-server-salesbot","links":{"self":"https://wellknown.network/agents/linkedin-mcp-server-salesbot/record.json","html":"https://wellknown.network/agents/linkedin-mcp-server-salesbot","markdown":"https://wellknown.network/agents/linkedin-mcp-server-salesbot/record.md","api":"https://wellknown.network/api/v1/agents/linkedin-mcp-server-salesbot","status":"https://wellknown.network/api/v1/agents/linkedin-mcp-server-salesbot/status","claim":"https://wellknown.network/agents/linkedin-mcp-server-salesbot/claim","claimApi":"https://wellknown.network/api/v1/claims","badge":"https://wellknown.network/agents/linkedin-mcp-server-salesbot/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:app.salesbot.cz:server:linkedin-mcp-server-salesbot","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"LinkedIn MCP Server (Salesbot)","summary":"Human-in-the-loop LinkedIn outreach and a built-in sales CRM for AI agents. Safety-gated, anti-spam.","description":"Human-in-the-loop LinkedIn outreach and a built-in sales CRM for AI agents. Safety-gated, anti-spam.","publisher":{"name":"cz.salesbot","url":null},"homepage":"https://app.salesbot.cz","repository":"https://github.com/Kubis010/linkedin-mcp-server-salesbot","version":"1.0.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://app.salesbot.cz/api/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-06-17T12:11:46.558733Z","publishedAt":"2026-06-17T12:11:46.558733Z","registryName":"cz.salesbot/linkedin-mcp-server"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"content.writing","name":"Writing & Editing","confidence":1,"provenance":"derived"},{"slug":"content.social","name":"Social Media","confidence":1,"provenance":"derived"},{"slug":"documents.spreadsheets","name":"Spreadsheets","confidence":1,"provenance":"derived"},{"slug":"data.web-search","name":"Web Search","confidence":1,"provenance":"derived"},{"slug":"data.database","name":"Databases","confidence":1,"provenance":"derived"},{"slug":"productivity.crm","name":"CRM & Sales","confidence":1,"provenance":"derived"},{"slug":"commerce.pricing","name":"Pricing & Quotes","confidence":1,"provenance":"derived"},{"slug":"productivity.email","name":"Email","confidence":0.962,"provenance":"derived"}],"categories":["commerce","content","data","documents","productivity"]},"observed":{"status":"live","statusReason":"Responded 3h ago.","lastOkAt":"2026-09-06T00:27:58.598Z","lastProbedAt":"2026-09-06T00:27:58.598Z","statusComputedAt":"2026-09-06T00:28:18.081Z","reliability30d":{"probes":1,"successRate":1,"p50Ms":1318},"latestObservations":[{"at":"2026-09-06T00:27:58.598Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":1318,"error":null,"detail":{"tools":[{"name":"search_linkedin_people","description":"Search people on LinkedIn by job title(s), current company and location. Pass `company` (a NAME like 'Škoda Auto') to filter to people who CURRENTLY work there."},{"name":"search_google_xray","description":"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, and "},{"name":"upsert_linkedin_contact","description":"Create a contact from a known LinkedIn profile URL, or return the existing contact when the profile was already imported. Use this when you already know the exa"},{"name":"enrich_contacts","description":"Enrich existing contacts with their full LinkedIn profile data via the connected LinkedIn account (Unipile) — headline, location, current company & position, fu"},{"name":"search_linkedin_navigator","description":"Scrape a Sales Navigator (or standard LinkedIn) search URL. Returns JSON `{ count, results }` where each item in `results` has: `linkedin_url`, `name`, `headlin"},{"name":"get_contact_profile","description":"Return the full contact profile from the database — name (with Czech vocative), headline, company, role, location, language, current campaign status and interac"},{"name":"list_contacts","description":"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 pi"},{"name":"list_lead_lists","description":"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 th"},{"name":"list_campaigns","description":"List your campaigns with ID, name, status (draft/running/paused), description and lead counts. Use this to obtain campaign_id when adding leads, generating mess"},{"name":"add_contacts_to_campaign","description":"Add selected contacts (by ID) to an existing campaign. Blacklist of domains/companies, duplicate checks and manual exclusion are applied automatically. Campaign"},{"name":"send_linkedin_message","description":"Send a one-off LinkedIn message to a specific contact outside any campaign. A random 30–180 s delay is applied before sending for anti-detection. The action cou"},{"name":"send_connection_request","description":"Send a LinkedIn connection invitation. The message is ALWAYS empty (no text) — policy choice to avoid account blocks, regardless of account type (free or premiu"},{"name":"get_daily_limits","description":"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"},{"name":"generate_campaign_message","description":"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"},{"name":"list_pending_approvals","description":"Return all AI drafts waiting for approval (messages_approved=false). Each draft includes the contact name, headline, company and generated text. Used as input f"},{"name":"approve_message","description":"Approve a draft and hand it to the campaign executor for sending (respecting daily limits and allowed hours). Optionally pass edited_messages to overwrite speci"},{"name":"reject_message","description":"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 ne"},{"name":"publish_linkedin_post","description":"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 bef"},{"name":"list_inbox_chats","description":"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, un"},{"name":"get_chat_messages","description":"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 t"},{"name":"reply_to_chat","description":"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 ret"},{"name":"mark_chat_read","description":"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."},{"name":"create_campaign","description":"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"},{"name":"update_campaign_settings","description":"Update settings of an existing campaign you own: name, description, daily_limit, sender_context, auto_approve_messages, or status. Use status='paused' to pause "},{"name":"start_campaign","description":"Start (activate) an existing campaign: schedules the outreach actions for its contacts and sets status to 'running'. The campaign must already have contacts (ad"},{"name":"stop_campaign","description":"Stop a running campaign: sets status to 'stopped' and cancels its pending scheduled actions (a DB trigger marks them skipped). To only pause temporarily, use up"},{"name":"scrape_website","description":"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 "},{"name":"get_linkedin_status","description":"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 wh"},{"name":"connect_linkedin","description":"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"},{"name":"set_deal_stage","description":"Move a lead to a different pipeline stage. Stages are user-configurable — call list_crm_stages to see the valid stage keys (defaults: prospect, contacted, demo,"},{"name":"log_crm_note","description":"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 pa"},{"name":"create_task","description":"Create a follow-up task, optionally linked to a lead (e.g. 'Send pricing PDF to Jane on Thursday'). Pro plan only."},{"name":"save_lead_message","description":"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 "},{"name":"list_lead_messages","description":"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"},{"name":"get_lead_context","description":"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 dra"},{"name":"export_crm","description":"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 databa"},{"name":"update_contact","description":"Update a lead's contact details — email, phone, location, company, position or headline. Use to enrich a lead (e.g. save an email address you found). Only the f"},{"name":"list_tasks","description":"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 lea"},{"name":"complete_task","description":"Mark a CRM task done (or reopen/cancel it). Pass the task_id; status defaults to 'done'. Use after a follow-up is handled."},{"name":"list_crm_stages","description":"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"},{"name":"add_crm_stage","description":"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 pipe"},{"name":"rename_crm_stage","description":"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."},{"name":"delete_crm_stage","description":"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."},{"name":"list_crm_fields","description":"List the custom fields defined on CRM leads (key, label, type). Set their values per lead with set_lead_fields."},{"name":"add_crm_field","description":"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."},{"name":"delete_crm_field","description":"Remove a custom field definition by key. Values already stored on leads stay in place but are no longer shown."},{"name":"set_lead_fields","description":"Set custom field values on a lead (by contact_id). Pass `fields` as an object of { field_key: value }. Only defined field keys are accepted (see list_crm_fields"},{"name":"search_job_postings","description":"Search LinkedIn job postings by keywords, location, seniority, job type, and more. Returns job offers with company info — great for finding companies that are a"},{"name":"search_web","description":"General-purpose Google search — returns organic results for any query. Unlike search_google_xray (LinkedIn-only), this searches the entire web. Useful for findi"},{"name":"get_job_posting_details","description":"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 fin"}],"toolCount":50,"serverName":"salesagent-mcp","capabilities":["tools"],"serverVersion":"1.0.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"search_linkedin_people","description":"Search people on LinkedIn by job title(s), current company and location. Pass `company` (a NAME like 'Škoda Auto') to filter to people who CURRENTLY work there."},{"name":"search_google_xray","description":"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, and "},{"name":"upsert_linkedin_contact","description":"Create a contact from a known LinkedIn profile URL, or return the existing contact when the profile was already imported. Use this when you already know the exa"},{"name":"enrich_contacts","description":"Enrich existing contacts with their full LinkedIn profile data via the connected LinkedIn account (Unipile) — headline, location, current company & position, fu"},{"name":"search_linkedin_navigator","description":"Scrape a Sales Navigator (or standard LinkedIn) search URL. Returns JSON `{ count, results }` where each item in `results` has: `linkedin_url`, `name`, `headlin"},{"name":"get_contact_profile","description":"Return the full contact profile from the database — name (with Czech vocative), headline, company, role, location, language, current campaign status and interac"},{"name":"list_contacts","description":"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 pi"},{"name":"list_lead_lists","description":"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 th"},{"name":"list_campaigns","description":"List your campaigns with ID, name, status (draft/running/paused), description and lead counts. Use this to obtain campaign_id when adding leads, generating mess"},{"name":"add_contacts_to_campaign","description":"Add selected contacts (by ID) to an existing campaign. Blacklist of domains/companies, duplicate checks and manual exclusion are applied automatically. Campaign"},{"name":"send_linkedin_message","description":"Send a one-off LinkedIn message to a specific contact outside any campaign. A random 30–180 s delay is applied before sending for anti-detection. The action cou"},{"name":"send_connection_request","description":"Send a LinkedIn connection invitation. The message is ALWAYS empty (no text) — policy choice to avoid account blocks, regardless of account type (free or premiu"},{"name":"get_daily_limits","description":"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"},{"name":"generate_campaign_message","description":"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"},{"name":"list_pending_approvals","description":"Return all AI drafts waiting for approval (messages_approved=false). Each draft includes the contact name, headline, company and generated text. Used as input f"},{"name":"approve_message","description":"Approve a draft and hand it to the campaign executor for sending (respecting daily limits and allowed hours). Optionally pass edited_messages to overwrite speci"},{"name":"reject_message","description":"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 ne"},{"name":"publish_linkedin_post","description":"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 bef"},{"name":"list_inbox_chats","description":"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, un"},{"name":"get_chat_messages","description":"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 t"},{"name":"reply_to_chat","description":"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 ret"},{"name":"mark_chat_read","description":"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."},{"name":"create_campaign","description":"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"},{"name":"update_campaign_settings","description":"Update settings of an existing campaign you own: name, description, daily_limit, sender_context, auto_approve_messages, or status. Use status='paused' to pause "},{"name":"start_campaign","description":"Start (activate) an existing campaign: schedules the outreach actions for its contacts and sets status to 'running'. The campaign must already have contacts (ad"},{"name":"stop_campaign","description":"Stop a running campaign: sets status to 'stopped' and cancels its pending scheduled actions (a DB trigger marks them skipped). To only pause temporarily, use up"},{"name":"scrape_website","description":"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 "},{"name":"get_linkedin_status","description":"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 wh"},{"name":"connect_linkedin","description":"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"},{"name":"set_deal_stage","description":"Move a lead to a different pipeline stage. Stages are user-configurable — call list_crm_stages to see the valid stage keys (defaults: prospect, contacted, demo,"},{"name":"log_crm_note","description":"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 pa"},{"name":"create_task","description":"Create a follow-up task, optionally linked to a lead (e.g. 'Send pricing PDF to Jane on Thursday'). Pro plan only."},{"name":"save_lead_message","description":"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 "},{"name":"list_lead_messages","description":"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"},{"name":"get_lead_context","description":"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 dra"},{"name":"export_crm","description":"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 databa"},{"name":"update_contact","description":"Update a lead's contact details — email, phone, location, company, position or headline. Use to enrich a lead (e.g. save an email address you found). Only the f"},{"name":"list_tasks","description":"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 lea"},{"name":"complete_task","description":"Mark a CRM task done (or reopen/cancel it). Pass the task_id; status defaults to 'done'. Use after a follow-up is handled."},{"name":"list_crm_stages","description":"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"},{"name":"add_crm_stage","description":"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 pipe"},{"name":"rename_crm_stage","description":"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."},{"name":"delete_crm_stage","description":"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."},{"name":"list_crm_fields","description":"List the custom fields defined on CRM leads (key, label, type). Set their values per lead with set_lead_fields."},{"name":"add_crm_field","description":"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."},{"name":"delete_crm_field","description":"Remove a custom field definition by key. Values already stored on leads stay in place but are no longer shown."},{"name":"set_lead_fields","description":"Set custom field values on a lead (by contact_id). Pass `fields` as an object of { field_key: value }. Only defined field keys are accepted (see list_crm_fields"},{"name":"search_job_postings","description":"Search LinkedIn job postings by keywords, location, seniority, job type, and more. Returns job offers with company info — great for finding companies that are a"},{"name":"search_web","description":"General-purpose Google search — returns organic results for any query. Unlike search_google_xray (LinkedIn-only), this searches the entire web. Useful for findi"},{"name":"get_job_posting_details","description":"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 fin"}],"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"cz.salesbot/linkedin-mcp-server","url":"https://registry.modelcontextprotocol.io/v0/servers/cz.salesbot%2Flinkedin-mcp-server","firstSeenAt":"2026-09-05T22:18:28.998Z","fetchedAt":"2026-09-05T22:18:28.998Z","normalizedAt":"2026-09-05T22:18:28.998Z"}]},"firstSeenAt":"2026-09-05T22:18:28.998Z","updatedAt":"2026-09-06T00:28:31.447Z"}