A phone verification MCP server for your AI agent
Connect it once and your agent can ask whether a number is a live mobile, who carries it, and whether it belongs to a known TCPA litigator, then act on the answer. Works in Claude Code, Cursor, Claude Desktop, VS Code and Windsurf with nothing but your API key.
What your agent gets
The endpoint is https://numberbroom.com/mcp, Streamable HTTP. It is a stateless proxy over the same REST API the developer docs describe, so auth, rate limits and billing are identical.
Takes one US number in any common format. Returns carrier-level line type (mobile, landline, VoIP, disconnected), carrier name, an activity score and whether the number is a known TCPA litigator, plus a keep or drop outcome the agent can act on. Does not check Do Not Call registries.
Remaining pre-paid balance on the connected account, with the number of lookups it covers. Lets an agent check before a run and stop cleanly instead of failing mid-list.
Three steps, one of them in your editor
Create an account and add credit
Sign up with email or Google, then top up between $10 and $5,000 from Settings. Credit is pre-paid, never expires, and is the only thing you are ever billed.
Generate a key for this client
In Settings, API access. Label it after the client, like "Cursor on laptop", and make a separate key for each one, so a leak is one revoke. It starts with nb_live_ and is shown once; only a hash is stored.
Add the server to your client
Pick your client below and paste the snippet with your key in place of nb_live_YOUR_KEY. Then ask your agent to verify a number.
Claude Code
One command. Claude Code speaks Streamable HTTP natively and passes the header on every request.
-
Run this in a terminal, with your key in place of the placeholder. Add
--scope userto make it available in every project rather than the current one.claude mcp add --transport http numberbroom https://numberbroom.com/mcp \ --header "Authorization: Bearer nb_live_YOUR_KEY" -
Or, for a repo the whole team shares, commit a
.mcp.jsonthat reads the key from an environment variable so it never lands in git:{ "mcpServers": { "numberbroom": { "type": "http", "url": "https://numberbroom.com/mcp", "headers": { "Authorization": "Bearer ${NUMBERBROOM_API_KEY}" } } } } Type
/mcpinside Claude Code to confirm numberbroom shows as connected, then ask: "Verify (902) 555-1234 and tell me whether it is safe to dial."
Cursor
Cursor reads MCP servers from a JSON file and supports a headers block on remote servers.
-
Create or open
~/.cursor/mcp.jsonfor every project, or.cursor/mcp.jsoninside one project, and add:{ "mcpServers": { "numberbroom": { "url": "https://numberbroom.com/mcp", "headers": { "Authorization": "Bearer nb_live_YOUR_KEY" } } } } In a project file that other people can see, write
"Bearer ${env:NUMBERBROOM_API_KEY}"instead and export the variable in your shell. Cursor resolves${env:NAME}insideheaders.Open Cursor's MCP settings, check that numberbroom is enabled with two tools listed, and ask the agent to verify a number.
Claude Desktop
The "Add custom connector" dialog only takes a URL and optional OAuth credentials; it has nowhere to put an API key. Claude Desktop does still run local stdio servers from its config file, so the open source mcp-remote bridge carries the header for you. Needs Node.js installed.
Open Settings, Developer, Edit Config. That opens
claude_desktop_config.json: on macOS it lives in~/Library/Application Support/Claude/, on Windows in%APPDATA%\Claude\.-
Add the server. The header value goes through an environment variable on purpose: Claude Desktop on Windows mangles a space inside an argument, and
Authorization:${AUTH_HEADER}with no space avoids it.{ "mcpServers": { "numberbroom": { "command": "npx", "args": [ "mcp-remote", "https://numberbroom.com/mcp", "--transport", "http-only", "--header", "Authorization:${AUTH_HEADER}" ], "env": { "AUTH_HEADER": "Bearer nb_live_YOUR_KEY" } } } } Quit and reopen Claude Desktop. The tools icon under the message box lists numberbroom once the bridge is up.
VS Code with GitHub Copilot
VS Code's MCP config supports HTTP servers with headers, and its inputs mechanism prompts for the key once and stores it as a secret instead of writing it into the file.
-
Add this to
.vscode/mcp.jsonin the workspace, or to your user-level file via the MCP: Open User Configuration command:{ "inputs": [ { "type": "promptString", "id": "numberbroom-key", "description": "NumberBroom API key (nb_live_...)", "password": true } ], "servers": { "numberbroom": { "type": "http", "url": "https://numberbroom.com/mcp", "headers": { "Authorization": "Bearer ${input:numberbroom-key}" } } } } Click Start above the server entry, paste the key when prompted, then use the tools from Copilot's agent mode.
Windsurf
Windsurf's Cascade reads remote servers from a JSON file with a serverUrl and a headers block.
-
Open
~/.codeium/windsurf/mcp_config.json(Cascade's MCP settings has a button for it) and add:{ "mcpServers": { "numberbroom": { "serverUrl": "https://numberbroom.com/mcp", "headers": { "Authorization": "Bearer nb_live_YOUR_KEY" } } } } Refresh the server list in Cascade and confirm both tools appear.
Claude.ai, mobile apps and Cowork
Not supported today, and we would rather say so than hand you a snippet that fails.
Use Claude Code or Claude Desktop instead. Both hold the key on your machine and send it as a header, which is exactly what this server expects. Their tabs are above.
If your team needs this inside claude.ai specifically, tell us. An OAuth front for the server is a real piece of work, and knowing someone is waiting on it is what moves it up the list.
ChatGPT
ChatGPT's MCP connectors, in Developer mode, accept OAuth or no authentication, and OpenAI's own docs say ChatGPT cannot present custom API keys. So the MCP endpoint is not reachable from ChatGPT. The REST API is, through a custom GPT Action with API key auth, and it returns the same fields.
Open the GPT editor, create a GPT, go to Configure, Actions, Create new action.
Set Authentication to API Key, Auth Type to Bearer, and paste your
nb_live_key. OpenAI encrypts it at rest and it never appears in the chat.-
Paste this schema. It describes the two REST endpoints the MCP tools wrap:
openapi: 3.1.0 info: title: NumberBroom phone verification version: "1.0" servers: - url: https://numberbroom.com/api paths: /v1/verify: post: operationId: verifyPhoneNumber summary: Verify one US phone number. Returns line type, carrier, activity score and TCPA litigator status. Costs $0.20; an unparseable number is free. requestBody: required: true content: application/json: schema: type: object required: [phone] properties: phone: type: string description: The number in any common US format. responses: "200": description: Verification result. valid is false when the input is not a US phone number. content: application/json: schema: type: object properties: e164: { type: string } valid: { type: boolean } lineType: { type: string } carrier: { type: string } isLitigator: { type: boolean } activityScore: { type: number } isLikelyDisconnected: { type: boolean } outcome: { type: string } keep: { type: boolean } dncEvaluated: { type: boolean } charged: { type: number } creditsRemaining: { type: number } /v1/credits: get: operationId: getCreditBalance summary: Remaining pre-paid balance and how many lookups it covers. Free to call. responses: "200": description: Balance content: application/json: schema: type: object properties: credits: { type: number } ratePerLookup: { type: number } lookupsRemaining: { type: integer } Save, then test in the preview: "Verify (902) 555-1234." Every lookup spends the key owner's balance, so keep the GPT private to your team rather than publishing it to the store.
Any other MCP client
If your client can add a remote server over Streamable HTTP and attach a static header, it works. Most clients take a JSON block shaped like this; the field names vary slightly, the values do not.
-
{ "url": "https://numberbroom.com/mcp", "transport": "streamable-http", "headers": { "Authorization": "Bearer nb_live_YOUR_KEY" } } If the client only speaks stdio, run it through
npx mcp-remote https://numberbroom.com/mcp --header "Authorization: Bearer nb_live_YOUR_KEY", the same bridge the Claude Desktop tab uses.Searching for numberbroom in a client that browses the official MCP registry finds the same server: it is published there as
io.github.cameron-creations/numberbroom-mcp.
initialize request to it; the server answers with its name and version. Source and a test suite are at github.com/cameron-creations/numberbroom-mcp.Same price as the API, because it is the API
No subscription and no per-seat fee. Your agent spends the balance you loaded, one lookup at a time.
Line type, carrier, activity score and litigator flag, all in one call.
Pre-paid through Stripe. Credit does not expire.
Lookups a day per key through this server, unless you set the key's own limit, up to 5,000 lookups. Resets at midnight UTC.
Unparseable numbers, failed carrier lookups, and every balance check.
Before you connect
Do I need OAuth or a separate developer account?
Does the MCP server store my key or the numbers I check?
What does a lookup cost, and when am I not charged?
What if an agent loops, or my key leaks?
Can my agent scrub a whole list through MCP?
Does it check the Do Not Call registry?
Why can I not add it in claude.ai or ChatGPT?
Give your agent a phone it can trust
Add credit, generate a key, paste one snippet. The first lookup is a minute away and costs twenty cents.