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.
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.
| Tool | What it does | Example prompt |
|---|---|---|
| find_email | Find and verify one person's work email at a company. | Find the work email of Jane Doe at stripe.com |
| find_emails_bulk | Find 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_job | Queue 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_status | Check progress and per-outcome counters for a job from create_job. | What is the status of job JOB_ID? |
| get_job_results | Page 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", ... }.
| code | When |
|---|---|
| rate_limited | find_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_credits | The wallet cannot cover the reservation. required and available are included. |
| invalid_input | find_email rejected the name or company domain. |
| linkedin_resolution_unavailable | A LinkedIn company page was sent and the resolver could not be reached. |
| batch_too_large | find_emails_bulk was over the synchronous cap. max_rows and received are included. Use create_job for a larger list. |
| too_many_queued_jobs | create_job was called while this workspace already has its maximum number of jobs waiting (10 by default). limit is included. |
| jobs_unavailable | Async jobs are not configured for this workspace. |
| not_found | get_job_status or get_job_results was called with a job id this workspace does not have. |
| internal_error | The 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.