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.
https://api.nvoke.run/mcpTwo 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.
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.
claude mcp add --transport http nvoke https://api.nvoke.run/mcpClaude.ai and Claude Desktop
Settings, Connectors, Add custom connector. Paste the URL. Claude handles the sign-in.
https://api.nvoke.run/mcpCursor 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.
{
"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 onlyWho 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_searchStarts 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 onlyWaits 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 onlyOne search with status and counters.
(searchId)
list_searchesread onlyYour searches, newest first.
get_leadsread onlyCompanies 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 onlyThe search as CSV text, one row per email. Same filters as get_leads.
(searchId, verification?, kind?, q?)
cancel_searchStops a running search. What it found so far stays.
(searchId)
delete_searchdestructiveDeletes a search with its companies and emails. Cannot be undone.
(searchId)
list_webhooksread onlyYour webhooks: the URL, events, scope and how the last deliveries went.
create_webhookPushes 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_webhookSends a signed ping to the webhook now and returns how the server answered.
(webhookId)
delete_webhookdestructiveStops 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.