Phone carrier for AI agents. Provision phone numbers, place and receive calls, send and receive SMS, manage TCPA compliance and consent, and track usage and billing from any MCP-compatible client. 32 tools across 12 groups.
Strong tool definitions with comprehensive schemas and descriptions. All 32 tools have clear names following verb_noun convention (saperly_place_call, saperly_list_transactions, etc.). Descriptions are detailed (avg ~150 chars) and explain WHAT, WHEN, and consequences. Input schemas are well-structured with types and descriptions for all parameters. Risk annotations (READ_ONLY, IRREVERSIBLE, DESTRUCTIVE, WRITE) provide clear intent signaling. Key gaps: some parameter descriptions lack format/constraint details (e.g., E.164 format mentioned but not formalized); output schemas not explicitly documented in source; error handling guidance minimal.
get a full snapshot of your saperly account: all lines, balance, usage, and 5 most recent calls. use this first to understand current state.
wait for an inbound call on a line. blocks until a call arrives (or timeout). useful for testing or building call-driven workflows.
list your recent calls, or get one call's full detail. pass `callId` to fetch that call's transcript, recording, and metadata; omit it to list recent calls (optionally filtered by line or direction).
check if consent exists for a phone number on a line.
list SMS conversations grouped by contact, or get the full message history with one contact. pass `phoneNumber` (with `line`) to fetch that conversation's messages; omit it to list conversations (optionally filtered by line).
Output schemas not explicitly documented in source code. While input schemas are comprehensive, return types and field structures are not visible in tool definitions, forcing LLMs to infer response structure.
Parameter format constraints mentioned in descriptions but not formalized in schema. E.164 phone format, ISO date cursors, and UUID formats are described textually rather than via JSON Schema pattern/format fields, reducing machine-parseability.
Error handling guidance absent. Tool descriptions do not explain what errors can occur, when to retry, or how to recover. E.g., saperly_place_call does not document timeout behavior or what happens if consent is missing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
create a custom tcpa disclosure message played at the start of every call on lines using this disclosure.
provision a new phone line for your ai agent. returns the assigned phone number. mode: webhook (S2T+T2S via your HTTP webhook, bring your own AI), audio (raw websocket stream), or hosted (saperly runs the AI, requires systemPrompt).
check your account balance in USD. calls cost $0.13/min in webhook mode or $0.26/min in hosted mode for Zone A (US/Canada). international destinations use Zone B (×2) or Zone C (×3) multipliers. phone numbers cost $2.50/month (first number free for 30 days). credits never expire.
get your account settings: default disclosure, default voice, and other global preferences.
get call and SMS usage over a time period. shows calls, minutes, and cost (in credits) per day.
hang up an active call. the call ends immediately.
mint a new child api key. requires service-key auth (sk_svc_...). returns the plaintext key ONCE — save it immediately. permissions: full | call_only | sms_only | read_only.
soft-revoke a child api key. DESTRUCTIVE — the key stops working immediately (no grace window for child keys). requires confirm=true.
retrieve a single child api key by id. metadata only — no plaintext. includes revoked keys (so you can see when a key was revoked).
list child api keys minted by the service key bound to this mcp client. metadata only — no plaintext.
atomic rotate: revoke the old child api key + mint a new one with the same permissions/scope/cap. returns the new plaintext key ONCE. DESTRUCTIVE — old key stops working. requires confirm=true.
update a child api key's label, scope, permissions, or cap. partial update — only fields you pass are changed. pass null to clear agent_label / line_id / monthly_cap_cents.
list your phone lines, or get one line's full detail. pass `line` (a phone number or line id) for that line's details; omit it to list all lines.
list all tcpa disclosure configurations.
list recent billing transactions in USD: signup credit, postpaid charges, refunds, number fees, call/SMS charges. shows amount, type, and running balance (all dollars).
list available voices for text-to-speech on calls. each voice has a slug (e.g. 'alloy') and a language.
place an outbound phone call. blocking by default: it waits for the call to be answered (or declined / no-answer) and returns the outcome, so you won't place a second call while the first is still ringing. modes: 'scripted' (default — you drive: optionally speak `say` once answered and get the caller's first reply, then continue with saperly_say / saperly_press_digits / saperly_hangup), or 'ai' (Saperly runs the conversation from your `prompt` and returns the full transcript when the call ends — no backend needed). consent must be on file first (saperly_check_consent / saperly_record_outbound_consent). costs credits.
press keypad digits on an active call (DTMF). useful for navigating IVR systems or entering account numbers.
record that outbound consent was obtained for a phone number (you are recording a fact, not granting permission). required before making outbound calls to that number.
revoke consent for a phone number. future outbound calls to this number will be blocked.
speak text on an active call and optionally wait for the caller's response. the call must be in progress (placed via saperly_place_call with wait=false, or received via saperly_await_inbound_call). you drive the conversation turn by turn.
send an outbound SMS. requires either an inbound SMS from the recipient within the last 24 hours, OR active explicit_outbound consent on file for that (line, recipient) pair (e.g. recorded via POST /v1/consent or a web-form opt-in).
update a phone line's configuration. can change webhook urls, system prompt, voice, recording, and other settings.
update your account settings: default disclosure, default voice, and other global preferences.
list recent webhook deliveries for a line. shows status, timestamp, and payload for each delivery.
get webhook delivery stats for a line: success rate, failure count, and average latency.
send a test webhook to your webhook url. useful for debugging webhook integrations.
Confirmation pattern incomplete for destructive operations. saperly_key_delete and saperly_key_rotate require confirm=true, but other destructive tools (saperly_hangup, saperly_revoke_consent) lack confirmation steps, increasing risk of accidental execution.
Pagination guidance minimal. saperly_list_transactions and saperly_conversations accept limit/cursor but descriptions do not explain pagination semantics, total count availability, or when to stop iterating.