sms
Send text messages via SMS or WhatsApp to any phone number in E.164 format. Specify the message and optionally choose the delivery channel.
Instructions
Send an SMS or WhatsApp message. Cost: 1 credit.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Phone number in E.164 format (e.g. +1234567890) | |
| message | Yes | Message text | |
| channel | No | auto, sms, or whatsapp | auto |
Implementation Reference
- src/index.ts:98-106 (schema)Schema definition for the 'sms' tool: defines name, description, and input parameters (to, message, channel).
{ name: "sms", description: "Send an SMS or WhatsApp message. Cost: 1 credit.", inputSchema: { to: z.string().describe("Phone number in E.164 format (e.g. +1234567890)"), message: z.string().describe("Message text"), channel: z.string().optional().default("auto").describe("auto, sms, or whatsapp"), }, }, - src/index.ts:247-259 (registration)Registration of all capabilities (including 'sms') as MCP tools via server.registerTool in a loop.
for (const cap of CAPABILITIES) { // Cast inputSchema to avoid TS2589 (excessively deep type instantiation from Zod chains) server.registerTool( cap.name, { description: cap.description, inputSchema: cap.inputSchema as any, }, async (args: any): Promise<CallToolResult> => { return callSuprsonic(cap.name, args as Record<string, unknown>); }, ); } - src/index.ts:183-234 (handler)Generic HTTP handler (callSuprsonic) used by the 'sms' tool and all other tools. Makes a POST request to the Suprsonic API with the capability name and parameters.
async function callSuprsonic(capability: string, params: Record<string, unknown>): Promise<CallToolResult> { if (!API_KEY) { return { content: [{ type: "text", text: "Error: SUPRSONIC_API_KEY environment variable is not set. Get your key at https://suprsonic.ai/app/apis" }], isError: true, }; } try { const resp = await fetch(`${BASE_URL}/v1/agent`, { method: "POST", headers: { "Authorization": `Bearer ${API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ capability, params }), }); const result = await resp.json() as any; // Handle non-envelope responses (401, 429, etc. return {"detail": ...}) if (result.detail && result.success === undefined) { const msg = typeof result.detail === "object" ? (result.detail.title || result.detail.detail || JSON.stringify(result.detail)) : String(result.detail); return { content: [{ type: "text", text: `Error (HTTP ${resp.status}): ${msg}` }], isError: true, }; } if (!result.success) { const errMsg = result.error?.detail || result.error?.title || "Request failed"; return { content: [{ type: "text", text: `Error: ${errMsg}` }], isError: true, }; } const text = JSON.stringify(result.data, null, 2); const meta = result.metadata ? `\n\n[Provider: ${(result.metadata as any).provider_used || "unknown"}, ${(result.metadata as any).response_time_ms || 0}ms, ${result.credits_used || 0} credits]` : ""; return { content: [{ type: "text", text: text + meta }], }; } catch (err) { return { content: [{ type: "text", text: `Network error: ${err instanceof Error ? err.message : String(err)}` }], isError: true, }; } }