Connecting AI assistants (MCP)
Connect Claude Code or any MCP client to the VoiceLabs remote MCP server at app.voicelabs.now/api/mcp — OAuth 2.1, six tools, instant revocation.
VoiceLabs runs a remote MCP (Model Context Protocol) server, so an AI agent can work with your VoiceLabs data on your behalf after you sign in and consent. It is listed on the official MCP Registry as now.voicelabs/voicelabs.
- Endpoint:
https://app.voicelabs.now/api/mcp - Transport: streamable HTTP, stateless (no MCP sessions)
- Auth: OAuth 2.1 — authorization code with PKCE and dynamic client registration. The agent signs in as you and only gets what you consent to.
Connect from Claude Code
claude mcp add --transport http voicelabs https://app.voicelabs.now/api/mcpAny MCP client that supports streamable HTTP with OAuth discovery works the same way: point it at the endpoint and it discovers the authorization server via /.well-known/oauth-protected-resource, registers itself, and walks you through consent in the browser.
Native clients only for now
Browser-based (cross-origin) MCP clients are not supported yet — use a native client such as Claude Code or Claude Desktop.
Scopes
| Scope | Grants |
|---|---|
voice:read | Read your voices, profiles, and past generations. |
voice:generate | Generate speech and transcribe audio on your behalf. |
OIDC scopes (openid, profile, email, offline_access) handle identity and token refresh; they grant no API access.
Tools
Read tools (scope voice:read, read-only and idempotent):
| Tool | What it does |
|---|---|
list_voice_profiles | Your voice profiles (cloned voices and presets) with language, engine, and usage counts. |
list_captures | Your recent captures (dictations, recordings, uploads) with transcripts. Paginated: limit (1–200, default 50) and offset. |
get_generation | Poll a generation by generationId; returns status (generating, completed, or failed) and, once complete, the audio URL. |
Generation tools (scope voice:generate; each call creates new data, none are destructive):
| Tool | What it does |
|---|---|
speak | Synthesize speech from text in one of your voices (profileId or profileName, optional language). Async: returns a generationId with status generating — poll get_generation for the audio URL. |
transcribe | Transcribe an audio clip (audioBase64, up to 10 MiB of base64; optional language) with VoiceLabs' Whisper. Returns the transcript and the created capture id. |
ensure_voice_profile | Make sure a voice profile with the given name exists, creating it from a built-in preset voice if it does not. Idempotent — calling it again with the same name returns the same profile with created: false and creates nothing. Use it when list_voice_profiles comes back empty, or when speak reports NOT_FOUND for a voice. It cannot clone a real person's voice; that needs audio samples you upload yourself. |
Because speak is async and polling happens via get_generation (a voice:read tool), clients that generate should request both voice:generate and voice:read.
Discovery endpoints
An MCP client finds everything it needs from two metadata documents, so nothing has to be configured by hand:
| Endpoint | What it is |
|---|---|
https://app.voicelabs.now/.well-known/oauth-protected-resource | RFC 9728 protected-resource metadata — points clients at the authorization server. |
https://app.voicelabs.now/.well-known/oauth-authorization-server | OAuth 2.1 authorization-server metadata, including the dynamic client registration endpoint. |
A request without a valid OAuth access token gets a 401 with a WWW-Authenticate header pointing at that resource metadata.
Errors and quotas
Generation requires a signed-in VoiceLabs account — there is no guest mode. Free accounts generate against a small monthly allowance (the exact figure is shown in the app), past which an active trial or subscription is needed.
Generation is metered server-side by your plan. Tool failures come back as structured execution errors (SCOPE_MISSING, QUOTA_EXCEEDED, UPSTREAM_UNAUTHORIZED, or TOOL_EXECUTION_FAILED), never as raw upstream responses. A QUOTA_EXCEEDED denial includes a link to app.voicelabs.now/billing so the agent can tell you how to keep generating.
Audio retrieval
The audioUrl returned by get_generation is a short-lived capability URL: its signature grants access to that one generation's audio only, for you only, for about 15 minutes. An expired or tampered link returns 403, and polling get_generation again always mints a fresh one. No general credential ever appears in a URL.
Consent, and revoke, at any time
Every connection starts with an explicit consent screen in your browser that names the agent and the scopes it asked for. Disconnect an agent at any time from app.voicelabs.now/connections. Revocation is immediate: the next request from that agent is rejected, even if its access token has not yet expired.
Prefer to call the API yourself rather than through an agent? The same capabilities are available over plain HTTP — see the Developer API.
Usage and limits
How VoiceLabs meters usage — the free monthly generation allowance and the Pro plan's 120 minutes of generated audio per month, fair use.
Developer API
The VoiceLabs /v1 REST API — API keys and scopes, text-to-speech and transcription endpoints, RFC 9457 errors, rate limits, idempotency, and the official @voicelabs/sdk TypeScript SDK.