MCP

Use FindLeadEmails in Cursor, Claude and other AI agents

We run a remote MCP server named findleademails at https://www.findleademails.com/api/mcp. It speaks Streamable HTTP. An agent calls the same finder and jobs as the REST API, with the same API key and the same wallet. Paste YOUR_API_KEY from the Developers page into the snippet for your client. Do not commit the key.

Use the www host. https://findleademails.com redirects there, and some clients drop the Authorization header when they follow that redirect.

Get an API key

Sign in and open Developers. Create a key, copy it when it is shown, and send it on every request as Authorization: Bearer YOUR_API_KEY. Only a hash is stored, so a lost key cannot be displayed again — rotate it on that page to get a new value.

Cursor

Project config goes in .cursor/mcp.json. A file at ~/.cursor/mcp.json applies to every project. Cursor's remote-server entry is a url plus headers.

{
  "mcpServers": {
    "findleademails": {
      "url": "https://www.findleademails.com/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

To keep the key out of the file, Cursor will substitute ${env:FINDLEADEMAILS_API_KEY} inside headers. The copy-paste block above uses the placeholder so you can see the header shape.

Add to Cursor

That button is Cursor's install link: the server name is the name parameter, and config is the base64 of the same url and headers object. Cursor asks before it installs. The installed entry still contains YOUR_API_KEY — replace it with the key from Developers.

Claude Desktop

claude_desktop_config.json runs a local command. A remote Streamable HTTP server needs the mcp-remote bridge via npx (Node.js 18 or newer). The header is passed without a space after the colon because some clients split arguments on spaces; the bearer value, which contains a space, lives in env.

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json. Windows: %APPDATA%\Claude\claude_desktop_config.json. If the file is missing, enable it under Settings → Developer. Quit and reopen Claude Desktop after saving.

{
  "mcpServers": {
    "findleademails": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://www.findleademails.com/api/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Claude Code

From a shell, with the Claude Code CLI installed:

claude mcp add --transport http findleademails https://www.findleademails.com/api/mcp --header "Authorization: Bearer YOUR_API_KEY"

--transport http is the remote HTTP transport, and --header sets the bearer key. Replace YOUR_API_KEY before you run it.

VS Code

Workspace config is .vscode/mcp.json. VS Code's file uses a top-level servers object and requires type "http" for a remote server.

{
  "servers": {
    "findleademails": {
      "type": "http",
      "url": "https://www.findleademails.com/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

VS Code's docs prefer an input variable over a key written into the file. The block above uses YOUR_API_KEY so the header is obvious; swap in their input form if you will commit the file.

Other MCP clients

A client that takes a remote server as a URL plus headers uses this shape. If that client's own docs use different keys, follow those docs. We have checked this file against Cursor; we have not checked a separate config format for every other product.

{
  "mcpServers": {
    "findleademails": {
      "url": "https://www.findleademails.com/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Test the key

This calls the tools/list method. The handler requires both Accept values on a POST. A success comes back as a server-sent event: message whose data line is the JSON-RPC result listing the five tools. No session header is required.

curl https://www.findleademails.com/api/mcp \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'

A missing or rejected key stops first, with HTTP 401 and {"error":"invalid_token","error_description":"No authorization provided"}. Nothing is listed and nothing is charged.

Tools

Each tool takes the same fields as the matching REST route. A single lookup wants first_name, last_name, and company_domain. A LinkedIn company page URL can stand in for the domain; resolving it costs 1 credit only when it finds a match, separate from the lookup.

ToolWhat it doesExample prompt
find_emailFind and verify one person's work email at a company.Find the work email of Jane Doe at stripe.com
find_emails_bulkFind and verify a batch of people in one call. Use create_job for a larger list.Find work emails for these people, each with a first name, last name, and company domain
create_jobQueue a large list for background processing and return a job id.Queue a job named Q4 outbound to find emails for this list of leads
get_job_statusCheck progress and per-outcome counters for a job from create_job.What is the status of job JOB_ID?
get_job_resultsPage through a job's per-row results, including while it is still running.Show the results for job JOB_ID

find_emails_bulk is synchronous and capped. Above that cap it returns batch_too_large with max_rows. get_job_results pages with cursor until next_cursor is null, and it can be read while the job is still running.

Credits

Billing is the same wallet as the dashboard and the REST API. A verified result costs 1 credit. A catch-all is free — the domain accepts every address, so no specific mailbox can be confirmed. A miss (not_found) is free, and so is a repeat lookup of someone already found. A predicted result is free when verification ran but could not reach a verdict.

create_job reserves one credit per row up front and refunds the unused portion as rows resolve. Credits never expire.

Rate limits and errors

find_email, find_emails_bulk, and create_job use the same per-workspace ceilings as the synchronous REST endpoints. The numbers are on Rate limits. Reading a job's status or results is not rate limited.

A failed tool call is not an HTTP error from the agent's point of view. The tool result is flagged as an error and its text is JSON { "error", "code", ... }.

codeWhen
rate_limitedfind_email, find_emails_bulk, or create_job exceeded this workspace's per-second or per-day ceiling. retry_after_seconds says how long to wait.
insufficient_creditsThe wallet cannot cover the reservation. required and available are included.
invalid_inputfind_email rejected the name or company domain.
linkedin_resolution_unavailableA LinkedIn company page was sent and the resolver could not be reached.
batch_too_largefind_emails_bulk was over the synchronous cap. max_rows and received are included. Use create_job for a larger list.
too_many_queued_jobscreate_job was called while this workspace already has its maximum number of jobs waiting (10 by default). limit is included.
jobs_unavailableAsync jobs are not configured for this workspace.
not_foundget_job_status or get_job_results was called with a job id this workspace does not have.
internal_errorThe tool failed unexpectedly.

Before a tool runs, a missing or rejected key is HTTP 401. After a valid key, a POST without Accept: application/json, text/event-stream is HTTP 406.

Troubleshooting

Where is an API key created?
On the Developers page in the dashboard, after you sign in. The key is shown once. Send it as Authorization: Bearer YOUR_API_KEY. A lost key is replaced by rotating it there.
What does HTTP 401 mean?
The bearer key was missing, wrong, or revoked. The server answers with HTTP 401 and {"error":"invalid_token","error_description":"No authorization provided"} before any tool runs, so nothing is charged. If Developers says API key authentication is turned off, a key is refused until that is enabled.
What does a lookup cost from an agent?
The same as the REST API. A verified mailbox costs 1 credit. Catch-alls, misses, and repeat lookups of someone already found are free. A predicted result is free when verification ran but could not reach a verdict.
The client connects but tools/list fails or returns nothing useful?
Use https://www.findleademails.com/api/mcp. The apex host redirects there, and some clients drop the Authorization header when they follow that redirect. After a valid key, a POST that does not send Accept: application/json, text/event-stream is refused with HTTP 406.