mcpField
T
textbee SMS

textbee SMS

Local
textbee.devCommunication1Updated 1d ago

About textbee SMS

@textbee/mcp connects MCP clients to textbee.dev, letting them send and read SMS through a paired Android phone and its number. It supports hosted or local use and can target self-hosted textbee instances.

Key features

  1. 01Send SMS to one or more recipients
  2. 02Read and filter message history
  3. 03Check device status and message counts
  4. 04Paginate message polling
  5. 05Configure self-hosted instances

Use cases

  1. 01Sending an SMS from an MCP client
  2. 02Checking delivery status for a sent batch
  3. 03Searching received messages across devices

MCP support

This MCP server exposes `send_sms`, `get_messages`, and `list_devices` to connected MCP clients. It supports a hosted remote endpoint or local stdio setup, and can connect to a self-hosted textbee instance.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"textbee": {
"command": "npx",
"args": [
"-y",
"@textbee/mcp"
],
"env": {
"TEXTBEE_API_KEY": "<TEXTBEE_API_KEY>",
"TEXTBEE_BASE_URL": "<TEXTBEE_BASE_URL>"
}
}
}
}
Run commandnpx -y @textbee/mcp
Environment variables to set
TEXTBEE_API_KEYSecretAPI key from the textbee dashboard (app.textbee.dev/dashboard).
TEXTBEE_BASE_URLSelf-hosted instance URL. Defaults to https://api.textbee.dev; the /api/v1 suffix is added automatically.

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npm@textbee/mcp0.1.0

Tools

3

Saved tool list · updated today

ParameterTypeRequiredDescription
messagestringYesThe SMS body, plain text. Long messages are split into segments by the carrier and each segment counts against the quota; the result reports the segment count.
device_idstringNoWhich registered phone sends the message. Omit in almost every case and let textbee choose. Pass it only when the user asks for a specific phone. Ids come from list_devices.
recipientsarrayYesPhone numbers in international E.164 format including the country code, for example ["+15550100123"]. Each recipient counts as one message. The plan caps how many recipients one send may have; the server rejects the send beyond it.
scheduled_atstringNoISO 8601 timestamp to send later instead of now, for example 2026-09-01T14:30:00Z. Must be in the future, and requires the account's server to have queueing enabled. Omit to send immediately.
sim_subscription_idintegerNoWhich SIM sends on a dual-SIM phone. The server does not validate this: a wrong value is silently ignored and the phone default SIM is used. The id is shown in the textbee Android app.

Details

From the project README

@textbee/mcp

npm version CI license

MCP server for textbee.dev, the open source SMS gateway that turns an Android phone into an SMS API. Gives Claude, Cursor, and any MCP client the ability to send and read SMS through your own phone and your own number.

Three tools, no per-message markup, works with self-hosted textbee instances.

Setup

You need a textbee account with a paired Android device and an API key from the dashboard. The key has full account access; treat it like a password.

claude.ai, Claude Desktop, and the Claude mobile apps (no install)

These use the hosted endpoint at https://mcp.textbee.dev/mcp, which runs the same tools from this package.

  1. In claude.ai or Claude Desktop, open Customize, then Connectors, then + Add and Add custom connector.
  2. Enter the name textbee and the URL https://mcp.textbee.dev/mcp, then click Continue twice.
  3. Choose Sign in now, leave the OAuth client on the recommended option, and click Add.
  4. Paste your API key on the textbee sign-in page and click Connect.

One connection works on the web, in Claude Desktop, and in the Claude mobile apps (the mobile apps cannot add connectors themselves). On Team and Enterprise plans, an owner adds the connector for the organization first. It lasts 90 days, then Claude asks you to reconnect. textbee checks the key and does not store it, but the key does pass through textbee's server. Revoke the key in the dashboard to disconnect. To keep the key on your machine, use the local setup below.

Claude Code

Local, with the key in your own config:

claude mcp add textbee -s user -e TEXTBEE_API_KEY=your-key -- npx -y @textbee/mcp

Or hosted, signing in with your key in the browser:

claude mcp add --transport http -s user textbee https://mcp.textbee.dev/mcp

Then run /mcp in Claude Code, select textbee, and choose Authenticate.

Claude Desktop (local)

Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json), then restart Claude Desktop:

{
  "mcpServers": {
    "textbee": {
      "command": "npx",
      "args": ["-y", "@textbee/mcp"],
      "env": { "TEXTBEE_API_KEY": "your-key" }
    }
  }
}
Cursor

The same object in ~/.cursor/mcp.json. Clients that support remote servers with headers can use https://mcp.textbee.dev/mcp instead and send the key as x-textbee-api-key or Authorization: Bearer <key>.

Full setup guide: textbee.dev/docs/agents/mcp.

Slow first start

npx downloads the package on first run. If your client times out waiting, install globally once and point the config at the binary:

npm install -g @textbee/mcp
{ "mcpServers": { "textbee": { "command": "textbee-mcp", "env": { "TEXTBEE_API_KEY": "your-key" } } } }

Tools

send_sms

Send an SMS to one or more recipients (E.164 format, for example +15550100123). The sending phone is chosen automatically: your default device, otherwise the enabled device with the most recent heartbeat. Optional device_id, sim_subscription_id, and scheduled_at. Returns an sms_batch_id for delivery checks when the account uses the SMS queue.

get_messages

Read messages across every device on the account. Defaults to received messages, newest first. Filter by direction (received, sent, all), free-text search, sms_batch_id (per-recipient delivery status of a send), device_ids, and a from/to time window. Supports cursor pagination for polling without duplicates or gaps.

list_devices

The phones on the account: ids, enabled state, which one sends by default, last check-in, and message counts.

Self-hosted textbee

Point the server at your own instance:

"env": {
  "TEXTBEE_API_KEY": "your-key",
  "TEXTBEE_BASE_URL": "https://sms.example.com"
}

The /api/v1 suffix is optional and added automatically. Subpath deployments like https://example.com/textbee work too. An invalid URL is an error rather than a silent fallback, so a typo never sends your key to the public API.

Environment variables

VariableRequiredDefaultPurpose
TEXTBEE_API_KEYyesnoneAPI key from the textbee dashboard
TEXTBEE_BASE_URLnohttps://api.textbee.devYour instance's URL when self-hosting
TEXTBEE_TIMEOUT_MSno30000Per-request timeout in milliseconds

Notes

  • Your key stays on your machine: this server talks only to the textbee API at the base URL above.
  • Sends count against your textbee plan quota, and the plan's rate limits apply server-side.
  • All diagnostics go to stderr; stdout is reserved for the MCP protocol.

Using it as a library

The package also exports its tool definitions for embedding in another MCP host (this is how the hosted remote endpoint reuses them):

import { createTextbeeMcpServer, staticCredentials, loadConfig } from '@textbee/mcp'

const server = createTextbeeMcpServer({
  credentials: staticCredentials(loadConfig(process.env)),
})

Credentials are resolved per tool call, so a multi-tenant host can inject a different key per request. See credentialsFromAuthInfoExtra.

License

MIT. Part of the textbee project.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.