loading…
Search for a command to run...
loading…
Receive SMS verification codes with AI agents. Get virtual phone numbers for WhatsApp, Telegram, Google, and 500+ services. Own modem infrastructure across 200+
Receive SMS verification codes with AI agents. Get virtual phone numbers for WhatsApp, Telegram, Google, and 500+ services. Own modem infrastructure across 200+ countries with real-time WebSocket delivery. 12 tools for number discovery, purchase, and code extraction.
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.
npx virtualsms-mcp
Or install globally:
npm install -g virtualsms-mcp
Get your API key at virtualsms.io.
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.
find_cheapest, search_service, swap_number, and wait_for_code.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.
All 10 clients use the same npx virtualsms-mcp stdio command. Only the config file location and format differ.
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 mcp add --scope user virtualsms npx virtualsms-mcp -e VIRTUALSMS_API_KEY=vsms_your_api_key_here
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}
Edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}
Edit ~/.openclaw/mcp.json:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}
Edit ~/.codex/config.toml:
[mcp_servers.virtualsms]
command = "npx"
args = ["virtualsms-mcp"]
env = { VIRTUALSMS_API_KEY = "vsms_your_api_key_here" }
Edit your Hermes MCP config:
{
"mcpServers": {
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}
Open the Cline MCP settings panel and add:
{
"virtualsms": {
"command": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
Edit ~/.config/zed/settings.json:
{
"context_servers": {
"virtualsms": {
"command": {
"path": "npx",
"args": ["virtualsms-mcp"],
"env": {
"VIRTUALSMS_API_KEY": "vsms_your_api_key_here"
}
}
}
}
}
Edit ~/.continue/config.yaml:
mcpServers:
- name: virtualsms
command: npx
args:
- virtualsms-mcp
env:
VIRTUALSMS_API_KEY: vsms_your_api_key_here
| 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 |
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.).
⭐ = 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_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.
list_servicesGet all available SMS verification services.
list_services()
→ [{code: "telegram", name: "Telegram"}, ...]
list_countriesGet all available countries for phone verification.
list_countries()
→ [{iso: "US", name: "United States"}, ...]
check_priceCheck 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}]}
get_balanceCheck your account balance.
get_balance()
→ {balance_usd: 5.00}
get_profileFull 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: "[email protected]",
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_statsAggregated 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_transactionsTransaction 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: "…" },
...
]
}
buy_numberPurchase 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_smsPoll 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_orderFull 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_orderCancel 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_ordersBulk-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_ordersList 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_historyPast 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 ⭐ RecommendedOne-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..."}
wait_for_code uses a two-tier delivery system:
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.
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.
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
wait_for_code(service: "telegram", country: "US")
find_cheapest(service: "telegram", limit: 3)
# → picks cheapest country
wait_for_code(service: "telegram", country: "PK")
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")
If your session is interrupted mid-verification:
list_active_orders(status: "pending")check_sms(order_id: "abc123")cancel_order(order_id: "abc123")wait_for_code always returns order_id even on timeout — use it to recover.
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.
Add this to claude_desktop_config.json and restart Claude Desktop.
{
"mcpServers": {
"virtualsms-io-mcp-server": {
"command": "npx",
"args": []
}
}
}Read, send and search emails from Claude
Send, search and summarize Slack messages
No-code MCP client for team chat platforms, such as Slack, Microsoft Teams, and Discord.
A community discord server dedicated to MCP by [Frank Fiegel](https://github.com/punkpeye)