VoiceBooker MCP-Server
Der VoiceBooker-MCP-Server (Model Context Protocol) ermöglicht kompatiblen KI-Clients, die VoiceBooker-Ressourcen des authentifizierten Benutzers zu verwalten. Bots und Stages können geprüft und geändert, SIP-Konten konfiguriert und Anrufverläufe untersucht werden – ohne eine eigene REST-Integration zu bauen.
Verbindung herstellen
Der Server ist unter folgender URL als MCP Streamable HTTP verfügbar:
https://voicebooker.de/app/api/v1/mcpJede Anfrage benötigt ein VoiceBooker-API-Token im Header:
X-API-TOKEN: <Ihr-API-Token>API-Tokens werden in VoiceBooker erstellt oder verwaltet. Teilen Sie das Token nur mit dem benötigten MCP-Client und speichern Sie es nicht in einer gemeinsam genutzten Konfigurationsdatei. Das Token bestimmt den Unternehmenskontext; Ressourcen anderer Unternehmen können weder gelesen noch geändert werden.
Ein JSON-basierter MCP-Client kann beispielsweise so konfiguriert werden:
{
"mcpServers": {
"voicebooker": {
"url": "https://voicebooker.de/app/api/v1/mcp",
"headers": { "X-API-TOKEN": "<Ihr-API-Token>" }
}
}
}Je nach Client heißen die Felder möglicherweise headers, httpHeaders oder werden über Umgebungsvariablen gesetzt. Verbinden Sie den Client nach dem Speichern neu und lassen Sie die verfügbaren VoiceBooker-Tools auflisten.
Verwendung
Ressourcen-ID-Felder verwenden in MCP-Schemas und Antworten camelCase: botId, stageId, botStageId, sharedBotId und callSessionId.
Der Server liefert IDs für seine Ressourcen. Verwenden Sie diese IDs bei weiteren Aufrufen genau so, wie sie zurückgegeben wurden. Für eine Bot-Inspektion:
- Mit
list_botsden Bot finden. - Mit
list_stagesund der Bot-ID alle Stages abrufen. Erst die Stages enthalten Prompts, Tools, Funktionen und das konkrete Verhalten. - Die vollständigen Stage-Daten lesen, bevor Änderungen vorgenommen werden.
- Das passende Create-, Update- oder Delete-Tool verwenden und die Antwort prüfen.
Für die Fehlersuche rufen Sie zuerst list_call_history und anschließend get_trace_conversation mit der zurückgegebenen Call-Session-ID auf. Der Trace enthält Gesprächszeilen, State, Stack sowie Funktions- und Webhook-Aufrufe.
Verfügbare Tools
Bots
| Tool | Funktion |
|---|---|
list_bots | Listet Bot-Container des authentifizierten Benutzers. |
create_bot | Erstellt einen Bot-Container mit einer ersten Welcome-Stage. name ist erforderlich; settings, initial_state, wizard und editable_keys sind optional. |
update_bot | Ändert Bot-Metadaten. botId ist erforderlich; das Stage-Verhalten wird nicht ersetzt. |
get_bot_definition | Liefert die vollständige Bot-Definition mit Stages, Prompts, Tools, Funktionen und Flow-Metadaten. botId ist erforderlich. |
update_bot_definition | Ersetzt die vollständige Bot-Definition nach Validierung atomar. botId und definition sind erforderlich; expectedVersion schützt vor parallelen Änderungen, dryRun: true prüft ohne Speichern. |
delete_bot | Löscht einen Bot oder macht ihn unsichtbar. Bots mit Stages werden unsichtbar gemacht. |
wizard eignet sich für einfache Single-Stage-Assistenten. Für Expert- oder Multi-Stage-Flows die Stages separat erstellen oder ändern.
Bot-Snapshots
Snapshots sind versionierte, unternehmensbezogene Kopien der vollständigen Bot-Definition. Vor einer Wiederherstellung wird automatisch ein Backup des aktuellen Bots erstellt.
| Tool | Funktion |
|---|---|
list_bot_snapshots | Listet Snapshots eines Bots, neueste zuerst. botId ist erforderlich. |
create_bot_snapshot | Speichert die aktuelle Bot-Definition als neue Version. botId ist erforderlich; message ist optional. |
restore_bot_snapshot | Stellt einen Snapshot wieder her und erstellt vorher ein automatisches Backup. botId und snapshotId sind erforderlich. |
diff_bot_snapshots | Vergleicht die vollständigen Definitionen zweier Snapshots. botId, fromSnapshotId und toSnapshotId sind erforderlich. |
Bot-Tests
Bot-Test-Tools verwalten Testkonfigurationen für zwei verschiedene Bots im authentifizierten Unternehmen. Der Quell-Bot
ist die anrufende Seite, der Ziel-Bot die antwortende Seite. Die Antworten verwenden die öffentliche API-Struktur mit
srcBotId und destBotId.
| Tool | Funktion |
|---|---|
list_bot_tests | Listet Bot-Tests des authentifizierten Unternehmens auf. |
create_bot_test | Erstellt einen Bot-Test. name, srcBotId und destBotId sind erforderlich; settings ist optional. |
update_bot_test | Aktualisiert einen Bot-Test. id ist erforderlich; nicht angegebene Felder bleiben erhalten. |
delete_bot_test | Löscht einen Bot-Test. id ist erforderlich. |
settings kann convInitBot, maxConvTurns, asCall, startTimeout und stateUpdate enthalten. Beide Bots müssen
sichtbar sein und zum authentifizierten Unternehmen gehören; Quell- und Ziel-Bot müssen verschieden sein.
Stages
| Tool | Funktion |
|---|---|
list_stages | Listet alle geordneten Stages eines Bots. botId ist erforderlich. |
create_stage | Erstellt eine Stage und hängt sie an einen Bot. botId und name sind erforderlich. Prompt, Tools, Funktionen, Settings und stage_config definieren das Verhalten. |
update_stage | Ändert eine Stage und ihre botbezogene Konfiguration. botId und stageId sind erforderlich; instance_settings ändert die Instanzwerte. |
delete_stage | Entfernt eine Stage aus dem Flow. botId und stageId sind erforderlich. |
prompt und tools haben jeweils einen eigenen Ausführungsmodus. Die Flags settings.promptExec und settings.toolsExec sind unabhängig voneinander und müssen nur für das jeweilige Feld gesetzt werden:
- Wenn
promptExecfehlt oderfalseist, wirdpromptals Liquid-Text verarbeitet und als System-Nachricht an das LLM übergeben. WennpromptExec: truegesetzt ist, musspromptJavaScript mitprompt(params)enthalten. Diese Funktion muss ein Objekt zurückgeben:{ prompt: "..." }erzeugt eine System-Nachricht, die das LLM für die nächste Antwort verwendet;{ text: "..." }erzeugt eine direkte Assistant-Nachricht, die unverändert zurückgegeben wird. Gibt die Funktion beide Felder zurück, wird nurpromptverwendet. - Wenn
toolsExecfehlt oderfalseist, musstools– sofern es nicht leer ist – ein JSON-kodierter String sein, der zu einem Array von OpenAI-kompatiblen Function-Tools decodiert werden kann. Jedes lokale Tool benötigt außerdem einen gleichnamigen Handler infunctions; ein Eintrag infunctionsallein wird niemals automatisch ausgeführt. WenntoolsExec: truegesetzt ist, musstoolsstattdessen JavaScript mittools(params)enthalten. Die Funktion muss{ tools: [...] }zurückgeben; ein direkt zurückgegebenes Array ist ungültig. Dynamisch erzeugte lokale Tools benötigen ebenfalls gleichnamige Handler infunctions. - Die beiden Felder dürfen unterschiedliche Modi verwenden. Beispielsweise sind ein JavaScript-
promptmit statischen JSON-Tools oder ein Liquid-promptmit dynamisch erzeugten JavaScript-Tools zulässig. Nicht zulässig ist nur das Vermischen der Formate innerhalb desselben Feldes:promptdarf nicht gleichzeitig Liquid-Text und eine JavaScript-Funktion enthalten, undtoolsdarf nicht gleichzeitig ein JSON-Array-String und JavaScript-Code sein.
Ein Tool-Handler muss ein strukturiertes Objekt zurückgeben. data wird als Tool-Ergebnis an das LLM übergeben, damit es daraus die nächste Assistant-Antwort formuliert. text wird dagegen direkt und unverändert als Assistant-Nachricht zurückgegeben. Wenn ein Handler beide Felder liefert, hat data Vorrang; text wird dann nicht direkt ausgegeben. Die Handler in functions werden erst ausgeführt, wenn das LLM das jeweilige Tool aufruft.
list_stages liefert außerdem botEngine: lightweight steht für synchrones JavaScript mit api() und webhook(), extendedNodeJs für Promise-basiertes JavaScript mit fetch. Ein nicht-null settings.packageJson aktiviert extendedNodeJs; ein fehlender oder null-Wert aktiviert lightweight. Verwenden Sie im Lightweight-Modus nicht async, await, fetch, Promise, import oder require.
Stage-Namen sind exakt und groß-/kleinschreibungssensitiv. settings.initialStages legt den anfänglichen Stack fest. Prompt-Code kann den Stage wechseln, indem er den aktualisierten Stack zurückgibt:
function prompt(params) {
params.stack.push("Booking");
return { state: params.state, stack: params.stack, prompt: "Frage nach dem Buchungsdatum." };
}Ein Tool kann mit transitionTo: "Booking" wechseln; dropStage: true entfernt den aktuellen Stage vor dem Handler. Dynamische Tools verwenden function tools(params) { return { tools: [...] }; }; jedes lokale Tool benötigt einen gleichnamigen Handler in functions. toolsState/toolsStack gelten für tools(params), state/stack in der Tooldefinition für den Handler.
SIP-Konten
| Tool | Funktion |
|---|---|
list_sip_accounts | Listet SIP-Konten für Registrierung, Routing, Webhooks und Weiterleitungen. include_inactive ist standardmäßig true. |
create_sip_account | Speichert ein editierbares SIP-Konto und stößt eine Connector-Registrierung an. Es wird keine Telefonnummer gekauft oder provisioniert. |
update_sip_account | Aktualisiert ein Konto und erhält nicht angegebene Felder. id ist erforderlich; Settings werden zusammengeführt. |
delete_sip_account | Löscht editierbare Konten. Systemverwaltete Konten werden stattdessen mit register: false abgemeldet. |
SIP-Passwörter sind nur schreibbar und werden niemals zurückgegeben. Beim Update erhält das Weglassen eines Passworts das bestehende Passwort; ein leerer String löscht es.
Anrufverläufe und Traces
| Tool | Funktion |
|---|---|
list_call_history | Findet Telefon- und Chat-Sessions. Alle Argumente sind optional; verfügbar sind unter anderem botId, ISO-8601 start/end_date, call, limit und offset. Ohne Argumente werden alle Bots durchsucht. |
get_trace_conversation | Liefert Gesprächszeilen und Trace-Ereignisse einer Session. callSessionId ist erforderlich; limit ist auf 1000 begrenzt. |
list_call_webhook_events | Liefert die vollständigen gespeicherten Webhook- und JavaScript-Ereignisse einer Session einschließlich Headern, Bodies, Fehlern, URLs und Laufzeiten. callSessionId ist erforderlich; limit ist auf 1000 begrenzt. |
get_trace_conversation enthält Webhook-Aufrufe nur zusammengefasst als fsCalls. Für vollständige Ereignisdaten verwenden Sie list_call_webhook_events. Gespräche mit aktivierter Datenaufbewahrungs-Sperre werden ausgeschlossen; konfigurierte Filter für verborgene APIs werden angewendet.
Wichtige Hinweise
- Lesen Sie vor dem Ändern eines Bots immer seine vollständigen Stages.
- Behalten Sie beim Ändern einer Stage den Text-/JavaScript-Modus bei.
- Beachten Sie, dass das Löschen von Bots oder Stages aktive Gesprächsabläufe verändern kann.
- Beachten Sie, dass das Erstellen eines SIP-Kontos die Konfiguration speichert und die Connector-Registrierung auslösen kann, aber keine DID provisioniert.