VirtualSMS MCP — SMS Verification for AI Agents
About
VirtualSMS MCP gives AI agents full SMS verification capability: discover prices, buy temporary phone numbers, and receive verification codes in real time via WebSocket push (with polling fallback). It includes 11 MCP tools for search, pricing, purchase, order management, and cod
Details
- Author
- virtualsms-io
- Downloads
- 359
- Categories
- Communication, Other, Productivity, AI
Jump to
- 11 MCP tools for SMS verification
- Real-time SMS delivery via WebSocket with polling fallback
- Operates on own SIM card infrastructure (not a reseller)
- Covers 200+ countries for phone numbers
- Supports migration from SMS-Activate or DaisySMS
- One-step wait_for_code tool buys number and retrieves code
Setting up with Highlight
This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:
- Download and install Highlight from highlightai.com/download
- Navigate to the plugins tab and select "Add Custom Plugin"
-
Configure the plugin with the settings below
Plugin Name
VirtualSMS MCP — SMS Verification for AI AgentsCommand (node, npx, python, etc.)Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.
- Enable "Start Automatically" if you want the plugin to start when Highlight launches
From the repository
Run npx virtualsms-mcp or install globally via npm install -g virtualsms-mcp. Obtain an API key from virtualsms.io and set the VIRTUALSMS_API_KEY environment variable. Configure the MCP client (Claude Desktop, Cursor, etc.) with the command and env variable. The server exposes 11 tools: discovery, account, and order management tools including wait_for_code for one-step SMS retrieval.
virtualsms_list_proxy_catalog
List available proxy pool types, countries, and price-per-GB. Use this before buying proxy traffic.
virtualsms_list_proxies
List all proxies on your account with remaining GB and login credentials. Returns proxy_id values for use with get_proxy_usage, rotate_proxy, set_proxy_targeting, and generate_proxy_endpoint.
virtualsms_buy_proxy
Purchase proxy traffic (GB) for a selected pool type. Returns proxy credentials and remaining balance. country_code here is only a soft preference for provisioning. For actual per-connection targeting (country/state/city/zip/asn) or a ready-to-use connection string, use virtualsms_generate_proxy_endpoint after buying. To persist a default targeting on the sub-user, use virtualsms_set_proxy_targeting.
virtualsms_rotate_proxy
Request a fresh IP for an existing proxy. Useful when an endpoint flags the current exit IP.
virtualsms_get_proxy_usage
Get cached GB used/remaining and request count for one proxy. Cheap, no upstream call. Reads a cached value refreshed every ~5 minutes.
virtualsms_get_proxy_usage_history
Get a per-day traffic (GB) and request-count series for one proxy over the last 7 or 30 days.
virtualsms_set_proxy_targeting
Persist a default geo-targeting (country, and optionally cities/ASNs) on an existing proxy sub-user. Country-only is free. Adding cities or ASNs bills the GB on your OWN allocation at 2x (not on residential_premium, where refined targeting is included free). This changes the STORED default. For a one-off connection string with any targeting (including state/zip), use virtualsms_generate_proxy_endpoint instead.
virtualsms_test_proxy
Make one request through a proxy and report the exit IP, country, city, ISP, and latency. Proves the proxy works and which country it exits from. Consumes a small amount of the proxy's GB allocation. Rate-limited to about once per 20 seconds per proxy.
virtualsms_list_proxy_locations
List available cities, states, ASNs, or ZIP codes for a pool type + country. Use this to discover valid location_code values before calling virtualsms_generate_proxy_endpoint or virtualsms_set_proxy_targeting with sub-country targeting. Public endpoint, no purchase required. Not available for residential_premium (only residential, mobile, datacenter).
virtualsms_generate_proxy_endpoint
Build ready-to-use proxy connection string(s) for an owned proxy: country/state/city/zip/asn targeting, rotating or sticky session, HTTP or SOCKS5, in host:port:user:pass / user:pass@host:port / curl format. Nothing is purchased or changed server-side. This only composes a connection string from the proxy's existing credentials (same convention as the VirtualSMS dashboard's endpoint generator). Sub-country targeting (state/city/zip/asn) bills the proxy's own GB at 2x on non-premium pools, free on residential_premium.
virtualsms_start_manual_registration_session
Beta, invite-only. Start a country-matched cloud browser you drive yourself: returns a viewer_url, an authenticated live-viewer link you open to watch and drive the session (manual takeover), plus optional order phone number and timeline. Agent-driven navigation is the separate opt-in session tools. Pair with create_order for OTP + browser in one agent flow.
virtualsms_list_services
Get all available SMS verification services (Telegram, WhatsApp, Google, etc.). Use this to discover valid service codes before buying a number.
virtualsms_list_countries
Get all available countries for SMS verification. Use this to discover valid country codes before buying a number.
virtualsms_get_price
Check the price and availability for a specific service + country combination. Always check price before buying to confirm availability.
virtualsms_get_balance
Check your VirtualSMS account balance in USD. Requires VIRTUALSMS_API_KEY to be set.
virtualsms_create_order
Purchase a virtual phone number for SMS verification. Returns order_id and phone_number. Codes typically arrive within ~10-60 seconds after purchase. Use get_sms to poll for the verification code, or use wait_for_sms to block until it arrives.
virtualsms_get_sms
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.
virtualsms_cancel_order
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).
virtualsms_wait_for_sms
Wait (block) until the SMS arrives on an existing order_id, or until timeout. Codes typically arrive within ~10-60 seconds. This call BLOCKS for up to timeout_seconds (default 60, max 600) before returning. 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.
virtualsms_find_cheapest
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.
virtualsms_search_services
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.
virtualsms_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. **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).
virtualsms_list_orders
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 get_sms to retrieve codes.
virtualsms_get_order
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 get_sms returns.
virtualsms_cancel_all_orders
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.
virtualsms_order_history
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.
virtualsms_get_stats
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.
virtualsms_get_profile
Full account profile: email, Telegram link status, current balance, lifetime spend, total orders, active API keys, and account creation date.
virtualsms_get_transactions
Transaction history for the account with optional filters for type, date range, and pagination. Types: "deposit", "purchase", "refund", "admin_credit".
virtualsms_rentals_pricing
List all active rental pricing tiers (Full Access tier: local SIM inventory, durations and prices). This is a raw catalog dump and may list rows that are not purchasable today, so confirm against rentals_available (authoritative per country) before creating a rental. Use rentals_price for platform-tier (per-country, per-service) pricing instead.
virtualsms_rentals_available
List countries with rental stock, available counts, and pricing. tier=full_access (default) shows local-SIM inventory; tier=platform shows countries available via our global supplier network (with per-country service counts and popular services). Use this before creating a rental.
virtualsms_rentals_services
List services available for platform-tier rental in a given country, with physical stock counts and retail price. Platform-tier rentals are locked to ONE chosen service per number. Use this to pick a valid service code before creating one.
virtualsms_rentals_price
Get the catalog-driven retail price for a (service, country, duration) platform-tier rental combo.
virtualsms_create_rental
Rent a phone number for an extended period (as opposed to a one-off number via create_order). Two tiers: "full_access" = local SIM inventory, works across ANY service on that number. "platform" = sourced via our global supplier network, locked to ONE chosen service, durations 1/3/7 days only. Both tiers carry the same refund terms: a full refund within 20 minutes of purchase and before the first SMS arrives. Check rentals_available and rentals_price/rentals_pricing first to confirm country/service/duration and cost.
virtualsms_list_rentals
List your rentals across both tiers, optionally filtered by status. Returns rental_id, tier, country, phone number, status, and expiry for each. Use get_rental for full detail on one.
virtualsms_get_rental
Get the full details of a specific rental by ID, including tier, phone number, country, service lock, status, expiry, and any received SMS. Use list_rentals first if you do not have the rental_id.
virtualsms_extend_rental
Extend an active rental by an additional duration. Charges your balance at the current catalog price for that duration.
virtualsms_cancel_rental
Cancel a rental for a full refund. Only eligible within 20 minutes of purchase AND before any SMS has been received. Works for either tier. Past that window a rental runs to its natural expiry.
virtualsms_retry_order
Ask the provider to resend the SMS to the SAME phone number on an existing order (order must be in waiting/created status). Not all order types support this. Some providers only support swap_number instead, which returns a NEW number.
virtualsms_check_number
Public carrier + line-type lookup for an arbitrary E.164 phone number (mobile/landline/VoIP, spam risk). No API key required.
Claude Desktop / Cursor
Paste into your MCP client config file to install this server.
{
"mcpServers": {
"virtualsms mcp \u2014 sms verification for ai agents": {
"virtualsms": {
"command": "npx",
"args": [
"-y",
"virtualsms-mcp"
],
"env": {
"VIRTUALSMS_API_KEY": "vms_your_api_key_here"
}
}
}
}
}
McpServers
{
"virtualsms": {
"command": "npx",
"args": [
"-y",
"virtualsms-mcp"
],
"env": {
"VIRTUALSMS_API_KEY": "vms_your_api_key_here"
}
}
}
Quick links:Quickstart·Why VirtualSMS·What you can build·Tools·Questions·Examples·Changelog·Security policy·Status
VirtualSMS is an account verification platform for developers and AI agents. It combines one-time SMS verification, dedicated number rentals, matching-country proxies and private cloud browser sessions behind one API, one MCP server and one prepaid balance.
Infrastructure for AI agents that need real-world phone verification.
The numbers are carrier-issued mobile numbers, backed by real physical SIM cards on carrier networks, not VoIP, which is why they pass the line-type checks that reject VoIP numbers at signup.
- receive one-time SMS codes from $0.05
- rent dedicated numbers from 1 to 30 days
- buy matching-country residential, mobile and datacenter proxies
- launch private cloud browser sessions that work alongside your number and proxy (beta)
All four work together from one prepaid balance, one API and one dashboard. Use only the pieces you need, or combine them into a single verification workflow.
Most providers solve one piece of the verification workflow. VirtualSMS combines numbers, rentals, proxies and cloud browser sessions behind one API, SDKs and an MCP server, so you use only the pieces you need or combine them into one workflow.
VirtualSMS can be used by individuals manually, integrated into applications with SDKs and APIs, or driven by AI agents through MCP. Use the platform through a REST API, official SDKs for Node, Python, PHP, Ruby and .NET, a hosted MCP server, or automation tools like n8n.
This server exposes that platform to any MCP client. Built for AI agents. Designed for agentic workflows. Works with Claude Code, Claude Desktop, Cursor, Windsurf and every MCP-compatible client, with no wrapper code to write.
Paste this into your MCP client's config. Nothing to install, no Node.js required on the client:
{ "mcpServers": { "virtualsms": { "type": "streamableHttp", "url": "https://mcp.virtualsms.io/mcp", "headers": { "x-api-key": "vsms_your_api_key_here" } } } }
Get an API key atvirtualsms.io. Then ask your agent:
"Buy me a Telegram number in the cheapest country and wait for the code."
Prefer to run it locally over stdio instead:
Verifying an account should not mean stitching together numbers from one provider, proxies from another, and browser sessions from a third: multiple accounts, multiple balances and APIs, and support spread across vendors. VirtualSMS brings those pieces together behind one balance, one API and one MCP server.
VirtualSMS combines all three under one account, and gives you one way to drive them:
- Carrier-issued mobile numbers.Backed by real physical SIM cards, not VoIP, so they resolve as mobile at signup.
- Matching-country proxies.Residential, mobile and datacenter pools, so the number and the IP agree.
- Private cloud browser sessions.Beta.
- REST API.Documented atvirtualsms.io/docs.
- Hosted MCP server.This repo, live athttps://mcp.virtualsms.io/mcp.
- One prepaid balance.Verification, rentals and proxies all draw from it.
Concrete jobs this server does today. Every one is a plain-English request your agent turns into tool calls:
Runnable versions of the first two live inexamples/.
Every client runs the samenpx virtualsms-mcpstdio command. Only the file location and format differ. The hosted config above works anywherestreamableHttpis supported and is the recommended path.
Edit~/Library/Application Support/Claude/claude_desktop_config.json(macOS) or%APPDATA%\Claude\claude_desktop_config.json(Windows):
{ "mcpServers": { "virtualsms": { "command": "npx", "args": ["virtualsms-mcp"], "env": { "VIRTUALSMS_API_KEY": "vsms_your_api_key_here" } } } }
Quit and reopen Claude Desktop. A drop-in config plus a worked transcript lives inexamples/03-claude-desktop-config/.
claude mcp add --scope user virtualsms npx virtualsms-mcp -e VIRTUALSMS_API_KEY=vsms_your_api_key_here
{ "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" } } } }
{ "mcpServers": { "virtualsms": { "command": "npx", "args": ["virtualsms-mcp"], "env": { "VIRTUALSMS_API_KEY": "vsms_your_api_key_here" } } } }
[mcp_servers.virtualsms] command = "npx" args = ["virtualsms-mcp"] env = { VIRTUALSMS_API_KEY = "vsms_your_api_key_here" }
{ "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" } } }
{ "context_servers": { "virtualsms": { "command": { "path": "npx", "args": ["virtualsms-mcp"], "env": { "VIRTUALSMS_API_KEY": "vsms_your_api_key_here" } } } } }
mcpServers: - name: virtualsms command: npx args: - virtualsms-mcp env: VIRTUALSMS_API_KEY: vsms_your_api_key_here
Yes, via ChatGPT's Developer Mode. Open Settings, turn on Developer mode, then addhttps://mcp.virtualsms.io/mcpas a custom connector (Plus, Pro, Business, Enterprise and Edu plans; not available on the free tier). Setup is a URL paste rather than a config file, so it differs from the client setups above. ChatGPT only connects to remote MCP servers over SSE or streaming HTTP, so use the hosted endpoint, not the local stdio command. TheREST APIis still there if you would rather build a custom GPT or Action instead.
40 tools by default. SetVIRTUALSMS_ENABLE_SESSIONS=1to expose 3 more.
Tool names are shown below without thevirtualsms_prefix for readability. The real wire names are prefixed:virtualsms_create_order,virtualsms_get_sms, and so on.
The core SMS verification surface: discover a service, price it, buy a number, get the code.
get_smsvswait_for_sms:wait_for_smsis the recommended default for interactive agent workflows. It blocks and returns the moment the SMS arrives over WebSocket. Useget_smsfor batch jobs, cron-driven polling, or when you already manage your own polling loop.
wait_for_smstakes anorder_id, not a service and country.Callcreate_orderfirst, then pass the returnedorder_id. That is the two-step buy-and-wait flow.
Keep a number by the day instead of buying a single verification. Two tiers:
- Full Access:local SIM inventory, for a whole number that works across any service. Every country in stock today lists 1, 7 and 30 days, at prices that vary per country. Durations and prices are not hardcoded here on purpose: callrentals_availablefor the live list per country and treat that as authoritative.
- Platform:sourced via our global supplier network, locked to one chosen service, durations of 1, 3 or 7 days. Callrentals_pricefor the exact retail price of a (service, country, duration) combo.
Stock, durations and pricing all differ per tier and per country, so callrentals_availablebefore committing to either. An active rental can be extended withextend_rentalat the current catalog price, in the same durations its tier allows.
Both tiers carry the same refund terms: cancel for a full refund within 20 minutes of purchase and before the first SMS arrives. Platform cancels are additionally subject to a 2 minute minimum hold, so a cancel inside the first 2 minutes is rejected and has to be retried.
Matching-country proxies, so the number and the IP agree. Three pools: residential, mobile and datacenter. Buy traffic by the GB, then generate a connection string.
Beta, invite-only.The browser stack is early. It works, but the shape of these tools can still change and there is no stability guarantee yet. Joinhttps://t.me/VirtualSMS_iofor beta access and updates.
Served only whenVIRTUALSMS_ENABLE_SESSIONSis set to1,trueoryes. Not exposed on the default surface.
create_order(service: "telegram", country: "US") → {order_id: "abc123", phone_number: "+14155552671", status: "pending"} wait_for_sms(order_id: "abc123", timeout_seconds: 180) → {success: true, code: "12345", delivery_method: "websocket", elapsed_seconds: 8}
find_cheapest(service: "telegram", limit: 3) → {cheapest_options: [{country: "PK", price_usd: 0.05, ...}]} create_order(service: "telegram", country: "PK") wait_for_sms(order_id: "abc123")
swap_number(order_id: "abc123") → {order_id: "def456", phone_number: "+628...", status: "waiting"}
rentals_available(tier: "full_access") → countries holding local SIM stock, each with its own duration and price list create_rental(tier: "full_access", country: "FR", duration_hours: 720) → {rental_id: "rnt_1", phone_number: "+33...", expires_in_days: 30}
Stock is per country and per tier, so discover first and rent second.rentals_available(tier: "platform")covers a different, service-locked catalogue.
Pair a number with a matching-country proxy
list_proxy_catalog() buy_proxy(pool_type: "residential", gb: 1, country_code: "GB") generate_proxy_endpoint(proxy_id: "px_1", country_code: "GB", protocol: "socks5")
What is account verification infrastructure?
Account verification infrastructure is the stack that gets a real account through a signup flow that demands a phone number. It has five layers, and a gap in any one of them fails the whole chain:
- Numbers.A carrier-issued mobile line, because the line type gets checked.
- SMS.The verification code, delivered to that number and readable by software rather than by a human holding a handset.
- Proxy.An IP in the same country as the number, so the two agree.
- Browser.A clean environment to drive the signup itself.
- Automation.An API or an agent that runs the chain end to end, unattended.
Most providers sell the first two layers and leave you to source the rest, which is exactly where the number, the IP and the browser stop telling the same story. VirtualSMS provides the infrastructure behind all five.
VirtualSMS is an account verification platform for individuals, developers, and AI agents. It combines one-time SMS verification, dedicated number rentals, matching-country proxies, and private cloud browser sessions behind one API, one MCP server, and one prepaid balance.
What is an MCP server for SMS verification?
MCP (Model Context Protocol) is an open standard that lets an AI client call external tools. An MCP server for SMS verification exposes phone-number and verification-code operations as tools an agent can call directly, so the agent buys the number, waits for the code and reads it back without any glue code from you. This repo is that server for VirtualSMS: 40 tools covering verification, rentals and proxies. If you are not driving an agent at all, the same operations are available as a plain REST verification API.
Honest answers, so you do not waste an afternoon:
- You need to send SMS.This platform receives; it does not send. Use a messaging provider such as Twilio.
- You need a permanent number for your business.Verification numbers are temporary by design, and rentals run in days, not years. Buy a real line from a carrier.
- You need codes on a number you already own.There is no port-in. The numbers come from our inventory.
- You are running A2P marketing campaigns.Wrong tool entirely.
- You are trying to evade a platform's terms of service.Whether your use complies with the terms of the service you verify against is your responsibility, not ours.
Can Claude or Cursor receive SMS verification codes?
Yes, through this server. Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Zed, Continue.dev, Codex, OpenClaw and Hermes are all MCP clients, and each one is a config paste away (seeClient setup). Once installed, "buy a Telegram number and wait for the code" is a request the agent can carry out end to end. ChatGPT can reach it too, through Developer Mode custom connectors (seeDoes this work with ChatGPT?), or through theREST APIif you would rather not enable Developer Mode.
How do AI agents receive OTP codes automatically?
Two tool calls.create_orderbuys a number for a given service and country and returns anorder_id.wait_for_smsthen blocks on thatorder_idand returns the moment the code arrives, pushed over WebSocket, typically in 2 to 15 seconds. The agent never polls, never sleeps in a loop, and never needs a human to read a phone. If you would rather drive your own loop,get_smspolls a single order instead.
Twilio is a full communications platform: send and receive SMS and voice, long-lived numbers, A2P campaigns, the lot. VirtualSMS does one job, which is receiving verification codes on demand. The practical differences:
- Line type.Twilio numbers are VoIP. Many services reject VoIP numbers at signup. VirtualSMS numbers are real physical SIM cards on carrier networks, so they resolve as mobile.
- Pricing shape.Twilio bills you for a number every month whether you use it or not. VirtualSMS bills per code from $0.05, with no subscription.
- Direction.Twilio sends and receives. This receives.
If you need to send messages, use Twilio. If you need to receive a verification code, this is purpose-built for it.
Why real physical SIM cards instead of VoIP?
Verification systems check the line type of the number you give them. VoIP numbers are cheap and disposable at scale, so they correlate with fraud, and a large share of services reject them outright at signup. Real physical SIM cards sit on carrier networks and resolve as mobile, which is exactly what those checks are looking for: a non-VoIP number that behaves like a real handset.
You do not have to take that on faith.check_numberruns a carrier and line-type lookup on any E.164 number, needs no API key, and will tell you whether a number reads as mobile, landline or VoIP.
Developers searching fortextverified mcp,sms-activate mcp,5sim mcp,daisysms mcporsmspool mcpare usually asking one question: which SMS verification provider can an AI agent drive natively? This section answers that without a scoreboard.
VirtualSMSpublishes this MCP server, so any MCP client calls it directly with no wrapper code: 40 tools, 2500+ services, 145+ countries, from $0.05 per code, on real physical SIM cards, plus number rentals and matching-country proxies from the same balance.
SMS-Activateshut down in December 2025. If your integration pointed there, it is gone, and the migration is a new API key and a new base URL rather than a rewrite: the shape of the job, buy a number then read the code, is the same here.
TextVerified,5SIM,DaisySMSandSMSPoolare all active SMS verification providers, each with its own API, pricing, coverage and terms. Check their current documentation for what they offer today.
We deliberately do not publish a comparison table of competitors' prices, service counts or coverage. Those numbers move week to week, we have no privileged view into anyone else's inventory, and a stale table dressed up as research is worse than no table at all. The VirtualSMS numbers above are ours and we stand behind them. Compare them against whatever you are using now.
wait_for_smsuses a two-tier delivery system:
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





