Docs / MCP server

MCP server

Give your agent nvoke as tools. One URL, no install. It finds companies, waits for the checks and hands back the addresses that work.

URLhttps://api.nvoke.run/mcp
TransportStreamable HTTP, stateless
AuthAPI key header, or OAuth through nvoke sign-in

Two ways in

API key. Send Authorization: Bearer nvk_sk_... as a header. Get the key in the desktop app under Account, or let the agent sign up on its own.

OAuth. Clients that speak MCP OAuth need only the URL. The first call answers 401 and points the client at nvoke’s sign-in. The browser opens, you sign in or sign up, approve, done. No key to paste.

Claude Code

With a key. Keep it on one line: a line break in the middle drops the header on Windows.

shell
claude mcp add --transport http nvoke https://api.nvoke.run/mcp --header "Authorization: Bearer nvk_sk_..."

Or with OAuth. Then run /mcp in Claude Code and pick nvoke to sign in.

shell
claude mcp add --transport http nvoke https://api.nvoke.run/mcp

Claude.ai and Claude Desktop

Settings, Connectors, Add custom connector. Paste the URL. Claude handles the sign-in.

url
https://api.nvoke.run/mcp

Cursor and others

In ~/.cursor/mcp.json, or the same shape in any client that takes a URL and headers. Leave out headers to sign in with OAuth instead.

mcp.json
{
  "mcpServers": {
    "nvoke": {
      "url": "https://api.nvoke.run/mcp",
      "headers": {
        "Authorization": "Bearer nvk_sk_..."
      }
    }
  }
}

Tools

Each tool runs the matching REST route as you, so quotas, errors and shapes are the same. Errors come back as tool errors with the API’s { "error": "code" } body.

get_accountread only

Who you are signed in as, the plan, verified emails used this month and the allowance, and the billing link a human uses to upgrade. Call this first.

start_search

Starts finding companies and their verified emails. kind local: a trade in a place, from OpenStreetMap (needs niche and location). kind web: a keyword, optionally in a country, from web search (needs keyword). kind launches: products launched recently on Product Hunt and Show HN (keyword optional). Returns the search at once; it runs for a few minutes on our servers. Then call wait_for_search.

(kind, niche?, location?, keyword?, country?, days?, limit?)

wait_for_searchread only

Waits until the search finishes or the timeout passes, then returns it. Call again while status is queued or running. Counters grow as it runs.

(searchId, timeoutSeconds?)

get_searchread only

One search with status and counters.

(searchId)

list_searchesread only

Your searches, newest first.

get_leadsread only

Companies a search found with their checked emails, 50 to a page. Use verification valid for addresses that accept mail. Pass nextCursor back as cursor for more.

(searchId, verification?, kind?, q?, cursor?, limit?)

export_csvread only

The search as CSV text, one row per email. Same filters as get_leads.

(searchId, verification?, kind?, q?)

cancel_search

Stops a running search. What it found so far stays.

(searchId)

delete_searchdestructive

Deletes a search with its companies and emails. Cannot be undone.

(searchId)

list_webhooksread only

Your webhooks: the URL, events, scope and how the last deliveries went.

create_webhook

Pushes leads to a URL as they are ready instead of polling: lead.ready per company with a valid address, search.finished when a search ends. Scope drops or a dropId limits it to daily drops. Returns the signing secret once; give it to whoever verifies the requests.

(url, events?, scope?, dropId?)

test_webhook

Sends a signed ping to the webhook now and returns how the server answered.

(webhookId)

delete_webhookdestructive

Stops the webhook at once and drops its pending deliveries.

(webhookId)

The loop

get_account, then start_search, then wait_for_search until the status is done (it waits up to 50 seconds per call), then get_leads with verification: "valid" or export_csv. The server sends the same instructions to the client when it connects.