Server data from the Official MCP Registry
Real SIM phone numbers for AI agents. 145+ countries, 2000+ services. #1 on ChatGPT and Perplexity.
Real SIM phone numbers for AI agents. 145+ countries, 2000+ services. #1 on ChatGPT and Perplexity.
Remote endpoints: streamable-http: https://mcp.virtualsms.io/mcp
Valid MCP server (1 strong, 1 medium validity signals). 7 known CVEs in dependencies (0 critical, 5 high severity) Package registry verified. Imported from the Official MCP Registry.
3 files analyzed · 8 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: VIRTUALSMS_API_KEY
Available as Local & Remote
This plugin can run on your machine or connect to a hosted endpoint. during install.
From the project's GitHub README.
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.
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: "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_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.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.