Servidor MCP de VoiceBooker
El servidor MCP (Model Context Protocol) de VoiceBooker permite que un cliente de IA compatible gestione los recursos de VoiceBooker del usuario autenticado. Puedes consultar y editar bots y stages, configurar cuentas SIP e investigar el historial de llamadas sin crear una integración REST independiente.
Añadir el servidor
El servidor utiliza MCP Streamable HTTP y está disponible en:
https://voicebooker.de/app/api/v1/mcpCada solicitud debe incluir un token de API de VoiceBooker en la cabecera X-API-TOKEN:
X-API-TOKEN: <tu-token-de-api>El token determina el contexto de la empresa; los recursos de otras empresas no se pueden leer ni modificar. Comparte el token solo con el cliente MCP necesario y no lo guardes en configuraciones compartidas.
Ejemplo de configuración JSON:
{
"mcpServers": {
"voicebooker": {
"url": "https://voicebooker.de/app/api/v1/mcp",
"headers": { "X-API-TOKEN": "<tu-token-de-api>" }
}
}
}Según el cliente, el campo puede llamarse headers, httpHeaders o definirse mediante una variable de entorno. Vuelve a conectar el cliente después de guardar la configuración para que descubra las herramientas.
Usar el servidor
Los campos de ID de recursos usan camelCase en los esquemas y respuestas MCP: botId, stageId, botStageId, sharedBotId y callSessionId.
El servidor devuelve IDs para sus recursos. Reutilízalos exactamente como se devuelven. Para inspeccionar un bot, usa list_bots y después list_stages con su ID: los stages contienen los prompts, herramientas, funciones y el comportamiento real. Lee todos los stages antes de realizar cambios.
Para investigar una conversación, usa primero list_call_history y después get_trace_conversation con el ID de sesión devuelto. El trace incluye turnos, estado, stack y llamadas a funciones o webhooks.
Herramientas disponibles
Bots y stages
| Herramienta | Función |
|---|---|
list_bots | Lista los contenedores de bots. |
create_bot | Crea un contenedor con un stage Welcome. name es obligatorio; settings, initial_state, wizard y editable_keys son opcionales. |
update_bot | Modifica los metadatos sin sustituir el comportamiento de los stages. botId es obligatorio. |
get_bot_definition | Devuelve la definición completa del bot, incluidos stages, prompts, herramientas, funciones y metadatos del flujo. botId es obligatorio. |
update_bot_definition | Sustituye la definición completa del bot después de validarla. botId y definition son obligatorios; expectedVersion evita sobrescrituras y dryRun: true valida sin guardar. |
delete_bot | Elimina u oculta un bot; los bots con stages se ocultan. |
list_bot_snapshots | Lista las copias versionadas de un bot, empezando por la más reciente. botId es obligatorio. |
create_bot_snapshot | Guarda la definición y los stages actuales como una nueva versión. botId es obligatorio; message es opcional. |
restore_bot_snapshot | Restaura una copia y crea primero una copia de seguridad automática. botId y snapshotId son obligatorios. |
diff_bot_snapshots | Compara las definiciones completas de dos copias. botId, fromSnapshotId y toSnapshotId son obligatorios. |
list_stages | Lista todos los stages ordenados de un bot. botId es obligatorio. |
create_stage | Crea un stage asociado a un bot. botId y name son obligatorios. |
update_stage | Modifica un stage y su configuración por bot. botId y stageId son obligatorios. |
delete_stage | Elimina un stage del flujo. botId y stageId son obligatorios. |
prompt y tools tienen cada uno su propio modo de ejecución. Las opciones settings.promptExec y settings.toolsExec son independientes y solo afectan al campo correspondiente:
- Si
promptExecestá ausente o esfalse,promptse procesa como texto Liquid y se envía al LLM como mensaje del sistema. ConpromptExec: true,promptdebe contener JavaScript que definaprompt(params). La función debe devolver un objeto:{ prompt: "..." }crea un mensaje del sistema que el LLM usa para su siguiente respuesta, mientras que{ text: "..." }crea un mensaje directo del asistente que se devuelve sin cambios. Si devuelve ambos campos, solo se utilizaprompt. - Si
toolsExecestá ausente o esfalse, un valortoolsno vacío debe ser una cadena JSON que se decodifique en un array de herramientas de función compatibles con OpenAI. Cada herramienta local también necesita un handler con el mismo nombre enfunctions; una función situada solo enfunctionsnunca se ejecuta automáticamente. ContoolsExec: true,toolsdebe contener JavaScript que definatools(params), y la función debe devolver{ tools: [...] }; devolver directamente el array no es válido. Las herramientas generadas dinámicamente también necesitan handlers con el mismo nombre enfunctions. - Los dos campos pueden usar modos diferentes. Por ejemplo, un
promptJavaScript con herramientas JSON estáticas, o unpromptLiquid con herramientas JavaScript generadas dinámicamente, son válidos. Solo está prohibido mezclar formatos dentro del mismo campo:promptno puede contener a la vez texto Liquid y una función JavaScript, ytoolsno puede contener a la vez una cadena JSON y código JavaScript.
En un handler de herramienta, data se envía al LLM como resultado de la herramienta para que formule la siguiente respuesta. text se devuelve directamente como respuesta del asistente sin cambios. Si se devuelven ambos, data tiene prioridad y text no se envía directamente.
list_stages también devuelve botEngine: lightweight usa JavaScript síncrono con api() y webhook; extendedNodeJs usa JavaScript basado en Promises y permite fetch. Un settings.packageJson no nulo activa extendedNodeJs; ausente o nulo activa lightweight. No uses async, await, fetch, Promise, import ni require en el motor ligero.
Los nombres de stage distinguen mayúsculas y minúsculas. settings.initialStages define el stack inicial. El código del prompt puede cambiar de stage devolviendo el stack actualizado:
function prompt(params) {
params.stack.push("Booking");
return { state: params.state, stack: params.stack, prompt: "Pide la fecha de la reserva." };
}Una herramienta puede cambiar de stage con transitionTo: "Booking"; dropStage: true elimina el stage actual antes del handler. Las herramientas dinámicas usan function tools(params) { return { tools: [...] }; } y cada herramienta local necesita un handler con el mismo nombre en functions. toolsState/toolsStack se aplican a tools(params) y state/stack a su handler.
Usa wizard para asistentes sencillos de un solo stage. Para flujos expertos o multi-stage, crea o modifica los stages por separado.
Pruebas de bots
Las herramientas de pruebas de bots gestionan configuraciones para dos bots diferentes de la empresa autenticada. El bot
de origen es quien inicia la conversación y el bot de destino quien responde. Las respuestas usan la estructura pública con
srcBotId y destBotId.
| Herramienta | Función |
|---|---|
list_bot_tests | Lista las pruebas de bots de la empresa autenticada. |
create_bot_test | Crea una prueba. name, srcBotId y destBotId son obligatorios; settings es opcional. |
update_bot_test | Actualiza una prueba. id es obligatorio y los campos omitidos se conservan. |
delete_bot_test | Elimina una prueba. id es obligatorio. |
settings puede incluir convInitBot, maxConvTurns, asCall, startTimeout y stateUpdate. Ambos bots deben estar
visibles, pertenecer a la empresa autenticada y ser diferentes.
Cuentas SIP
| Herramienta | Función |
|---|---|
list_sip_accounts | Lista cuentas usadas para registro, enrutamiento, webhooks y transferencias. include_inactive es true de forma predeterminada. |
create_sip_account | Guarda una cuenta SIP editable y actualiza el registro del conector; no compra ni provisiona un número. |
update_sip_account | Actualiza una cuenta conservando los campos no indicados; id es obligatorio y la configuración se combina. |
delete_sip_account | Elimina cuentas editables. Las cuentas gestionadas por el sistema se desregistran con register: false. |
Las contraseñas SIP son de solo escritura y nunca se devuelven. Al actualizar, omitir una contraseña conserva la existente; una cadena vacía la elimina.
Historial y trazas
| Herramienta | Función |
|---|---|
list_call_history | Busca sesiones telefónicas y de chat. Todos los parámetros son opcionales: botId, start, end_date, call, limit y offset. Sin parámetros, busca todos los bots. |
get_trace_conversation | Devuelve turnos y eventos de trace de una sesión. callSessionId es obligatorio y limit tiene un máximo de 1000. |
list_call_webhook_events | Devuelve los eventos completos persistidos de webhook y JavaScript de una sesión, incluidos headers, cuerpos, errores, URL y tiempos. callSessionId es obligatorio; limit tiene un máximo de 1000. |
get_trace_conversation incluye las llamadas webhook resumidas como fsCalls. Usa list_call_webhook_events para obtener los detalles completos. Se excluyen las conversaciones sujetas a retención de datos y se aplican los filtros de API ocultas configurados.