AI agents (MCP)
Let Claude, Cursor or another AI agent send SMS and OTPs, and read your messages, prices and balance, through the Model Context Protocol (MCP).
https://api.siellabs.com/mcpAn agent connects in one of two ways. It can sign in: you approve it in the web app, and choose what it may do. Or it can use one of your API keys, as your own code does. Either way, every tool is an API request: the same checks, limits and prices as the endpoint behind it. The server speaks MCP over HTTP (Streamable HTTP), with no sessions.
Connect by signing in#
Add the server to your agent with the address above and no key. When you connect, the agent opens the web app: sign in as you always do, tick what the agent may do, and approve.
- Send messages: send SMS, charged to your balance.
- OTP: send and check one-time codes.
- Read: messages, the balance, prices and sender IDs.
The agent then shows on the API keys page as a connected app. Change what it may do there, or disconnect it. Its sign-in renews itself every hour; if it goes unused for 30 days, approve it again. Your account's users get an email each time an app is connected.
Claude (claude.ai and Claude Desktop)#
In Settings, Connectors, add a custom connector with the address https://api.siellabs.com/mcp, then connect it and approve it. Connectors added on claude.ai work in Claude Desktop and the mobile apps too.
ChatGPT#
Add a custom connector (in Settings, Apps and Connectors, with developer mode on) with the address https://api.siellabs.com/mcp and OAuth as its authentication, then connect it and approve it.
Claude Code#
claude mcp add --transport http --scope user siel https://api.siellabs.com/mcpThen type /mcp in Claude Code, pick siel and choose Authenticate.
Connect with an API key#
For agents that can send a header, and for one that should keep working without anyone signing in. Create a key on the API keys page, with only the permissions the agent needs (see Limiting a key), then add the server to your agent with the key in place of YOUR_API_KEY.
Claude Code#
claude mcp add --transport http --scope user siel https://api.siellabs.com/mcp --header "Authorization: Bearer YOUR_API_KEY"Cursor#
In ~/.cursor/mcp.json, or .cursor/mcp.json in a project:
{
"mcpServers": {
"siel": {
"url": "https://api.siellabs.com/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}VS Code#
In .vscode/mcp.json. VS Code asks for the key once and keeps it out of the file:
{
"servers": {
"siel": {
"type": "http",
"url": "https://api.siellabs.com/mcp",
"headers": { "Authorization": "Bearer ${input:siel-key}" }
}
},
"inputs": [
{ "type": "promptString", "id": "siel-key", "description": "Siel API key", "password": true }
]
}Windsurf#
In ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"siel": {
"serverUrl": "https://api.siellabs.com/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}Other agents#
Any agent that speaks MCP over HTTP and can send a header works: the address https://api.siellabs.com/mcp and the header Authorization: Bearer YOUR_API_KEY. One that speaks MCP's sign-in (OAuth 2.1 with PKCE and its own registration) can leave the header out and sign in instead.
Tools#
| Tool | What it does | Permission |
|---|---|---|
send_sms | Sends one SMS. Send a message | Send messages |
get_message | A message's status, price and receipts. Retrieve a message | Read |
list_messages | Your latest messages, newest first. List messages | Read |
get_prices | What you pay in one country, by network. Prices | Read |
get_balance | Your balance and what you can still spend. Balance | Read |
list_sender_ids | Your sender IDs and their review. Sender IDs | Read |
send_otp | Sends an OTP by Telegram or SMS. Send a code | OTP |
check_otp | Checks the code a person typed. Check a code | OTP |
get_otp | An OTP's status, never its code. Look a code up | OTP |
An agent sees only the tools its key's permissions allow. A refused call comes back to the agent with the API's error code and message, so it can tell you what to change. There is no batch tool: an agent sends one message per call, and campaigns stay in the web app.
Most agents ask you before each tool call. Keep that on for send_sms and send_otp: each call is charged and can't be undone.
Things to ask#
- "What's my balance, and how many messages did I send today?"
- "Why did my last message to +447700900123 fail?"
- "How much is an SMS to Germany?"
- "Send 'Your table is ready' to +447700900123 from YourBrand."
Without an agent#
Each request is one JSON-RPC message in a POST, answered with one JSON answer. Tool results carry the API's JSON as text and as structured content.
curl https://api.siellabs.com/mcp \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'