MCP

Use FindLeadEmails in Cursor, Claude and other AI agents

Quick start

Connect the server, sign in, and ask for a work email. A free account includes 50 welcome credits when you confirm your email. Listing tools does not spend credits.

Connect

Server URL https://www.findleademails.com/api/mcp. These buttons sign you in with OAuth. You do not paste an API key.

Connect CursorConnect VS Code
  • Claude and ChatGPT. The button copies the URL. In Settings → Connectors, add a custom connector, paste it, and choose Sign in.
  • Cursor and VS Code. The button opens the install link. Approve it, then sign in when the app asks.

Create a free account50 welcome credits when you confirm your email.

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, and it spends the same wallet. Listing tools does not need a credential. Running a tool does. Sign in with OAuth, or paste the key from the Developers page into the Authorization header as Bearer YOUR_API_KEY. 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.

Directories: official MCP registry, Glama, cursor.directory, and GitHub.

Sign in with OAuth

Claude, ChatGPT, Codex, VS Code, Cursor, Windsurf, and other clients that speak MCP authorization can connect without a pasted key. The server publishes protected-resource metadata at /.well-known/oauth-protected-resource and authorization server metadata at /.well-known/oauth-authorization-server. A tool call with no credential returns HTTP 401 with a WWW-Authenticate header so the client starts sign-in.

You sign in with your existing FindLeadEmails account, pick the workspace, and approve. The app then calls tools with a short-lived access token for that workspace. Credits are spent the same way as an API key. Revoke the app any time on the Developers page. API keys keep working on the same URL, and listing tools still does not need a credential.

Get an API key

Sign in and open Developers. Create a key, copy it when it is shown, and paste it as the header Authorization: Bearer YOUR_API_KEY on every tool call. Only a hash is stored, so a lost key cannot be displayed again — rotate it on that page to get a new value. Clients that support OAuth can skip this step.

Claude

Open Settings, then Connectors, then Add custom connector. Paste https://www.findleademails.com/api/mcp. Choose Sign in when needed, and keep Use Claude's published identity.

Cursor

Sign in with OAuth by installing the server URL with no Authorization header. Cursor starts sign-in on the first tool call.

Add to Cursor

That button is Cursor's install deeplink (cursor://anysphere.cursor-deeplink/mcp/install). name is findleademails, and config is the base64 of {"url":"https://www.findleademails.com/api/mcp"}. Cursor asks before it installs. The same entry written by hand:

{
  "mcpServers": {
    "findleademails": {
      "url": "https://www.findleademails.com/api/mcp"
    }
  }
}

Project config goes in .cursor/mcp.json. A file at ~/.cursor/mcp.json applies to every project. To use an API key instead, add headers and paste the key into Authorization, replacing YOUR_API_KEY.

