Skip to main content
Glama
anttka4cz

Cold Leads MCP server

by anttka4cz

Cold Leads MCP server

Model Context Protocol server for Cold Leads, the B2B outreach CRM. It exposes the hosted workspace tools to local MCP clients (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code): contacts, imports, synced conversations, templates, campaigns, website capture, lead search, and verification. Without an API key, it can also ask the human owner to approve a subscription.

npx -y @coldleads/mcp-server

Try it without a key

The hosted demo server has the same tools over a sample workspace (fictional contacts on .example domains). It never sends e-mail and uses no credits:

claude mcp add --transport http coldleads-demo https://coldleads.app/api/mcp/demo

Then ask: "Verify these three contacts and prepare outreach drafts. Don't send anything until I approve. Jana Dvořák jana.dvorak@ridgeline.example, info@harborlane.example, Piotr Kowalski piotr@quillmetrics.example". Any client that supports remote (Streamable HTTP) MCP servers can use the same URL. A complete agent built on it: cold-leads-ai-sales-agent.

Demo limits:

Limit

Value

Session

24 hours from its start (not extended), visible only to that session

Contacts

10, including the 4 sample contacts

Templates

1 of your own (besides the sample template; update it with template_id)

Campaign drafts

1

Text length

notes 100 characters, template body 500, message 200

Requests

120 per minute and 20 new sessions per hour per IP address

Verification

sample results for the three demo prospects; other addresses get syntax, disposable-domain and role checks only (no MX or mailbox check)

Sending

never: send_contact_message and launch_campaign still require approval, then return demo_not_sent

Related MCP server: Email Verifier MCP Server

Tools

Tool

What it does

Cost

verify_email

Verification of one address: syntax, disposable domain, role account and MX records, plus an SMTP mailbox and catch-all check when Cold Leads can open an SMTP connection to the recipient's mail server (otherwise reasons contains smtp_unreachable and catch_all is null). Returns valid, risky or invalid. Usually answers within a few seconds (the client gives up after 8 s).

1 credit

search_leads

Contacts already in your Cold Leads CRM for a company domain, with an optional role keyword: e-mail, name, company, stage, tags, verification status and a do_not_contact flag. Cold Leads has no third-party lead database.

free

list_contacts, import_contacts, update_contact

List, import up to 100 parsed contact rows per call, and update contacts in your own workspace. Imports deduplicate, skip global DNC entries and do not send e-mail. CSV/XLSX parsing is done by the assistant.

free

get_conversation, send_contact_message

Read mailbox-synced contact conversations or send one e-mail after explicit approval of recipient and content. Opt-outs, bounces and DNC are blocked.

sender/provider limits

list_templates, save_template

Review, create and update workspace templates; content screening applies.

free

list_campaigns, create_campaign_draft, launch_campaign

Inspect campaigns, prepare drafts and audience estimates, and launch only after human review and explicit confirmation.

plan and recipient limits

get_lead_context, get_sales_next_actions, schedule_follow_up, get_agent_activity

Everything known about one lead (contactability, history, last reply class, next action); the queue of replies waiting for an answer and due follow-ups; set a contact's next action (never sends e-mail); the audit log of API and MCP calls.

free

get_workspace_info, setup_website_lead_capture

Read non-secret workspace/mailbox status or generate a public-only form key/snippet for your website. Website submissions are inquiry leads, not automatic cold-outreach consent.

free

provision_account_and_get_payment_link

For agents without a key: creates a pending account for the human owner and returns a Stripe payment link for the Business plan. The human decides and pays.

—

check_provisioning_status

After the owner paid: returns the API key exactly once (with the claim_token). The server starts using it immediately.

—

Responses are compact JSON in a text block. An illustrative result for an address whose mailbox could not be checked (example.com is reserved for documentation):

{"status":"success","email":"jane.doe@example.com","validity":"valid","catch_all":null,"score":75,"reasons":["smtp_unreachable"],"disposable":false,"role_account":false}

Errors come back as tool results with isError: true, for example {"status":"error","error":"rate_limited","message":"…","http_status":429,"retry_after_seconds":60}.

Requirements

  • A Cold Leads secret API key (sk_…) from Settings → API keys. The API is included in the Business plan (10,000 verification and API credits a month; extra packs available).

  • Node.js 20 or newer (CI tests 20 and 22).

  • No key yet? Start the server without one and let your agent call provision_account_and_get_payment_link — see Agent onboarding.

Setup

Claude Desktop

claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "coldleads": {
      "command": "npx",
      "args": ["-y", "@coldleads/mcp-server"],
      "env": { "COLDLEADS_API_KEY": "sk_your_secret_key" }
    }
  }
}

Cursor / Windsurf

~/.cursor/mcp.json (Cursor) or ~/.codeium/windsurf/mcp_config.json (Windsurf) — the same mcpServers block as above.

Claude Code

claude mcp add coldleads --env COLDLEADS_API_KEY=sk_your_secret_key -- npx -y @coldleads/mcp-server

