MCP LinkedIn Sales Navigator
This MCP server lets AI assistants automate LinkedIn Sales Navigator through browser control to search leads, view profiles, manage lists, send InMails, and export data.
Search leads with filters such as title, company, location, industry, company size, seniority, job function, and keywords, with pagination support.
Get detailed profile information for a Sales Navigator lead using its profile URL.
Save leads to existing lists or create new lead lists.
List all existing lead lists.
Send InMail messages with subject and body limits, including dry-run support for review before sending.
Export leads from the current search results or a specific list to JSON or CSV, with configurable fields and limits.
Check session status, authentication, browser connection, and daily usage budgets for debugging and rate-limit monitoring.
MCP LinkedIn Sales Navigator
MCP server for LinkedIn Sales Navigator — Browser automation via Playwright.
LinkedIn Sales Navigator doesn't provide a public API. This MCP server uses browser automation (Playwright) to control Sales Navigator through an authenticated browser session. It enables AI assistants to search leads, view profiles, manage lists, send InMails, and export data — all through the standard Model Context Protocol.
⚠️ Important Disclaimers
This tool requires an active LinkedIn Sales Navigator subscription
Browser automation: This operates by controlling a real browser — no API hacking
Session required: You must be logged into LinkedIn in the browser instance
Rate limiting: Use responsibly. LinkedIn may restrict accounts that perform excessive automation
Terms of Service: Review LinkedIn's ToS before using automation tools
No credentials stored: This tool never stores or handles LinkedIn passwords
Related MCP server: LinkedIn Automation MCP Server
Features
Tool | Description |
| Search leads with filters (title, company, location, industry, seniority, etc.) |
| Get detailed profile information for a lead |
| Save a lead to a list |
| List all lead lists |
| Create a new lead list |
| Send an InMail message (with dry-run support) |
| Export leads to JSON or CSV format |
| Check browser connection, Sales Navigator auth, and today's usage budgets (call this first when debugging) |
Quick Start
Prerequisites
Node.js ≥ 20
LinkedIn Sales Navigator subscription with active session
A browser with an active LinkedIn login (Chrome recommended)
Install
npm install globodai-mcp-linkedin-sales-navigatorOr clone and build from source:
git clone https://github.com/globodai-group/mcp-linkedin-sales-navigator.git
cd mcp-linkedin-sales-navigator
npm install
npm run buildConfiguration
The server is configured via environment variables (read in src/index.ts):
Variable | Default | Description |
|
| Auth mode: |
|
| CDP HTTP endpoint when |
| (unset) | Path to exported cookies JSON when |
| (unset) | Chrome profile directory when |
|
| Set to |
|
| Page navigation timeout (ms) |
|
| Click/fill/wait timeout (ms) |
|
| Viewport width (px) |
|
| Viewport height (px) |
|
| Daily cap for |
|
| Daily cap for |
|
| Daily cap for |
|
| Daily cap for |
|
| Minimum delay between page navigations/actions, plus 0–50% random jitter |
|
| Local JSON file for daily counters (dates and counts only) |
Rate limits and account safety
This server throttles your own Sales Navigator activity so a Claude session does not fire actions back-to-back. It is not anti-detection: there is no fingerprint spoofing, user-agent rotation, or proxy support.
Budget | Default | What counts |
Profile views | 80 / local day | Each |
Searches | 30 / local day | Each |
Saves | 50 / local day |
|
InMails | 15 / local day |
|
Action pacing | 4000 ms + 0–50% jitter | Minimum gap between navigations/actions across all tools |
0 on a daily budget means unlimited. Raise a cap by setting the matching LSN_DAILY_* variable; check usageToday on linkedin_session_status for used / cap / remaining. Counters reset at the next local midnight and live in LSN_USAGE_FILE (or ~/.mcp-linkedin-sales-navigator/usage.json). That file stores only dates, category names, and counts.
LinkedIn does not publish official automation limits and restricts automated activity in its User Agreement. No tool can guarantee an account will not be restricted. Start with the defaults, spread activity over working hours, and stay within your Sales Navigator InMail credits.
Authentication Methods
1. CDP (Chrome DevTools Protocol) — Recommended
Connect to an already-running Chrome browser with an active LinkedIn session.
Start Chrome with remote debugging:
# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--remote-debugging-port=9222
# Linux
google-chrome --remote-debugging-port=9222
# Windows
& "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
# If Chrome is installed elsewhere, quote the full path. Node.js 20+ is required.Use PowerShell or Command Prompt. Keep the debugging port free (default 9222) and match LSN_CDP_ENDPOINT.
Then log into LinkedIn Sales Navigator manually. The MCP server connects to this browser.
Shutdown behavior (CDP): when the MCP server exits, it detaches from your Chrome instance only. It does not close your tabs or quit the browser.
LSN_AUTH_METHOD=cdp LSN_CDP_ENDPOINT=http://localhost:9222 npx globodai-mcp-linkedin-sales-navigator2. User Data Directory
Use an existing Chrome profile that's already logged into LinkedIn:
LSN_AUTH_METHOD=session LSN_USER_DATA_DIR=/path/to/chrome/profile npx globodai-mcp-linkedin-sales-navigator3. Cookie-Based
Export your LinkedIn cookies and provide them as a JSON file:
LSN_AUTH_METHOD=cookies LSN_COOKIES_PATH=/path/to/linkedin-cookies.json npx globodai-mcp-linkedin-sales-navigatorMCP client setup
Use the same command, args, and env block in any MCP client. Replace paths and endpoints for your machine.
Claude Desktop
Edit the config file:
OS | Path |
macOS |
|
Windows |
|
Example entry:
{
"mcpServers": {
"linkedin-sales-navigator": {
"command": "npx",
"args": ["-y", "globodai-mcp-linkedin-sales-navigator"],
"env": {
"LSN_AUTH_METHOD": "cdp",
"LSN_CDP_ENDPOINT": "http://localhost:9222"
}
}
}
}Restart Claude Desktop after saving.
Claude Code
From a shell (adjust env vars as needed):
claude mcp add linkedin-sales-navigator -- \
env LSN_AUTH_METHOD=cdp LSN_CDP_ENDPOINT=http://localhost:9222 \
npx -y globodai-mcp-linkedin-sales-navigatorGeneric MCP client
Point the client at the package binary via npx or node /path/to/mcp-linkedin-sales-navigator/dist/index.js, stdio transport, with the environment variables from the table above.
Clawdbot / CORTX Integration
This MCP server is designed to work seamlessly with Clawdbot browser relay:
{
"mcpServers": {
"linkedin-sales-navigator": {
"command": "npx",
"args": ["globodai-mcp-linkedin-sales-navigator"],
"env": {
"LSN_AUTH_METHOD": "cdp",
"LSN_CDP_ENDPOINT": "http://localhost:9222"
}
}
}
}When using Clawdbot's browser relay, the AI assistant can directly control a browser tab where you're logged into Sales Navigator — no additional setup needed.
Tool Examples
Search for leads
{
"tool": "linkedin_search_leads",
"arguments": {
"title": "VP of Engineering",
"location": "San Francisco Bay Area",
"companySize": "201-500",
"industry": "Computer Software"
}
}Get a lead's profile
{
"tool": "linkedin_get_lead_profile",
"arguments": {
"profileUrl": "https://www.linkedin.com/sales/lead/ACwAAAxxxxxx"
}
}Send an InMail (with dry run)
{
"tool": "linkedin_send_inmail",
"arguments": {
"profileUrl": "https://www.linkedin.com/sales/lead/ACwAAAxxxxxx",
"subject": "Quick question about your team",
"body": "Hi, I noticed your team is growing...",
"dryRun": true
}
}Export leads to CSV
{
"tool": "linkedin_export_leads",
"arguments": {
"source": "current_search",
"format": "csv",
"limit": 50
}
}Troubleshooting
Start with the linkedin_session_status tool. It connects lazily (same as other tools), reports authMethod, browserConnected, authenticated, usageToday, and a short hint for the next step.
Symptom | What to check |
Browser not initialized | Fixed in 0.2.0: the browser connects on each tool call if startup failed. Ensure Chrome is running with remote debugging (CDP) or paths are set for |
Not authenticated | Sales Navigator’s shell renders a few seconds after load. Log in at linkedin.com/sales in the same browser profile the server uses, then call |
CDP endpoint unreachable | Confirm Chrome was started with |
Expired session / cookie | Re-authenticate in the browser or refresh exported cookies. An expired |
See CONTRIBUTING.md for reporting selector breakage without sharing secrets.
Architecture
┌─────────────────────────────────────────────────┐
│ AI Assistant (Claude, GPT, etc.) │
│ ↕ MCP Protocol (stdio) │
├─────────────────────────────────────────────────┤
│ MCP Server (this package) │
│ ├── Tools (search, leads, inmails, lists, etc.)│
│ ├── Browser Controller (Playwright) │
│ └── Selectors & Auth │
├─────────────────────────────────────────────────┤
│ Playwright → Chromium / Chrome │
│ ↕ CDP or Direct │
├─────────────────────────────────────────────────┤
│ LinkedIn Sales Navigator (web app) │
└─────────────────────────────────────────────────┘Development
# Install dependencies
npm install
# Install Playwright browsers
npx playwright install chromium
# Development mode (watch)
npm run dev
# Build
npm run build
# Lint
npm run lint
# Type check
npm run typecheck
# Unit tests
npm testSelector Maintenance
LinkedIn rotates hashed CSS module classes on every deploy. Selectors in this project follow a fixed priority (see PR #3 and src/browser/selectors.ts):
data-anonymize="..."and similar LinkedIn field markers (person-name,headline,title,company-name, …)data-x--...,data-sn-view-name,data-control-name— product hooks tied to behaviorSemantic HTML / ARIA and shared
artdeco-*design-system classesPlaywright text matchers (
:has-text(),:text-matches()) only when nothing else is stable
Field locators are prioritised arrays, resolved in order by src/browser/query.ts (not comma-separated CSS lists, which follow document order).
The lead profile topcard headline and location often lack stable hooks. src/browser/dom-extract.ts walks structure from stable anchors (name h1, Save button) and reads text by position, with selector fallbacks afterward.
When tools break after a LinkedIn UI change:
Reproduce on the affected page and tool
Inspect DOM hooks (
data-anonymize,data-control-name) before class namesUpdate selectors, query arrays, or dom-extract heuristics as needed
Open a PR with a redacted HTML snippet (see CONTRIBUTING.md)
License
MIT — see LICENSE
Disclaimer
This project is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. LinkedIn and Sales Navigator are trademarks of LinkedIn Corporation. Use this tool responsibly and in accordance with LinkedIn's Terms of Service.
Available Tools
8 toolslinkedin_create_lead_listB
Create a new lead list in LinkedIn Sales Navigator
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the new lead list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action without mentioning side effects, authentication needs, duplicate handling, or return behavior. For a mutating operation, this lack of detail is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. It is appropriately sized for a simple creation tool with one parameter, conveying the core purpose efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic purpose but lacks usage guidelines and behavioral transparency. Given no output schema and no annotations, it is minimally adequate for a simple one-parameter tool, but an agent would benefit from knowing return values or constraints to ensure correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the 'name' parameter, so the baseline is 3. The description adds no additional meaning beyond what the schema already provides, but the schema fully documents the parameter, so no extra compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('create') and the resource ('new lead list') with platform context ('in LinkedIn Sales Navigator'). It distinguishes this from sibling tools like list_lead_lists and save_lead by explicitly targeting creation of a new list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as linkedin_save_lead or linkedin_list_lead_lists. The description offers no context, prerequisites, or exclusions, leaving the agent to infer usage solely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_export_leadsB
Export leads from LinkedIn Sales Navigator search results or a specific list to JSON or CSV format
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of leads to export (default: 25, max: 250) | |
| fields | No | Fields to include (default: fullName, firstName, lastName, title, company, location, salesNavUrl) | |
| format | No | Export format | json |
| listId | No | List ID to export from (required if source is 'list') | |
| source | Yes | Export from current search results ("current_search") or a specific list ("list") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the export action and format, omitting potential side effects (e.g., API rate limits, session requirements, or behavior when the source is invalid). This is a significant gap for a data-export tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the core action and scope. There is no extraneous information, and it is easy to parse at a glance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has five parameters, no output schema, and no annotations, the description is insufficient. It does not explain the dependency between source and listId (that listId is required when source is 'list'), nor does it describe the output structure or potential error conditions. An agent would need to infer these from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter (source, listId, limit, fields, format). The tool description adds no additional meaning beyond what the schema provides, only repeating the format options. Baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action (export leads), the source (search results or a specific list), and the output format (JSON/CSV). It distinguishes itself from sibling tools like linkedin_search_leads (which finds leads) and linkedin_get_lead_profile (which retrieves a single profile), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the two possible sources (current_search or list) but does not provide explicit guidance on when to choose this tool over alternatives, nor does it mention prerequisites such as having an active search session or a valid list ID. Usage context is only implied, with no exclusions or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_lead_profileB
Get detailed profile information for a LinkedIn Sales Navigator lead
| Name | Required | Description | Default |
|---|---|---|---|
| profileUrl | Yes | Sales Navigator profile URL (e.g., https://www.linkedin.com/sales/lead/...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It states it 'gets' information (suggesting read-only), but gives no details on what 'detailed' includes, any rate limits, authentication requirements, or response format. The description adds little beyond the verb itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence, front-loaded with the action, and contains no redundant information. It's appropriately sized for a single-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description omits important context for a tool with no output schema: it doesn't explain what fields are returned, whether the profile URL is enough, or any limitations. While the tool is simple, the description doesn't sufficiently cover the user's need for understanding the tool's full behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the only parameter (profileUrl) comprehensively with a description and example. The tool description doesn't add extra meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('detailed profile information for a LinkedIn Sales Navigator lead'), clearly distinguishing it from siblings like search, save, and export. It's immediately obvious what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need a specific lead's profile, but it doesn't explicitly specify when to use this over search_leads or other alternatives. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_list_lead_listsA
List all lead lists in LinkedIn Sales Navigator
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. The verb 'List' implies a read-only operation, which is a basic behavioral trait, but it does not disclose any details about return format, pagination, authentication, or rate limits. While the safety is implied, richer behavioral context is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence: 'List all lead lists in LinkedIn Sales Navigator.' It is concise, clear, and every word contributes to the meaning. There is no redundant or filler content, making it an excellent model of brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with no parameters and no output schema, but the description still does not fully cover the context. It states the purpose but does not describe the structure of the returned data (e.g., whether it includes IDs, names, or other metadata). An agent may need to rely on external knowledge or trial and error to understand the output. Given the absence of an output schema, the description should have provided more detail about the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there are no parameter semantics to clarify. Per guidelines, a tool with 0 parameters receives a baseline score of 4 because the description does not need to compensate for missing parameter information. The description appropriately omits parameter details that do not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'lead lists' and scopes it to 'all' in LinkedIn Sales Navigator. This clearly distinguishes it from sibling tools like 'create_lead_list' which creates lists, and 'search_leads' which searches for leads. The purpose is unambiguous and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention that it is the appropriate tool for viewing all lead lists, nor does it reference the sibling tools such as create_lead_list or search_leads. An agent receives no contextual advice for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_save_leadA
Save a lead to a list on LinkedIn Sales Navigator. Always preview first with dryRun=true before saving (default dryRun=false preserves prior behaviour).
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, locate the save UI with human-like pacing but do not click Save (preview only). Prefer true before a real save. | |
| listName | No | Name of the list to save to (default: saved leads) | |
| profileUrl | Yes | Sales Navigator profile URL of the lead to save |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that dryRun previews without clicking and that default is false (actual save), which is a key behavioral trait. However, it omits other relevant behaviors such as prerequisites (e.g., active session), potential side effects, or error handling, leaving the agent with partial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two sentences—and front-loads the core action before the cautionary note. Every word earns its place, and the instruction is placed after the purpose for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters, no output schema, and no annotations, the description is adequate but leaves gaps: it doesn't clarify whether the list must already exist, what happens on failure, or if authentication is required. The guidance to preview mitigates some risk, but the agent may still lack sufficient context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters already have descriptions. The tool description repeats the dryRun default and intent but adds no meaning beyond the schema. The baseline of 3 applies because the schema does the heavy lifting and the description contributes no extra parameter context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Save') and resource ('a lead to a list on LinkedIn Sales Navigator'), clearly distinguishing it from sibling tools like search, export, or profile retrieval. The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a strong operational guideline ('Always preview first with dryRun=true before saving') but does not explicitly contrast this tool with alternatives or state when not to use it. It implies the tool's role relative to siblings but leaves the selection logic to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_search_leadsA
Search for leads on LinkedIn Sales Navigator with filters (title, company, location, industry, seniority, etc.)
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| title | No | Job title filter | |
| company | No | Company name filter | |
| function | No | Job function (e.g., "Sales", "Engineering", "Marketing") | |
| industry | No | Industry filter | |
| keywords | No | Search keywords | |
| location | No | Geographic location filter | |
| companySize | No | Company headcount range (e.g., "51-200", "201-500", "1001-5000") | |
| seniorityLevel | No | Seniority level (e.g., "VP", "Director", "Manager", "C-Suite") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. The verb 'search' implies a read-only operation, but the description does not explicitly state that, nor does it mention pagination (though 'page' exists in the schema), result limits, or any licensing prerequisites. It adds some context by referencing Sales Navigator but lacks deeper detail about what happens when the tool runs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the action and resource. No wasted words; it accomplishes its purpose without fluff. The parenthetical list of filters is concise and immediately informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 9 optional parameters and no output schema, the description is thin. It establishes the core purpose and mentions Sales Navigator, but it does not clarify pagination behavior, response format, or any constraints on combining filters. The schema compensates for parameter details, but the description alone feels slightly incomplete for an agent encountering the tool for the first time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all 9 parameters. The tool description lists a few filter examples (title, company, location, industry, seniority) and says 'etc.', which adds a general sense of available filters but no information beyond what the schema provides. Baseline of 3 is appropriate when the schema carries the full explanatory burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Search' and clearly identifies the resource 'leads on LinkedIn Sales Navigator'. This distinguishes it from sibling tools like linkedin_get_lead_profile and linkedin_send_inmail, which have different purposes. No ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates the tool's use case: searching for leads with filters. While it does not explicitly contrast with alternatives, the sibling tool names make it apparent that this is the search tool, while others handle profile retrieval, saving, messaging, and list management. The context is clear, though no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_send_inmailA
Send an InMail message to a lead on LinkedIn Sales Navigator. Requires available InMail credits. Always preview first with dryRun=true before sending (default dryRun=false preserves prior behaviour).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | InMail message body (max 1900 characters) | |
| dryRun | No | If true, compose the InMail with human-like pacing but do not click Send (preview/review only). Prefer true before a real send. | |
| subject | Yes | InMail subject line (max 200 characters) | |
| profileUrl | Yes | Sales Navigator profile URL of the recipient |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It usefully states that InMail credits are required and that dryRun previews without sending, but it does not describe response behavior, failure modes, or consequences of an actual send beyond the obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core purpose, then gives the most important usage instruction. It avoids restating schema details or repeating the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description adequately covers the prerequisite and preview workflow. However, it does not mention return values, success/failure signals, or edge cases like invalid profiles or exhausted credits, leaving some ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all parameters, including max lengths and the dryRun default, so the baseline is 3. The description adds operational emphasis on dryRun usage but does not need to redefine parameter semantics. Schema coverage is 100%, so no compensation is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Send an InMail message') and target ('lead on LinkedIn Sales Navigator'), making it clearly distinct from sibling tools that read profiles, search, save, or export leads. It adds platform and object context beyond the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit procedural guidance: always preview first with dryRun=true before sending, and notes that dryRun=false preserves prior behavior. It does not name sibling alternatives or conditions to avoid use, but for a send operation the instruction is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_session_statusA
Check LinkedIn Sales Navigator browser connection, authentication, and today's usage budgets. Call this before other tools to verify the session (auth method, browserConnected, authenticated, usageToday). Attaches to the existing browser if needed. Never navigates the user's own tab; opens an owned dedicated tab when no Sales Navigator tab exists (same as other tools).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the full behavioral disclosure burden. It proactively reveals that the tool may attach to an existing browser, never navigates the user's own tab, and opens an owned dedicated tab when needed. This goes beyond a simple 'check status' and gives agents useful side-effect awareness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, followed by usage guidance and behavioral caveats. Every sentence earns its place; there is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema status tool, the description is nearly complete: it states what is checked, when to call it, and relevant side effects. The main gap is that it does not describe the exact response shape or possible error states, but the named fields give enough context for an agent to interpret the tool's output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so the baseline of 4 applies. The description adds value by listing the session attributes an agent can verify (auth method, browserConnected, authenticated, usageToday), which effectively compensates for the absence of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Check LinkedIn Sales Navigator browser connection, authentication, and today's usage budgets.' It also frames the tool as a preflight check distinct from sibling data-operation tools, so an agent can tell it apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this before other tools to verify the session.' It also explains tab-attachment behavior and states it is consistent with sibling tools. It does not mention when not to use the tool, but no alternative status/checking sibling exists, so the missing exclusion is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.2.0- Changed
linkedin_export_leads1 field changed- added
Input schema / properties / listId / patternAdded value: +"^[A-Za-z0-9_-]+$"
- Changed
linkedin_save_lead1 field changed- added
Input schema / properties / dryRunAdded value: +{ + "default": false, + "description": "If true, locate the save UI with human-like pacing but do not click Save (preview only). Prefer true before a real save.", + "type": "boolean" +}
- Changed
linkedin_send_inmail1 field changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"If true, compose the InMail but don't send it (for review)"New value: +"If true, compose the InMail with human-like pacing but do not click Send (preview/review only). Prefer true before a real send."
- Added
linkedin_session_status
7 tool updates
v0.1.0- First observed
linkedin_create_lead_list - First observed
linkedin_export_leads - First observed
linkedin_get_lead_profile - First observed
linkedin_list_lead_lists - First observed
linkedin_save_lead - First observed
linkedin_search_leads - First observed
linkedin_send_inmail
TDQS
Scored across 8 tools
Each tool addresses a distinct operation: profile retrieval, session health, lead saving, InMail sending, exporting, list creation, list enumeration, and searching. There is no functional overlap; even export_leads and search_leads have clear boundaries (export vs. discover). An agent can unambiguously select the correct tool for each task.
All tools share the 'linkedin_' prefix and use snake_case. Most follow a clear verb_noun pattern (get_lead_profile, save_lead, send_inmail, export_leads, create_lead_list, list_lead_lists, search_leads). The exception is linkedin_session_status, which uses a noun_noun structure and lacks a verb, creating a minor but noticeable inconsistency.
With 8 tools, the server is well-scoped for a LinkedIn Sales Navigator integration. Each tool covers a core workflow (searching, profiling, list management, outreach, and session monitoring) without unnecessary bloat. The count is firmly within the ideal 3-15 range and feels neither thin nor overloaded.
The surface covers the primary Sales Navigator operations: search, profile views, list CRUD (create/list, and save implies add to list), InMail sending, and export. Minor gaps exist—such as removing leads from lists or updating list metadata—but agents can accomplish most sales workflows without dead ends. The only notable omission is a list-lead enumeration function (e.g., list leads in a specific list), which is a secondary workflow.
Maintenance
Related MCP Connectors
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
LinkedIn for AI agents: inbox, invitations, Sales Navigator search, posts. Quotas and webhooks.
Full LinkedIn access for AI agents: leads, messaging, and campaigns with safe limits built in.
Live LinkedIn data for AI agents: profiles, companies, jobs, posts, email finding. No account risk.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with LinkedIn by scraping profiles, companies, job postings, and getting personalized job recommendations using authenticated browser automation.1715,550 PyPI3,557Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage LinkedIn workflows through a comprehensive set of tools for content generation, profile optimization, lead management, message outreach, engagement, analytics, scheduling, and industry research.-
- AlicenseAqualityBmaintenanceConnects LinkedIn to AI assistants, enabling lead search, profile analysis, messaging, and workflow automation through a cloud browser. Supports sales, recruiting, and market research tasks.59194 npmMIT
- AlicenseAqualityBmaintenanceEnables AI assistants to search LinkedIn Sales Navigator contacts and accounts by driving a real logged-in browser and capturing Sales Navigator's own search API responses.1617 PyPI2MIT