MCP
Connect Speko to Claude Code, Codex, OpenCode, Cursor, and other AI coding tools.
Speko MCP gives coding agents authenticated access to organizations, agents, sessions, calls, phone numbers, knowledge bases, evals, deployment, migration helpers, and usage data.
Tool surfaces are bound to hostnames. This page documents the full surface at
mcp.speko.ai; assistant directories are published on narrower hosts, listed
under Directory hosts.
Install in your tool
Run the guided installer and choose OAuth browser sign-in:
npx @spekoai/mcp@latest initThe hosted endpoint is https://mcp.speko.ai/mcp. It uses stateless JSON HTTP
with MCP 2026-07-28. Better Auth owns OAuth state while the MCP service
validates every access token independently, so requests can reach any replica.
Automation can instead use a Speko Platform API key from
API keys.
MCP does not expose API-key lifecycle tools. Create and revoke product-wide Platform keys from API keys.
claude mcp add --transport http speko https://mcp.speko.ai/mcpAdd to ~/.codex/config.toml:
[mcp_servers.speko]
url = "https://mcp.speko.ai/mcp"Add to opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"speko": {
"type": "remote",
"url": "https://mcp.speko.ai/mcp",
"enabled": true
}
}
}Open Cursor Settings > MCP > Add new global MCP server, then add:
{
"mcpServers": {
"speko": {
"url": "https://mcp.speko.ai/mcp"
}
}
}Configure a remote HTTP MCP server:
| Setting | Value |
|---|---|
| Name | speko |
| URL | https://mcp.speko.ai/mcp |
| Authentication | OAuth browser sign-in |
For API-key automation, add Authorization: Bearer ${SPEKO_API_KEY} using the
client's environment-variable syntax.
What to ask your agent
Once connected to mcp.speko.ai, ask your agent to:
- inspect organization usage and credit balance;
- create, update, deploy, or roll back agents;
- create sessions and inspect call transcripts or recordings;
- create phone numbers, knowledge bases, and evals;
- convert external voice-agent configs with
migration.workspace.inspect,migration.external_config.parse, andmigration.session_config.build.
Directory hosts
Assistant directories run on their own hosts. Each surface is a property of the host — no query parameter, header, or account setting widens it.
| Host | Tools | Surface |
|---|---|---|
mcp.speko.ai | 101 | Full operational surface. Coding agents use this. |
anthropic.speko.ai | 35 | Anthropic MCP Directory. Reads, audio.transcribe, outbound calling. |
chatgpt.speko.ai | 20 | OpenAI Plugin Directory. |
builder-mcp.speko.ai | 12 | App builders (v0, Lovable, Bolt, Replit, Base44, Figma Make). |
Anthropic MCP Directory
https://anthropic.speko.ai/mcp serves 35 tools: reads across agents,
sessions, calls, transcripts, recordings, phone numbers, knowledge bases,
credits and usage, plus audio.transcribe, docs.search, the migration
helpers, sessions.phone.create for placing a call, and
phone_numbers.kyb.{get,submit} for the declaration that unlocks calling.
Six groups are absent from that host:
| group | absent |
|---|---|
| audio generation | audio.synthesize |
| live session / call creation | sessions.create, agents.test_call |
| agent configuration and deployment | agents.create, agents.update, agents.deploy, agents.rollback, agents.tools writes |
| knowledge-base and phone-number writes | knowledge_bases writes, phone_numbers.create, phone_numbers.update |
| bulk evaluation and monitoring | agents.evals.*, agents.monitors.* |
| irreversible and outward-facing writes | agents.delete, phone_numbers.delete, knowledge_bases.delete, share_cards.create |
Configuring an agent is equivalent to arming it — a deployed agent speaks on
inbound traffic with no further tool call — so agent configuration is withheld
alongside speech generation itself. audio.transcribe remains, because
speech-to-text produces no audio and returns only text. Calling a withheld tool
returns Unknown tool, indistinguishable from a name that was never
registered.
Before any outbound call the workspace files a business declaration: the
business name, what calling is for, and an attestation. It is two fields, it
takes effect the moment it is submitted, and phone_numbers.kyb.get returns the
prefilled name and the exact attestation text to show. Calls from the shared
caller-ID pool dial from a Speko-owned number, so the declaration is what keeps
a named business behind every call.
sessions.phone.create is served here. It places one call, to one number, per
explicit tool call, using an agent you deployed elsewhere — no bulk, scheduled
or unattended path reaches it, and the caller cannot configure the agent that
speaks. Every call created on a directory host has AI disclosure injected
server side: the first thing said on the line is that the caller is an AI, and
no prompt can override it.
To create agents or synthesize speech, use mcp.speko.ai, the
REST API, or an SDK.