VoiceLabs

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/mcp

Any 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

ScopeGrants
voice:readRead your voices, profiles, and past generations.
voice:generateGenerate 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):

ToolWhat it does
list_voice_profilesYour voice profiles (cloned voices and presets) with language, engine, and usage counts.
list_capturesYour recent captures (dictations, recordings, uploads) with transcripts. Paginated: limit (1–200, default 50) and offset.
get_generationPoll 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):

ToolWhat it does
speakSynthesize 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.
transcribeTranscribe 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_profileMake 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:

EndpointWhat it is
https://app.voicelabs.now/.well-known/oauth-protected-resourceRFC 9728 protected-resource metadata — points clients at the authorization server.
https://app.voicelabs.now/.well-known/oauth-authorization-serverOAuth 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.

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.

On this page