Skip to main content
Glama
platfone-com

Platfone MCP - Receive SMS & Virtual Numbers

by platfone-com

Platfone MCP Server

npm version npm downloads License: MIT Smithery

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 — stdio and http from a single codebase

  • API 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/mcp

Agent Guidelines

  • Always call check_price first to verify cost and availability

  • Then call order_number to rent a number

  • Call check_sms until SMS is received or expired

  • Use retry_activation if no SMS arrives

  • Use cancel_activation to release funds if no longer needed

Tools

Tool

Description

get_balance

Check account balance: total, reserved, and available funds.

check_price

Check pricing and availability for a country + service pair before ordering.

order_number

Order a virtual phone number. Accepts names ("Israel") or IDs ("il"). Returns activation_id + phone.

check_sms

Poll activation state. Returns SMS code when received, or current status with polling instructions.

retry_activation

Request another SMS on the same number. Free of charge.

cancel_activation

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 SMS

Optional 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

UnauthorizedException

Check your PLATFONE_API_KEY is valid

PaymentRequiredException

Top up your Platfone balance

NoNumbersAvailableException

Try a different country or service

TooManyRequestsException

Rate limited — wait and retry

MaxPriceExceededException

Retry order_number with the suggested max_price and returned order_id

TooManyActivationsException

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 tools
cancel_activationCancel ActivationA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
activation_idYesActivation ID to cancel.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countryYesCountry name or ID (e.g. 'us', 'United Kingdom').
serviceYesService category name or ID from the Platfone catalog.
max_priceNoOptional budget limit in USD cents. A warning is shown if the suggested price exceeds this.

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
activation_idYesActivation ID returned by order_number.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/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, 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countryYesCountry name or ID (e.g. 'us', 'United Kingdom').
serviceYesService category name or ID from the Platfone catalog.
max_priceNoMaximum price in USD cents you're willing to pay. Protects against price changes.
quality_factorNoQuality vs price preference: 0 = cheapest, 50 = balanced (default), 100 = highest quality.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/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 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
activation_idYesActivation ID to retry.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

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

Usage Guidelines5/5

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.

  1. 2 tool updatesv1.1.8
    • Addedget_balance
    • Addedorder_number
  2. 2 tool updatesv1.1.7
    • Removedget_balance
    • Removedorder_number
  3. 6 tool updatesv1.1.6
    • First observedcancel_activation
    • First observedcheck_price
    • First observedcheck_sms
    • First observedget_balance
    • First observedorder_number
    • First observedretry_activation

TDQS

A4.5/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: cancel activation, check price, check SMS, get balance, order number, and retry activation. No overlap in functionality.

Naming Consistency5/5

All tools follow the snake_case verb_noun pattern (e.g., cancel_activation, check_price), which is consistent and predictable.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP 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 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Gives 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.
    15
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Connect 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.
    4
    MIT