{
  "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.

Claude Desktop

Sign in with OAuth by adding the remote URL and no API key. When the app offers Connectors, use the same steps as Claude: Settings, Connectors, Add custom connector, paste https://www.findleademails.com/api/mcp, choose Sign in when needed, and keep Use Claude's published identity. A config file can hold the URL on its own:

{
  "mcpServers": {
    "findleademails": {
      "url": "https://www.findleademails.com/api/mcp"
    }
  }
}

If that build only runs a local command, bridge with mcp-remote via npx (Node.js 18 or newer) and paste an API key. 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. Paste the API key there as Bearer YOUR_API_KEY so the bridge sends it as the Authorization header.

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

Add the server without a key, then open /mcp and choose Authenticate.

claude mcp add --transport http findleademails https://www.findleademails.com/api/mcp

--transport http is the remote HTTP transport. To send an API key instead, add --header and replace YOUR_API_KEY:

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

VS Code

Sign in with OAuth. The install link uses https://vscode.dev/redirect/mcp/install with name=findleademails and a urlencoded config of {"type":"http","url":"https://www.findleademails.com/api/mcp"}. Omitting headers is what starts sign-in.

Add to VS Code

The same entry in .vscode/mcp.json:

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

To use an API key, keep the top-level servers object and type "http". When VS Code prompts, paste the API key. It is sent as the Authorization header.

{
  "inputs": [
    {
      "type": "promptString",
      "id": "findleademails-api-key",
      "description": "Paste your FindLeadEmails API key. It is sent as Authorization: Bearer YOUR_API_KEY.",
      "password": true
    }
  ],
  "servers": {
    "findleademails": {
      "type": "http",
      "url": "https://www.findleademails.com/api/mcp",
      "headers": {
        "Authorization": "Bearer ${input:findleademails-api-key}"
      }
    }
  }
}

A portable .mcp.json at the workspace root uses mcpServers instead of servers and does not prompt with ${input:…}. In that file, paste the key directly into headers.Authorization as Bearer YOUR_API_KEY.

Windsurf

Sign in with OAuth by setting serverUrl and leaving out headers. Cascade reads mcp_config.json. On macOS and Linux that file is ~/.config/devin/mcp_config.json (or $XDG_CONFIG_HOME/devin/mcp_config.json). On Windows it is %APPDATA%\devin\mcp_config.json. Open it from the Cascade panel's actions menu.

{
  "mcpServers": {
    "findleademails": {
      "serverUrl": "https://www.findleademails.com/api/mcp"
    }
  }
}

To use an API key, add headers and paste the key into Authorization.

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

To keep the key out of the file, replace the header value with Bearer ${env:FINDLEADEMAILS_API_KEY}. Devin Local, the default agent in new tabs, stores MCP servers in the Devin CLI config instead of this file.

ChatGPT and Codex

In ChatGPT, open Settings, then Connectors, and add a custom connector. Paste https://www.findleademails.com/api/mcp and sign in when ChatGPT asks. Pick the workspace whose credits the connector should spend.

In Codex, add the same URL and authenticate. The CLI command does not include an API key:

codex mcp add findleademails --url https://www.findleademails.com/api/mcp

An API key still works if the client asks for a bearer token. Send Authorization: Bearer YOUR_API_KEY.

Gemini CLI

Install the extension from github.com/findleademails/findleademails-mcp. It points Gemini CLI at this server. Sign in when the client asks, or set the API key the extension requests.

gemini extensions install https://github.com/findleademails/findleademails-mcp

Cline

Add a remote server with type streamableHttp and no API key so Cline can sign in with OAuth. Paste an Authorization header only if you want to use a key.

{
  "mcpServers": {
    "findleademails": {
      "url": "https://www.findleademails.com/api/mcp",
      "type": "streamableHttp"
    }
  }
}

Perplexity

On a Pro, Max, or Enterprise account, open Connectors, add a custom remote connector, and choose the API key option rather than OAuth. The server URL is below. Paste the API key so the connector sends it as a request header. If the form asks for the header name, use Authorization with the value Bearer YOUR_API_KEY.

URL: https://www.findleademails.com/api/mcp
Header: Authorization: Bearer YOUR_API_KEY

Grok

On grok.com, open Connectors, choose New Connector, then Custom, and enter the server URL. When Grok asks for authentication, paste the API key so requests carry Authorization: Bearer YOUR_API_KEY. Business and Enterprise workspaces need an admin to provision custom connectors first.

The xAI API sends the authorization field as the header Authorization: Bearer <token>. Paste the API key itself into authorization, without the word Bearer.

{
  "type": "mcp",
  "server_url": "https://www.findleademails.com/api/mcp",
  "server_label": "findleademails",
  "authorization": "YOUR_API_KEY"
}

The Grok CLI takes the header directly. Paste the API key into that header:

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

Other MCP clients

A client that takes a remote server as a URL plus headers uses this shape. Paste the API key into the Authorization header. If that client's own docs use different keys, follow those docs.

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

Directories

The server is listed in the official MCP registry, Glama, cursor.directory, and GitHub.

Try it

Listing tools does not need a key. 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 6 tools. No session header is required, and nothing is charged.

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

A tool call needs the key. Paste it as the Authorization header. Without that header the server answers HTTP 401 with {"error":"invalid_token","error_description":"No authorization provided. A free FindLeadEmails account includes free credits. Create one at https://www.findleademails.com/signup, then connect https://www.findleademails.com/api/mcp and sign in with OAuth. Or send Authorization: Bearer <your API key>."} and the tool does not run.

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":2,"method":"tools/call","params":{"name":"verify_email","arguments":{"email":"jane.doe@company.com"}}}'

Tools

Each tool takes the same fields as the matching REST route. verify_email wants one email. 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. 1 credit only when verified. Free outcomes still return at 0 credits. A billable result that cannot be paid for includes https://www.findleademails.com/pricing.Find the work email of Jane Doe at stripe.com
verify_emailCheck one email address you already have. 1 credit only when confirmed valid. Free outcomes still return at 0 credits. Buy credits at https://www.findleademails.com/pricing.Verify whether jane.doe@company.com is a real mailbox
find_emails_bulkFind and verify a batch in one call. Use create_job for a larger list. Stops when the wallet cannot pay for another verified row and skips the rest. https://www.findleademails.com/pricingFind work emails for these people, each with a first name, last name, and company domain
create_jobQueue a large list and return a job id. Reserves one credit per row up front and refuses the whole job if the wallet cannot cover it.Queue a job named Q4 outbound to find emails for this list of leads
get_job_statusRead progress and per-outcome counters for a job from create_job. Does not spend credits.What is the status of job JOB_ID?
get_job_resultsRead a page of a job's per-row results, including while it is still running. Does not spend credits.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. verify_email costs 1 credit only when that mailbox is confirmed valid. Invalid, catch-all, unknown, and a repeat check of the same address are free.

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, verify_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, verify_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_creditsA billable lookup cannot be paid for. required, available, credits_remaining, and upgrade_url are included. Free outcomes still return at 0 credits. find_emails_bulk skips the unpaid rows instead of failing the batch. create_job still refuses up front when it cannot reserve one credit per row.
invalid_inputfind_email rejected the name or company domain, or verify_email rejected the address.
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.
verification_unavailableverify_email could not run because mailbox verification is temporarily unavailable.
not_foundget_job_status or get_job_results was called with a job id this workspace does not have.
internal_errorThe tool failed unexpectedly.

Listing tools does not require a credential. Before a tool runs, a missing or rejected credential is HTTP 401. The JSON body tells an API-key client what header to send, and WWW-Authenticate includes resource_metadata so an OAuth client can sign in. After a valid credential, 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. Clients that support OAuth (Claude, ChatGPT, VS Code, and others) can sign in instead of using a key. Connected apps are listed on that same page and can be revoked.
What does HTTP 401 mean?
A tool call had no usable API key or OAuth access token. The server answers with HTTP 401 and {"error":"invalid_token","error_description":"No authorization provided. A free FindLeadEmails account includes free credits. Create one at https://www.findleademails.com/signup, then connect https://www.findleademails.com/api/mcp and sign in with OAuth. Or send Authorization: Bearer <your API key>."} before the tool runs, so nothing is charged. When no credential was sent, WWW-Authenticate includes resource_metadata and scope and omits error="invalid_token", which is how an OAuth client starts sign-in. A rejected credential still uses error="invalid_token". Listing tools does not need a credential and does not return this error. If Developers says API key authentication is turned off, a key is refused until that is enabled. OAuth sign-in is separate from that switch.
What does a lookup cost from an agent?
A verified mailbox costs 1 credit. Catch-alls, misses, cached repeats, and a predicted result that verification could not decide are free, and those free outcomes still return when the wallet is empty. A billable lookup fails at 0 credits with upgrade_url https://www.findleademails.com/pricing. verify_email costs 1 credit only when that exact mailbox is confirmed valid. find_emails_bulk returns the rows it could finish and skips the rest. create_job still reserves one credit per row up front.
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. tools/list works without a key. A POST that does not send Accept: application/json, text/event-stream is refused with HTTP 406. A tool call still needs Authorization: Bearer YOUR_API_KEY.