SMS verification for AI agents
An agent can buy a number and read its code with no human in the loop.
No identity to supply
An account is a seed phrase the agent generates and keeps. Nothing to verify, nothing to hand over, nobody to be.
No card to hold
Funding is crypto. An agent with a wallet can pay for itself — no card number, no billing address, no human approving a checkout.
No page to read
Catalog, prices, purchase and delivery are all tool calls. Nothing here needs a browser or a screenshot to operate.
How do you connect the MCP server?
One endpoint, JSON-RPC 2.0 over streamable HTTP. No API key to request and nothing to install — the catalog tools work before an account exists, and only the tools that spend money need a seed.
https://otpdrop.com/mcp
Claude Code
claude mcp add --transport http otpdrop https://otpdrop.com/mcp
Cursor, Windsurf, VS Code and most others
Clients that speak HTTP natively take the same block. Cursor and Windsurf call the key
mcpServers; VS Code calls it servers.
{
"mcpServers": {
"otpdrop": {
"type": "http",
"url": "https://otpdrop.com/mcp"
}
}
}
| Client | Where the config lives |
|---|---|
| Claude Code | claude mcp add, or .mcp.json in the project |
| Claude Desktop | Settings → Connectors → Add custom connector |
| Cursor | ~/.cursor/mcp.json, or .cursor/mcp.json per project |
| VS Code | .vscode/mcp.json, under servers |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
MCP clients move quickly and these paths change. If one does not match what you see, check that client's own documentation — the URL and transport above are the only parts that come from us.
What if the client only speaks stdio?
Some clients cannot open an HTTP MCP server directly. Bridge it locally:
{
"mcpServers": {
"otpdrop": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://otpdrop.com/mcp"]
}
}
}
What if you have no MCP client?
The server is a plain HTTP endpoint, so any language can call it. This lists the tools:
curl -s -X POST https://otpdrop.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Add Authorization: Bearer <seed> for the tools that need an account. If you would
rather not speak JSON-RPC, the same operations are available as ordinary REST endpoints in the
API reference.
What can an agent do on OTPDrop?
| Tool | Does | Needs a seed |
|---|---|---|
list_services | Every service with its code and category | no |
list_countries | Every country with its dial code | no |
list_catalog | The full catalog with the pricing matrix | no |
quote | The price for one service and country | no |
agent_help | In-context instructions for using this server | no |
create_account | Generate a new account and its seed | no |
topup | Get a deposit address and amount for a coin | yes |
topup_status | Check whether a deposit has been credited | yes |
buy_number | Buy a number, debiting the balance | yes |
get_order | Order details and current status | yes |
get_sms | The verification code once it lands | yes |
Three read-only resources mirror the catalog for clients that prefer them:
catalog://services, catalog://countries and catalog://pairs.
What does a complete run look like?
Five calls, start to finish. The only step that waits on the outside world is the deposit confirming on-chain.
- create_account — returns a seed. Store it; it is the only way back into the account, and it cannot be reset.
- topup — name a coin and an amount, get back an address, the exact amount to send, and an expiry. Send the funds from the agent's wallet.
- topup_status — poll until the deposit is credited to the balance.
- buy_number — name a service and country. The balance is debited and a number is issued immediately: no per-purchase address, no second wait.
- get_sms — poll until the code arrives. If none arrives before the order expires, the price returns to the balance automatically.
Fund once, buy many. A single top-up covers as many numbers as its balance allows, so only the first purchase in a session pays the confirmation wait.
Discovery
Everything needed to integrate is machine-readable and served without auth.
What should you tell your agent?
- The seed is unrecoverable. An agent that generates one and fails to persist it has thrown away the balance with it.
- Deposits are credited after network confirmation, which is not instant — poll
topup_statusrather than assuming success. - Send only the coin and network named on the invoice. A wrong-network transfer cannot be recovered.
- An arrived code completes the order and is billable, even if the destination service rejects it. See the Refund Policy.
- Refunds return to the OTPDrop balance, never to a wallet.
Writing a conventional integration instead? The REST API documentation covers the endpoints, authentication and error codes.