Platfone MCP - Receive SMS & Virtual Numbers
The Platfone MCP server enables AI agents to rent virtual phone numbers and receive SMS messages for account verification, testing, and automation workflows. It uses human-friendly inputs for countries and services (auto-resolved server-side) and authenticates via an API key.
get_balance: Check your total, reserved, and available funds (in USD cents).check_price: Look up pricing, availability, and quality score for a country + service pair before ordering.order_number: Rent a virtual phone number for a given country and service (e.g., "Israel" + "Telegram"). Returns the number, activation ID, price, expiry, and cancellation details.check_sms: Poll an activation for incoming SMS — retrieves message content, parsed verification code, and status. Can be polled repeatedly until an SMS arrives or the activation expires.retry_activation: Request an additional SMS on the same number, free of charge, if the first didn't arrive or a new code is needed.cancel_activation: Cancel an active order before an SMS is received to release reserved funds back to your balance.
Provides virtual phone numbers for Telegram account verification and SMS reception, allowing AI agents to automate registration and testing workflows.
Platfone MCP Server
Platfone provides virtual phone numbers for account verification, testing, and automation workflows. The Platfone MCP server enables AI agents to obtain temporary numbers and receive SMS messages from MCP-compatible clients like Claude, VS Code Copilot, Codex, etc.
📖 Docs · 🔧 Setup Guide · 🔑 Get API Key · 📦 npm
Why MCP?
Instead of manually integrating the API, AI agents can:
Order numbers autonomously by country and service name
Wait for SMS codes
Retry or cancel activations
All via structured tool calls — no custom backend required.
Related MCP server: agentline-mcp
Features
Full activation lifecycle — from ordering a number to receiving SMS
ETag-cached catalog — countries and services are cached in-memory with 5-minute TTL and ETag-based conditional refresh — never sent to the agent
Human-friendly inputs — use "Israel" or "Telegram" instead of IDs; names are auto-resolved server-side
Dual transport —
stdioandhttpfrom a single codebaseAPI key auth — works with your existing Platfone API key
Installation
See the full Installation Guide for detailed instructions.
Quick Start
NPM:
PLATFONE_API_KEY=your_key npx @platfone/mcpAgent Guidelines
Always call
check_pricefirst to verify cost and availabilityThen call
order_numberto rent a numberCall
check_smsuntil SMS is received or expiredUse
retry_activationif no SMS arrivesUse
cancel_activationto release funds if no longer needed
Tools
Tool | Description |
| Check account balance: total, reserved, and available funds. |
| Check pricing and availability for a country + service pair before ordering. |
| Order a virtual phone number. Accepts names ("Israel") or IDs ("il"). Returns |
| Poll activation state. Returns SMS code when received, or current status with polling instructions. |
| Request another SMS on the same number. Free of charge. |
| Cancel an active activation before SMS is received. Refunds reserved amount. |
Note: Country and service catalogs are cached server-side and auto-resolved from human-readable names. The agent never receives the full catalog — only resolved IDs or disambiguation hints.
Typical AI Agent Flow
1. check_price (country: "Israel", service: "Telegram") → verify cost & availability
2. order_number (country: "Israel", service: "Telegram") → returns activation_id + phone
3. check_sms (activation_id) → poll or check once for SMSOptional steps:
retry_activation— request another SMS on the same number (free)cancel_activation— cancel before SMS arrives (refunds balance)
Development
Read the full Development Guide for setup instructions and testing tips.
Troubleshooting
Error | Solution |
| Check your |
| Top up your Platfone balance |
| Try a different country or service |
| Rate limited — wait and retry |
| Retry |
| Max concurrent active activations reached — cancel or wait for expiry |
License
See LICENSE.md. Licensed under the MIT License.
Use of the Platfone API is subject to Terms of Service and Privacy Policy.
Available Tools
6 toolscancel_activationCancel ActivationADestructiveInspect
Cancel a Platfone activation and release the phone number. Allowed when activation_status is "active", sms_status is "smsRequested", and the cancelable_after timestamp has passed. If cancelable_after is null, cancellation is not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| activation_id | Yes | Activation ID to cancel. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true and readOnlyHint=false. The description adds context about the prerequisites and what happens (number release), aligning with annotations and providing useful behavioral detail beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, front-loaded with the key action and conditions. Every sentence provides essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one parameter, no output schema. The description covers purpose, conditions, and a special case. It does not mention response format or errors, but for a cancellation tool with clear conditions, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter activation_id is fully described in the schema (100% coverage). The description adds no additional meaning beyond what the schema already provides, meeting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Cancel') and the resource ('a Platfone activation and release the phone number'). It distinguishes from sibling tools (check_price, check_sms, etc.) which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies explicit conditions for when cancellation is allowed (activation_status, sms_status, cancelable_after). It does not explicitly name alternatives but provides clear prerequisites, giving an agent good guidance on when to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_priceCheck PriceARead-onlyIdempotentInspect
Check pricing for a country + service pair before ordering. Returns min, max, and suggested price, average quality score, and number of available phone numbers. Use this before order_number to verify cost and availability. Accepts country and service as human-readable names or IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| country | Yes | Country name or ID (e.g. 'us', 'United Kingdom'). | |
| service | Yes | Service category name or ID from the Platfone catalog. | |
| max_price | No | Optional budget limit in USD cents. A warning is shown if the suggested price exceeds this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds the return values and the optional max_price trigger, but does not go beyond that to add major behavioral context. Adequate but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are direct and front-loaded with the core purpose. No unnecessary words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully explains the return values (min, max, suggested price, quality score, count) and the optional price warning. This is comprehensive for a check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 3 parameters, but the description adds significant value: it clarifies that country and service can be human-readable names or IDs (schema only shows maxLength), and explains the optional max_price triggers a warning. This exceeds schema info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it checks pricing for a country+service pair before ordering, lists the return values (min, max, suggested price, quality score, count), and distinguishes from the sibling tool order_number by saying to use it before ordering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use before order_number to verify cost and availability, and mentions that it accepts human-readable names or IDs. Could be slightly more specific about when not to use, but overall clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_smsCheck SMSARead-onlyIdempotentInspect
Retrieve the current state of a Platfone activation: SMS text, parsed code, status, and expiration. Can be used to poll periodically or check once on demand.
| Name | Required | Description | Default |
|---|---|---|---|
| activation_id | Yes | Activation ID returned by order_number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, destructiveHint, idempotentHint. Description adds value by stating it retrieves state and is suitable for polling, confirming non-destructive and idempotent behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the purpose and usage, with no redundant or unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, outcome fields, and usage pattern. Missing explicit return structure, but sufficient given simplicity and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with parameter 'activation_id' already described as 'Activation ID returned by order_number.' Description adds no further parameter-specific detail, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves current state of a Platfone activation, listing specific fields (SMS text, parsed code, status, expiration). This specificity distinguishes it from sibling tools like cancel_activation (destructive) or check_price (pricing).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly mentions polling periodically or checking once on demand, providing clear usage context. However, it does not explicitly exclude other scenarios or compare to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceGet BalanceARead-onlyIdempotentInspect
Returns the current Platfone account balance: total available funds and the amount reserved by active orders. All values are in USD cents. Use this after a 402 error to inform the user how much they need to top up.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, non-destructive, idempotent, and openWorld. Description adds valuable context about the currency unit (USD cents) and that reserved amounts are included. No contradictions, but further details on caching or latency are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The main purpose is front-loaded, followed by a targeted usage hint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool, the description fully explains what is returned and its context, making it complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so the baseline of 4 applies. The description does not need to add parameter info, and it correctly omits none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns the Platfone account balance with total available funds and reserved amount, which is specific and distinct from sibling tools that deal with orders, activations, and SMS checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises use after a 402 error to inform users about needed top-up, providing clear when-to-use guidance with a concrete scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
order_numberOrder NumberAInspect
Rent a virtual phone number via the Platfone API for the given country and service category. Returns phone number, activation_id, resolved country & service names, price, expiry time, retriable flag, and whether/when the activation can be canceled. Accepts country and service as human-readable names or IDs — names are auto-resolved from the cached catalog. Use check_price first to verify cost and availability. Use check_sms with the activation_id to poll for incoming SMS. Only received messages are billed. IMPORTANT: Only call this tool once per order. Never call it multiple times in parallel — duplicate orders will be rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| country | Yes | Country name or ID (e.g. 'us', 'United Kingdom'). | |
| service | Yes | Service category name or ID from the Platfone catalog. | |
| max_price | No | Maximum price in USD cents you're willing to pay. Protects against price changes. | |
| quality_factor | No | Quality vs price preference: 0 = cheapest, 50 = balanced (default), 100 = highest quality. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that only received messages are billed, lists return fields (phone number, activation_id, etc.), and warns about duplicate rejection. Annotations do not contradict; description adds valuable behavioral context beyond readOnlyHint/destructiveHint flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (a few sentences) and well-structured: starts with main purpose, lists return fields, explains parameter flexibility, gives usage guidance, notes billing, and ends with an important warning. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description thoroughly enumerates return fields and provides context on pricing, expiration, and cancellation. It also references prerequisite (check_price) and follow-up (check_sms) tools, making the tool's role in the workflow clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning: explains auto-resolution of names from cached catalog, that max_price protects against price changes, and that quality_factor defaults to 50 (balanced). This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (rent), the resource (virtual phone number), and the context (via Platfone API for given country and service category). It distinguishes from sibling tools by referencing check_price and check_sms for related tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'Use check_price first to verify cost and availability' and 'Use check_sms with the activation_id to poll for incoming SMS'. Warns against duplicate calls with 'Only call this tool once per order. Never call it multiple times in parallel — duplicate orders will be rejected.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_activationRetry ActivationAInspect
Request an additional SMS on the same Platfone number. Overwrites the previous SMS data with the next message. Free of charge. Only possible when sms_status is "smsReceived" or "retryReceived", activation_status is "active", and is_retriable is true. After calling, poll check_sms every 5 seconds until sms_status becomes "retryReceived" or the activation expires.
| Name | Required | Description | Default |
|---|---|---|---|
| activation_id | Yes | Activation ID to retry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds critical behavioral context beyond annotations: 'Overwrites the previous SMS data with the next message.' This explains the side effect of overwriting. Annotations indicate readOnlyHint=false, which aligns with the write operation described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (4 sentences), front-loaded with the purpose, and every sentence adds value. It efficiently covers purpose, prerequisites, behavior, and follow-up steps without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, the description is fully complete. It explains what the tool does, when to use it, its side effects, and how to handle the response via polling. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single parameter activation_id, so the description does not need to add much. It adds context about when the parameter is valid, but that is more about usage guidelines than parameter semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Request an additional SMS on the same Platfone number.' It specifies the verb (request) and the resource (additional SMS), and differentiates from sibling tools like cancel_activation or check_sms by focusing on retrying an activation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit conditions for use: 'Only possible when sms_status is "smsReceived" or "retryReceived", activation_status is "active", and is_retriable is true.' It also includes post-call instructions to poll check_sms every 5 seconds, making the tool's usage very clear.
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.
2 tool updates
v1.1.8- Added
get_balance - Added
order_number
2 tool updates
v1.1.7- Removed
get_balance - Removed
order_number
6 tool updates
v1.1.6- First observed
cancel_activation - First observed
check_price - First observed
check_sms - First observed
get_balance - First observed
order_number - First observed
retry_activation
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: cancel activation, check price, check SMS, get balance, order number, and retry activation. No overlap in functionality.
All tools follow the snake_case verb_noun pattern (e.g., cancel_activation, check_price), which is consistent and predictable.
With 6 tools, the set is well-scoped for the domain of receiving SMS via virtual numbers, covering ordering, checking, retrying, canceling, and balance/price queries.
Core lifecycle operations are present, but missing an explicit tool to list supported countries/services. However, the tools accept names directly, reducing the gap.
Maintenance
Related MCP Connectors
Communication stack for AI agents: SMS, AI voice calls, phone numbers, and account events.
Real SIM numbers for AI agents: SMS verification, rentals, proxies, cloud browser, x402 deposits.
Give your AI agents a real WhatsApp number to send and receive messages.
Give AI agents a phone number. Voice calls, SMS, and phone number management for MCP clients.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for provisioning dedicated real-SIM US phone numbers, receiving inbound SMS, and extracting OTP codes. Built for AI agents automating phone verification workflows.31 npm1MIT
- AlicenseAqualityCmaintenanceGives AI agents phone numbers, email, SMS, and voice calls as MCP tools, enabling them to provision numbers, capture 2FA codes, send messages, and make calls.15MIT
- AlicenseNot gradedqualityAmaintenanceConnect AI agents to Wavix's communications platform to send SMS, make and manage voice calls, run 2FA flows, and access speech analytics, phone number management, and SIP infrastructure.4MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage phone numbers, send/receive SMS, and place voice calls through natural language, connecting to the phone network via the AgentPhone API.281 npm124MIT