VirtualSMS MCP Server
The VirtualSMS MCP Server enables AI agents to obtain real SIM-card phone numbers and receive SMS verification codes across 145+ countries and 2000+ services (e.g., WhatsApp, Telegram, Google, Instagram, Uber).
Service & Country Discovery (no auth required)
List available services and countries, with optional filters
Check price/availability for a specific service + country combination
Find cheapest countries for a given service
Search services by natural language query
Account Management (API key required)
Check balance, view profile, retrieve usage stats, and access transaction history
Order Management (API key required)
Buy a virtual number — purchase a number for a specific service/country
Wait for SMS code (recommended) — one-step tool that buys a number and automatically waits for the SMS via WebSocket with polling fallback
Check SMS code — poll an active order for received codes
Cancel order — cancel and get a refund if no SMS received
Swap phone number — replace a non-working number on an existing order at no extra charge
Bulk cancel — cancel all active orders at once
List active orders — view active orders; essential for crash recovery to resume interrupted sessions
Order history — review past orders with filtering options
Reliability: Uses owned modem infrastructure with authentic mobile numbers, ensuring acceptance where VoIP numbers are blocked.
Provides tools to obtain virtual phone numbers and receive SMS verification codes specifically for Google account verification.
Enables the acquisition of temporary phone numbers to receive SMS verification codes for Instagram.
Facilitates obtaining virtual phone numbers and receiving real-time SMS verification codes for Telegram accounts.
Allows searching for service codes and purchasing virtual phone numbers to receive SMS verification codes for Uber.
Enables the purchase of virtual phone numbers and automated retrieval of SMS verification codes for WhatsApp accounts.
VirtualSMS MCP Server
Quick links: Quickstart · Why VirtualSMS · What you can build · Tools · Questions · Examples · Changelog · Security policy · Status
VirtualSMS is an account verification platform for developers and AI agents. It combines one-time SMS verification, dedicated number rentals, matching-country proxies and private cloud browser sessions behind one API, one MCP server and one prepaid balance.
Infrastructure for AI agents that need real-world phone verification.
The numbers are carrier-issued mobile numbers, backed by real physical SIM cards on carrier networks, not VoIP, which is why they pass the line-type checks that reject VoIP numbers at signup.
From one prepaid balance you can:
receive one-time SMS codes from $0.05
rent dedicated numbers from 1 to 30 days
buy matching-country residential, mobile and datacenter proxies
launch private cloud browser sessions that work alongside your number and proxy (beta)
All four work together from one prepaid balance, one API and one dashboard. Use only the pieces you need, or combine them into a single verification workflow.
Most providers solve one piece of the verification workflow. VirtualSMS combines numbers, rentals, proxies and cloud browser sessions behind one API, SDKs and an MCP server, so you use only the pieces you need or combine them into one workflow.
VirtualSMS can be used by individuals manually, integrated into applications with SDKs and APIs, or driven by AI agents through MCP. Use the platform through a REST API, official SDKs for Node, Python, PHP, Ruby and .NET, a hosted MCP server, or automation tools like n8n.
This server exposes that platform to any MCP client. Built for AI agents. Designed for agentic workflows. Works with Claude Code, Claude Desktop, Cursor, Windsurf and every MCP-compatible client, with no wrapper code to write.
Quickstart
Paste this into your MCP client's config. Nothing to install, no Node.js required on the client:
{
"mcpServers": {
"virtualsms": {
"type": "streamableHttp",
"url": "https://mcp.virtualsms.io/mcp",
"headers": {
"x-api-key": "vsms_your_api_key_here"
}
}
}
}Get an API key at virtualsms.io. Then ask your agent:
"Buy me a Telegram number in the cheapest country and wait for the code."
Prefer to run it locally over stdio instead:
npx virtualsms-mcpRelated MCP server: Twilio MCP Server
Why VirtualSMS
Verifying an account should not mean stitching together numbers from one provider, proxies from another, and browser sessions from a third: multiple accounts, multiple balances and APIs, and support spread across vendors. VirtualSMS brings those pieces together behind one balance, one API and one MCP server.
VirtualSMS combines all three under one account, and gives you one way to drive them:
Carrier-issued mobile numbers. Backed by real physical SIM cards, not VoIP, so they resolve as mobile at signup.
Matching-country proxies. Residential, mobile and datacenter pools, so the number and the IP agree.
Private cloud browser sessions. Beta.
REST API. Documented at virtualsms.io/docs.
Hosted MCP server. This repo, live at
https://mcp.virtualsms.io/mcp.One prepaid balance. Verification, rentals and proxies all draw from it.
Everything below expands on those six.
What you can build
Concrete jobs this server does today. Every one is a plain-English request your agent turns into tool calls:
You want to | Ask your agent | Tools it uses |
Verify a WhatsApp account from Claude Code | "Get me a WhatsApp code on a UK number" |
|
Create a Telegram account from Cursor | "Buy a Telegram number in the cheapest country and wait for the code" |
|
Retrieve verification codes automatically | "Wait for the code and paste it into the form" |
|
Test OTP flows during QA | "Run the signup flow ten times and report which codes landed" |
|
Provision temporary numbers during CI | "Give the test suite a fresh number, then release it" |
|
Keep a number for a week | "Rent me a British number for 7 days" |
|
Make the number and the IP agree | "Buy a UK proxy to match my UK number" |
|
Screen a number before you trust it | "Is this number VoIP?" |
|
Recover a number that went quiet | "That number never got the code, swap it" |
|
Runnable versions of the first two live in examples/.
Client setup
Every client runs the same npx virtualsms-mcp stdio command. Only the file location and format differ. The hosted config above works anywhere streamableHttp is supported and is the recommended path.
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}Quit and reopen Claude Desktop. A drop-in config plus a worked transcript lives in examples/03-claude-desktop-config/.
Claude Code (CLI)
claude mcp add --scope user virtualsms npx virtualsms-mcp -e VIRTUALSMS_API_KEY=vsms_your_api_key_hereCursor
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}Windsurf
Edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}OpenClaw
Edit ~/.openclaw/mcp.json:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}Codex (OpenAI Codex CLI)
Edit ~/.codex/config.toml:
[mcp_servers.virtualsms]
command = "npx"
args = ["virtualsms-mcp"]
env = { VIRTUALSMS_API_KEY = "vsms_your_api_key_here" }Hermes
Edit your Hermes MCP config:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}Cline (VS Code)
Open the Cline MCP settings panel and add:
{
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}Zed
Edit ~/.config/zed/settings.json:
{
"context_servers": {
"virtualsms": {
"command": {
"path": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}
}Continue.dev
Edit ~/.continue/config.yaml:
mcpServers:
- name: virtualsms
command: npx
args:
- virtualsms-mcp
env:
VIRTUALSMS_API_KEY: vsms_your_api_key_hereDoes this work with ChatGPT?
Yes, via ChatGPT's Developer Mode. Open Settings, turn on Developer mode, then add https://mcp.virtualsms.io/mcp as a custom connector (Plus, Pro, Business, Enterprise and Edu plans; not available on the free tier). Setup is a URL paste rather than a config file, so it differs from the client setups above. ChatGPT only connects to remote MCP servers over SSE or streaming HTTP, so use the hosted endpoint, not the local stdio command. The REST API is still there if you would rather build a custom GPT or Action instead.
Configuration
Variable | Required | Default | Description |
| Yes, for account tools | none | Your VirtualSMS API key. Keys carry a |
| No |
| API base URL |
| No | off | Serves 3 additional session-drive tools when set to |
| No | off | Serves the early-release rental tool when set to |
Tools
40 tools by default. Set VIRTUALSMS_ENABLE_SESSIONS=1 to expose 3 more.
Tool names are shown below without the virtualsms_ prefix for readability. The real wire names are prefixed: virtualsms_create_order, virtualsms_get_sms, and so on.
The core SMS verification surface: discover a service, price it, buy a number, get the code.
Tool | Auth | Description |
| Yes | All available verification services. Optional |
| Yes | All available countries. Optional |
| No | Price and availability for a service plus country pair |
| No | Cheapest countries for a service, sorted by price, with real stock counts |
| Yes | Natural-language service lookup. "telega" finds Telegram |
| Yes | Account balance in USD |
| Yes | Email, Telegram link, balance, lifetime spend, total orders, active API keys |
| Yes | Orders, success rate, spend, and status/service/country breakdown |
| Yes | Transaction history with type, date range, and pagination filters |
| Yes | Buy a number for a service plus country. Returns |
| Yes | Poll an order for the code. Use for batch and cron jobs |
| Yes | Block until the SMS lands on an existing |
| Yes | Full order detail plus every received message |
| Yes | Your active orders. Essential for crash recovery |
| Yes | Past orders with status, service, country, and date filters |
| Yes | Cancel and refund, if no SMS arrived. 120s cooldown after purchase |
| Yes | Bulk-cancel every active order |
| Yes | Swap for a new number, same service and country, no extra charge. 120s cooldown |
get_smsvswait_for_sms:wait_for_smsis the recommended default for interactive agent workflows. It blocks and returns the moment the SMS arrives over WebSocket. Useget_smsfor batch jobs, cron-driven polling, or when you already manage your own polling loop.
wait_for_smstakes anorder_id, not a service and country. Callcreate_orderfirst, then pass the returnedorder_id. That is the two-step buy-and-wait flow.
Keep a number by the day instead of buying a single verification. Two tiers:
Full Access: local SIM inventory, for a whole number that works across any service. Every country in stock today lists 1, 7 and 30 days, at prices that vary per country. Durations and prices are not hardcoded here on purpose: call
rentals_availablefor the live list per country and treat that as authoritative.Platform: sourced via our global supplier network, locked to one chosen service, durations of 1, 3 or 7 days. Call
rentals_pricefor the exact retail price of a (service, country, duration) combo.
Stock, durations and pricing all differ per tier and per country, so call rentals_available before committing to either. An active rental can be extended with extend_rental at the current catalog price, in the same durations its tier allows.
Both tiers carry the same refund terms: cancel for a full refund within 20 minutes of purchase and before the first SMS arrives. Platform cancels are additionally subject to a 2 minute minimum hold, so a cancel inside the first 2 minutes is rejected and has to be retried.
Tool | Auth | Description |
| Yes | Full Access pricing tiers: durations and prices |
| Yes | Countries with rental stock, counts, and pricing, per tier |
| Yes | Services available for Platform-tier rental in a country, with stock and price |
| Yes | Retail price for a service, country, and duration combination |
| Yes | Rent a number. Check availability and price first |
| Yes | Your rentals across both tiers, filterable by status |
| Yes | Full detail for one rental: tier, number, service lock, status, expiry, SMS |
| Yes | Extend an active rental. Charges the current catalog price |
| Yes | Full refund, within 20 minutes of purchase and before any SMS |
Matching-country proxies, so the number and the IP agree. Three pools: residential, mobile and datacenter. Buy traffic by the GB, then generate a connection string.
Tool | Auth | Description |
| Yes | Pool types, countries, and price per GB. Start here |
| No | Cities, states, ASNs, or ZIPs for a pool type plus country. No purchase required |
| Yes | Purchase proxy traffic in GB. Returns credentials and remaining balance |
| Yes | Your proxies with remaining GB and credentials. Returns |
| Yes | Build a ready-to-use connection string: country, state, city, ZIP or ASN targeting, rotating or sticky, HTTP or SOCKS5 |
| Yes | Request a fresh exit IP for an existing proxy |
| Yes | Prove a proxy works. Reports exit IP, country, city, ISP, and latency |
| Yes | Cached GB used and remaining, plus request count, for one proxy |
| Yes | Per-day traffic and request series over the last 7 or 30 days |
| Yes | Persist a default geo-targeting on a proxy sub-user |
Tool | Auth | Description |
| Yes | Ask for the SMS to be resent to the same number. Not all order types support it |
| No | Carrier and line-type lookup for any E.164 number: mobile, landline or VoIP, plus spam risk |
| Yes | Beta, invite-only. Start a country-matched cloud browser you drive yourself in a live viewer. Agent-driven navigation is a separate opt-in (the session tools). Join https://t.me/VirtualSMS_io for beta access |
Beta, invite-only. The browser stack is early. It works, but the shape of these tools can still change and there is no stability guarantee yet. Join https://t.me/VirtualSMS_io for beta access and updates.
Served only when VIRTUALSMS_ENABLE_SESSIONS is set to 1, true or yes. Not exposed on the default surface.
Tool | Description |
| Navigate an active browser session to a URL |
| Live viewer URL and current status for an active session |
| Stop an active browser session and release it |
Typical workflows
Get a verification code
create_order(service: "telegram", country: "US")
→ {order_id: "abc123", phone_number: "+14155552671", status: "pending"}
wait_for_sms(order_id: "abc123", timeout_seconds: 180)
→ {success: true, code: "12345", delivery_method: "websocket", elapsed_seconds: 8}Find the cheapest country first
find_cheapest(service: "telegram", limit: 3)
→ {cheapest_options: [{country: "PK", price_usd: 0.05, ...}]}
create_order(service: "telegram", country: "PK")
wait_for_sms(order_id: "abc123")Number not receiving? Swap it
swap_number(order_id: "abc123")
→ {order_id: "def456", phone_number: "+628...", status: "waiting"}Rent a number for a month
rentals_available(tier: "full_access")
→ countries holding local SIM stock, each with its own duration and price list
create_rental(tier: "full_access", country: "FR", duration_hours: 720)
→ {rental_id: "rnt_1", phone_number: "+33...", expires_in_days: 30}Stock is per country and per tier, so discover first and rent second. rentals_available(tier: "platform") covers a different, service-locked catalogue.
Pair a number with a matching-country proxy
list_proxy_catalog()
buy_proxy(pool_type: "residential", gb: 1, country_code: "GB")
generate_proxy_endpoint(proxy_id: "px_1", country_code: "GB", protocol: "socks5")Questions
What is account verification infrastructure?
Account verification infrastructure is the stack that gets a real account through a signup flow that demands a phone number. It has five layers, and a gap in any one of them fails the whole chain:
Numbers. A carrier-issued mobile line, because the line type gets checked.
SMS. The verification code, delivered to that number and readable by software rather than by a human holding a handset.
Proxy. An IP in the same country as the number, so the two agree.
Browser. A clean environment to drive the signup itself.
Automation. An API or an agent that runs the chain end to end, unattended.
Most providers sell the first two layers and leave you to source the rest, which is exactly where the number, the IP and the browser stop telling the same story. VirtualSMS provides the infrastructure behind all five.
VirtualSMS is an account verification platform for individuals, developers, and AI agents. It combines one-time SMS verification, dedicated number rentals, matching-country proxies, and private cloud browser sessions behind one API, one MCP server, and one prepaid balance.
What is an MCP server for SMS verification?
MCP (Model Context Protocol) is an open standard that lets an AI client call external tools. An MCP server for SMS verification exposes phone-number and verification-code operations as tools an agent can call directly, so the agent buys the number, waits for the code and reads it back without any glue code from you. This repo is that server for VirtualSMS: 40 tools covering verification, rentals and proxies. If you are not driving an agent at all, the same operations are available as a plain REST verification API.
When should I use this?
Your AI agent needs to sign in to or register an account that demands a phone number.
You are testing an OTP or signup flow and want fresh numbers on demand instead of a drawer of test SIMs.
You need a verification code retrieved automatically, in CI or in an unattended job.
You need a number and a matching-country IP that agree with each other.
You are driving signup automation in a browser and would rather the number, the IP and the browser came from one place than three.
You need a temporary phone number for one code, or a dedicated one you keep for up to 30 days.
You want per-code pricing from $0.05 with no subscription and no monthly number rental.
When should I NOT use this?
Honest answers, so you do not waste an afternoon:
You need to send SMS. This platform receives; it does not send. Use a messaging provider such as Twilio.
You need a permanent number for your business. Verification numbers are temporary by design, and rentals run in days, not years. Buy a real line from a carrier.
You need codes on a number you already own. There is no port-in. The numbers come from our inventory.
You are running A2P marketing campaigns. Wrong tool entirely.
You are trying to evade a platform's terms of service. Whether your use complies with the terms of the service you verify against is your responsibility, not ours.
Can Claude or Cursor receive SMS verification codes?
Yes, through this server. Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Zed, Continue.dev, Codex, OpenClaw and Hermes are all MCP clients, and each one is a config paste away (see Client setup). Once installed, "buy a Telegram number and wait for the code" is a request the agent can carry out end to end. ChatGPT can reach it too, through Developer Mode custom connectors (see Does this work with ChatGPT?), or through the REST API if you would rather not enable Developer Mode.
How do AI agents receive OTP codes automatically?
Two tool calls. create_order buys a number for a given service and country and returns an order_id. wait_for_sms then blocks on that order_id and returns the moment the code arrives, pushed over WebSocket, typically in 2 to 15 seconds. The agent never polls, never sleeps in a loop, and never needs a human to read a phone. If you would rather drive your own loop, get_sms polls a single order instead.
How is this different from Twilio?
Twilio is a full communications platform: send and receive SMS and voice, long-lived numbers, A2P campaigns, the lot. VirtualSMS does one job, which is receiving verification codes on demand. The practical differences:
Line type. Twilio numbers are VoIP. Many services reject VoIP numbers at signup. VirtualSMS numbers are real physical SIM cards on carrier networks, so they resolve as mobile.
Pricing shape. Twilio bills you for a number every month whether you use it or not. VirtualSMS bills per code from $0.05, with no subscription.
Direction. Twilio sends and receives. This receives.
If you need to send messages, use Twilio. If you need to receive a verification code, this is purpose-built for it.
Why real physical SIM cards instead of VoIP?
Verification systems check the line type of the number you give them. VoIP numbers are cheap and disposable at scale, so they correlate with fraud, and a large share of services reject them outright at signup. Real physical SIM cards sit on carrier networks and resolve as mobile, which is exactly what those checks are looking for: a non-VoIP number that behaves like a real handset.
You do not have to take that on faith. check_number runs a carrier and line-type lookup on any E.164 number, needs no API key, and will tell you whether a number reads as mobile, landline or VoIP.
Alternatives and comparisons
Developers searching for textverified mcp, sms-activate mcp, 5sim mcp, daisysms mcp or smspool mcp are usually asking one question: which SMS verification provider can an AI agent drive natively? This section answers that without a scoreboard.
VirtualSMS publishes this MCP server, so any MCP client calls it directly with no wrapper code: 40 tools, 2500+ services, 145+ countries, from $0.05 per code, on real physical SIM cards, plus number rentals and matching-country proxies from the same balance.
SMS-Activate shut down in December 2025. If your integration pointed there, it is gone, and the migration is a new API key and a new base URL rather than a rewrite: the shape of the job, buy a number then read the code, is the same here.
TextVerified, 5SIM, DaisySMS and SMSPool are all active SMS verification providers, each with its own API, pricing, coverage and terms. Check their current documentation for what they offer today.
We deliberately do not publish a comparison table of competitors' prices, service counts or coverage. Those numbers move week to week, we have no privileged view into anyone else's inventory, and a stale table dressed up as research is worse than no table at all. The VirtualSMS numbers above are ours and we stand behind them. Compare them against whatever you are using now.
How it works
WebSocket and polling
wait_for_sms uses a two-tier delivery system:
WebSocket, instant. Connects to
wss://virtualsms.io/ws/orders?order_id=xxx&api_key=your_key. When the SMS arrives the server pushes it in real time. Typical delivery: 2 to 15 seconds.Polling fallback. If the WebSocket fails to connect or drops, the tool falls back to polling every 5 seconds for the remaining timeout.
The delivery_method field in the response tells you which path was used: websocket, polling, or instant when the code had already landed before you called.
This server pushes over a held-open WebSocket; it never calls you back. If you would rather VirtualSMS POST events to a URL you own, the platform runs a separate webhook subscription system, configured from the dashboard and driven by the REST API rather than by this MCP server.
Architecture
AI Agent (Claude / Cursor / Codex / Windsurf / any MCP client)
│
▼ MCP (stdio or StreamableHTTP)
VirtualSMS MCP Server (this package)
│
├──► REST API: https://virtualsms.io/docs
│ create_order, get_sms, cancel_order, get_balance ...
│
└──► WebSocket: wss://virtualsms.io/ws/orders
real-time SMS push deliveryCrash recovery
If your session is interrupted mid-verification:
Restart the MCP server.
List active orders:
list_orders(status: "pending")Check for codes:
get_sms(order_id: "abc123")Cancel if not needed:
cancel_order(order_id: "abc123")
wait_for_sms always returns order_id, even on timeout, so you can recover.
Hosted endpoint and status
Hosted MCP endpoint:
https://mcp.virtualsms.io/mcp. TLS-only StreamableHTTP, fronted by Cloudflare.Platform status and uptime: virtualsms.io/status, polled live: website and dashboard, SMS gateway, REST API, Telegram bot and database. The hosted MCP endpoint runs as a separate service and is not yet a row on that page.
Target SLA: 99.9% on the hosted MCP path. A target we hold ourselves to rather than a contractual guarantee, and one the status page above does not yet measure.
Coverage: 145+ countries online, 2500+ services indexed.
Data retention: SMS message bodies are retained 7 days, then permanently deleted. Order metadata (phone number, service, country, timestamps) is retained for the lifetime of your account. See SECURITY.md for full details.
Vulnerability disclosure: email
security@virtualsms.ioor open a private security advisory.
Examples
Three runnable examples are checked into this repo. Each is node run.mjs away once VIRTUALSMS_API_KEY is set.
examples/01-quick-balance-check/: 5-second hosted MCP smoke test (get_balance).examples/02-buy-sms-and-wait-for-code/: full verification flow,find_cheapest→create_order→wait_for_sms→ cancel-on-timeout. The canonical pattern for AI agents.examples/03-claude-desktop-config/: drop-in Claude Desktop config plus a transcript of "ask Claude what's my balance" over StreamableHTTP.
SDKs and tools
The same platform, from whatever you already write in:
Repo | What it is |
Official Node.js / TypeScript SDK | |
Official Python SDK | |
Official PHP SDK | |
Official Ruby SDK | |
Official .NET SDK | |
Official Go SDK | |
Official Rust SDK | |
Official Swift SDK | |
Official Java SDK | |
REST API documentation source | |
Runnable examples across languages | |
n8n community nodes | |
Make, Zapier and workflow integrations | |
Carrier and line-type lookup tool | |
Claude skill for SMS verification | |
Cursor rules for SMS verification |
Build and contribute
git clone https://github.com/virtualsms-io/mcp-server.git
cd mcp-server
npm install
npm run build # tsc
npm test # vitest
npx tsc --noEmit # typecheck onlyTwo transports share one tool table: src/index.ts (stdio) and src/http-server.ts (StreamableHTTP). Tool definitions and handlers live in src/tools.ts. If you add a tool, wire it into both transports. src/__tests__/transport-parity.test.ts fails the build if you forget, and src/__tests__/docs-tool-names.test.ts fails if the docs name a tool that does not exist.
Issues and pull requests: github.com/virtualsms-io/mcp-server.
Release notes for v1.0.0 to v1.3.1 are in CHANGELOG.md.
Security
API keys are passed via the x-api-key header (hosted) or the VIRTUALSMS_API_KEY environment variable (local stdio), and are rotatable from your account at virtualsms.io. Full policy, retention detail and disclosure process: SECURITY.md.
Report vulnerabilities to security@virtualsms.io.
License
MIT. See LICENSE.
Built by VirtualSMS.io. Account verification for developers and AI agents, on real physical SIM cards: 2500+ services · 145+ countries · from $0.05 per code.
Available Tools
18 toolsvirtualsms_cancel_all_ordersCancel All Active OrdersADestructiveIdempotentInspect
Bulk-cancel every currently active order in your account. Returns the number of orders cancelled plus any failures. Useful for quick cleanup after a batch run or test session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the description's job is lighter. It adds value by specifying return values ('number of orders cancelled plus any failures'), which informs the agent of the outcome. It could mention the irreversible nature, but overall it adds useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action, and includes a usage hint. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description compensates by mentioning return values. Annotations cover destruction. It could mention what happens to other resources or confirmation steps, but it is mostly complete for a zero-parameter bulk action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so per guidelines the baseline is 4. The description rightly includes no parameter details, and the schema covers everything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Bulk-cancel every currently active order in your account.' It uses a specific verb ('bulk-cancel') and resource ('every active order'), and distinguishes itself from the sibling tool 'virtualsms_cancel_order' which cancels a single order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for when to use this tool: 'Useful for quick cleanup after a batch run or test session.' While it doesn't explicitly exclude other scenarios or name alternatives, the sibling tools (e.g., 'virtualsms_cancel_order') imply the singular use case, and the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_cancel_orderCancel OrderADestructiveIdempotentInspect
Cancel an order and request a refund. Only works if no SMS has been received yet. Use this if the service is taking too long or you want to try a different number. Cooldown: cancel is only available 120 seconds after purchase. Check cancel_available_at on the order before calling. Calling earlier returns a cooldown_active error from this MCP server (no backend round-trip).
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Order ID to cancel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveness and idempotence. The description adds valuable context: cancellation only allowed before SMS reception, a cooldown mechanism, and that premature calls result in a local error without backend impact. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no extraneous information. It front-loads the core action and constraints, each sentence serves a distinct purpose: purpose, usage, and behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple cancellation tool, the description covers key constraints (no SMS received, cooldown, error behavior). It lacks any mention of the success response or refund specifics, but given no output schema, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'order_id' is fully described in the schema (100% coverage). The description does not add semantic detail beyond what the schema provides, meriting the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Cancel an order and request a refund' and specifies the condition 'Only works if no SMS has been received yet.' This distinctively differentiates it from siblings like 'virtualsms_cancel_all_orders' which cancels multiple orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides when to use the tool: 'if the service is taking too long or you want to try a different number.' It also details a crucial prerequisite: check 'cancel_available_at' to respect a 120-second cooldown, and warns that early calls return a specific error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_create_orderBuy Virtual NumberAInspect
Purchase a virtual phone number for SMS verification. Returns order_id and phone_number. Use check_sms to poll for the verification code, or use wait_for_code to do it automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service code (e.g. "telegram", "whatsapp", "google") | |
| country | Yes | Country ISO code (e.g. "US", "GB", "RU") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations by stating it returns order_id and phone_number, indicating mutation ('purchase'). Annotations already show readOnlyHint=false, destructiveHint=false, idempotentHint=false. The description could disclose potential costs or failure conditions but does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence states purpose and output; the second gives actionable next steps. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the tool's purpose, output, and follow-up actions. Given no output schema, it adequately conveys return values. It lacks mention of pricing or potential failures, but for a straightforward purchase tool with two required params, it is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description provides example service codes ('telegram', 'whatsapp', 'google') and country codes ('US', 'GB', 'RU'), but these are illustrative and already implied in the schema. No new parameter meaning is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Purchase a virtual phone number for SMS verification', specifying the verb and resource. It also mentions the output (order_id and phone_number), distinguishing it from sibling tools like virtualsms_get_order or virtualsms_find_cheapest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides post-purchase guidance by suggesting check_sms or wait_for_sms for verification. However, it lacks explicit when-to-use guidance versus alternatives like virtualsms_get_order or virtualsms_find_cheapest. It gives clear context for next steps but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_find_cheapestFind Cheapest CountriesARead-onlyIdempotentInspect
Find the cheapest countries for a given service, sorted by price. Returns available countries with prices and stock levels so you can pick the best deal.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service code (e.g. "telegram", "whatsapp", "google") | |
| limit | No | Number of cheapest options to return (default: 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds valuable behavioral detail: 'Returns available countries with prices and stock levels' and 'sorted by price,' which beyond the annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The main purpose is front-loaded, and each sentence adds value: first states action, second describes output. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description covers input (service, limit), operation (sort by price), and output shape (countries with prices and stock levels). This is complete for a simple search tool, providing what an agent needs to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description does not add new parameter-specific meaning beyond what the schema already provides (e.g., service examples and limit default). It repeats the core idea but adds no extra semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the purpose: 'Find the cheapest countries for a given service, sorted by price.' It specifies the verb (find) and resource (cheapest countries), and distinguishes from similar tools like virtualsms_get_price by focusing on cheapest across countries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (for a given service, looking for cheapest), but does not explicitly state when not to use or mention alternative tools. It provides context but lacks exclusions or comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_get_balanceGet Account BalanceARead-onlyIdempotentInspect
Check your VirtualSMS account balance in USD. Requires VIRTUALSMS_API_KEY to be set.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Display balance in specific currency (default: USD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the important behavioral note that the tool requires an API key, which is beyond what annotations provide (readOnlyHint, idempotentHint). It correctly implies a safe, non-destructive operation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no unnecessary words. It front-loads the core purpose and follows with a critical requirement. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one optional parameter, no output schema) and rich annotations, the description is mostly complete. However, it does not hint at the return format, but the tool name and context imply a numeric balance value. A minor gap but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for its single optional parameter 'currency', so the description does not need to add extra meaning. The baseline score of 3 is appropriate as the description ignores the parameter entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Check' and the resource 'account balance in USD', which immediately distinguishes this tool from siblings like get_price or get_profile. The resource is specific and easy to understand.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a prerequisite (VIRTUALSMS_API_KEY) but does not provide guidance on when to use this tool versus alternatives. The context of sibling tools suggests it is for balance inquiry, but no explicit when-to-use or when-not-to-use advice is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_get_orderGet Order DetailsARead-onlyIdempotentInspect
Get the full details of a specific order, including status, phone number, service, country, timestamps, and any received SMS code/text. Use this when you have an order_id and need the latest state beyond what check_sms returns.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Order ID to retrieve full details for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and not destructive. The description adds valuable detail about the returned fields (status, phone number, service, country, timestamps, SMS code/text), which complements the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, efficiently front-loaded with the purpose and then a usage condition. There is no redundant information, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input schema, comprehensive annotations, and the absence of an output schema, the description provides sufficient context for an AI agent to understand when and how to use the tool. It lists the key data fields returned, though a brief example of the output format would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has full coverage (100%) for the single parameter 'order_id', which is described adequately. The description does not add extra meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves full order details including status, phone number, service, etc. It references a specific use case ('beyond what check_sms returns'), which distinguishes it from a related tool, though check_sms is not in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when you have an order_id and need the latest state beyond what check_sms returns,' providing a clear condition for use. It does not, however, mention when not to use it or provide alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_get_priceCheck Service PriceARead-onlyIdempotentInspect
Check the price and availability for a specific service + country combination. Always check price before buying to confirm availability.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | Service code (e.g. "telegram", "whatsapp", "google") | |
| country | Yes | Country ISO code (e.g. "US", "GB", "RU") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, fully conveying the safe, non-destructive nature. The description adds no new behavioral traits beyond reinforcing that it checks price/availability. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero wasted words. It front-loads the action and necessary context, making it easy to parse quickly. Every sentence provides value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple price-check tool with no output schema, the description covers the core purpose but lacks detail about the return format (e.g., price, currency, availability status). Given the low complexity, it is adequate but could benefit from stating what the output contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have schema descriptions (service code string, country ISO code) that are clear and sufficient. The description does not add extra meaning beyond what the schema already provides. Baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Check the price and availability for a specific service + country combination.' It uses a specific verb 'check' and distinct resource (price/availability), differentiating it from siblings like get_balance or get_order. The additional guidance to 'always check price before buying' reinforces its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises to use this tool before buying, giving clear context for when to invoke it. However, it does not mention alternatives or when not to use it, though siblings like virtualsms_find_cheapest may serve a different purpose. The guidance is straightforward and helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_get_profileGet Account ProfileARead-onlyIdempotentInspect
Full account profile: email, Telegram link status, current balance, lifetime spend, total orders, active API keys, and account creation date.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint=false, idempotentHint. Description adds no behavioral context beyond field listing, such as side effects or response handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence efficiently lists all returned fields with no redundancy. Front-loaded with 'Full account profile'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and rich annotations, the description sufficiently explains what the tool returns. It covers all relevant aspects for using the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so description does not need to add meaning. Baseline of 4 applies as there is no param info to supplement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies that the tool retrieves the full account profile, listing specific fields like email, balance, orders, etc. It distinguishes itself from siblings that handle orders, balance, or SMS operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description implies it is for viewing account profile, but does not state exclusions or mention sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_get_smsCheck SMS CodeARead-onlyIdempotentInspect
Check if an SMS verification code has been received for an order. Returns status, phone_number, and (when delivered) messages[] array plus an extracted code. Poll this every 5-10 seconds after buying a number, or use wait_for_sms to block until delivery.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Order ID returned from buy_number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only and idempotent. The description adds that it returns status, phone_number, messages array, and extracted code. It could be more precise about what happens when no code is received, but overall it's informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and practical usage details. No wasted words; tight and effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple polling tool with one parameter, the description covers the core behavior, return value structure, and usage pattern. Combined with rich annotations, it's fully informative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter order_id is well-described in the input schema (100% coverage). The description does not add new semantics beyond the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks if an SMS verification code has been received for an order, using specific verbs and resource. It distinguishes itself from the sibling tool wait_for_sms by presenting polling vs blocking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises polling every 5-10 seconds after buying a number and provides an alternative (wait_for_sms). This helps the agent decide when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_get_statsGet Account StatsARead-onlyIdempotentInspect
Account usage stats aggregated from your order history: total orders, success rate, total spend, top services/countries, and status breakdown over a configurable lookback window.
| Name | Required | Description | Default |
|---|---|---|---|
| since_days | No | Window in days for activity stats (default: 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description confirms it is a read operation by stating it aggregated from order history, but it does not add further behavioral context beyond listing the output fields. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that starts with the core purpose and lists specific data points returned. It is concise without unnecessary words, earning its place efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description lists key elements returned (total orders, success rate, total spend, top services/countries, status breakdown), providing a clear picture of the output. It does not specify format or units, but it is reasonably complete for a stats tool with a single optional input parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'since_days' is fully described in the input schema (default 30, window in days). The description mentions a 'configurable lookback window' but does not add semantic value beyond the schema. With 100% schema coverage, baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns aggregated usage stats including total orders, success rate, total spend, top services/countries, and status breakdown over a configurable lookback window. It distinguishes itself from sibling tools that handle individual orders, balances, or other specific operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for getting an overview of account activity, but it does not explicitly state when to use this tool vs alternatives like listing orders or checking balance. No explicit usage conditions or exclusions are provided, leaving the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_get_transactionsGet Transaction HistoryBRead-onlyIdempotentInspect
Transaction history for the account with optional filters for type, date range, and pagination. Types: "deposit", "purchase", "refund", "admin_credit".
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type: "deposit", "purchase", "refund", "admin_credit" | |
| from | No | Lower bound on created_at — RFC3339 or YYYY-MM-DD | |
| to | No | Upper bound on created_at — RFC3339 or YYYY-MM-DD | |
| limit | No | Max transactions (1-200, default: 50) | |
| offset | No | Pagination offset (default: 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only and idempotent. The description adds that it covers account-level transactions with filters, which is useful but does not disclose pagination limits or response structure beyond what schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with front-loaded purpose. No extraneous words; all information is relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema, the description does not describe the return format or fields. While annotations cover safety, the description could be more complete by stating what data is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 5 parameters with descriptions (100% coverage). The description reiterates the filter types and date range, adding no new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves transaction history for the account and lists optional filters. However, it does not explicitly distinguish this tool from siblings like virtualsms_order_history or virtualsms_get_balance, which could be confused.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. The description does not mention scenarios or exclusion criteria, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_list_countriesList Available CountriesARead-onlyIdempotentInspect
Get all available countries for SMS verification. Use this to discover valid country codes before buying a number.
| Name | Required | Description | Default |
|---|---|---|---|
| service | No | Filter countries available for a specific service (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide comprehensive safety and idempotency hints. The description adds that it returns country codes and implies non-destructive, read-only behavior, but does not significantly extend beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. Front-loads purpose and usage. Every sentence is informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description adequately explains purpose, usage, and expected output (country codes). No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one optional parameter. The description does not add meaning beyond the schema parameter description; it only mentions country codes. Per guidelines, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get all available countries for SMS verification.' It uses a specific verb and resource, and distinguishes from sibling tools like order and service listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using it to discover country codes before buying a number, providing clear contextual guidance. It does not specify when not to use or compare to alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_list_ordersList Active OrdersARead-onlyIdempotentInspect
List your active orders. Essential for crash recovery — if your session was interrupted, use this to find pending orders and their phone numbers, then use check_sms to retrieve codes.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Optional status filter: "pending", "sms_received", "cancelled", "completed" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, idempotentHint, etc. Description adds behavioral context about crash recovery and that the tool returns phone numbers. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose, second provides a critical use case. No fluff, front-loaded, efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description hints at return fields (orders with phone numbers). Lacks details on pagination or ordering, but for a list tool with one optional parameter, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with a clear description for the single optional parameter 'status'. Description does not add further parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'List your active orders' with a specific verb and resource. It distinguishes from sibling tools like virtualsms_get_order and virtualsms_order_history. Minor inconsistency: input schema allows filtering by various statuses, not just 'active', but overall clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes a key use case: crash recovery. Tells agent to use this tool to find pending orders and phone numbers, then follow up with check_sms. Does not specify when not to use, but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_list_servicesList Available ServicesARead-onlyIdempotentInspect
Get all available SMS verification services (Telegram, WhatsApp, Google, etc.). Use this to discover valid service codes before buying a number.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Filter services by name (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, and non-destructive hints. Description adds no additional behavioral traits beyond listing services, which is already clear from the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, no verbose language, front-loads the core purpose with examples. Every word is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only one optional parameter and no output schema, the description fully covers the necessary context: what it does and how to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. The tool description does not add new semantic meaning beyond what the schema already provides for the 'search' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists all available SMS verification services and provides examples (Telegram, WhatsApp, Google). It distinguishes from sibling 'search_services' by implying it returns all services without filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly tells when to use ('before buying a number') and hints at usage context, but does not contrast with sibling 'search_services' or specify when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_order_historyOrder HistoryARead-onlyIdempotentInspect
List past orders with optional filters for status, service, country, and a lookback window in days. Returns up to 50 orders (server cap) ordered most-recent-first.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Optional status filter: "completed", "cancelled", "expired", "sms_received", "waiting" | |
| service | No | Optional service code filter (e.g. "telegram", "whatsapp") | |
| country | No | Optional country ISO code filter (e.g. "US", "GB") | |
| since_days | No | Only include orders from the last N days | |
| limit | No | Max orders to return (default: 20, server cap: 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent. The description adds valuable behavioral details: server cap of 50 orders and most-recent-first ordering. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and filters, then limit and ordering. Every sentence is necessary and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers filters and limit but does not specify the return structure of orders. Since there is no output schema, the agent may need to know what fields each order contains (e.g., order id, status, etc.). A more complete description would mention typical fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description only summarizes the filters (status, service, country, since_days, limit) without adding new meaning beyond what's in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists past orders with optional filters, and mentions the server cap and ordering. However, it does not differentiate from the sibling tool 'virtualsms_list_orders', which may have a similar purpose, thus lacking sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide guidance on when to use this tool vs alternatives (e.g., virtualsms_get_order for a single order). It states optional filters but no when-not-to-use or explicit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_search_servicesSearch Service by NameARead-onlyIdempotentInspect
Find the right service code using natural language. Don't know the exact code? Just search "uber", "binance", "steam" etc. Returns matching services with similarity scores.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language search query (e.g. "uber", "whatsapp", "binance") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds value by stating it returns 'matching services with similarity scores', which provides behavioral context beyond the annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. The purpose is front-loaded, and every sentence contributes meaning. Excellent for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one param, no output schema), the description is complete: it explains what the tool does, when to use it, and what the response contains (matching services with scores). No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter 'query' well-described as 'Natural language search query'. The description reinforces this but adds no new semantic information. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Find the right service code using natural language.' It uses a specific verb ('search') and resource ('service code'), and distinguishes from siblings like virtualsms_list_services by focusing on name-based search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using the tool when the exact code is unknown, with examples like 'uber', 'binance', 'steam'. It does not explicitly list alternatives or when not to use, but the context of sibling tools (e.g., list_services, find_cheapest) provides implicit differentiation. A clear 'when-not' would improve this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_swap_numberSwap Phone NumberAInspect
Swap a phone number on an existing order. Gets a new number for the same service and country without additional charge. Use when the current number isn't receiving SMS. Cooldown: swap is only available 120 seconds after purchase. Check swap_available_at on the order before calling. Calling earlier returns a cooldown_active error from this MCP server (no backend round-trip).
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Order ID to swap — must be in waiting/created status with no SMS received |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behavioral traits beyond annotations: free swap, cooldown period, error scenario (cooldown_active). Annotations indicate non-read-only but description adds richness about conditions and outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: two sentences with main purpose and a separate note for cooldown. Every sentence adds value, no fluff. Information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, usage scenario, preconditions, cooldown, and error handling. Nothing missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter with a description, but the tool description adds critical context: the order must be in waiting/created status with no SMS received. This goes beyond what schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Swap a phone number on an existing order') and the resource ('Gets a new number for the same service and country without additional charge'). It effectively distinguishes from sibling tools like virtualsms_create_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('Use when the current number isn't receiving SMS') and includes a cooldown condition with specific timing (120 seconds) and error handling advice ('Check swap_available_at on the order before calling'). Provides clear guidance on when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
virtualsms_wait_for_smsWait for SMS on Existing OrderARead-onlyIdempotentInspect
Wait (block) until the SMS arrives on an existing order_id, or until timeout. Uses real-time WebSocket delivery with automatic polling fallback. Pass an order_id from create_order. To buy AND wait in one step, call create_order then this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Existing order ID returned from create_order | |
| timeout_seconds | No | How long to wait for SMS in seconds (default: 60, min: 5, max: 600) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the blocking nature, WebSocket delivery with polling fallback, and timeout behavior. This adds significant context beyond annotations (readOnlyHint, idempotentHint) which do not cover blocking behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each essential: purpose, technical details, and integration guidance. No redundancy, front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers the blocking behavior, timeout, and usage sequence. It could mention expected return on success/failure, but is adequate for a simple wait tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the description adds value by specifying that order_id should come from create_order, which is not in the schema. For timeout_seconds, it adds no extra meaning beyond schema defaults, but the overall context is helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool waits (blocks) for an SMS on an existing order_id or until timeout. It distinguishes from siblings by explicitly noting it uses an existing order_id from create_order and is meant for waiting, unlike other tools like get_sms or create_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to pass an order_id from create_order and suggests calling create_order first. It implies usage after order creation but does not explicitly compare with alternatives like get_sms for non-blocking retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
30 tool updates
v1.1.1- Removed
cancel_order - Removed
create_number_order - Removed
find_cheapest_countries - Removed
get_balance - Removed
get_price - Removed
get_sms_code - Removed
list_active_orders - Removed
list_countries - Removed
list_services - Removed
search_services - Removed
swap_phone_number - Added
virtualsms_cancel_all_orders - Added
virtualsms_cancel_order - Added
virtualsms_create_order - Added
virtualsms_find_cheapest - Added
virtualsms_get_balance - Added
virtualsms_get_order - Added
virtualsms_get_price - Added
virtualsms_get_profile - Added
virtualsms_get_sms - Added
virtualsms_get_stats - Added
virtualsms_get_transactions - Added
virtualsms_list_countries - Added
virtualsms_list_orders - Added
virtualsms_list_services - Added
virtualsms_order_history - Added
virtualsms_search_services - Added
virtualsms_swap_number - Added
virtualsms_wait_for_sms - Removed
wait_for_sms_code
12 tool updates
v1.0.8- First observed
cancel_order - First observed
create_number_order - First observed
find_cheapest_countries - First observed
get_balance - First observed
get_price - First observed
get_sms_code - First observed
list_active_orders - First observed
list_countries - First observed
list_services - First observed
search_services - First observed
swap_phone_number - First observed
wait_for_sms_code
TDQS
Each tool targets a specific action or resource with clear boundaries: create, cancel, swap, list, search, get. Overlapping tools like list_orders and order_history are distinguished by active vs past orders. No ambiguity.
All tools follow a consistent 'virtualsms_verb_noun' pattern. Verbs are action-oriented and nouns are descriptive. Minor variations like 'order_history' are still intuitive within the scheme.
18 tools cover the full scope of SMS verification: discovery, purchase, monitoring, cancellation, and account management. The number is well-scoped for a single-purpose API.
The toolset covers the entire lifecycle: searching services/countries, checking prices, creating orders, polling/waiting for SMS, canceling, swapping numbers, and viewing account stats/history. No obvious gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Virtual phone numbers for SMS verification, OTP receipt, and number management.
Hosted MCP server for the Wavix telecom platform: SMS, voice, 2FA, SIP, numbers, 10DLC, CDRs.
MCP server for Vonage API documentation, code snippets, tutorials, and troubleshooting.
WhatsApp (Web + Business API), SMS, contacts, and call records via 2Chat's MCP server.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables browser automation with Puppeteer, supporting navigation, form interactions, and connection to active Chrome instances for comprehensive web page interaction.82,359482MIT
- AlicenseNot gradedqualityFmaintenanceAn implementation of the Model Context Protocol (MCP) server that exposes Twilio APIs to AI assistants and tools, allowing them to interact with Twilio services through the MCP protocol.109MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables browser automation and web interaction through structured accessibility snapshots using Playwright. Provides fast, deterministic web page interaction without requiring screenshots or vision models.5,881,527-
- AlicenseNot gradedqualityDmaintenanceEnables sending SMS text messages through Twilio's messaging service with a simple send_text tool that supports configurable recipients and messaging service integration.80MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/virtualsms-io/mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server