VS Code

.vscode/mcp.json:

{
  "servers": {
    "coldleads": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@coldleads/mcp-server"],
      "env": { "COLDLEADS_API_KEY": "sk_your_secret_key" }
    }
  }
}

Hosted endpoint (no install)

Clients that support remote servers can connect directly with a secret key:

{
  "mcpServers": {
    "coldleads": {
      "url": "https://coldleads.app/api/mcp",
      "headers": { "Authorization": "Bearer sk_your_secret_key" }
    }
  }
}

The stdio server discovers workspace tools from https://coldleads.app/api/mcp and forwards their calls to the hosted MCP service, so the hosted and local tools use the same account, policy and sending safeguards. It also includes keyless onboarding tools. ChatGPT connects to the hosted endpoint with OAuth 2.1; enable Developer mode in ChatGPT, add the endpoint, sign in to Cold Leads and review the requested access. Other remote MCP clients can use the API-key header shown above.

Docker

docker build -t coldleads-mcp-server .
docker run -i --rm -e COLDLEADS_API_KEY=sk_your_secret_key coldleads-mcp-server

Configuration

Variable

Default

Purpose

COLDLEADS_API_KEY

—

Secret API key (sk_…). Optional at start-up: without it the server still starts, lists tools and can run agent onboarding.

COLDLEADS_API_BASE

https://coldleads.app

API base URL (for local development against a Cold Leads dev server).

Agent onboarding without a key

  1. The agent calls provision_account_and_get_payment_link with the owner's e-mail.

  2. It shows the returned checkout_url to the human. The human reviews the plan and price on the secure Stripe page and decides whether to pay. The API gives the agent no way to pay, and the agent is told never to open or pay the link.

  3. The agent polls check_provisioning_status with session_id and claim_token every 15–30 seconds.

  4. After payment the first call returns api_key once; this server switches to it immediately. Store it as COLDLEADS_API_KEY for the next start.

  5. The owner receives an e-mail to open the Cold Leads web app, where they can manage the subscription or rotate the key.

Only a request that carries the claim_token can collect the key; a status lookup without it never returns the key.

Responsible use

  • A verified address is not consent. You need a lawful basis to contact each person.

  • Never e-mail leads with do_not_contact: true (opted out, bounced or on the do-not-contact list).

  • Limits: 120 requests per minute per key; each verification costs 1 credit.

Development

npm ci
npm run build
npm test                      # schema, server and stdio child-process tests
COLDLEADS_API_KEY_FILE=path/to/key COLDLEADS_API_BASE=http://localhost:3000 node scripts/smoke.mjs   # live checks

License

MIT © 2026 Anton Tkachenko

Available Tools

4 tools
check_provisioning_statusCheck the owner's payment and get the API keyAInspect

Checks an account created with provision_account_and_get_payment_link. Returns status pending_payment, active, expired or suspended. When active, the first call with the claim_token returns api_key exactly once: store it securely as COLDLEADS_API_KEY and send it as Authorization: Bearer . Poll every 15–30 seconds while pending_payment.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYessession_id returned by provision_account_and_get_payment_link.
claim_tokenYesclaim_token returned by provision_account_and_get_payment_link.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the annotations: the api_key is returned exactly once on the first call with claim_token, must be stored securely, and is used as a Bearer token. This one-time-secret semantics is critical and is consistent with idempotentHint=false, which the description effectively explains.

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?

Four tight sentences with zero filler: purpose and status values first, then the critical one-time key behavior, then polling cadence. Front-loaded and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by enumerating all status values and describing what an active status returns. Auth usage and secret handling are covered, so an agent has everything needed to call and act on the result.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: claim_token is single-use and its first consumption yields the api_key. session_id semantics are left to the schema, which already documents it as coming from the provisioning tool.

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?

States a specific verb ('Checks') plus the resource ('an account created with provision_account_and_get_payment_link') and enumerates the possible return states (pending_payment, active, expired, suspended). It ties itself directly to the sibling tool that creates the resource, so it is distinguishable from verify_email, search_leads, and the provisioning tool without opening any schema.

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?

Gives concrete operational guidance: poll every 15-30 seconds while pending_payment, and make the claim call once active. It does not explicitly state when to use this versus any alternative or what to do on 'expired'/'suspended', so it falls just short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_leadsSearch leads by company domainA
Read-onlyIdempotent
Inspect

Search the leads already in your Cold Leads CRM for a target company domain: contact e-mail, name, company, phone, stage, tags, verification status and a do_not_contact flag. Covers only contacts in your own workspace (Cold Leads has no third-party lead database). Free, uses no credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoOptional keyword such as sales, ceo or marketing, matched against the contact's name, e-mail local part, tags, notes and type.
limitNoMaximum number of leads to return (1–50, default 10).
domainYesCompany domain, e.g. example.com. A URL or an e-mail address is reduced to its domain.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuine non-annotation context: the workspace-only data scope and the fact that it consumes no credits. It stops short of describing result formatting or truncation behavior when limit is hit.

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?

