VirtualSMS MCP Server
VirtualSMS MCP Server — SMS Verification for AI Agents
Ranked #1 in both ChatGPT's and Perplexity's SMS verification MCP categories · verified 2026-04-25
VirtualSMS MCP Server gives AI agents real SIM-card phone numbers (not VoIP) across 145+ countries and 2000+ services for SMS verification and OTP receiving. Built on the Model Context Protocol. One install, 18 tools, works with every major MCP client.
Powered by VirtualSMS.io — a phone verification service running on owned modem infrastructure.
Quick Install — Hosted (recommended, zero install)
Paste this into your AI assistant's MCP config:
{
"mcpServers": {
"virtualsms": {
"type": "streamableHttp",
"url": "https://mcp.virtualsms.io/mcp",
"headers": {
"x-api-key": "vsms_your_api_key_here"
}
}
}
}No npm install, no Node.js required on the client. The MCP server runs at mcp.virtualsms.io.
Related MCP server: Twilio MCP Server
Quick Install — Local (stdio via npm)
npx virtualsms-mcpOr install globally:
npm install -g virtualsms-mcpGet your API key at virtualsms.io.
What is VirtualSMS?
VirtualSMS.io is a temporary phone number API for SMS verification built on real SIM cards, not VoIP. Unlike resellers that aggregate other providers, VirtualSMS operates its own modem infrastructure — giving agents direct access to authentic mobile numbers across 145+ countries.
Use it to verify accounts on WhatsApp, Telegram, Google, Instagram, Uber, and 2000+ other services — programmatically, via REST API, WebSocket, or MCP.
Why VirtualSMS?
Real SIM cards, not VoIP — Accepted where VoIP numbers get blocked (WhatsApp, Google, banking).
Own infrastructure — Not a reseller. Physical modems, 2000+ services, 145+ countries (growing weekly).
Real-time delivery — WebSocket push means your agent gets the code in seconds, not minutes.
Competitive pricing — Starting from $0.02 per number.
Simple REST + WebSocket API — Clean, documented, agent-friendly.
18 MCP tools — Discovery, account, and full order management — including unique tools like
find_cheapest,search_service,swap_number, andwait_for_code.10 MCP clients supported — Claude Desktop, Claude Code, Cursor, Windsurf, OpenClaw, Codex, Hermes, Cline, Zed, Continue.
Migrating from SMS-Activate?
If you're moving away from SMS-Activate, VirtualSMS is a straightforward alternative with broader service coverage (2000+ vs ~500), competitive pricing, and a modern API built for programmatic use.
Just swap your API key and update the base URL — the concepts (buy number → wait for SMS → get code) are identical.
👉 Sign up at VirtualSMS.io and get started in minutes.
Configuration
All 10 clients use the same npx virtualsms-mcp stdio command. Only the config file location and format differ.
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"
}
}
}
}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_hereEnvironment Variables
Variable | Required | Default | Description |
| Yes (for auth tools) | — | Your VirtualSMS API key |
| No |
| API base URL |
Does this work with ChatGPT?
Not natively — ChatGPT uses GPT Actions, a different protocol than MCP. For ChatGPT, build a custom GPT that calls the VirtualSMS REST API directly. For MCP, use any of the 10 clients above (Claude, Cursor, Codex, Hermes, etc.).
Tools (18 total)
⭐ = unique to VirtualSMS — no other SMS MCP server ships these.
# | Tool | Category | Auth | Description |
1 |
| Discovery | No | List all available SMS verification services |
2 |
| Discovery | No | List all available countries for verification |
3 |
| Discovery | No | Check pricing and availability for a service in a country |
4 |
| Discovery | No | Find the cheapest countries for a given service, sorted by price |
5 |
| Discovery | No | Natural-language search over available services |
6 |
| Account | Yes | Check current account balance in USD |
7 |
| Account | Yes | Full account profile — email, Telegram link, balance, lifetime spend, total orders, active API keys |
8 |
| Account | Yes | Usage stats — orders count, success rate, spend, status/service/country breakdown |
9 |
| Account | Yes | Transaction history with type, date range, and pagination filters |
10 |
| Orders | Yes | Purchase a virtual phone number for verification |
11 |
| Orders | Yes | Poll an active order. Returns current SMS state — use for batch/cron jobs or manual polling loops |
12 |
| Orders | Yes | Full order details + all received messages |
13 |
| Orders | Yes | Cancel an order (refund if no SMS received) |
14 |
| Orders | Yes | Bulk cancel every currently active order |
15 |
| Orders | Yes | List all currently active orders |
16 |
| Orders | Yes | Past orders with status, service, country, and date filters |
17 |
| Orders | Yes | Exchange number for another without extra charge |
18 |
| Orders | Yes | WebSocket-backed wait (instant delivery). Returns as soon as SMS arrives — use for interactive agent flows |
check_smsvswait_for_code:wait_for_codeis the recommended default for interactive agent workflows — it blocks and returns on SMS arrival via WebSocket. Usecheck_smsfor batch jobs, cron-driven polling, or when you already manage your own polling loop.
Tool names above are shown without the
virtualsms_prefix for readability. Actual MCP tool names arevirtualsms_list_services,virtualsms_get_order, etc.list_active_ordersis registered asvirtualsms_list_orders.
Discovery Tools (no auth required)
list_services
Get all available SMS verification services.
list_services()
→ [{code: "telegram", name: "Telegram"}, ...]list_countries
Get all available countries for phone verification.
list_countries()
→ [{iso: "US", name: "United States"}, ...]check_price
Check price and availability for a service + country combination.
check_price(service: "telegram", country: "US")
→ {price_usd: 0.15, available: true}find_cheapest ⭐
Find cheapest countries for a service, sorted by price.
find_cheapest(service: "telegram", limit: 5)
→ {cheapest_options: [{country: "PK", price_usd: 0.05, ...}], total_available_countries: 23}search_service ⭐
Find the right service code using natural language.
search_service(query: "uber")
→ {matches: [{code: "uber", name: "Uber", match_score: 1.0}]}Account Tools (API key required)
get_balance
Check your account balance.
get_balance()
→ {balance_usd: 5.00}get_profile
Full account profile: email, Telegram link status, current balance, lifetime spend, total orders, active API key count, and account creation date.
get_profile()
→ {
id: "…uuid…",
email: "you@example.com",
telegram_linked: true,
telegram_username: "you_tg",
balance_usd: 5.00,
total_spent_usd: 27.45,
total_credits_usd: 10.00,
total_orders: 42,
active_api_keys: 2,
created_at: "2025-11-03T14:22:07Z"
}get_stats
Aggregated usage stats computed from your order history: total orders, success rate, total spend, status breakdown, top services and top countries over a configurable lookback window.
get_stats()
get_stats(since_days: 7)
→ {
window_days: 30,
balance_usd: 5.00,
total_orders: 42,
successful_orders: 37,
success_rate: 88.1,
total_spend_usd: 6.24,
status_breakdown: { sms_received: 37, cancelled: 3, waiting: 2 },
top_services: [{ key: "telegram", count: 18 }, ...],
top_countries: [{ key: "US", count: 14 }, ...]
}get_transactions
Transaction history with filters for type, date range, and pagination. Types: deposit, purchase, refund, admin_credit.
get_transactions()
get_transactions(type: "deposit", from: "2026-04-01", limit: 20)
→ {
count: 3,
limit: 50,
offset: 0,
filters: { type: "deposit", from: "2026-04-01" },
transactions: [
{ id: "…", amount: 10.00, type: "deposit", balance_before: 0.00, balance_after: 10.00, created_at: "…" },
...
]
}Order Management Tools (API key required)
buy_number
Purchase a virtual phone number for a specific service and country.
buy_number(service: "telegram", country: "US")
→ {order_id: "abc123", phone_number: "+14155552671", expires_at: "...", status: "pending"}check_sms
Poll an active order for received SMS. Use for batch jobs, cron-driven polling, or when you already manage your own polling loop. For interactive agent flows, prefer wait_for_code (WebSocket-backed, returns on arrival).
check_sms(order_id: "abc123")
→ {status: "sms_received", phone_number: "+14155552671", sms_code: "12345", sms_text: "Your code is 12345"}get_order
Full order detail — service, country, price, timestamps, status, and any received SMS code/text. Use when you need more than check_sms returns, or when restoring state for a known order_id.
get_order(order_id: "abc123")
→ {
order_id: "abc123",
phone_number: "+14155552671",
service: "telegram",
country: "US",
price: 0.15,
status: "sms_received",
sms_code: "12345",
sms_text: "Your Telegram code: 12345",
created_at: "2026-04-24T10:15:33Z",
expires_at: "2026-04-24T10:35:33Z"
}cancel_order
Cancel an order and request a refund (only if no SMS received yet). 2-minute minimum wait after purchase.
cancel_order(order_id: "abc123")
→ {success: true, refunded: true}cancel_all_orders
Bulk-cancel every currently active order in your account. Returns counts plus per-order success/failure detail. Useful for cleaning up after a batch or test session.
cancel_all_orders()
→ {
cancelled: 3,
failed: 0,
total_active: 3,
cancelled_orders: [{ order_id: "abc123", refunded: true }, ...]
}list_active_orders
List your active orders. Essential for crash recovery. Registered as virtualsms_list_orders.
list_active_orders()
list_active_orders(status: "pending")
→ {count: 2, orders: [{order_id: "abc123", phone_number: "+14155552671", status: "pending", ...}]}Optional status filter: "pending", "sms_received", "cancelled", "completed".
order_history
Past orders with optional filters for status, service, country, and a lookback window in days. Most recent first, up to 50 rows (server cap).
order_history(since_days: 7)
order_history(status: "completed", service: "telegram", limit: 10)
→ {
count: 10,
total_matched: 18,
filters: { status: "completed", service: "telegram", since_days: null },
orders: [{ order_id: "...", service: "telegram", country: "US", status: "completed", price: 0.15, created_at: "..." }, ...]
}swap_number ⭐
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. 2-minute minimum wait after purchase.
swap_number(order_id: "abc123")
→ {order_id: "def456", phone_number: "+628...", service: "telegram", country: "ID", status: "waiting"}wait_for_code ⭐ Recommended
One-step tool: buys a number AND waits for the SMS code. Uses WebSocket for instant delivery with automatic polling fallback. Recommended default for interactive agent workflows.
wait_for_code(service: "telegram", country: "US")
wait_for_code(service: "whatsapp", country: "PK", timeout_seconds: 180)
→ {
success: true,
phone_number: "+14155552671",
sms_code: "12345",
sms_text: "Your Telegram code: 12345",
order_id: "abc123",
delivery_method: "websocket",
elapsed_seconds: 8
}On timeout, returns order_id for recovery:
→ {success: false, error: "timeout", order_id: "abc123", phone_number: "...", tip: "Use check_sms..."}How It Works
WebSocket vs Polling
wait_for_code uses a two-tier delivery system:
WebSocket (instant) — connects to
wss://virtualsms.io/ws/orders?order_id=xxx&api_key=your_keyimmediately after purchase. When the SMS arrives, the server pushes it in real-time. Typical delivery: 2–15 seconds.Polling fallback — if WebSocket fails to connect or disconnects, automatically falls back to polling
GET /api/v1/order/{id}every 5 seconds.
The delivery_method field in the response tells you which was used.
Architecture
AI Agent (Claude / Cursor / Codex / Windsurf / any MCP client)
│
▼ MCP stdio protocol
VirtualSMS MCP Server (this package)
│
├──► REST API: https://virtualsms.io/api/v1/
│ buy_number, check_sms, cancel_order, get_balance ...
│
└──► WebSocket: wss://virtualsms.io/ws/orders
real-time SMS push deliveryTypical Workflows
Simple: Get a Telegram verification code
wait_for_code(service: "telegram", country: "US")Budget: Find cheapest option first
find_cheapest(service: "telegram", limit: 3)
# → picks cheapest country
wait_for_code(service: "telegram", country: "PK")Manual: Step by step
buy_number(service: "google", country: "GB")
# → order_id: "abc123", phone: "+447911123456"
# Use the number to trigger the SMS, then:
check_sms(order_id: "abc123")
# Number not working? Swap for a new one (no extra charge):
swap_number(order_id: "abc123")
# or cancel if no longer needed:
cancel_order(order_id: "abc123")Crash Recovery
If your session is interrupted mid-verification:
Restart the MCP server
List active orders:
list_active_orders(status: "pending")Check for codes:
check_sms(order_id: "abc123")Cancel if not needed:
cancel_order(order_id: "abc123")
wait_for_code always returns order_id even on timeout — use it to recover.
License
MIT — See LICENSE
Built with love by VirtualSMS.io — virtual phone numbers for SMS verification, built on owned SIM-card infrastructure. 2000+ services · 145+ countries · 18 MCP tools · 10 clients · Ranked #1 on both ChatGPT and Perplexity.
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