Your AI Agent Gets the Whole EasyVoice Platform — One MCP URL
Connect Claude, ChatGPT, Cursor, or any MCP client to EasyVoice and your agent can speak: instant text to speech with 66 voices, long-form narration up to 500,000 characters per job, two-speaker podcast episodes, and voice cloning — all over one URL, authenticated with the same ev_ API keys as the REST API.
https://easyvoice.ae/api/mcp
A free key gets 12 voices, 20 requests/minute, and instant TTS — no card. Pro ($9.99/mo flat) unlocks all 66 voices plus long-form, podcast, and cloning, with unlimited characters (fair use 10M per rolling 30 days). Pro comes with a 14-day money-back guarantee. Cloning (clone_voice) also works with an active 7-day pass.
The connection file is a single markdown doc you can hand to any AI assistant — it contains everything needed to connect and drive every tool.
What is MCP?
The Model Context Protocol (MCP) is how AI assistants gain abilities: you give your assistant a server URL, and every tool that server exposes becomes something the assistant can do on its own. Point it at EasyVoice and it gains seven tools — it can generate speech from any text it writes, narrate long scripts, produce two-speaker podcast episodes, clone voices, and check its own usage — without you copy-pasting anything between apps.
Connect your AI client
Free account, no card. You land back on this page — your key is one more click.
Copies the full connection file with your key filled in — paste it into any AI assistant and it can connect unaided.
Generate a key above and every block below fills in your real key automatically. Setting up by hand instead? Replace ev_your_api_key wherever it appears — manage keys anytime at /account/keys.
claude.ai — custom connectors
Settings → Connectors → Add custom connector. Paste the server URL, then add a request header (the header option is labeled beta in the connector UI):
URL: https://easyvoice.ae/api/mcp Header: Authorization: Bearer ev_your_api_key
Claude Desktop
Uses the same account-level Connectors UI as claude.ai (Settings → Connectors — synced to your account). Honest note: claude_desktop_config.json only takes local stdio servers, not remote URLs — for a remote server use the Connectors UI, or the mcp-remote bridge at the bottom of this list.
{
"mcpServers": {
"easyvoice": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://easyvoice.ae/api/mcp",
"--header",
"Authorization:Bearer ev_your_api_key"
]
}
}
}Claude Code
claude mcp add --transport http easyvoice https://easyvoice.ae/api/mcp --header "Authorization: Bearer ev_your_api_key"
Or the equivalent .mcp.json entry:
{
"mcpServers": {
"easyvoice": {
"type": "http",
"url": "https://easyvoice.ae/api/mcp",
"headers": { "Authorization": "Bearer ev_your_api_key" }
}
}
}ChatGPT — developer mode
Available on Plus, Pro, Business, Enterprise, and Edu (web). Enable developer mode in settings, then add a connector. The form supports OAuth or no authentication only — no custom headers — so put the key in the URL and pick No authentication:
https://easyvoice.ae/api/mcp?key=ev_your_api_key
Key-in-URL caveat: the URL sits in your connector config, so treat it like a password — you can revoke and recreate the key anytime at /account/keys. Hedged note: multiple community reports say Plus/Pro may restrict connector tools to read-only (unconfirmed by OpenAI docs) — if text_to_speech refuses to run there, that is the likely cause, not your key.
Cursor
Add to ~/.cursor/mcp.json. Prefer to keep the key out of the file? ${env:EASYVOICE_API_KEY} interpolation also works:
{
"mcpServers": {
"easyvoice": {
"url": "https://easyvoice.ae/api/mcp",
"headers": { "Authorization": "Bearer ev_your_api_key" }
}
}
}VS Code
Add to .vscode/mcp.json in your workspace.
{
"servers": {
"easyvoice": {
"type": "http",
"url": "https://easyvoice.ae/api/mcp",
"headers": {
"Authorization": "Bearer ev_your_api_key"
}
}
}
}Anything else — mcp-remote fallback
Bridges any stdio-only MCP client to this server:
npx mcp-remote https://easyvoice.ae/api/mcp --header "Authorization:Bearer ev_your_api_key"
Windows note: some client configs mangle spaces inside args — write the header value with no space after the colon (as above), or use the ?key= URL form instead.
Authentication
Primary: Authorization: Bearer ev_your_api_key — the exact same keys and header as the REST API. Fallback for clients without custom-header support: ?key=ev_your_api_key on the server URL (the header wins if both are sent).
initialize and tools/list work without a key — your connector will save and list tools fine — but every tools/call needs a valid key. Honest note on ?key=: a key in the URL can land in server access logs and client config files. Prefer the header where the client allows it, and revoke/recreate the key at /account/keys if a URL ever leaks.
Tools reference — seven tools, four groups
Instant TTS
text_to_speech
Convert text to a hosted MP3/WAV download link — the core tool, and the one free keys can use. Per-call limit: 8,000 characters (4,000 for Arabic ar_* voices).
| Parameter | Type | Required | Description |
|---|---|---|---|
| text | string | Yes | The text to speak — up to 8,000 characters per call (4,000 on ar_* voices). |
| voice | string | No | Voice id (default af_aoede) — call list_voices for the catalog. |
| speed | number | No | 0.5 to 2 (default 1). |
| format | string | No | mp3 or wav (default mp3). |
// tools/call arguments
{ "text": "Hello from my AI agent!", "voice": "af_aoede", "format": "mp3" }
// result (abridged)
{ "audio_url": "https://easyvoice.ae/api/tts/audio/1f6f7c2e-8a41.mp3",
"voice": "af_aoede", "format": "mp3", "characters": 23 }The result is a hosted download URL (https://easyvoice.ae/api/tts/audio/<uuid>.mp3). Audio links are not guaranteed to persist — download promptly. Over 8,000 characters on a Kokoro voice? Use generate_long_form (Pro) or the web studio. Over 4,000 characters on an ar_* voice? Use POST /api/v1/audio/speech (Arabic sync cap 12,000) or the web app — never the long-form tool, which is Kokoro-only and rejects Arabic voices. Your ready cloned voice_* ids work here with Pro or an active 7-day pass. Cloned voices speak English; requests over 2,000 characters are queued as background jobs with Pro. Pass holders split text into calls of 2,000 characters or fewer, or use Pro for background jobs. Only the key owner can use a clone.
list_voices
No parameters. Lists all 66 catalog voices with a tier column (free | pro) plus your cloned voices and their status. Free keys can synthesize with the 12 free-tier voices — the rest return a truthful Pro-required error.
// tools/call arguments
{}
// result (abridged)
{ "plan": "free",
"voices": [ { "id": "af_aoede", "name": "Aoede", "language": "English",
"tier": "free", "available": true }, "..." ],
"cloned": [ { "id": "voice_abc123", "name": "My Voice", "status": "ready" } ] }Async jobs — long-form, podcast, status
Pro gate, stated once up front: these tools reuse the Jobs API, and “The Jobs API requires a Pro subscription — free API keys can use /v1/audio/speech.” is exactly what a free key gets back (as an isError result). Free keys can use instant text_to_speech above. The agent flow for all job tools: create → poll get_job_status → download audio_url. Generated audio is kept for six months and then deleted — on the 1st of each month we remove the month that has passed six months. Download anything you want to keep; your generation history (the text and the settings) stays in your account. The audio_url can be re-fetched any time within that window by calling get_job_status again with the same job id.
generate_long_form
Narrate a full script — up to 500,000 characters in one job. Kokoro narration voices only: ar_* and cloned voice_* ids are rejected by the long-form engine.
| Parameter | Type | Required | Description |
|---|---|---|---|
| input | string | Yes | The full script, up to 500,000 characters. |
| voice | string | No | Kokoro voice id (default af_aoede). |
| speed | number | No | 0.5 to 2 (default 1). |
| format | string | No | mp3 or wav (default mp3). |
// tools/call arguments
{ "input": "Chapter 1. The full 120,000-character script...", "voice": "af_aoede" }
// result — a job id, 202-style
{ "job_id": "1f6f7c2e-...", "status": "queued", "input_chars": 120000 }
// then poll get_job_status with that job_id:
{ "id": "1f6f7c2e-...", "status": "active", "completed": 3, "total": 12 }
{ "id": "1f6f7c2e-...", "status": "completed",
"audio_url": "https://easyvoice.ae/api/tts/audio/1f6f7c2e.mp3" }create_podcast
Two-speaker (A/B) episode from dialogue segments. Caps: up to 60 segments and 30,000 combined characters per episode on Pro. Your READY cloned voice_* ids are allowed as either speaker.
| Parameter | Type | Required | Description |
|---|---|---|---|
| segments | array | Yes | Alternating { speaker: "A" | "B", text } segments — max 60 per episode. |
| voice_a | string | Yes | Voice id for speaker A — catalog voice or an owned READY voice_* id. |
| voice_b | string | Yes | Voice id for speaker B. |
| format | string | No | mp3 or wav (default mp3). |
// tools/call arguments
{ "segments": [
{ "speaker": "A", "text": "Welcome to the show." },
{ "speaker": "B", "text": "Great to be here." } ],
"voice_a": "af_aoede", "voice_b": "am_adam" }
// result — then poll get_job_status; the completed job carries the episode
// audio_url plus per-segment audio URLs
{ "job_id": "3a9f1b7c-...", "status": "queued" }get_job_status
Poll any job owned by your key. Long-form jobs add completed/total part progress; podcast jobs add per-segment audio URLs.
| Parameter | Type | Required | Description |
|---|---|---|---|
| job_id | string | Yes | The id returned by generate_long_form or create_podcast. |
// tools/call arguments
{ "job_id": "1f6f7c2e-..." }
// result (abridged)
{ "id": "1f6f7c2e-...", "status": "completed",
"audio_url": "https://easyvoice.ae/api/tts/audio/1f6f7c2e.mp3" }Voice cloning
clone_voice
Enroll a custom cloned voice from an audio sample (async); cloned voices speak English. Honest gating, all enforced server-side: Pro or 7-day pass; consent: true attestation required (recorded); 5 enrollments per day; 3 cloned voices max — a full account returns 409. Sample: 10 MB max, wav/mp3/m4a, a 10–30 second clean single-speaker recording (enrollment rejects shorter or longer clips).
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Display name for the cloned voice. |
| consent | boolean | Yes | Must be literally true — you attest you have the recording rights to the sample. Anything else is rejected. |
| audio_base64 | string | One of | Base64-encoded audio sample (10 MB max decoded). |
| audio_url | string | One of | Public https URL to the sample — fetched server-side, same 10 MB bound, redirects not followed. |
| mime_type | string | No | Sample MIME type (default audio/wav) — wav, mp3, m4a accepted. |
// tools/call arguments
{ "name": "My Narrator", "consent": true,
"audio_url": "https://example.com/sample.wav" }
// result
{ "voice_id": "voice_9f2c...", "status": "enrolling" }The tool returns the voice id at once and no job id, so get_job_status does not apply. After enrolling, check list_voices until the clone reports ready, then use it in create_podcast (Pro key), or in text_to_speech with Pro or an active 7-day pass. Synchronous cloned synthesis also works through POST /api/v1/audio/speech with the same key.
Account
get_usage
No parameters — returns your plan, remaining free characters, rate limits, and the daily reset time. Agents should call this to self-handle quota errors instead of retrying blindly.
// tools/call arguments
{}
// result (free key)
{ "plan": "free", "used": 1200, "remaining": 3800, "limit": 5000,
"rpm_limit": 20, "concurrency_limit": 2, "reset_at": "2026-07-22T00:00:00Z" }Limits — Free vs Pro
| Limit | Free | Pro ($9.99/mo) |
|---|---|---|
| Voices | 12 free voices | All 66 + your cloned voices |
| Characters | 5,000/day, shared with the web app. Resets midnight UTC. | Unlimited — fair use 10M chars per rolling 30 days, all surfaces together |
| Requests per minute | 20 | 60 |
| Concurrent requests | 2 | No per-key cap |
| Instant TTS (text_to_speech) | Free + Pro — 8,000 chars/call, 4,000 on ar_* voices | Same caps, full catalog |
| Long-form (generate_long_form) | Pro only | 500,000 chars/job — Kokoro voices only |
| Podcast (create_podcast) | Pro only (via API key) | 30,000 chars/episode, max 60 segments |
| Cloning (clone_voice) | Pro or 7-day pass | 5 enrollments/day, 3 cloned voices max |
Pro is unlimited in characters, not in requests — 60 requests/minute. Fair use is 10,000,000 characters per rolling 30 days, counted across the studio, the API, MCP, long-form jobs and podcasts together. Past that line the account is slowed, never blocked or billed: generation is paced per account to 10,000 characters a minute (3,000 characters a minute past 20,000,000) on every surface, the studio included, and API and MCP requests, across all of the account's keys, to 30 a minute (10 a minute past 20,000,000). A paced request waits up to 20 seconds for its turn and is then served; a longer wait answers HTTP 429 fair_use_paced with Retry-After. Jobs wait behind other customers' jobs for up to 30 minutes and start when the account's character budget allows. The slowdown lifts by itself once the rolling total falls back below the line. No overage charges, ever. Every Pro tools/call response carries an X-EasyVoice-Fair-Use header (ok or throttled) with your rolling 30-day total.
Troubleshooting
- 401 on tools/call — missing or invalid key. The connector saves fine without a key (initialize and tools/list are open), but every tools/call needs one. Create a key at /account/keys.
- 403 plan_required family — truthful Pro gates, one line each: a Pro voice on a free key returns “This voice is only available on the Pro plan.”; the job tools return “The Jobs API requires a Pro subscription — free API keys can use /v1/audio/speech.”; clone_voice on a key with neither Pro nor an active 7-day pass returns “Voice cloning requires a Pro subscription or an active 7-day pass.” $9.99/mo flat unlocks Pro.
- 429 family —
rate_limit_exceeded(per-minute window: 20 free / 60 Pro),concurrency_limit_exceeded(more than 2 in flight on free),daily_quota_exceeded(free 5,000/day pool spent — resets midnight UTC). Cloning has its own 5/day enrollment limit, also surfaced asrate_limit_exceeded. Callget_usageto see where you stand. - Fair use: too many requests are waiting at once / character budget — a Pro account past the fair-use line has its generation calls paced, in requests and in characters a minute (one pace shared with its REST API keys and the studio); a call waits up to 20 seconds for its turn and is then served. A call that would wait longer gets this message back as a tool error saying when to retry. Send calls one at a time, or retry after the seconds it names. Nothing is blocked or billed.
- 409 voice_quota_exceeded — 3 cloned voices max. Delete one (
DELETE /api/v1/voices/{id}or the web app) and enroll again. - GET returns 405 — expected and spec-sanctioned. The endpoint is POST-only; a 405 on GET does not mean the server is down.
- mcp-remote on Windows — spaces inside args get mangled in some client configs. Use
"Authorization:Bearer ev_your_api_key"(no space after the colon) or the?key=URL.
MCP server — frequently asked questions
How do I make Claude generate voice audio?▾
Claude cannot synthesize speech by itself — you connect it to a text-to-speech service over MCP. Add https://easyvoice.ae/api/mcp as a custom connector (Settings → Connectors on claude.ai and Claude Desktop, or "claude mcp add" in Claude Code) with your EasyVoice API key, then ask Claude to call the text_to_speech tool. It returns a hosted MP3 or WAV download link. Free API keys work — 12 voices, no card required.
What can an AI agent do with EasyVoice over MCP?▾
An AI agent connected to EasyVoice over MCP can turn any text it writes into downloadable speech — 66 voices, one URL, no SDK. Beyond instant TTS, a Pro key unlocks the full platform: long-form narration up to 500,000 characters per job and two-speaker podcast episodes — the agent submits a job, polls get_job_status, and collects the audio URL when it completes. Voice cloning works with a Pro key or an active 7-day pass; clone_voice returns a voice id at once, with no job to poll, and the agent checks list_voices until the clone is ready.
Which AI apps can connect to the EasyVoice MCP server?▾
claude.ai and Claude Desktop (custom connectors), Claude Code, Cursor, ChatGPT developer mode, and any MCP client that speaks Streamable HTTP. Clients that only support local stdio servers can bridge with npx mcp-remote. The server answers plain JSON — no SSE required.
Does it work with ChatGPT?▾
ChatGPT developer mode (Plus, Pro, Business, Enterprise, Edu — web) accepts remote MCP servers. Its connector form supports OAuth or no-auth only, so use the key-in-URL form: https://easyvoice.ae/api/mcp?key=ev_your_api_key with authentication set to none. One honest caveat: community reports say ChatGPT Plus and Pro may restrict custom-connector tools to read-only, which would block text_to_speech. We could not confirm this from OpenAI's documentation, so treat write tools on Plus/Pro as unverified — Business/Enterprise/Edu with admin-enabled write tools is the reliably reported path.
Is my API key safe in the URL?▾
The Authorization header is safer and is the primary method — the ?key= URL form exists only for clients whose connector form has no header field. A key in the URL can end up in server access logs and in client config files, so treat that URL like a password. The blast radius is limited: a free key is capped at 20 requests/minute, 2 concurrent, and a shared 5,000 characters/day, and no key can spend money — keys only generate audio. You can revoke and re-create keys anytime at /account/keys.
Is it really unlimited?▾
Pro has no character meter — generate as much as your product needs at $9.99/month flat; 10,000,000 characters is roughly 180+ hours of finished audio. Fair use is 10,000,000 characters per rolling 30 days, counted across the studio, the API, MCP, long-form jobs and podcasts together. Past that line the account is slowed, never blocked or billed: generation is paced per account to 10,000 characters a minute (3,000 characters a minute past 20,000,000) on every surface, the studio included, and API and MCP requests, across all of the account's keys, to 30 a minute (10 a minute past 20,000,000). A paced request waits up to 20 seconds for its turn and is then served; a longer wait answers HTTP 429 fair_use_paced with Retry-After. Jobs wait behind other customers' jobs for up to 30 minutes and start when the account's character budget allows. The slowdown lifts by itself once the rolling total falls back below the line. No overage charges, ever. Pro requests are limited to 60 per minute. Reselling raw API capacity is the one thing fair use excludes, and the thresholds may change with notice.
Can my agent generate an audiobook or a podcast?▾
Yes, with a Pro key. generate_long_form takes a script up to 500,000 characters in one job (Kokoro narration voices only), and create_podcast builds a two-speaker episode from up to 60 dialogue segments (30,000 characters per episode). Both are async: the agent submits the job, polls get_job_status until it reports completed, then downloads the audio_url. Free API keys get a truthful error on these tools — the Jobs API requires a Pro subscription.
Can my agent use my cloned voice?▾
Yes. Pass one of your ready cloned voice_* ids to text_to_speech with a Pro or active 7-day pass key, or as voice_a or voice_b in create_podcast with a Pro key. Only the key owner can use a clone. generate_long_form is Kokoro-only and rejects cloned and Arabic voices. New clones are enrolled with clone_voice (Pro or 7-day pass, consent required); cloned voices speak English.
Free key, no card — 12 voices and instant TTS today; Pro ($9.99/mo flat) when your agent needs the whole platform.
New to MCP? What is a TTS MCP server? — the explainer