Two tight sentences with the action and data scope front-loaded, followed by the cost/scope caveat. The field enumeration doubles as a return-value summary, so nothing is wasted.

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?

With no output schema, the description usefully lists the returned fields, and it covers the workspace scope and cost model. Minor gaps remain around result ordering and behavior when the limit truncates a large domain's lead set.

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 domain, role and limit are all fully documented in the schema, including domain normalization and the 1–50 limit range. The description adds no parameter-level detail beyond that, which is the expected baseline 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?

States a specific verb + resource + scope: 'Search the leads already in your Cold Leads CRM for a target company domain,' and enumerates the returned fields. It is clearly distinguishable from the sibling tools (verify_email, provision_account_and_get_payment_link), which are about verification and provisioning rather than retrieval.

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?

Explicitly bounds usage: 'Covers only contacts in your own workspace (Cold Leads has no third-party lead database)' and notes it is free. This tells the agent when NOT to expect results, but it never names an alternative tool or a condition under which a sibling should be used instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_emailVerify an e-mail addressA
Read-onlyIdempotent
Inspect

Verifies an e-mail address: syntax, disposable domain, role account and MX records, plus an SMTP mailbox and catch-all check when Cold Leads can open an SMTP connection to the recipient's mail server (otherwise reasons contains smtp_unreachable and catch_all is null). Returns validity (valid, risky or invalid), a score and reason codes. Usually answers within a few seconds; costs 1 credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesThe e-mail address to verify, e.g. anna@example.com.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond that: the conditional SMTP/catch-all logic, the smtp_unreachable reason and null catch_all fallback, the tri-state validity output, the score, the typical latency, and the 1-credit cost. This is exactly the kind of context annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the checks performed and the return shape, packed into three dense but purposeful sentences. The parenthetical on SMTP fallback is slightly heavy but earns its place by explaining the null catch_all case.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description appropriately explains the return values (validity, score, reason codes) and the fallback behavior. Cost and latency expectations are also disclosed. An agent has everything needed to decide whether and how to call this tool.

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?

Schema coverage is 100%, so the single parameter is already documented, and the 0-params baseline logic does not strictly apply. The description does not add syntax/format detail beyond the schema, but it enriches understanding by implying what gets evaluated against that input. Baseline 3-4 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 names the specific action (verifies an e-mail address) and enumerates exactly what is checked (syntax, disposable domain, role account, MX records, SMTP mailbox, catch-all). This is a precise verb+resource statement that clearly distinguishes it from the lead-search and provisioning siblings.

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?

Usage context is implied: you call this to validate an address before relying on it. However, the description offers no explicit when-to-use vs alternatives guidance and does not explain how this relates to the sibling tools (e.g. whether to verify before provisioning). Adequate but with a clear gap.

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. 2 tool updatesv1.0.2
    • Changedsearch_leads1 field changed
      • changedInput schema / properties / domain / description
        Previous value: -"Company domain, e.g. acme.com. A URL or an e-mail address is reduced to its domain."New value: +"Company domain, e.g. example.com. A URL or an e-mail address is reduced to its domain."
    • Changedverify_email1 field changed
      • changedInput schema / properties / email / description
        Previous value: -"The e-mail address to verify, e.g. anna@acme.com."New value: +"The e-mail address to verify, e.g. anna@example.com."
  2. 4 tool updatesv1.0.0
    • First observedcheck_provisioning_status
    • First observedprovision_account_and_get_payment_link
    • First observedsearch_leads
    • First observedverify_email

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct action: search_leads reads the local CRM, verify_email validates an address, and the two provisioning tools handle account creation versus status/API-key retrieval. The onboarding pair shares a domain but their descriptions clearly separate their roles, so an agent can pick correctly.

Naming Consistency4/5

Names are consistently snake_case and predominantly verb_noun (search_leads, verify_email, check_provisioning_status). Only provision_account_and_get_payment_link is an unusually long compound, a minor deviation but still verb-led and readable.

Tool Count4/5

Four tools is lean but each earns its place: one read, one verification, and a two-step account onboarding flow. Slightly thin for a CRM-style server but well-scoped rather than padded.

Completeness3/5

The domain spans leads, verification, and onboarding, but the lead surface only offers search — there is no create/update/delete or tag/stage management, so agents cannot populate or mutate the CRM. Core read+verify workflows work, but lifecycle coverage for leads has notable gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to verify email addresses through a multi-signal probabilistic pipeline, returning confidence scores and honest statuses (safe/risky/invalid/unknown) with evidence.
    Apache 2.0
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to verify email addresses in real-time, checking syntax, DNS, MX records, and SMTP handshake, returning verdicts and deliverability scores without sending actual emails.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to verify email addresses and receive a 'send', 'hold', or 'kill' verdict with the reason, while also managing signup and credits programmatically.
    5
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to verify email deliverability and check mailbox existence, manage bulk verification batches, and monitor verification credit balances directly from chat.
    6
    1
    MIT