Sendblue
Open source · MIT license · MCP server

SMS/iMessage for
AI agents.

Your agent sends campaign messages and checks for replies. No webhooks. No exposed endpoints. No security risk. Just secure API polling.

View on GitHub

Why not webhooks?

Traditional webhook approaches require exposing your machine to the internet — via ngrok, Tailscale, or a public server. That's an attack surface on the machine where your credentials, code, and agent memory live.

No exposed services
Your machine makes outbound HTTPS calls only. Nothing listens. Nothing is reachable from the internet.
No infrastructure
No ngrok. No Tailscale Funnel. No webhook receiver. No static IP needed. Works from anywhere.
Polling is enough
Campaign responses take hours or days. Checking every few minutes is fast enough. Zero complexity for the same result.

What it looks like

Send a message
send_sms(number="+15551234567", content="Campaign message here")
→ {"status": "QUEUED", "message_handle": "35d2bd01..."}
Check for replies
list_messages(is_outbound=False, limit=10)
→ [{"content": "Interested!", "from_number": "+15551234567", ...}]
Check iMessage support
evaluate_service_type(number="+15551234567")
→ {"number": "+15551234567", "service": "iMessage"}
Get your contacts
get_contacts()
→ [{"name": "alice", "number": "+15551234567"}, {"name": "bob", "number": "+15559998888"}]

End-to-end: a sales campaign

Monday — Campaign launch
# Agent sends 50 outreach messages
for contact in campaign_list:
    send_sms(number=contact.phone, content=personalized_message)
Tuesday — Check responses
# Different session, different agent
replies = list_messages(is_outbound=False, limit=50)
# 12 replies, 3 interested, 9 opt-outs

No webhook setup. No public endpoints. No ngrok. Just secure API polling.

How it works

Sendblue MCP is a FastMCP server backed by httpx for async API calls. Your agent talks to the MCP server. The MCP server talks to Sendblue over HTTPS. Nothing listens. Nothing is exposed.

Agent → MCP Server (FastMCP) → Sendblue API (HTTPS)
  • 01 Credentials stored locally in ~/.keys/sendblue.json (mode 0600)
  • 02 All API calls are outbound-only HTTPS — nothing inbound, nothing exposed
  • 03 Five tools: send, list messages, get contacts, check delivery status, evaluate iMessage support
  • 04 Works with Windsurf, Claude Desktop, or any MCP-compatible client

Install

Clone and install
$ git clone https://github.com/jackccrawford/sendblue-mcp.git
$ cd sendblue-mcp
$ poetry install --no-root
Configure credentials
// ~/.keys/sendblue.json
{
  "api_key": "your_sendblue_api_key",
  "secret_key": "your_sendblue_secret_key",
  "from_number": "+15559876543",
  "contacts": { "alice": "+15551234567" }
}

Get credentials from Sendblue Dashboard

Add to Claude Desktop
// claude_desktop_config.json
{
  "mcpServers": {
    "sendblue": {
      "command": "poetry",
      "args": ["-C", "/path/to/sendblue-mcp", "run", "python", "src/server.py"]
    }
  }
}

Built on Sendblue

Sendblue provides the SMS/iMessage API infrastructure — message delivery, phone number management, iMessage detection, and delivery status tracking. This MCP server is an open-source wrapper that connects your AI agent to their API using secure polling.

You'll need a Sendblue account and API credentials to use this tool. This project is not affiliated with Sendblue — it's an independent open-source MCP server built on their public API.

Your agent needs to
reach people.

Secure SMS/iMessage. No webhooks. No attack surface.

View on GitHub

MIT License · Python · FastMCP · Works with Claude Desktop & Windsurf