salesrobot-cli
v1.0.42
Published
MCP server for the SalesRobot API — LinkedIn automation from AI agents
Downloads
5,832
Maintainers
Readme
salesrobot-mcp
MCP server for the SalesRobot API. Manage LinkedIn accounts, campaigns, prospects, messaging, and AI features from your terminal or from any AI agent via the Model Context Protocol (MCP).
Campaign Creation Flow
┌───────────────────────────────────┐
│ Step 0 · Account Settings │ ← once per account
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ Step 1 · Create Campaign │
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ Step 2 · Add Prospects │
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ Step 3 · Campaign Settings │
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ Step 4 · Create Sequence │
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ Step 5 · Start Campaign │
└─────────────────┬─────────────────┘
│
▼
┌───────────────────────────────────┐
│ Step 6 · Monitor & Optimize │
└───────────────────────────────────┘Prerequisites
Before creating a campaign:
API key configured - Get your api key from Salesrobot's settings
LinkedIn account connected — list your accounts and copy the UUID you'll use.
Tool: linkedin_account_list Returns a list of all connected LinkedIn accounts. Copy the uuid field.Account settings (optional but recommended) — quotas, schedule, and blacklist apply to the LinkedIn account and protect it across all campaigns. Set these once per account before you start creating campaigns. These settings take effect for every campaign on this account. You can update them at any time.
Daily quotas:
Tool: setting_quota Parameters: linkedinAccountUuid: "<ACCOUNT_UUID>" dailyViewQuota: 100 dailyConnectQuota: 25 dailyMessageQuota: 50 dailyFollowQuota: 20Sending schedule:
Tool: setting_add_schedule Parameters: linkedinAccountUuid: "<ACCOUNT_UUID>" name: "Business Hours" startTime: "09:00" endTime: "17:00" timeZone: "America/New_York" maxProspects: 50Pending invite handling:
Tool: setting_pending_invite Parameters: linkedinAccountUuid: "<ACCOUNT_UUID>" dailyConnectQuota: 30 dailyMessageQuota: 60Blacklist by company:
Tool: setting_update_blacklist Parameters: linkedinAccountUuid: "<ACCOUNT_UUID>" companyNames: ["Competitor Inc", "Existing Customer Corp"]Blacklist by profile URL:
Tool: setting_update_blacklist Parameters: linkedinAccountUuid: "<ACCOUNT_UUID>" profileUrls: ["https://linkedin.com/in/exclude-this-person"]Copy blacklist from another account:
Tool: setting_copy_blacklist Parameters: linkedinAccountUuid: "<ACCOUNT_UUID>" copyFromAccount: "<SOURCE_ACCOUNT_UUID>"
MCP Server (AI Agents)
Prerequisites
The MCP server requires Node.js v18 (the package is built targeting Node 18). The recommended way to manage Node versions is nvm.
macOS / Linux — nvm
1. Install nvm (skip if already installed):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# then restart your terminal or run: source ~/.zshrc2. Install Node 18 and set it as the active version:
nvm install 18
nvm use 18
node --version # should print v18.x.x3. Install the MCP package globally under Node 18:
npm install -g salesrobot-cliThis puts the MCP server script at:
~/.nvm/versions/node/v18.20.x/lib/node_modules/salesrobot-cli/dist/mcp.jsWindows — nvm-windows
Windows uses a separate tool called nvm-windows (different project, same concept).
1. Install nvm-windows:
Download and run the latest nvm-setup.exe installer from the nvm-windows releases page, then open a new Command Prompt or PowerShell as Administrator.
2. Install Node 18 and set it as the active version:
nvm install 18
nvm use 18
node --version # should print v18.x.x3. Install the MCP package globally under Node 18:
npm install -g salesrobot-cliThis puts the MCP server script at:
C:\Users\YOUR_USERNAME\AppData\Roaming\nvm\v18.x.x\node_modules\salesrobot-cli\dist\mcp.jsMCP Setup
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"salesrobot": {
"command": "npx",
"args": ["-y", "salesrobot-cli"],
"env": {
"SR_API_KEY": "your_api_key_here"
}
}
}
}Or if installed globally:
{
"mcpServers": {
"salesrobot": {
"command": "salesrobot-mcp",
"env": {
"SR_API_KEY": "your_api_key_here"
}
}
}
}Using nvm (recommended — avoids Node version conflicts):
If npx or salesrobot-mcp picks up the wrong Node version, pin the full paths from your nvm installation:
{
"mcpServers": {
"salesrobot": {
"command": "/Users/YOUR_USERNAME/.nvm/versions/node/v18.20.8/bin/node",
"args": ["/Users/YOUR_USERNAME/.nvm/versions/node/v18.20.8/lib/node_modules/salesrobot-cli/dist/mcp.js"],
"env": {
"SR_API_KEY": "your_api_key_here"
}
}
}
}What each field means:
| Field | Purpose | |-------|---------| |
command| Full path to the Node.js binary. Using the nvm path (instead of justnode) guarantees Claude Desktop uses exactly Node v18 regardless of what your shell'sPATHis set to. Find yours by runningnvm which 18in a terminal. | |args[0]| Full path to the MCP server entry point —dist/mcp.jsinside the globally-installedsalesrobot-clipackage. The folder is~/.nvm/versions/node/v18.20.x/lib/node_modules/salesrobot-cli/. | |env.SR_API_KEY| Your SalesRobot API key. Get it from SalesRobot → Settings → API Key. Passing it here means Claude Desktop injects it into the MCP server process automatically — you don't need to set it in your shell. |
All 55 tools are available instantly. Tool names use snake_case: campaign_list, prospect_add, inbox_send_message, etc.
Campaign Creation Flow (MCP)
Step 0: linkedin_account_list → get your account UUID
Step 1: campaign_create
Step 2: prospect_sync_sales_nav / prospect_import_linkedin_search / prospect_import_post_comments / prospect_import_post_reactions / prospect_import_linkedin_group / prospect_import_linkedin_event / prospect_import_recruiter_lite / prospect_add / prospect_upload_csv
Step 3: campaign_update_settings
Step 4: campaign_create_sequence_from_steps
Step 5: campaign_startStep 0 — Get LinkedIn Account UUID
Tool: linkedin_account_list
Returns a list of all connected LinkedIn accounts. Copy the uuid field.Step 1 — Create Campaign
Tool: campaign_create
Parameters:
linkedinAccountUuid: "your-account-uuid"
campaignName: "Q1 2026 Enterprise Outreach"
Returns the new campaign UUID. Save it for subsequent steps.Step 2 — Add Prospects
Option A — Sales Navigator URL
Tool: prospect_sync_sales_nav
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
searchUrl: "https://www.linkedin.com/sales/search/people?..."Option B — LinkedIn search URL (regular)
Tool: prospect_import_linkedin_search
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
searchUrl: "https://www.linkedin.com/search/results/people/?keywords=..."
connectionLevels: ["2nd", "3rd"] (optional)
premiumOnly: false (optional)
collectContactInfo: true (optional)
enrichData: true (optional)Option C — Post comments
Tool: prospect_import_post_comments
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
searchUrl: "https://www.linkedin.com/posts/some-post-id"
collectContactInfo: true (optional)
enrichData: true (optional)Option D — Post reactions
Tool: prospect_import_post_reactions
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
searchUrl: "https://www.linkedin.com/posts/some-post-id"
collectContactInfo: true (optional)
enrichData: true (optional)Option E — LinkedIn Group
Tool: prospect_import_linkedin_group
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
searchUrl: "https://www.linkedin.com/groups/12345678/"
sendMessageUsingGroup: true (optional — enables group DM context)
collectContactInfo: true (optional)
enrichData: true (optional)Option F — LinkedIn Event
Tool: prospect_import_linkedin_event
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
searchUrl: "https://www.linkedin.com/events/87654321/"
sendMessageUsingEvent: true (optional — enables event DM context)
collectContactInfo: true (optional)
enrichData: true (optional)Option G — Recruiter Lite
Tool: prospect_import_recruiter_lite
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
searchUrl: "https://www.linkedin.com/talent/search?..."
premiumOnly: false (optional)
collectContactInfo: true (optional)
enrichData: true (optional)Option H — Single prospect by LinkedIn URL
Tool: prospect_add
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
profileUrl: "https://www.linkedin.com/in/johndoe"Option I — Single prospect by details
Tool: prospect_add
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
firstName: "John"
jobTitle: "VP Sales"
companyName: "Acme Corp"Option J — Bulk upload via CSV
Tool: prospect_upload_csv
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
filePath: "/path/to/prospects.csv"
enrichData: true (optional)
collectContactInfo: false (optional)IMPORTANT RULES — always follow these exactly:
connectionLevelsis always required incampaign_update_settings. The backend throws HTTP 500 if it is missing. Always include it, even if the user did not mention connection levels — default to["2nd", "3rd"]for LinkedIn search campaigns.searchUrlandsearchTypeare set automatically by the import call in Step 2 — they persist the prospect source so the UI shows the correct label and URL. Do NOT pass them tocampaign_update_settings; they have no effect there.Match
searchTypeto the import tool used in Step 2 (for reference — these are sent internally by each import tool):
| Step 2 tool used | searchType sent |
|----------------------------------------|----------------------|
| prospect_import_linkedin_search | normal |
| prospect_sync_sales_nav | salesnav |
| prospect_import_post_comments | comment |
| prospect_import_post_reactions | react |
| prospect_import_linkedin_group | group |
| prospect_import_linkedin_event | event |
| prospect_import_recruiter_lite | recruiter |
| prospect_add / prospect_upload_csv | not applicable |
Step 3 — Update Campaign Settings
Tune the campaign-level filters and enrichment options that control how prospects are processed for this specific campaign.
Account-wide settings (quotas, schedule, blacklist) are set once per LinkedIn account in the Prerequisites step — not here.
Campaign settings
Field reference
| Field | Type | Purpose |
|-------|------|---------|
| connectionLevels | string[] | Array of connection degrees to include. Examples: ["1st"], ["2nd","3rd"], ["1st","2nd","3rd"]. Drives which step types are allowed (e.g. SEND_MESSAGE requires 1st). |
| enrichData | boolean | Auto-enrich prospects with company, email, and profile data before the sequence runs. |
| premiumOnly | boolean | Restrict outreach to LinkedIn Premium members only. |
| openInmailDiscover | boolean | Use Open InMail Discover for prospect targeting (requires Sales Nav / LinkedIn premium). |
| fetchAllAtOnce | boolean | Fetch the full prospect list up front instead of streaming in batches. |
| groupMessageUrl | string \| null | LinkedIn Group URL used when a step is SEND_MESSAGE_USING_GROUP. |
| eventMessageUrl | string \| null | LinkedIn Event URL used when a step is SEND_MESSAGE_USING_EVENT / INVITE_TO_EVENT. |
| dontAddIfInAnotherLinkedinAccountForMyUser | boolean | De-dup across the user's other connected LinkedIn accounts — skip prospects already targeted elsewhere. |
IMPORTANT: connectionLevels is always required. The backend throws HTTP 500 if it is missing. Always include it, even if the user did not mention connection levels — default to ["2nd", "3rd"] for LinkedIn search campaigns.
Example:
Tool: campaign_update_settings
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
connectionLevels: ["2nd", "3rd"]
enrichData: true
dontAddIfInAnotherLinkedinAccountForMyUser: trueStep 4 — Create Sequence
Build the outreach sequence — the ordered list of steps each prospect goes through.
Add Sequence Steps
Available step types
| Step type (sequenceStepType) | Description | Connection level |
|--------------------------------|-------------|------------------|
| SEND_CONNECTION_REQUEST | Send LinkedIn connection request (optional note) | 2nd / 3rd only |
| SEND_CONNECTION_REQUEST_BROWSER | Browser-based connection request | 2nd / 3rd only |
| SEND_CONNECTION_USING_EMAIL | Email-channel connection | Any |
| SEND_MESSAGE | Send LinkedIn DM | 1st only |
| SEND_MESSAGE_IN_MAIL | Send InMail | 2nd / 3rd (premium) |
| SEND_VOICE_MESSAGE | LinkedIn voice note | 1st only |
| SEND_VIDEO_MESSAGE | LinkedIn video | 1st only |
| SEND_MESSAGE_USING_GROUP | DM via LinkedIn Group context | Any |
| SEND_MESSAGE_USING_EVENT | DM via LinkedIn Event context | Any |
| VIEW_PROFILE | View prospect's profile (soft touch) | Any |
| FOLLOW | Follow prospect | Any |
| LIKE_POST | Like prospect's recent post | Any |
| LIKE_AND_COMMENT | Like + comment on post | Any |
| ENDORSE | Endorse skills | 1st only |
| INVITE_TO_EVENT | Invite to a LinkedIn event | 1st only |
| WITHDRAW_CONNECTION_REQUEST | Withdraw a pending invite | — |
Per-step inputs
For each step you configure:
- Type —
sequenceStepType(see table above) - Timing —
day(days after previous step) +hours(additional hours) - Title / description — display labels in the UI
- Message content —
subject+messageBody(with merge tags) - A/B variants — multiple entries in
multiVariateMails - AI variables — referenced by id/name on the variant
- Media —
voiceMessageURL,videoMessageURL,uploadedFile - Email threading —
emailThreadMode(NEW|GROUPED) +emailThreadGroupId - Event context —
eventUrlforINVITE_TO_EVENT/SEND_MESSAGE_USING_EVENT - Post age filter —
maxPostAgeInDaysforLIKE_POST/LIKE_AND_COMMENT
Merge tags
Always use double curly braces
{{tag}}. Single braces{tag}will not be resolved and will appear as literal text in the sent message.
| Tag | Resolves to |
|-----|-------------|
| {{firstName}} | Prospect's first name |
| {{lastName}} | Prospect's last name |
| {{companyName}} | Prospect's company |
| {{jobTitle}} | Prospect's job title |
| {{avatarFirstName}} | Sender's first name (avatar) |
| {{customField}} | Custom field value |
| {{aiVariableName}} | AI variable output (from ai-features create-ai-variable) |
Basic example — connection request + follow-up
Tool: campaign_create_sequence_from_steps
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
campaignFamily: "LINKEDIN"
sequenceSteps: [
{
stepOrdinal: 1,
day: 0,
sequenceStepType: "SEND_CONNECTION_REQUEST",
title: "Connection Request",
messageBody: "Hi {{firstName}}, I noticed you're the {{jobTitle}} at {{companyName}}. I'd love to connect!"
},
{
stepOrdinal: 2,
day: 1,
sequenceStepType: "SEND_MESSAGE",
title: "Follow-up",
messageBody: "Hi {{firstName}}, thanks for connecting! Would you be open to a 15-minute call?"
}
]AI variable — personalised icebreaker
Create the variable first, then reference it with {{variableName}} in any message body.
Tool: ai_features_create_variable
Parameters:
linkedinAccountUuid: "..."
name: "icebreaker"
prompt: "Write a single, friendly sentence referencing {{firstName}}'s recent LinkedIn activity that could open a cold outreach message."
Tool: campaign_create_sequence_from_steps
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
sequenceSteps: [
{
stepOrdinal: 1,
day: 0,
sequenceStepType: "SEND_CONNECTION_REQUEST",
messageBody: "{{icebreaker}} Would love to connect, {{firstName}}!"
}
]AI voice clone — personalised voice notes
Clone your voice once, then use SEND_VOICE_MESSAGE steps to reach prospects at scale.
Tool: ai_features_create_voice_clone
Parameters:
linkedinAccountUuid: "..."
voiceName: "My Voice"
description: "Sales outreach voice"
removeBackgroundNoise: true
Tool: ai_features_test_voice_clone (optional verification)
Parameters:
linkedinAccountUuid: "..."
text: "Hi {{firstName}}, just wanted to reach out personally!"
Tool: campaign_create_sequence_from_steps
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
sequenceSteps: [
{
stepOrdinal: 1,
day: 0,
sequenceStepType: "VIEW_PROFILE"
},
{
stepOrdinal: 2,
day: 1,
sequenceStepType: "SEND_VOICE_MESSAGE",
messageBody: "Hi {{firstName}}, I noticed your work at {{companyName}} and wanted to reach out personally!"
}
]AI video avatar — personalised video messages
Upload a video of yourself to create an avatar, then send AI-personalised videos to each prospect.
Tool: ai_features_create_video_avatar
Parameters:
linkedinAccountUuid: "..."
name: "My Avatar"
description: "Personalised sales outreach"
gender: "MALE"
Tool: ai_features_generate_sample_video (optional verification)
Parameters:
linkedinAccountUuid: "..."
text: "Hi {{firstName}}, great to connect!"
Tool: campaign_create_sequence_from_steps
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
sequenceSteps: [
{
stepOrdinal: 1,
day: 0,
sequenceStepType: "SEND_CONNECTION_REQUEST",
messageBody: "Hi {{firstName}}, would love to connect!"
},
{
stepOrdinal: 2,
day: 2,
sequenceStepType: "SEND_VIDEO_MESSAGE",
messageBody: "Hi {{firstName}}, I made this short video specifically for you about how we help {{companyName}} leaders at {{companyName}}."
}
]Step 5 — Start Campaign
Tool: campaign_start
Parameters:
linkedinAccountUuid: "..."
campaignUuid: "..."
hasInviteMessage: trueAll MCP Tools
linkedin-account (4 tools)
| Tool | Description |
|------|-------------|
| linkedin_account_list | List all connected LinkedIn accounts |
| linkedin_account_check | Check if a LinkedIn email or cookie account exists |
| linkedin_account_add_tags | Add tags to an account |
| linkedin_account_auth_link | Get LinkedIn authentication URL |
campaign (9 tools)
| Tool | Description |
|------|-------------|
| campaign_create | Create a new campaign |
| campaign_list | List campaigns for an account |
| campaign_start | Start a campaign |
| campaign_pause | Pause or resume a campaign |
| campaign_stats | Get time-based campaign statistics |
| campaign_update_settings | Update campaign settings |
| campaign_get_prospects | Get prospects in a campaign |
| campaign_delete_prospects | Delete multiple prospects |
| campaign_create_sequence_from_steps | Create a message sequence |
prospect (15 tools)
| Tool | Description |
|------|-------------|
| prospect_add | Add a single prospect to a campaign |
| prospect_delete | Delete a prospect |
| prospect_execution_time | Get last execution time for a prospect |
| prospect_list | List prospects |
| prospect_pause | Pause or resume a prospect's sequence |
| prospect_import_linkedin_search | Import from a LinkedIn search URL |
| prospect_import_post_comments | Import prospects who commented on a post |
| prospect_import_post_reactions | Import prospects who reacted to a post |
| prospect_import_linkedin_group | Import members of a LinkedIn Group |
| prospect_import_linkedin_event | Import attendees of a LinkedIn Event |
| prospect_import_recruiter_lite | Import from a Recruiter Lite search |
| prospect_sync_sales_nav | Import from a Sales Navigator search URL |
| prospect_update_settings | Update campaign settings for prospects |
| prospect_update | Update prospect details |
| prospect_upload_csv | Bulk-add prospects from CSV |
inbox (3 tools)
| Tool | Description |
|------|-------------|
| inbox_get_messages | Get synced inbox messages |
| inbox_send_message | Send a LinkedIn message |
| inbox_tag_chat | Tag a conversation |
dashboard (1 tool)
| Tool | Description |
|------|-------------|
| dashboard_daily_stats | Get daily campaign activity statistics |
setting (5 tools)
| Tool | Description |
|------|-------------|
| setting_add_schedule | Create a sending schedule |
| setting_pending_invite | Update pending invite settings |
| setting_quota | Update daily quotas |
| setting_update_blacklist | Update blacklist |
| setting_copy_blacklist | Copy blacklist from another account |
ai-features (9 tools)
| Tool | Description |
|------|-------------|
| ai_features_create_variable | Create an AI personalization variable |
| ai_features_get_variables | List AI variables |
| ai_features_create_video_avatar | Create an AI video avatar |
| ai_features_get_video_avatar | Get the configured video avatar |
| ai_features_generate_sample_video | Generate a sample personalized video |
| ai_features_create_voice_clone | Create an AI voice clone |
| ai_features_delete_voice_clone | Delete the voice clone |
| ai_features_test_voice_clone | Generate a test voice message |
job (5 tools)
| Tool | Description |
|------|-------------|
| job_create | Post a new job on LinkedIn |
| job_list | List job postings |
| job_applicants | Get job applicants |
| job_update | Edit a job posting |
| job_search_params | Search for location/company/job title IDs |
raw (4 tools)
| Tool | Description |
|------|-------------|
| raw_get_profile | Fetch a LinkedIn profile by username or URL |
| raw_get_post | Get a LinkedIn post by URL |
| raw_get_posts | Get recent posts for a profile or company page |
| raw_send_connection | Send a LinkedIn connection request |
Common Workflows (MCP)
Check Campaign Performance
1. dashboard_daily_stats
linkedinAccountUuid: "..."
campaignUuids: ["campaign-uuid"]
weeksBack: 4
2. campaign_stats
linkedinAccountUuid: "..."
campaignUuid: "..."Manage Your Inbox
1. inbox_get_messages
linkedinAccountUuid: "..."
isUnread: true
2. inbox_send_message
linkedinAccountUuid: "..."
prospectUuid: "..."
messageToSend: "Thanks for connecting! Let's schedule a call..."
3. inbox_tag_chat
linkedinAccountUuid: "..."
threadId: "..."
tags: ["hot-lead", "schedule-call"]Set Up Account Settings (Before First Campaign)
1. setting_quota
linkedinAccountUuid: "..."
dailyViewQuota: 100
dailyConnectQuota: 25
dailyMessageQuota: 50
dailyFollowQuota: 20
2. setting_add_schedule
linkedinAccountUuid: "..."
name: "Business Hours"
startTime: "09:00"
endTime: "17:00"
timeZone: "America/New_York"
maxProspects: 50
3. setting_pending_invite (optional)
linkedinAccountUuid: "..."
dailyConnectQuota: 30
dailyMessageQuota: 60
4. setting_update_blacklist (optional — blacklist by company)
linkedinAccountUuid: "..."
companyNames: ["Competitor Inc", "Existing Customer Corp"]
4. setting_update_blacklist (optional — blacklist by profile URL)
linkedinAccountUuid: "..."
profileUrls: ["https://linkedin.com/in/exclude-this-person"]
5. setting_copy_blacklist (optional — copy from another account)
linkedinAccountUuid: "..."
copyFromAccount: "<SOURCE_ACCOUNT_UUID>"Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| SR_API_KEY | SalesRobot API key (required) | — |
License
MIT
