# Speko MCP MCP Server

> **Speko MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to Speko MCP.
>
> MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows,
> token refresh, and production-grade auto-scaling — so your AI agents can connect to
> third-party services and run freely without you managing any MCP server yourself.
>
> Server page:  https://mewcp.com/mcp/speko-mcp
> MewCP docs:   https://docs.mewcp.com
> Full catalog: https://mewcp.com/llms.txt

---

## About

Speko turns audio and video recordings into searchable transcripts and structured meeting insights. Transcribe conversations, identify speakers, generate summaries and action items, extract key topics, and search across recorded discussions to retrieve specific information.

---

## Details

- Server ID: `speko-mcp`
- Version: 0.2.53
- Tools: 159
- Authentication: OAuth, managed by MewCP
- Transport: http

---

## Access

The gateway URL below serves your **entire MewCP toolset**, not this server on its
own. Pasting a config snippet is not enough — Speko MCP has to be in the toolset
first. In order:

1. Add Speko MCP to your toolset at https://mewcp.com/mcp/speko-mcp
2. Connect your Speko MCP account (OAuth); MewCP stores the credential and attaches it to each call
3. Copy your MewCP API key from the dashboard (Developer)
4. Configure your client with the snippet for it below

Once connected, an agent does **not** see this server's tools as top-level tools.
It sees four meta-tools and reaches everything through them:

- `search(query)` — find tools by keyword across the toolset
- `get_schema(tools)` — full description and arguments for the tools you picked
- `list_accounts(provider)` — only when one app has several connected accounts
- `call_tool(server_maskedId, tool_name, args)` — execute

So the list below is what `search` can return for this server, not a set of
callable tool names on their own.

---

## Tools (159)

Descriptions are truncated to 160 characters; call `get_schema`
for the full text and the argument schema. Where a tool is annotated, its type
is shown — treat `destructive` as irreversible.

