textbee Logotextbee.dev
Plans from $9.99/mo.View Plans
How to Send SMS from Claude with MCP (Claude Desktop, Claude Code, and claude.ai)
mcp
claude
ai-agents
sms-api
automation
tutorial

How to Send SMS from Claude with MCP (Claude Desktop, Claude Code, and claude.ai)

A hands-on guide to sending and reading SMS from Claude Desktop, Claude Code, and claude.ai with the textbee MCP server. Setup, example prompts, delivery checks, reading replies, and guardrails.

TT

textbee team

7 min read
Share

TL;DR

  • Claude can send and read SMS through your own Android phone once you add the textbee MCP server: one config entry, npx -y @textbee/mcp, plus your API key.
  • Works in Claude Code (one command), Claude Desktop (a JSON entry), and claude.ai on the web (the hosted endpoint at mcp.textbee.dev/mcp, since the browser cannot launch a local process).
  • Three tools: send_sms, get_messages, list_devices. The examples below show a send, a delivery check, reading a reply, and reading an OTP.
  • Messages go out from your number, plan limits are enforced on the server, and the key stays in your own client config when you use the local server.

What you need

  1. A textbee account with the Android app installed on a phone you own and paired to the account. The free tier is enough for this guide.
  2. An API key from the dashboard. Create a dedicated one for Claude so you can revoke it on its own later.
  3. Claude Code, Claude Desktop, or a claude.ai account with connectors enabled.

If you have not set up the phone yet, the quickstart takes about five minutes.

Step 1: add the textbee MCP server to Claude

Claude Code

One command registers the server for your user, so it is available in every project:

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

Run claude mcp list to confirm it shows as connected.

Claude Desktop

Open claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json) and add:

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

Restart Claude Desktop. The three textbee tools appear in the tools menu of every new conversation.

If the client times out on the first start (npx downloads the package the first time), install it globally once with npm install -g @textbee/mcp and set "command": "textbee-mcp" with no args.

claude.ai on the web

The browser cannot launch a local process, so use the hosted endpoint: add a custom connector pointing at https://mcp.textbee.dev/mcp, authenticating with your API key as the bearer token (the MCP page has the current per-client steps). Same three tools, same plan limits. Note that with the hosted endpoint your key passes through textbee's server on each request (it is used for that request only and not stored); when you can run npx, the local server is the better choice.

Step 2: send your first message

Ask Claude in plain language:

Send an SMS to +1 555 0134 saying "Build 412 passed, deploying to staging now."

Claude calls send_sms with the recipient in E.164 format (+15550134) and the text. The tool picks the sending phone for you: your default device, otherwise the enabled device that checked in most recently. The result includes an sms_batch_id when your account uses the send queue, which is what the next step uses.

A few things worth knowing about send_sms:

  • Several recipients at once: "text these three numbers the same message" becomes one call with a list of recipients.
  • Pick the phone: if you run more than one gateway phone, ask Claude to send from a specific device; it will call list_devices first and pass the device_id.
  • Dual-SIM: sim_subscription_id selects the SIM on a dual-SIM phone.
  • Schedule: "send this tomorrow at 9am" maps to scheduled_at.

Step 3: check delivery instead of assuming it

This is where an agent beats a fire-and-forget script. Ask:

Was that message delivered?

Claude calls get_messages with the sms_batch_id from the send and reports the per-recipient status (sent, delivered, failed). If a recipient failed, the error text tells Claude whether to retry (a transient device issue) or stop (a quota or permission problem).

Step 4: read replies and verification codes

get_messages reads across every phone on the account, newest first, received messages by default. That enables two patterns:

Wait for a reply.

I texted Sam about tomorrow's 2pm slot. Check whether they replied and tell me what they said.

Claude filters by direction received and a free-text search for Sam's number or name, and reads back the reply.

Read an OTP. Sign up for a service that texts a verification code to your gateway phone's number, then:

A verification code was just sent to my gateway number. Read it and paste it here.

Claude searches recent received messages, finds the six-digit code, and returns it. This is the pattern that turns a gateway phone into a verification inbox for agents that register accounts or log in on your behalf.

For polling over time, get_messages supports cursor pagination, so Claude can ask "anything new since last time?" without missing or repeating a message.

Example: a deploy watcher in Claude Code

A realistic Claude Code session, with the server added in step 1:

Run the production deploy script. When it finishes, text me at +1 555 0134 whether it succeeded or failed, then confirm the text was delivered.

Claude runs the script, calls send_sms with the outcome, then get_messages with the batch id and reports delivered. You walk away from the terminal and still get the result on your phone.

Guardrails

Handing an agent the ability to text people deserves care. What is in place:

  • Plan limits are enforced server-side. A loop that goes wrong cannot outspend your plan; over-quota sends fail with an error Claude is told not to retry.
  • Recipients are validated before a send, and status is reported from the device, not assumed.
  • Your key stays local with the local server; the server talks only to the textbee API and the code is open source.
  • Use a dedicated key for Claude and revoke it in the dashboard if you ever want to cut it off.
  • Keep humans in the loop for bulk. For one-to-many sends to customers, have Claude draft and show the recipient list before sending, and keep the compliance basics in mind.

Self-hosted textbee

If you run your own textbee backend, add one variable and Claude talks to your instance instead of the cloud API:

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

The /api/v1 suffix is added for you, subpath deployments work, and an invalid URL is an error rather than a silent fallback. The hosted endpoint talks to the cloud API only; self-hosted instances use the local server.

Troubleshooting

  • Every call fails with a key error: the TEXTBEE_API_KEY value is missing or revoked. Create a fresh key in the dashboard and restart the client.
  • "No enabled device found": enable a device in the Android app or the dashboard, or ask Claude to list devices and send from a specific one.
  • Claude says the tools are not available: in Claude Desktop, confirm the JSON is valid and restart; in Claude Code, run claude mcp list.
  • Slow first call: npx is downloading the package; install it globally as described above.

Frequently asked questions

Does this work with Cursor or other MCP clients?

Yes. The same config object works in ~/.cursor/mcp.json and in any MCP-compatible client. This guide focuses on Claude because that is where most readers start.

Does Claude need my phone unlocked or the app open?

No. The textbee Android app runs in the background and the backend wakes it over push when there is a message to send. The phone needs power, signal, and SMS permission granted (see the Android 15+ permission guide if the permission is greyed out).

What does it cost per message?

Nothing per message from textbee. Sends count against your plan's quota, and your carrier's SMS plan covers the actual delivery. There is no per-message markup for agent traffic.

Can Claude read messages without sending?

Yes. get_messages does not consume send quota, so a read-only workflow (monitoring a shared inbox, picking up OTPs) costs nothing against the send limit.

Is there an alternative to MCP for automations?

The same account works over plain HTTP for n8n, Make, Zapier, or your own code. The agent quickstart has the endpoints, and the n8n guide covers the no-code path.

Get started

  1. Create a textbee account and pair the Android app.
  2. Add the MCP server with the snippet for your client above.
  3. Ask Claude to text you, then ask whether it was delivered.

The MCP page and the docs have the full reference.