How to List Available Voices and Personalities Using the VoiceStudio MCP Server
The VoiceStudio MCP server exposes GET /mcp/list_voices and GET /mcp/list_personalities endpoints that return JSON arrays of voice profiles and personality configurations when authenticated with the X-OmniVoice-Client-Id header.
VoiceStudio provides a Multilingual Conversational Platform (MCP) server that catalogs synthetic voice profiles and their associated personalities through a JSON-RPC-style HTTP interface. This guide explains how to list available voices and personalities using the MCP server, referencing the actual implementation in the debpalash/VoiceStudio repository.
MCP Server Architecture and Voice Registry
The MCP server implementation resides in backend/mcp_server.py and initializes lazily to conserve resources. When the first request hits any MCP endpoint, the server instantiates a FastMCP instance around line 329. The server relies on the VoiceRegistry service defined in backend/services/plugin_sdk.py to retrieve voice and personality data.
Voice profiles represent individual voice configurations (ID, name, language), while personalities define behavioral contexts that map to specific voice profiles. Both data types are serialized and returned through dedicated HTTP endpoints.
HTTP API Endpoints for Voice Discovery
List Voices Endpoint
Send a GET request to /mcp/list_voices to retrieve the complete catalog of available voice profiles.
curl -s -H "X-OmniVoice-Client-Id: my-client" \
http://localhost:8000/mcp/list_voices | jq .
The endpoint returns an array of voice-profile objects containing identifiers, display names, and language codes. In backend/mcp_server.py, the list_voices coroutine (around line 483) handles this request by iterating over stored VoiceProfile objects from the registry.
List Personalities Endpoint
Send a GET request to /mcp/list_personalities to retrieve personality configurations.
curl -s -H "X-OmniVoice-Client-Id: my-client" \
http://localhost:8000/mcp/list_personalities | jq .
This endpoint returns personality objects including IDs, descriptions, and their mappings to voice profiles. The implementation builds this list from Personality entries that reference specific voice profiles in the registry.
OpenAI-Compatible Python SDK
VoiceStudio provides an OpenAI compatibility layer in backend/api/routers/openai_compat.py that exposes list_voices() and list_personalities() methods directly. This allows tools designed for the OpenAI API to interact with VoiceStudio without modification.
# Using the built‑in OpenAI‑compatible client
import omv # VoiceStudio’s Python SDK
client = omv.OpenAICompat()
voices = client.list_voices() # -> list of dicts
personalities = client.list_personalities() # -> list of dicts
print(voices, personalities)
The list_voices() wrapper is implemented around line 683 in backend/api/routers/openai_compat.py, providing a seamless interface for existing OpenAI integrations.
Direct FastMCP Client Access
For applications requiring direct MCP protocol access, use the FastMCP client:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP()
voices = await mcp.list_voices()
personalities = await mcp.list_personalities()
This approach bypasses the HTTP layer and communicates directly with the MCP server instance.
Configuration and Environment Setup
The MCP server binds to the address and port defined by the OMNIVOICE_MCP_PORT environment variable, defaulting to port 8000. To disable the MCP server entirely (useful for testing), set OMNIVOICE_MCP_DISABLE=1.
All requests must include the X-OmniVoice-Client-Id header, which the server validates during request processing (see lines 7-10 in backend/mcp_server.py). The client SDK automatically injects this header when using the omv package.
Error Handling and Degraded States
If the voice registry fails to load, both endpoints return HTTP 500 errors with a diagnostic note field explaining the failure. When the MCP server is not started or transport is misconfigured, the endpoints respond with a clear "MCP transport could not be configured" message.
Integration tests in tests/test_mcp_mount.py assert the presence of list_voices and list_personalities in the MCP tool surface, ensuring these endpoints remain available across versions. For examples of degraded state handling, see tests/test_truthful_degraded_state.py.
Summary
- Primary endpoints: Use
GET /mcp/list_voicesandGET /mcp/list_personalitiesto retrieve catalog data. - Authentication: Include the
X-OmniVoice-Client-Idheader with all requests. - Implementation files: Core logic resides in
backend/mcp_server.py(MCP server) andbackend/api/routers/openai_compat.py(OpenAI compatibility). - Data source: The
VoiceRegistryservice inbackend/services/plugin_sdk.pyprovides the underlying voice and personality data. - Environment control: Configure
OMNIVOICE_MCP_PORTfor custom ports orOMNIVOICE_MCP_DISABLE=1to disable the server.
Frequently Asked Questions
What authentication is required to list voices via the MCP server?
All requests to the list endpoints must include the X-OmniVoice-Client-Id header containing a valid client identifier. The server validates this header during request processing in backend/mcp_server.py. When using the Python SDK, this header is automatically managed by the omv client.
Can I use the OpenAI compatibility layer instead of raw HTTP requests?
Yes. The backend/api/routers/openai_compat.py file implements OpenAI-compatible wrappers that expose list_voices() and list_personalities() methods. Import the omv module and use omv.OpenAICompat() to access these methods with familiar OpenAI SDK patterns.
What happens if the MCP server is not running when I make a request?
If the server is disabled via OMNIVOICE_MCP_DISABLE=1 or fails to initialize, the endpoints return a "MCP transport could not be configured" error message. The FastMCP instance loads lazily (around line 329 in backend/mcp_server.py), so transport errors typically indicate configuration or dependency issues rather than runtime timeouts.
How does the server handle corrupted or missing voice registry data?
If the VoiceRegistry service cannot load voice profiles or personality definitions, the endpoints return HTTP 500 status codes with a note field containing diagnostic information. The integration tests in tests/test_mcp_mount.py verify that these endpoints gracefully handle registry failures without crashing the server process.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →