SMSBulk MCP Server
Use SMSBulk straight from Claude Desktop, Cursor, or any MCP-compatible client — order SMS numbers and disposable email addresses and read back the codes.
The Model Context Protocol (MCP) lets AI assistants call external tools. This open-source server connects the SMSBulk API to your AI client, with no business logic and no secrets stored.
What it does
The server is a pure relay: it forwards every request to the SMSBulk public API using your own API key. It exposes 18 tools across four groups — catalog, SMS, wallet, and email.
Unlike SMS-only providers, SMSBulk offers both phone and email verification. The email tools have no equivalent in most competing MCP servers.
Installation
Requires Node.js 18 or newer. Clone the repository, install dependencies, and build:
git clone https://github.com/Tolunay3434/smsbulk-mcp.git
cd smsbulk-mcp
npm install
npm run buildThen point your MCP client at the built dist/index.js. Catalog tools work without a key; every other tool needs your SMSBulk API key.
Client configuration
Claude Desktop
{
"mcpServers": {
"smsbulk": {
"command": "node",
"args": ["/absolute/path/to/smsbulk-mcp/dist/index.js"],
"env": {
"SMSBULK_API_KEY": "your_api_key_here",
"MAX_SPEND_PER_SESSION": "5"
}
}
}
}Add this to claude_desktop_config.json, then restart Claude Desktop. The SMSBulk tools appear in the tools menu.
Cursor
{
"mcpServers": {
"smsbulk": {
"command": "node",
"args": ["/absolute/path/to/smsbulk-mcp/dist/index.js"],
"env": {
"SMSBULK_API_KEY": "your_api_key_here"
}
}
}
}Add this to ~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project).
Replace /absolute/path/to/smsbulk-mcp with the real path where you cloned the repository. Never commit your API key.
Tool reference
18 tools. Catalog tools need no key; all others send your x-api-key.
Catalog
No API key requiredlist_services—All active services with stock and minimum-price summaries.
list_countries—All supported countries with flags and ISO codes.
get_serviceslugOne service, looked up by SEO slug or service code.
get_service_countriesslugIn-stock countries for a service, with prices, stock, and speed tiers.
SMS verification
API key requiredrequest_numberserviceCode, countryIso, operator?, idempotency_token?SpendsReserve a number for SMS verification. Retry-guarded.
get_statusidStatus and SMS code (once received) for one activation.
completeidMark an activation complete. This is final.
cancelidCancel an activation; refunds the wallet if no SMS arrived.
request_resendidAsk the provider to send another SMS to the same number.
list_activationslimit?, cursor?, status?Your activations, cursor-paginated, newest first.
Wallet
API key requiredget_balance—Your current wallet balance.
list_transactionslimit?, cursor?Recent deposits, debits, and refunds.
Email verification
API key requiredNot on SMS-only serversemail_get_domainssiteAvailable email provider domains for a target site, with prices and stock.
email_requestsite, domain, idempotency_token?SpendsReserve a disposable email address. Retry-guarded.
email_listlimit?Your recent email activations, newest first (up to 100, no cursor).
email_get_statusidStatus, parsed OTP, and raw HTML body (once received).
email_reorderidSpendsRe-open the same address for another OTP.
email_cancelidCancel; refunds the wallet if no OTP arrived.
Safety & limitations
These guards are convenience seatbelts, not guarantees.
Best-effort retry protection — not guaranteed idempotency
request_number and email_request keep a small in-memory guard that catches the common accidental case: the same order tool fired twice in one session with identical arguments replays the first result instead of charging again. It is not guaranteed idempotency — it lives only in this process's memory, resets on restart, does not coordinate across clients, and cannot prevent a true server-side race. To safely retry one intended order, pass the same idempotency_token; to deliberately place a second order, pass a different one.
Soft spend cap (MAX_SPEND_PER_SESSION)
When set, the server tracks the real cost of each successful order and blocks the next order once the running total reaches your cap. It is soft and in-memory — it resets on restart, covers this session only, and blocks the next request rather than splitting a single one. An order placed while still under the cap is allowed even if it pushes the total over. It is an extra layer on top of your account's server-side limits (balance, daily quota, rate limits).
Bring verification into your AI workflow
Clone the server, drop in your API key, and order SMS or email codes straight from your assistant.
