Skip to main content
Glama
virtualsms-io

VirtualSMS MCP Server

VirtualSMS MCP Server — SMS Verification for AI Agents

npm version License: MIT GitHub Stars

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.


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-mcp

Or install globally:

npm install -g virtualsms-mcp

Get 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, and wait_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_here

Cursor

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_here

Environment Variables

Variable

Required

Default

Description

VIRTUALSMS_API_KEY

Yes (for auth tools)

Your VirtualSMS API key

VIRTUALSMS_BASE_URL

No

https://virtualsms.io

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

list_services

Discovery

No

List all available SMS verification services

2

list_countries

Discovery

No

List all available countries for verification

3

check_price

Discovery

No

Check pricing and availability for a service in a country

4

find_cheapest

Discovery

No

Find the cheapest countries for a given service, sorted by price

5

search_service

Discovery

No

Natural-language search over available services

6

get_balance

Account

Yes

Check current account balance in USD

7

get_profile

Account

Yes

Full account profile — email, Telegram link, balance, lifetime spend, total orders, active API keys

8

get_stats

Account

Yes

Usage stats — orders count, success rate, spend, status/service/country breakdown

9

get_transactions

Account

Yes

Transaction history with type, date range, and pagination filters

10

buy_number

Orders

Yes

Purchase a virtual phone number for verification

11

check_sms

Orders

Yes

Poll an active order. Returns current SMS state — use for batch/cron jobs or manual polling loops

12

get_order

Orders

Yes

Full order details + all received messages

13

cancel_order

Orders

Yes

Cancel an order (refund if no SMS received)

14

cancel_all_orders

Orders

Yes

Bulk cancel every currently active order

15

list_active_orders

Orders

Yes

List all currently active orders

16

order_history

Orders

Yes

Past orders with status, service, country, and date filters

17

swap_number

Orders

Yes

Exchange number for another without extra charge

18

wait_for_code

Orders

Yes

WebSocket-backed wait (instant delivery). Returns as soon as SMS arrives — use for interactive agent flows

check_sms vs wait_for_code: wait_for_code is the recommended default for interactive agent workflows — it blocks and returns on SMS arrival via WebSocket. Use check_sms for 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 are virtualsms_list_services, virtualsms_get_order, etc. list_active_orders is registered as virtualsms_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:

  1. WebSocket (instant) — connects to wss://virtualsms.io/ws/orders?order_id=xxx&api_key=your_key immediately after purchase. When the SMS arrives, the server pushes it in real-time. Typical delivery: 2–15 seconds.

  2. 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 delivery

Typical 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:

  1. Restart the MCP server

  2. List active orders: list_active_orders(status: "pending")

  3. Check for codes: check_sms(order_id: "abc123")

  4. 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 tools
virtualsms_cancel_all_ordersCancel All Active OrdersA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 OrderA
DestructiveIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesOrder ID to cancel

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceYesService code (e.g. "telegram", "whatsapp", "google")
countryYesCountry ISO code (e.g. "US", "GB", "RU")

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 CountriesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceYesService code (e.g. "telegram", "whatsapp", "google")
limitNoNumber of cheapest options to return (default: 5)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 BalanceA
Read-onlyIdempotent
Inspect

Check your VirtualSMS account balance in USD. Requires VIRTUALSMS_API_KEY to be set.

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNoDisplay balance in specific currency (default: USD)

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 DetailsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesOrder ID to retrieve full details for

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 PriceA
Read-onlyIdempotent
Inspect

Check the price and availability for a specific service + country combination. Always check price before buying to confirm availability.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceYesService code (e.g. "telegram", "whatsapp", "google")
countryYesCountry ISO code (e.g. "US", "GB", "RU")

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ProfileA
Read-onlyIdempotent
Inspect

Full account profile: email, Telegram link status, current balance, lifetime spend, total orders, active API keys, and account creation date.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 CodeA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesOrder ID returned from buy_number

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StatsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
since_daysNoWindow in days for activity stats (default: 30)

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 HistoryB
Read-onlyIdempotent
Inspect

Transaction history for the account with optional filters for type, date range, and pagination. Types: "deposit", "purchase", "refund", "admin_credit".

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by type: "deposit", "purchase", "refund", "admin_credit"
fromNoLower bound on created_at — RFC3339 or YYYY-MM-DD
toNoUpper bound on created_at — RFC3339 or YYYY-MM-DD
limitNoMax transactions (1-200, default: 50)
offsetNoPagination offset (default: 0)

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 CountriesA
Read-onlyIdempotent
Inspect

Get all available countries for SMS verification. Use this to discover valid country codes before buying a number.

ParametersJSON Schema
NameRequiredDescriptionDefault
serviceNoFilter countries available for a specific service (optional)

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 OrdersA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOptional status filter: "pending", "sms_received", "cancelled", "completed"

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ServicesA
Read-onlyIdempotent
Inspect

Get all available SMS verification services (Telegram, WhatsApp, Google, etc.). Use this to discover valid service codes before buying a number.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFilter services by name (optional)

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 HistoryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOptional status filter: "completed", "cancelled", "expired", "sms_received", "waiting"
serviceNoOptional service code filter (e.g. "telegram", "whatsapp")
countryNoOptional country ISO code filter (e.g. "US", "GB")
since_daysNoOnly include orders from the last N days
limitNoMax orders to return (default: 20, server cap: 50)

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 NameA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesNatural language search query (e.g. "uber", "whatsapp", "binance")

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesOrder ID to swap — must be in waiting/created status with no SMS received

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 OrderA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesExisting order ID returned from create_order
timeout_secondsNoHow long to wait for SMS in seconds (default: 60, min: 5, max: 600)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 30 tool updatesv1.1.1
    • Removedcancel_order
    • Removedcreate_number_order
    • Removedfind_cheapest_countries
    • Removedget_balance
    • Removedget_price
    • Removedget_sms_code
    • Removedlist_active_orders
    • Removedlist_countries
    • Removedlist_services
    • Removedsearch_services
    • Removedswap_phone_number
    • Addedvirtualsms_cancel_all_orders
    • Addedvirtualsms_cancel_order
    • Addedvirtualsms_create_order
    • Addedvirtualsms_find_cheapest
    • Addedvirtualsms_get_balance
    • Addedvirtualsms_get_order
    • Addedvirtualsms_get_price
    • Addedvirtualsms_get_profile
    • Addedvirtualsms_get_sms
    • Addedvirtualsms_get_stats
    • Addedvirtualsms_get_transactions
    • Addedvirtualsms_list_countries
    • Addedvirtualsms_list_orders
    • Addedvirtualsms_list_services
    • Addedvirtualsms_order_history
    • Addedvirtualsms_search_services
    • Addedvirtualsms_swap_number
    • Addedvirtualsms_wait_for_sms
    • Removedwait_for_sms_code
  2. 12 tool updatesv1.0.8
    • First observedcancel_order
    • First observedcreate_number_order
    • First observedfind_cheapest_countries
    • First observedget_balance
    • First observedget_price
    • First observedget_sms_code
    • First observedlist_active_orders
    • First observedlist_countries
    • First observedlist_services
    • First observedsearch_services
    • First observedswap_phone_number
    • First observedwait_for_sms_code

TDQS

A4.2/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables browser automation with Puppeteer, supporting navigation, form interactions, and connection to active Chrome instances for comprehensive web page interaction.
    8
    2,359
    482
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables sending SMS text messages through Twilio's messaging service with a simple send_text tool that supports configurable recipients and messaging service integration.
    80
    MIT

Latest Blog Posts

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