Sparetext

AI agents

Let Claude, ChatGPT and other agents text from your phone.

What this does

When you ask Claude or ChatGPT to text someone, it sends the text from your phone, and it can read the texts you get back. It can text any number you ask it to, and it asks you before each text goes out. You add Sparetext once, as a "custom connector" in Claude or ChatGPT: copy the address below, then follow the steps for your app.

You need a plan that allows custom connectors. On Claude, every plan does (the free plan allows one). On ChatGPT, it depends on your plan and workspace.

Your connection address

Live
https://sparetext.dev/mcp
You sign in with your Sparetext account, or use a key An MCP server: works with Claude, ChatGPT and Cursor
For apps that can't sign in, make a key and we'll put it into the setup steps.Create a free account
Tools your agent gets
  • send_smsSend a text to one or more numbers
  • wait_for_replyWait a few seconds for a reply or a code
  • get_conversationRead the thread with one number
  • list_conversationsWho texted, with unread counts
  • mark_readClear the unread count for a number
  • list_messagesSearch sent and received texts
  • get_messageCheck one text's status
  • cancel_textStop a text that hasn't gone out yet
  • list_devicesWhich phones are online, and how they send
  • get_statsTotals for the last N days

claude.ai, Claude Desktop and the Claude apps

  1. 1Open Customize › Connectors and choose Add custom connector.
  2. 2Paste the server URL. Leave the OAuth client fields empty.
    https://sparetext.dev/mcp
  3. 3Click Add, then Connect. A Sparetext page opens: sign in and choose Allow. If Claude asks how to sign in, pick Sign in now and Use Claude's published identity.
  4. 4In a chat, open + › Connectors, turn on Sparetext, and ask: “Text +44 7700 900124 that I'm running 10 minutes late.”

Claude asks before each send. The Free plan allows one custom connector. On Team and Enterprise plans an Owner adds it first, under Organization settings › Connectors.

Claude Code

Terminal
claude mcp add --transport http --scope user \
  sparetext https://sparetext.dev/mcp
claude mcp login sparetext

The login opens a Sparetext page: choose Allow. Inside Claude Code, /mcp does the same. Or skip the browser and pass a key:

Terminal
claude mcp add --transport http --scope user \
  sparetext https://sparetext.dev/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

As a plugin (custom MCP server)

  1. 1On the web, open chatgpt.com/plugins, select +, then Add custom MCP server.
  2. 2Name it Sparetext, paste the Server URL and set Authentication to OAuth:
    https://sparetext.dev/mcp
  3. 3Select I understand and want to continue, then Create as a plugin. When ChatGPT sends you to Sparetext, sign in and choose Allow.
  4. 4Install the plugin from your plugins. In a new chat, type @, pick Sparetext and ask it to send or read a text. ChatGPT asks you to confirm each send.

Your plan and workspace settings decide whether you can add custom MCP servers. After we add tools, open the plugin and choose Refresh.

Custom GPTs

OpenAI retires custom GPTs on December 11, 2026, and their Actions don't carry over to plugins. Connect Sparetext as a plugin instead. Other tools can still import our OpenAPI spec.

Cursor

Add Sparetext to ~/.cursor/mcp.json (or .cursor/mcp.json in a project). Cursor signs you in with OAuth: choose Allow on the Sparetext page.

mcp.json
{
  "mcpServers": {
    "sparetext": {
      "url": "https://sparetext.dev/mcp"
    }
  }
}

Or use a key from your environment, so it never sits in the file:

mcp.json
{
  "mcpServers": {
    "sparetext": {
      "url": "https://sparetext.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${env:SPARETEXT_API_KEY}"
      }
    }
  }
}

Other MCP clients

Most take the same URL and sign in with OAuth, or send the header Authorization: Bearer YOUR_API_KEY.

Clients that only take a URL

Put the key in the address. Treat this URL like a password: anyone with it can text from your phone.

https://sparetext.dev/mcp/k/YOUR_API_KEY

Local stdio clients

Bridge with mcp-remote:

claude_desktop_config.json
{
  "mcpServers": {
    "sparetext": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://sparetext.dev/mcp",
        "--header",
        "Authorization: Bearer YOUR_API_KEY"
      ]
    }
  }
}

Connect the MCP server

  1. 1Save your key in the Gateway's env file, add the server, and restart:
    Terminal
    echo 'SPARETEXT_API_KEY=YOUR_API_KEY' >> ~/.openclaw/.env
    openclaw mcp set sparetext '{"url":"https://sparetext.dev/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer ${SPARETEXT_API_KEY}"}}'
    openclaw gateway restart
  2. 2Check it answers: openclaw mcp doctor sparetext --probe
  3. 3Ask your agent: “text +44 7700 900124 that the build passed.”

To sign in with OAuth instead, set "auth": "oauth" in place of the header, stop the Gateway and run openclaw mcp login sparetext.

Or install the Sparetext skill

Download the skill and unzip it into ~/.openclaw/skills, so you have sparetext/SKILL.md. It reads SPARETEXT_API_KEY and uses the sparetext command when it's installed (it ships in the Mac download), or curl.

Terminal
sparetext login YOUR_API_KEY --server https://sparetext.dev
sparetext send --to +44 7700 900124 --text "Build passed"
sparetext wait --contact +44 7700 900124 --timeout 120

Start a new session (/new) or restart the Gateway so it loads.

Give an n8n AI Agent the tools

Add an MCP Client Tool to the agent. Endpoint: the MCP URL. Server Transport: HTTP Streamable. Authentication: MCP OAuth2 to sign in, or Bearer Auth with an API key.

Send from a workflow

Add an HTTP Request step:

HTTP request
POST https://sparetext.dev/api/v1/messages
x-api-key: YOUR_API_KEY
content-type: application/json

{"to": "+44 7700 900124", "text": "Order #1042 has shipped"}

Start a workflow when a text arrives

Use a Webhook trigger in your tool, then add its URL on the Webhooks page with the Text received event. Every delivery is signed. In n8n, check it in a Code node right after the trigger:

Code node (JavaScript)
const crypto = require('crypto');
const secret = 'YOUR_WEBHOOK_SECRET'; // from Sparetext › Webhooks
const { headers, body } = $input.first().json;
const sig = Object.fromEntries(String(headers['x-sparetext-signature'] ?? '').split(',').map((p) => p.split('=')));
const expected = crypto.createHmac('sha256', secret).update(`${sig.t}.${JSON.stringify(body)}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(sig.t)) < 300;
if (!fresh || String(sig.v1).length !== expected.length || !crypto.timingSafeEqual(Buffer.from(String(sig.v1)), Buffer.from(expected))) {
  throw new Error('This request did not come from Sparetext.');
}
return $input.all();

Self-hosted n8n needs NODE_FUNCTION_ALLOW_BUILTIN=crypto. The signature is t=<unix seconds>,v1=<hex HMAC-SHA256> over <t>.<body>. Sparetext signs compact JSON, so re-serializing the parsed body gives back the exact bytes.

Zapier and Make

To react to texts, use Webhooks by Zapier › Catch Hook or Make's Custom webhook as the trigger, and add that URL on the Webhooks page as above. To send, add Zapier's Webhooks by Zapier › POST or Make's HTTP › Make a request step with the request on the left.

Agents send texts to real people from your number. Each connection gets its own key, listed on API keys, where you can cut it off at any time.