
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.
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
- 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.
- An API key from the dashboard. Create a dedicated one for Claude so you can revoke it on its own later.
- 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:
claude mcp add textbee -s user -e TEXTBEE_API_KEY=your-key -- npx -y @textbee/mcpRun 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:
{
"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_devicesfirst and pass thedevice_id. - Dual-SIM:
sim_subscription_idselects 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:
"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_KEYvalue 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:
npxis 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
- Create a textbee account and pair the Android app.
- Add the MCP server with the snippet for your client above.
- Ask Claude to text you, then ask whether it was delivered.
You may also like

Give Your AI Agent a Phone Number: Send SMS from Claude with MCP
The textbee MCP server lets Claude, Cursor, and any MCP-enabled agent send and read SMS through your own Android phone. Setup in two minutes, open source, no per-message markup.

How to Receive SMS and Process Webhooks with textbee
Set up inbound SMS webhooks with textbee. Payload structure, signature verification, Node.js and Python handler examples, STOP keyword handling, OTP reply capture, and local testing with ngrok.

n8n SMS Integration with textbee: Automate SMS Without Code
Send SMS from n8n workflows using textbee and your Android phone as the gateway. HTTP Request node config, workflow patterns, expressions, and a full open-source self-hosted stack guide.