- `organization.get` _(read)_ — Get the current workspace and its capability flags: features.buyPhoneNumbers, sms10dlc, imessageIntegration, agentDuplication and others, each as an {enabled}…
- `credits.balance.get` _(read)_ — Get the current workspace prepaid credit balance in USD, as of updatedAt. Requires the speko:billing scope, unlike most reads on this surface.
- `credits.ledger.list` _(read)_ — List recent credit movements for the current workspace, newest first. Filter with kind as a comma-separated list of "grant", "debit", "topup", "refund" and…
- `usage.summary.get` _(read)_ — Get workspace usage, managed cost and current balance. from_ and to bound the window; omit both for all-time. totalCost = minutesCost (the per-minute call…
- `agents.list` _(read)_ — List agents in the current workspace without their full system prompts. Each item includes voice, turnHandling and runMode as currently stored. Use agents.get…
- `agents.preview_stacks` _(read)_ — Preview the THREE voice-stack options before creating an agent — so the user picks. Returns the same recommendation the dashboard's agent-create shows, as…
- `agents.create` _(write)_ — Create a Speko agent. Never send endCall: the end_call tool is always on and {'enabled': false} is rejected with 400. To keep the agent from hanging up early,…
- `agents.get` _(read)_ — Get one agent and its complete editable configuration, including voice, turnHandling (profile, keypad, onMachine, dtmfToolDescription, amdPrompt) and system…
- `agents.update` _(write)_ — Update one Speko agent. Only the fields sent change. Never send endCall: the end_call tool is always on and {'enabled': false} is rejected with 400. To keep…
- `agents.delete` _(destructive)_ — Delete one Speko agent.
- `agents.tools.list` _(read)_ — List tools registered on an agent, most recently created first. A call already in progress does not see a tool registered after it started. If a call reports…
- `agents.tools.create` _(write)_ — Register a new tool on an agent. A call already in progress will not see it; a new call will, once list_agent_tools shows it registered.
- `agents.tools.get` _(read)_ — Get one agent tool by id, as currently stored in the registry. The row includes `simulation` when the tool overrides the default simulated-run policy; its…
- `agents.tools.update` _(write)_ — Update one agent tool's description, parameters, source, or simulated-run behaviour. A call already in progress keeps using the version it started with.
- `agents.tools.delete` _(destructive)_ — Delete one agent tool. A call already in progress may keep using it until the call ends; new calls stop seeing it immediately.
- `agents.deploy` _(write)_ — Deploy a SessionConfig as a new immutable agent version.
- `agents.rollback` _(destructive)_ — Roll an agent back to a historical version.
- `agents.versions.list` _(read)_ — List versions for an agent.
- `agents.test_call` _(write)_ — Start an agent-to-agent test call. Puts the agent under test and a caller (a persona synthesized from `objective`, or another agent via `caller_agent_id`) in…
- `agents.test_call.get` _(read)_ — Read one agents.test_call run, to get its agentSessionId. agents.test_call answers with a run id and nothing else: the room and session are created by the…
- `sessions.create` _(write)_ — Create a browser/WebRTC or server-to-server voice session.
- `sessions.phone.create` _(write)_ — Create an outbound phone session, dialing `body.to` from an owned or auto-provisioned number. Use maxDurationSeconds to set a hard call limit. ChatGPT and…
- `sessions.list` _(read)_ — List sessions for the authenticated organization.
- `sessions.get` _(read)_ — Get one session.
- `sessions.transcript.get` _(read)_ — Get the ordered transcript and per-turn latency for a workspace session, including any tool calls made mid-call (toolCalls, by name and args) and a…
- `sessions.recording.get` _(read)_ — Get a signed recording URL for one session.
- `agents.calls.list` _(read)_ — List recent calls for an agent.
- `calls.get` _(read)_ — Get call detail including transcript.
- `calls.recording.get` _(read)_ — Get a signed recording URL for one call.
- `phone_numbers.list` _(read)_ — List phone and SIP numbers owned by the current workspace. For OAuth connectors, the first outbound call automatically provisions a dedicated number from…
- `phone_numbers.available.search` _(read)_ — Search phone numbers available to buy. PRICES are per number and are the ones a purchase charges: ``upfrontCostUsd`` is the one-time setup and…
- `phone_numbers.create` _(write)_ — Buy (provision) a phone number. PAID — tell the owner the price and get their OK first. Check phone_numbers.list before buying: when the workspace already has…
- `phone_numbers.get` _(read)_ — Get one phone or SIP number owned by the current workspace. setupStatus.status is "ready" only when inboundReady, outboundReady and agentReady are all true;…
- `phone_numbers.update` _(write)_ — Update one phone number.
- `phone_numbers.delete` _(destructive)_ — Release and delete one phone number.
- `knowledge_bases.create` _(write)_ — Create a knowledge base.
- `knowledge_bases.list` _(read)_ — List visible knowledge bases, optionally filtered to one agent with agent_id. Each entry carries documentCount and chunkCount as current totals, not a snapshot…
- `knowledge_bases.get` _(read)_ — Get one knowledge base owned by the current workspace, including its embeddingModel and current documentCount and chunkCount. Use knowledge_bases.list to find…
- `knowledge_bases.delete` _(destructive)_ — Delete one knowledge base.
- `knowledge_bases.documents.list` _(read)_ — List documents in a workspace knowledge base, each with an ingestion status of "pending", "processing", "ready" or "failed", and its own chunkCount. Use…
- `knowledge_bases.documents.create` _(write)_ — Create a knowledge document row and upload URL.
- `knowledge_bases.documents.get` _(read)_ — Get one document from a workspace knowledge base. status is one of "pending", "processing", "ready" or "failed"; errorMessage is set on "failed" and ingestedAt…
- `knowledge_bases.documents.delete` _(destructive)_ — Delete one knowledge document.
- `knowledge_bases.documents.finalize` _(write)_ — Finalize a knowledge document and enqueue ingestion.
- `agents.evals.list` _(read)_ — List evals for an agent.
- `agents.evals.create` _(write)_ — Create an eval for an agent.
- `agents.evals.run` _(write)_ — Run one agent eval.
- `evals.get` _(read)_ — Get eval detail and recent runs.
- `agents.monitors.list` _(read)_ — List an agent's alert monitors — rules that watch an eval metric on scored production calls and notify when it crosses a threshold.
- `agents.monitors.create` _(write)_ — Create an alert monitor on an agent (fires when a metric crosses its threshold).
- `agents.monitors.update` _(write)_ — Update an alert monitor (threshold, channels, status, etc.).
- `agents.monitors.delete` _(destructive)_ — Delete an alert monitor.
- `agents.monitors.events.list` _(read)_ — List a monitor's firing history (breach events + observed values).
- `agents.monitoring.results.list` _(read)_ — List production calls scored by online monitoring (verdict + scores per call).
- `migration.workspace.inspect` _(read)_ — Inspect a voice-agent codebase and return migration recommendations.
- `migration.session_config.build` _(read)_ — Build a Speko SessionConfig draft from prose and hints.
- `migration.external_config.parse` _(read)_ — Parse an external voice-agent config into a Speko SessionConfig draft. Output is a scaffold: verify it against the raw config and check `warnings` and…
- `migration.briefing.render` _(read)_ — Render briefing markdown for an agent/version.
- `share_cards.create` _(write)_ — Create a public share card for an agent build.
- `audio.synthesize` _(write)_ — Synthesize speech from text, returning a download link and base64 audio. Routed across TTS providers by the intent. The result carries a signed download URL…
- `audio.transcribe` _(write)_ — Transcribe audio to text. Speech to text only: no audio is generated and none is returned. Google Drive's "can't scan for viruses" confirmation pages are…
- `capabilities.search` _(read)_ — Search the actions available to the current principal and MCP profile. An empty query (the default) returns everything visible, up to limit. Filter by effect…
- `capabilities.describe` _(read)_ — Return the exact input schema, output schema and authorization policy for one action, by id. The natural second call after capabilities.search, when a summary…
- `operations.list` _(read)_ — List recent durable action executions in the current workspace: the operations that run async rather than returning inline, in "claimed", "queued", "running",…
- `operations.get` _(read)_ — Read one durable action operation by id, including its steps array (each with its own status and optional progress) and, once failed, an error object with a…
- `operations.wait` _(read)_ — Wait briefly for a durable operation to change or reach a terminal state, up to timeoutMs (0 to 30000, default 10000). Returns as soon as the operation moves,…
- `operations.cancel` _(destructive)_ — Request cancellation of a cancellable operation. This is a request, not a guarantee: an operation past its cancellable point keeps running. Requires…
- `agent_access.overview` _(read)_ — List OAuth client grants and product API keys for the current workspace control plane. oauthGrants carry the scopes each connected client holds; apiKeys carry…
- `agent_access.oauth_grant.revoke` _(destructive)_ — Revoke one OAuth client grant for the current user and workspace. consentId is the id field from agent_access.overview's oauthGrants array, not the client id.…
- `api_keys.list` _(read)_ — List product API keys in the current workspace, each with its scopes, revocation state, and resourceVersion. resourceVersion is literally "active" or…
- `api_keys.create` _(write)_ — Create a product API key and return its secret in `key` exactly once; it is never retrievable again, so store it immediately. `scopes` is 1 to 6 values from…
- `api_keys.revoke` _(destructive)_ — Revoke one product API key. `expected_resource_version` must be "active", the only value an unrevoked key ever has; it does not need a fresh read from…
- `gateway.overview.get` _(read)_ — Get one snapshot of the current workspace Gateway: session counts (total, last 24h, active), 24h error count, active key count, workload and instance counts,…
- `gateway.workloads.list` _(read)_ — List Gateway workloads in the current workspace, each identified by type and id, with its total and active session counts and when it was last seen.
- `gateway.instances.list` _(read)_ — List Gateway runtime instances in the current workspace, each with its active and pending session counts, capacity, and whether it is online, draining, or…
- `gateway.activity.list` _(read)_ — List recent Gateway activity events for the current workspace, newest first, optionally filtered to one workload, one instance, or one event_type. Each row…
- `gateway.usage.get` _(read)_ — Get aggregated Gateway usage for the current workspace, broken down by provider: spend in micros of the given currency, session count, and the metering source…
- `gateway.legacy_keys.list` _(read)_ — List legacy Runtime API keys still valid during the migration window, each with its expiry, revocation state, and resourceVersion. `legacyAcceptUntil`, when…
- `gateway.legacy_keys.revoke` _(destructive)_ — Revoke one legacy Runtime API key. `expected_resource_version` must match the key's current resourceVersion from gateway.legacy_keys.list; a stale value is…
- `gateway.models.list` _(read)_ — List Relay models with their provider, kind (stt, tts, llm, s2s, or evaluation), routability, and benchmark and ranking data for the given objective and…
- `gateway.relay.activity.list` _(read)_ — List recent Relay requests, newest first, each with its full attempt chain: every provider tried, in order, with an outcome of served, failed, or superseded.…
- `gateway.relay.usage.get` _(read)_ — Get Relay usage summed over a bounded recent window (1 to 2160 hours, default 168, one week), with total requests, failures, and failovers, the same three…
- `gateway.relay.credit.get` _(read)_ — Get the Runtime credit snapshot Relay uses to admit new requests: available balance in micros, open reserved micros not yet settled, and unexported settled…
- `gateway.provider_credentials.list` _(read)_ — List Relay provider credentials for the current workspace without exposing stored key values; only the last four characters, if configured, are shown.…
- `gateway.provider_credentials.replace` _(write)_ — Create a Relay provider credential, or replace the existing one for that provider. `expected_resource_version` defaults to null, meaning no credential is…
- `gateway.provider_credentials.delete` _(destructive)_ — Delete a Relay provider credential. `expected_resource_version` must match the current resource_version from gateway.provider_credentials.list; a stale value…
- `gateway.profiler.conversations.list` _(read)_ — List recent Gateway profiler conversations, each with its turn counts (total, evaluated, good) and good_turn_rate when evaluation has run, plus how it ended:…
- `gateway.profiler.conversations.get` _(read)_ — Get one profiler conversation with every turn assembled: latency breakdown (ear-to-mouth, endpointing, LLM time to first token, tool time, TTS time to first…
- `gateway.profiler.turn_trace.get` _(read)_ — Get the raw, ordered event trace behind one profiler turn: every marker event with its type, sequence number, and millisecond timestamp, alongside the same…
- `gateway.relay.tts_preview.create` _(write)_ — Create a bounded Relay TTS preview and return a short-lived audio resource link. Pick the provider and model from a tts row of gateway.models.list. A preview…
- `agents.duplicate` _(write)_ — Duplicate an agent and its copyable tools, knowledge, evaluations, version, and graph. The copy carries the source voice and turnHandling settings forward…
- `receptionist.setup` _(write)_ — Create an AI phone receptionist for a small business in one step, without deploying it. Reads the business website when website_url is given (public http/https…
- `receptionist.update_facts` _(write)_ — Correct or add business facts on a receptionist made by receptionist.setup, in plain text (for example "we close at 6 on Fridays, a haircut is $40"). The…
- `agents.graph.get` _(read)_ — Read the authored execution graph stored for one agent version. Omit `version` for the agent latest. Returns graph:null when the version has no graph yet (not…
- `agents.graph.replace` _(write)_ — Publish an authored execution graph as a NEW agent version. A graph change is a change to the agent, so it cuts a version the same way a config change does:…
- `agents.graph.seed` _(write)_ — Derive a first execution graph for an agent version from its system prompt (falling back to the version derived flow). Idempotent: an existing graph is…
- `agents.evals.update` _(write)_ — Partially update one test case. Only the fields you send are written; omitted fields are left untouched. `description` and `source_call_id` accept null to…
- `agents.evals.character.set` _(write)_ — Set or clear JUST the simulated-caller character on one test case. Merged into the existing input_payload without touching its other keys — this is the safe…
- `agents.evals.delete` _(destructive)_ — Delete one test case. Historical runs survive — the run rows reference the case through a nullable column, so the track record is not destroyed with the case.
- `agents.evals.runs.list` _(read)_ — The five most recent runs of ONE test case, newest first, each with the verdict in its result. Poll this after agents.evals.run to watch a case settle.
- `agents.evals.generate` _(write)_ — Author test cases for an agent from its own configuration — system prompt, intent, tools, knowledge-base titles and first message — using the scenario…
- `agents.evals.trends.get` _(read)_ — Pass-rate over time for one agent, as a contiguous zero-filled series plus window totals. Manual test calls are excluded — they are hardcoded-pass and would…
- `agents.evals.runs.suggest_fix` _(read)_ — Ask for a minimal system-prompt revision that would make a FAILED run pass. The failures are extracted from the run itself, so you only need the run id.…
- `agents.evals.suggest_prompt_fix` _(read)_ — Ask for a minimal system-prompt revision from failures you supply yourself, when the failures did not come from one stored run. Prefer…
- `agents.apply_prompt_fix` _(write)_ — Deploy a revised system prompt as a NEW agent version. Takes the current live config (or the agent as it stands, if it was never deployed), swaps the prompt,…
- `agents.apply_stack_fix` _(write)_ — Re-pin ONE pipeline layer (stt, llm or tts) to a different provider and deploy that as a new agent version — the fix that is not a prompt change. Every other…
- `agents.config_structure.get` _(read)_ — Read the agent's LIVE system prompt back as a structured decision view — its goals, the rules it follows, and its conditional branches, plus a best-effort…
- `scenarios.list` _(read)_ — List the organization scenario library, newest first. A scenario is one thing a caller is trying to do, reusable across agents. Pass `agent_id` to list only…
- `scenarios.create` _(write)_ — Author a scenario into the organization library and optionally attach it to agents. Deduped by content: an identical scenario already in the org (for example…
- `scenarios.attach` _(write)_ — Attach a library scenario to an agent so the reliability gate drives it there. Supply `persona_id` to pin the caller character this agent runs the scenario…
- `scenarios.detach` _(destructive)_ — Detach a library scenario from one agent. The scenario itself and its history survive — only the agent link is removed.
- `scenarios.archive` _(destructive)_ — Archive a scenario — the only lifecycle transition there is. An archived scenario stops being driven by the gate but keeps its run history. Pass…
- `scenarios.runs.list` _(read)_ — List up to 50 recent reliability runs that exercised this scenario, each with the per-scenario verdict it produced — the scenario track record across agent…
- `billing.checkout.create` _(write)_ — Create a short-lived Stripe Checkout handoff for adding workspace credits. This is a ONE-TIME purchase: the owner pays amount_usd once and nothing renews; tell…
- `billing.portal.create` _(write)_ — Create a short-lived Stripe Billing Portal handoff for the workspace. Returns a url, its purpose, and an expiresAt timestamp; the portal itself lets the…
- `billing.auto_topup.setup` _(write)_ — Create a short-lived Stripe handoff for authorizing an auto-top-up card. Returns a url, its purpose, and an expiresAt timestamp; completing it on Stripe…
- `billing.invoices.list` _(read)_ — List recent Stripe invoices for the current workspace, newest first. limit caps the page size at 100 and defaults to 25. Each invoice reports amountPaid and…
- `billing.auto_topup.get` _(read)_ — Get the current automatic credit top-up configuration and payment-method status. hasPaymentMethod and the nested paymentMethod fields cover the card Stripe has…
- `billing.auto_topup.update` _(write)_ — Replace the automatic credit top-up configuration for the workspace. This is a whole-object replace, not a patch. enabled, thresholdCents, and amountCents must…
- `billing.auto_topup.resume` _(write)_ — Clear a paused auto-top-up failure state so charging may resume, without changing the threshold or amount on file. Check billing.auto_topup.get first to…
- `billing.spending_cap.get` _(read)_ — Get the workspace monthly spending cap and how much of it this month has used. monthlyCapUsd is null when no cap is set. While reached is true, new sessions,…
- `billing.spending_cap.update` _(write)_ — Set the workspace monthly spending cap in whole US dollars (1 to 100,000), or null to remove it. Takes effect immediately: if this month has already spent the…
- `integrations.list` _(read)_ — List the integrations this workspace can use (calendars, CRMs) with each one's connected installations. connectable is true when integrations.connect can start…
- `integrations.connect` _(write)_ — Start connecting an OAuth integration (e.g. Google Calendar, HighLevel). Returns a short-lived url (ten minutes, single use) to a Speko page that names this…
- `agents.integration_tools.attach` _(write)_ — Give an agent the tools of a connected integration installation. Replaces that app's integration tools on the agent with the set for mode, so calling it again…
- `agents.integration_tools.detach` _(write)_ — Remove an integration app's tools from an agent (only tools of kind integration for that app; webhook and other tools are never touched). The installation…
- `phone_numbers.kyb.get` _(read)_ — Read this workspace's phone compliance status. OAuth connector workspaces submit automatically from the phone authorization accepted during sign-in; do not…
- `receptionist.go_live` _(write)_ — Put an agent live as the business’s phone receptionist in one call: get a number (buy a new US/Canadian number, optionally by area code, or reuse one the…
- `receptionist.verify_forwarding` _(write)_ — Check that calls to the owner’s business number actually reach the receptionist. Speko cannot place a test call into a carrier’s forwarding, so this is a…
- `receptionist.pause` _(write)_ — Instant off switch: the receptionist stops answering its number right away. The number is kept (and still billed monthly) so receptionist.resume brings it back…
- `receptionist.resume` _(write)_ — Turn a paused receptionist back on: re-links the agent to its kept number so it answers again. Safe to repeat. Errors: RECEPTIONIST_NOT_FOUND,…
- `receptionist.settings.update` _(write)_ — Change a receptionist’s owner settings: who gets the post-call summary (email, text), privacy mode (link only, no caller details), per-agent recording, and the…
- `receptionist.cancel` _(destructive)_ — Cancel the receptionist so the owner stops paying for it, in one approval: it stops answering, the number go_live bought for it is released (which ends the…
- `phone_numbers.sip_gateway.get` _(read)_ — Read this workspace's static-IP SIP gateway setup: connection details (gateway IP, SIP domain/realm, ports), the SIP login username and auth mode (never its…
- `phone_numbers.sip_connections.create` _(write)_ — Connect the customer's own carrier or SIP trunk (Telnyx, Twilio, Odorik or any VoIP provider) as a carrier connection. This is how a customer brings their own…
- `phone_numbers.import` _(write)_ — Import a number the customer already owns at their own carrier, routed over a carrier connection from phone_numbers.sip_connections.create. Self-serve: no SIP…
- `sessions.end` _(destructive)_ — Immediately request hang-up of a live voice or outbound phone session in this workspace. Use this when a call is stuck, no longer useful, or the user asks to…
- `support.ticket.create` _(write)_ — Open a support ticket with the Speko team on behalf of the signed-in user. Only for problems with Speko itself (calls, agents, phone numbers, billing, the…
- `support.ticket.list` _(read)_ — List the organization's support tickets, most recent activity first. status filters to open (waiting on Speko), answered (Speko replied last), closed, or all…
- `support.ticket.get` _(read)_ — Read one support ticket and its conversation. ticket carries the original summary and details the user sent; messages holds every reply after that, oldest…
- `support.ticket.reply` _(write)_ — Add a message from the user to a support ticket (1-4,000 characters). The Speko team sees it in the same thread, and the ticket moves to open (waiting on…
- `support.ticket.rate` _(write)_ — Rate how the Speko team handled a resolved support ticket. score is 1-5 (1 very poor, 5 excellent); comment is optional (up to 2,000 characters) and says what…
- `sms.conversations.list` _(read)_ — List SMS threads in this workspace, most recent activity first. A thread is one contact (remote_phone_number) texting one workspace number (phone_number_id).…
- `sms.conversations.get` _(read)_ — Get one SMS thread. assigned_agent_id is the agent handling it now (agent_override_id when set, otherwise the agent on its number; null means no agent and no…
- `sms.conversations.messages.list` _(read)_ — Read the messages in one SMS thread. Each page is in chronological order (oldest first) and holds the newest messages not yet returned; next_cursor pages back…
- `sms.conversations.update` _(write)_ — Partially update one SMS thread: only the fields sent are written. assigned_agent_id pins an agent to this thread; null clears the pin so the thread follows…
- `sms.conversations.reply` _(write)_ — Queue a text in an existing SMS thread, from the thread number to its contact. When the contact texted within the last 24 hours the reply is conversational: no…
- `sms.messages.list` _(read)_ — List SMS messages across the workspace, newest first. Filter agent_id returns messages written while that agent handled the thread. origin tells a person…
- `sms.messages.get` _(read)_ — Get one SMS message and its delivery state. status moves queued or scheduled -> submitting -> accepted -> sent -> delivered; delivery_failed and rejected carry…
- `sms.messages.send` _(write)_ — Send a proactive text from a workspace number to a contact, starting a thread or adding to the existing one for that number and contact. Proactive sends always…
- `voice_clones.list` _(read)_ — List the workspace's custom (cloned) voices. Each voice lists its provisions: one per TTS provider it was cloned onto. A provision with status "ready" carries…
- `voice_clones.create` _(write)_ — Clone a voice from a recording, in one call: creates the voice, downloads audio_url as its reference clip and clones it onto provider (default elevenlabs). It…
- `voice_clones.provision` _(write)_ — Clone an existing custom voice onto one more TTS provider, using the reference clip it already has (for example a voice made on elevenlabs, now also on…
- `voice_clones.delete` _(destructive)_ — Delete a custom voice: removes its reference clips and deletes the cloned voice at every provider it was provisioned to. Agents or requests that still use its…
- `docs.search` _(read)_ — Search bundled Speko docs. Returns slug, title, score, snippet. Use this to look up SDK usage, API request/body shapes, and migration steps without leaving the…
- `voices.list` _(read)_ — List the Speko TTS voice catalog: voices (vendor, id, name) plus TTS providers with their models. Use a returned voice id as the `voice` field on agents.create…
- `voices.search` _(read)_ — Search every vendor's TTS voices that Speko can route, including ElevenLabs on a Speko-managed key. Each result carries `use_with` ({provider, model, voice}):…
- `models.list` _(read)_ — List the STT/LLM/TTS/S2S provider and model catalog. Each entry's `id` ('vendor' or 'vendor:model') is the literal string accepted by `allowedProviders` pins…
- `code_snippets.get` _(read)_ — Get ready-to-paste Speko integration code for a web voice call. Returns correct, compilable code for the canonical Speko runtime flow: the app's server mints a…

---

## Connect

Gateway URL: https://gateway.mewcp.com/personal/mcp

Every request carries one header:

    Authorization: Bearer <API_KEY>

Replace `API_KEY` with your own key from the dashboard (Developer).

## Apps

### Claude Desktop

Mac & Windows app

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://gateway.mewcp.com/personal/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open Claude Desktop → Settings → Developer → "Edit Config"
2. Paste the snippet inside the outer { } of the config file (merge with your existing "mcpServers" section if you have one)
3. Save the file, then quit Claude Desktop completely and reopen it
4. Start a new conversation — your tool will be available

### VS Code

Copilot / Cline

- Command Palette → "MCP: Open User Configuration" (opens mcp.json). For one project only, use .vscode/mcp.json instead.

```json
{
  "mcp.servers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have a "servers" section in your mcp.json? Just add the server entry inside it.

1. Open VS Code → Command Palette (Cmd+Shift+P / Ctrl+Shift+P)
2. Run "MCP: Open User Configuration" to open your mcp.json
3. Paste the snippet and save
4. Start the server when prompted (or from the MCP servers view) and use it in Copilot Chat

### Cursor

AI-first editor

- macOS: `~/.cursor/mcp.json`
- Windows: `%USERPROFILE%\.cursor\mcp.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your mcp.json? Just add the server entry inside it.

1. Open Cursor → Settings → Cursor Settings → MCP
2. Click "Add new global MCP server"
3. Paste the snippet and save
4. Restart Cursor

### Codex

OpenAI's CLI agent

- Add the snippet to your Codex MCP config or your standard MCP config file for the CLI tool you use.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Codex generally reads a standard MCP server block, so you can add this alongside your other configured servers.

1. Open your Codex MCP config or project-level config file
2. Paste the MewCP server block inside the config JSON/TOML structure your tool expects
3. Save the file and restart Codex
4. Verify the tool is available inside a fresh session

### Claude Code

Anthropic's CLI agent

- ~/.claude.json (user scope) or .mcp.json in your project root — create it if it doesn't exist. Or skip the file and use the CLI command below.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open ~/.claude.json (or .mcp.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file and start (or restart) Claude Code
4. Or skip the file entirely and run the CLI command below instead

### OpenCode

Open-source terminal agent

- ~/.config/opencode/opencode.json (global) or opencode.json in your project root — create it if it doesn't exist.

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mewcp": {
      "type": "remote",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcp" section in your opencode.json? Just add the server entry inside it.

1. Open ~/.config/opencode/opencode.json (or opencode.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and start (or restart) OpenCode

### OpenClaw

Self-hosted agent gateway

- ~/.openclaw/openclaw.json — create it if it doesn't exist.

```json
{
  "mcp": {
    "servers": {
      "mewcp": {
        "transport": "streamable-http",
        "url": "https://gateway.mewcp.com/personal/mcp",
        "enabled": true,
        "headers": {
          "Authorization": "Bearer API_KEY"
        }
      }
    }
  }
}
```

Already have an "mcp" section in your openclaw.json? Just add the server entry inside "servers".

1. Open ~/.openclaw/openclaw.json in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and restart OpenClaw

### Antigravity

Google's agentic IDE

- ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — create it if it doesn't exist.

```json
{
  "mcpServers": {
    "mewcp": {
      "serverUrl": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it. Remote servers must use the "serverUrl" field — the legacy "url"/"httpUrl" fields aren't supported.

1. In the editor's agent side panel, click "…" → "MCP Servers" → "Manage MCP Servers" → "View raw config" (Antigravity CLI: type /mcp instead to open the Interactive MCP Manager)
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file — the server connects automatically

### Hermes

Nous Research's CLI agent

- config.yaml in your Hermes config directory (~/.hermes) — add this under a top-level "mcp_servers:" key.

```yaml
mcp_servers:
  mewcp:
    url: "https://gateway.mewcp.com/personal/mcp"
    headers:
      Authorization: "Bearer API_KEY"
```

Already have an "mcp_servers" section in your config.yaml? Just add the server entry inside it.

1. Open config.yaml in your Hermes config directory
2. Paste the snippet under the top-level "mcp_servers:" key (merge with existing entries if you have any)
3. Save the file, then run /reload-mcp in Hermes (or start a fresh session)
4. Ask Hermes "Tell me which MCP-backed tools are available right now" to confirm it connected

### DeepSeek Harness

DeepSeek's agent harness

- cordis.yml in your DSH project — or the patch file you mount plugins from.

```yaml
- id: mcp-mewcp
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: mewcp
    transport: streamable-http
    url: https://gateway.mewcp.com/personal/mcp
    headers:
      Authorization: "Bearer API_KEY"
```

One plugin instance = one MCP server. Add this entry to your plugin list; don't nest it inside another entry.

1. Open cordis.yml (or your patch file) in your DSH project
2. Paste the entry into your plugin list, keeping the leading dash and indentation
3. Restart DSH (or let HMR reload) — tools register as mcp__mewcp__<tool_name>
4. Verify with: dsh web --dump-config | grep -A3 mcp

## SDKs

### Python

fastmcp client

```python
import asyncio
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport

SERVER_URL = "https://gateway.mewcp.com/personal/mcp"
API_KEY = "API_KEY"

transport = StreamableHttpTransport(
    url=SERVER_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}",
    }
)

async def main():
    client = Client(transport)
    async with client:
        tools = await client.list_tools()
        print(tools)

asyncio.run(main())
```

1. Install fastmcp: pip install fastmcp
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run your script

### TypeScript

MCP SDK

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const SERVER_URL = "https://gateway.mewcp.com/personal/mcp";
const API_KEY = "API_KEY";

const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), {
  requestInit: {
    headers: {
      Authorization: `Bearer ${API_KEY}`,
    },
  },
});

const client = new Client({ name: "mewcp-client", version: "1.0.0" });
await client.connect(transport);

const tools = await client.listTools();
console.log(tools.tools.map((t) => t.name));
```

1. Install: npm install @modelcontextprotocol/sdk
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run with Node 18+ as an ES module (e.g. npx tsx script.ts)