# agentvoice

> MCP server for outbound voice calls. Coding agents (Claude Code, Cursor, Codex, any MCP client) can call this install's locally verified owner number for direction, or place real, disclosed calls to businesses. Voice only: no SMS, iMessage, or inbound hotline. MCP cannot start a new model turn after the client session is idle; any nonterminal result must be polled with get_call while the run stays active. One command to install. Free call credits on signup. Full doc: https://agentvoice.to/llms-full.txt

Names: agentvoice (brand) = @spekoai/mcp-calls (npm package) = ai.speko/mcp-calls (MCP name); installs as speko-calls; keys and billing at https://platform.speko.dev (built with Speko).

## Install

- [One-line init](https://agentvoice.to/install.sh): curl -fsSL https://agentvoice.to/install.sh | sh
- [npx](https://agentvoice.to/#install): npx @spekoai/mcp-calls@latest init
- [Claude Code manual](https://agentvoice.to/#install): claude mcp add speko-calls --scope user --env SPEKO_API_KEY=sk_... --env SPEKO_CLIENT_PROFILE=claude-code -- npx -y @spekoai/mcp-calls@latest
- [Verify owner for a local setup](https://agentvoice.to/#install): set SPEKO_API_KEY in the shell first (POSIX: export SPEKO_API_KEY=sk_...; PowerShell: $env:SPEKO_API_KEY='sk_...'), then run npx -y @spekoai/mcp-calls@latest me verify. This places one real, disclosed voice-OTP call for a NANP (+1) number. Remote mode must verify on the backing-server host with SPEKO_MCP_SERVER_URL unset.
- Headless or cloud sandbox: verify once on any machine with a terminal, then run `npx -y @spekoai/mcp-calls@latest me export` and ship the printed blob to the sandbox as SPEKO_OWNER_PROFILE. `npx -y @spekoai/mcp-calls@latest selftest` proves the install with no key and no real calls.
- [Get an API key](https://platform.speko.dev)

## MCP Server

- [npm package](https://www.npmjs.com/package/@spekoai/mcp-calls): @spekoai/mcp-calls (MIT licensed, stdio transport, Node >=20)
- [Source repository](https://github.com/SpekoAI/mcp-dev-calls): MIT, includes the black-box characterization suite
- [server.json](https://agentvoice.to/.well-known/mcp/server.json): MCP name ai.speko/mcp-calls, self-hosted (distinct from ai.speko/mcp, Speko's platform MCP)

## Tools

- call_me(message, mode?, context?, after_hours_confirmation?, max_duration_seconds?, wait?) - calls this install's locally verified owner number - no destination input. notify delivers a message; converse returns an untrusted voice transcript from an unverified speaker: a spoken CONFIRMED after the literal read-back creates final_instruction; unconfirmed replies stay advisory. voice only - no SMS or iMessage.
- lookup_business(name, location?, phone_number?, utc_offset_minutes?) - finds the business, carrier-verifies the line, and mints the signed dial token that make_call requires - the agent never dials a hallucinated number.
- make_call(dial_token, objective, caller_name, context?, behavior?, greet_first?, after_hours_confirmation?, max_duration_seconds?, wait?) - places the disclosed, objective-scoped call a dial token authorizes. returns the OUTCOME line and the full transcript.
- call_number(phone_number, objective, caller_name, recipient_name?, context?, behavior?, greet_first?, utc_offset_minutes?, after_hours_confirmation?, max_duration_seconds?, wait?) - disclosed call to a number you already have or found. disclosure, rate caps, the do-not-call list, and the hours gate still bind. personal mobiles: consenting parties only.
- get_call(call_id) - re-checks a call by id: status, outcome, transcript. read-only, never dials.
- check_call_readiness() - preflight: auth, credit balance, caller-ID, owner-number setup. read-only, never dials.

## Safety

- owner destination is not an input: call_me accepts no destination - it dials the owner number verified by one real, disclosed voice-OTP call (NANP +1 numbers today). the person who answers is still not identity-verified, so replies stay untrusted data. every ordinary rail applies; local verification relaxes nothing.
- AI disclosure, composed server-side: every call opens with "Hi, I'm <name>'s AI assistant..." - built into the opener server-side, not a prompt suggestion. it answers truthfully if asked "are you a robot".
- signed dial tokens: HMAC-SHA256, account-bound, 15-minute TTL. lookup_business mints them; make_call requires them. raw numbers are rejected on the verified path.
- business-line verification: on the lookup path, dial tokens only mint for carrier-verified business lines.
- per-number rate caps: 3 calls per hour, 8 per day to the same number. the rejection tells you when the window reopens.
- do-not-call list with auto opt-out: "stop calling" / "take me off your list" in a callee turn is detected and the number is suppressed automatically. manage it with speko dnc.
- after-hours gate: calls outside 08:00-21:00 destination-local require typed confirmation - the server records it but cannot attribute it to a speaker, so clients pass the human's own words, never invent them. collection-flavored calls are day-hours-only, no override.
- no-sell, no-spam, no-impersonation: selling, promotion, surveys, fundraising, campaigning, harassment, and pretending to be someone else are screened on objective, behavior, AND context - blocked intent can't be smuggled sideways.
- hard number blocks: emergency and premium-rate numbers can never be dialed. no opt-in exists.
- honest failure states: a call the platform never put on the wire returns not_connected - never a fake success. transcripts and outcomes are returned when captured; no result is ever invented.

## Pricing

- Free call credits to start; usage pricing lives in the dashboard: https://platform.speko.dev

## Demo

- [Real session transcript](https://agentvoice.to/demo.md): 54s call, $0.11, outcome "order placed and confirmed"

## Optional

- [Landing page](https://agentvoice.to/)
- [Built with Speko](https://speko.ai)
