linkedin-sales-nav-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOST | No | Host for HTTP transport | 127.0.0.1 |
| PORT | No | Port for HTTP transport | 9000 |
| HEADLESS | No | false = visible window (safest); true = headless (more detectable) | false |
| HTTP_PATH | No | Path for HTTP transport | /mcp |
| LOG_LEVEL | No | Log level: DEBUG, INFO, WARNING, ERROR | WARNING |
| TRANSPORT | No | Transport type (stdio or HTTP) | stdio |
| CHROME_PATH | No | Use your own Chrome instead of bundled Chromium | |
| NAV_TIMEOUT | No | Timeout for navigation (seconds) | 60 |
| CAPTURE_WAIT | No | Wait time for capturing responses (seconds) | 25 |
| PROXY_SERVER | No | Leave empty on your own machine; only for a residential exit node if remote | |
| TOOL_TIMEOUT | No | Per-tool MCP timeout (seconds) — must exceed the pacing budget below | 600.0 |
| LOGIN_TIMEOUT | No | Timeout for login (seconds) | 300 |
| USER_DATA_DIR | No | Persistent browser profile directory | ~/.linkedin-sales-nav/profile |
| LONG_PAUSE_MAX | No | Length of longer break (seconds) | 45.0 |
| LONG_PAUSE_MIN | No | Length of longer break (seconds) | 20.0 |
| PACING_ENABLED | No | Human-like delays between pages | true |
| PAGE_DELAY_MAX | No | Random dwell before advancing a page (seconds) | 8.0 |
| PAGE_DELAY_MIN | No | Random dwell before advancing a page (seconds) | 3.0 |
| LONG_PAUSE_EVERY | No | Take a longer break every N pages (0 disables) | 5 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_contactsA | Search people/leads by driving Sales Navigator in the logged-in browser and capturing its search API responses. Results are saved to the local database automatically; this tool returns a small summary, not the records (call export_results or get_results for the data). Build the search in Sales Navigator (title / geography / industry / seniority / keyword filters), copy the URL from the address bar, and pass it here. Saved lead lists work too. Resumable: the search URL is hashed to a query id. If a previous run stopped partway, calling again with the same URL resumes from the next page instead of restarting — safe to call repeatedly to page deeper. |
| search_accountsA | Search companies/accounts by driving Sales Navigator in the logged-in browser and capturing its search API responses. Results are saved to the local database automatically; this tool returns a small summary, not the records (call export_results or get_results for the data). Build the search in Sales Navigator (industry / headcount / geography / growth filters), copy the URL from the address bar, and pass it here. Saved account lists work too. Resumable: the search URL is hashed to a query id. If a previous run stopped partway, calling again with the same URL resumes from the next page instead of restarting. |
| list_queriesA | List every saved search and its progress. Returns:
Dict with |
| export_resultsB | Export a saved query's records to files under the output folder. |
| get_resultsA | Pull a bounded slice of a saved query's records into the conversation for analysis. Bounded on purpose — for large sets, prefer export_results and analyze the file with code rather than loading everything into context. |
| enrich_leadsA | Add Open Profile / InMail status to a saved contact search. Search results cannot carry this. Sales Navigator's search payload has
an Costs one LinkedIn request per lead (~1s each with pacing), so it is a
separate opt-in tool rather than part of Results go to the Resumable and idempotent: with |
| check_session_statusA | Check whether the browser profile has a live Sales Navigator session. Launches (or reuses) the browser and verifies it lands on a signed-in
/sales page. Use this first when searches fail — it tells you if you
need to run Returns: Dict with logged_in (bool), plus the profile directory and headless setting for this server. |
| next_outreach_batchA | Leads eligible for a first message, best channel first. Read-only. Excludes anyone already sent to in ANY campaign — dedupe is on the stable member_id, so a person found by three searches is messaged once — and anyone already handled in this campaign. With open_profile_only (the default) only leads confirmed Open Profile by enrich_leads come back: those are free to message. Run enrich_leads first or this returns nothing. |
| send_messageA | Send ONE Sales Navigator message. Writes to LinkedIn. This is the only tool here that is not read-only, and it is guarded accordingly:
|
| outreach_statusB | Counts by status and channel, plus remaining daily cap. |
| reconcile_outreachA | Settle sends stuck in A Sends nothing. Until reconciled, an ambiguous lead is treated as already-contacted, so the uncertainty can never produce a duplicate — it can only delay a legitimate follow-up. |
| check_repliesA | Read the Sales Navigator inbox and mark leads who replied. Sends nothing. Reads structured message threads — a reply is a message whose author is the lead rather than you, matched to leads by the stable member_id, so nothing depends on parsing rendered text or guessing who spoke last. Only leads this server recorded a send for are considered; a
conversation with someone you messaged by hand elsewhere is left alone.
A lead marked |
| run_outreach_batchA | Draft and send for several leads in one call, unattended. Uses MCP sampling: the server asks YOUR client for each draft, so no model runs here and no API key lives here — only the request for a completion. That is what lets a scheduled job run the loop without a person taking a turn. Nothing is relaxed for automation. Every draft goes through the same
send path as a manual one: the evidence gate, global dedupe, the daily
cap, the free-channel-only default, and two-phase commit. Stops early when the daily cap is reached. A draft that fails to parse or fails validation is recorded and skipped rather than ending the run. |
| fetch_lead_profilesA | Fetch full profiles for a query's leads — depth 3, drafting material. Same endpoint as Deliberately separate from Requires Resumable: leads with a successful fetch are skipped, so calling repeatedly walks the query. |
| get_lead_profileA | Read one stored full profile — the payload you draft a message from. Reads from the local store only; it does not call LinkedIn. Run
|
| pipeline_statusA | One funnel view of a query: scraped → enriched → open → profiled → sent. State otherwise lives across four tables; this joins it so "where is everything?" is one call instead of mental arithmetic. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| sales_nav_compose_message | Draft a personalized Sales Navigator message for one lead, using your own offer file. Refuses to render if OFFER_FILE is not set. |
| sales_nav_search_workflow | Playbook for a prospecting run with this server: verify the session, run a Sales Navigator search URL, then sample or export the saved records. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| saved_queries | Every saved Sales Navigator search and its progress (url_hash, url, scraper_type, status, last_page, total_available, records_count). Attach this to see what is already in the local store before deciding to search again. |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nick-choudhary/linkedin-sales-nav-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server