Skip to main content
Glama
globodai-group

MCP LinkedIn Sales Navigator

MCP LinkedIn Sales Navigator

CI npm version

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

linkedin_search_leads

Search leads with filters (title, company, location, industry, seniority, etc.)

linkedin_get_lead_profile

Get detailed profile information for a lead

linkedin_save_lead

Save a lead to a list

linkedin_list_lead_lists

List all lead lists

linkedin_create_lead_list

Create a new lead list

linkedin_send_inmail

Send an InMail message (with dry-run support)

linkedin_export_leads

Export leads to JSON or CSV format

linkedin_session_status

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-navigator

Or 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 build

Configuration

The server is configured via environment variables (read in src/index.ts):

Variable

Default

Description

LSN_AUTH_METHOD

cdp

Auth mode: cdp (attach to running Chrome), session (Playwright + user data dir), or cookies (JSON cookie file)

LSN_CDP_ENDPOINT

http://localhost:9222

CDP HTTP endpoint when LSN_AUTH_METHOD=cdp

LSN_COOKIES_PATH

(unset)

Path to exported cookies JSON when LSN_AUTH_METHOD=cookies

LSN_USER_DATA_DIR

(unset)

Chrome profile directory when LSN_AUTH_METHOD=session

LSN_HEADLESS

false

Set to true to run Chromium headless (session / cookies modes)

LSN_NAVIGATION_TIMEOUT

30000

Page navigation timeout (ms)

LSN_ACTION_TIMEOUT

10000

Click/fill/wait timeout (ms)

LSN_VIEWPORT_WIDTH

1280

Viewport width (px)

LSN_VIEWPORT_HEIGHT

900

Viewport height (px)

LSN_DAILY_PROFILE_VIEWS

80

Daily cap for linkedin_get_lead_profile. 0 = unlimited

LSN_DAILY_SEARCHES

30

Daily cap for linkedin_search_leads, plus each results page fetched by linkedin_export_leads. 0 = unlimited

LSN_DAILY_SAVES

50

Daily cap for linkedin_save_lead + linkedin_create_lead_list. 0 = unlimited

LSN_DAILY_INMAILS

15

Daily cap for linkedin_send_inmail sends (dry runs do not count). 0 = unlimited

LSN_MIN_ACTION_INTERVAL_MS

4000

Minimum delay between page navigations/actions, plus 0–50% random jitter

LSN_USAGE_FILE

~/.mcp-linkedin-sales-navigator/usage.json

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 linkedin_get_lead_profile call

Searches

30 / local day

Each linkedin_search_leads call, and each results page fetched by linkedin_export_leads

Saves

50 / local day

linkedin_save_lead (real save) and linkedin_create_lead_list

InMails

15 / local day

linkedin_send_inmail calls that actually send. Dry runs do not count

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

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-navigator

2. 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-navigator

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-navigator

MCP 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

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

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-navigator

Generic 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 session / cookies. Retry after fixing the environment.

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 linkedin_session_status again.

CDP endpoint unreachable

Confirm Chrome was started with --remote-debugging-port=9222 (or your port), nothing else bound to that port, and LSN_CDP_ENDPOINT matches (including http://).

Expired session / cookie

Re-authenticate in the browser or refresh exported cookies. An expired li_at cookie produces auth failures until you sign in again.

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 test

Selector 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):

  1. data-anonymize="..." and similar LinkedIn field markers (person-name, headline, title, company-name, …)

  2. data-x--..., data-sn-view-name, data-control-name — product hooks tied to behavior

  3. Semantic HTML / ARIA and shared artdeco-* design-system classes

  4. Playwright 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:

  1. Reproduce on the affected page and tool

  2. Inspect DOM hooks (data-anonymize, data-control-name) before class names

  3. Update selectors, query arrays, or dom-extract heuristics as needed

  4. 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 tools
linkedin_create_lead_listB

Create a new lead list in LinkedIn Sales Navigator

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new lead list

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of leads to export (default: 25, max: 250)
fieldsNoFields to include (default: fullName, firstName, lastName, title, company, location, salesNavUrl)
formatNoExport formatjson
listIdNoList ID to export from (required if source is 'list')
sourceYesExport from current search results ("current_search") or a specific list ("list")

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
profileUrlYesSales Navigator profile URL (e.g., https://www.linkedin.com/sales/lead/...)

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoIf true, locate the save UI with human-like pacing but do not click Save (preview only). Prefer true before a real save.
listNameNoName of the list to save to (default: saved leads)
profileUrlYesSales Navigator profile URL of the lead to save

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.)

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-indexed)
titleNoJob title filter
companyNoCompany name filter
functionNoJob function (e.g., "Sales", "Engineering", "Marketing")
industryNoIndustry filter
keywordsNoSearch keywords
locationNoGeographic location filter
companySizeNoCompany headcount range (e.g., "51-200", "201-500", "1001-5000")
seniorityLevelNoSeniority level (e.g., "VP", "Director", "Manager", "C-Suite")

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesInMail message body (max 1900 characters)
dryRunNoIf true, compose the InMail with human-like pacing but do not click Send (preview/review only). Prefer true before a real send.
subjectYesInMail subject line (max 200 characters)
profileUrlYesSales Navigator profile URL of the recipient

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 4 tool updatesv0.2.0
    • Changedlinkedin_export_leads1 field changed
      • addedInput schema / properties / listId / pattern
        Added value: +"^[A-Za-z0-9_-]+$"
    • Changedlinkedin_save_lead1 field changed
      • addedInput schema / properties / dryRun
        Added 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"
        +}
    • Changedlinkedin_send_inmail1 field changed
      • changedInput schema / properties / dryRun / description
        Previous 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."
    • Addedlinkedin_session_status
  2. 7 tool updatesv0.1.0
    • First observedlinkedin_create_lead_list
    • First observedlinkedin_export_leads
    • First observedlinkedin_get_lead_profile
    • First observedlinkedin_list_lead_lists
    • First observedlinkedin_save_lead
    • First observedlinkedin_search_leads
    • First observedlinkedin_send_inmail

TDQS

A3.8/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers