Gebruik het OpenAPI-contract om een integratieclient te genereren. De publieke API, het dashboard en het MCP-beheerendpoint werken op dezelfde resources en rechten van de werkruimte.
| Mogelijkheid | Endpoint |
|---|---|
| Herbruikbare tools | GET / POST /api/v1/voice/tools |
| Een tool lezen / bijwerken / verwijderen | GET / PATCH / DELETE /api/v1/voice/tools/{id} |
| Een tool bekijken of testen | POST /api/v1/voice/tools/{id}/test |
| Tools aan een agent koppelen | PUT /api/v1/voice/agents/{id}/tools |
| Kennisbanken | GET / POST /api/v1/voice/knowledge-bases |
| Een kennisbank lezen / bijwerken / verwijderen | GET / PATCH / DELETE /api/v1/voice/knowledge-bases/{id} |
| Documenten toevoegen / weergeven | POST / GET /api/v1/voice/knowledge-bases/{id}/documents |
| Een document lezen / verwijderen | GET / DELETE /api/v1/voice/knowledge-bases/{id}/documents/{doc_id} |
| Abonnementen op gespreksgebeurtenissen | GET / POST /api/v1/voice/webhooks |
| Een abonnement lezen / bijwerken / verwijderen | GET / PATCH / DELETE /api/v1/voice/webhooks/{id} |
| Een ondertekende testgebeurtenis sturen | POST /api/v1/voice/webhooks/{id}/test |
| Externe MCP-tools ontdekken | POST /api/v1/voice/mcp/discover |
| MCP-beheerendpoint | /api/v1/voice/mcp |
Registreer een HTTP-tool die je CRM-adapter bevraagt:
{
"name": "lookup_customer",
"description": "Find a customer after confirming their customer ID.",
"kind": "http",
"url": "https://crm.example.com/customers/{{customer_id}}",
"method": "GET",
"read_only": true,
"credential_ref": "crm",
"input_schema": {
"type": "object",
"properties": { "customer_id": { "type": "string" } },
"required": ["customer_id"],
"additionalProperties": false
},
"response_path": "data"
}
POST /tools geeft { "data": { "id": "TOOL_ID", ... } } terug. Koppel de definitie aan een agent met PUT /agents/AGENT_ID/tools en { "tool_ids": ["TOOL_ID"] }. Dit vervangt de hele toollijst door momentopnamen; koppel opnieuw wanneer een tool uit de bibliotheek verandert. Een definitie uit de bibliotheek verwijderen laat bestaande momentopnamen intact. Je kunt ook inline-definities lezen en vervangen met het veld tools van de agent-API. Gebruik analysis_config en widget_config om de analyse en de widget via de agent-API te configureren.
Een tool kan GET, POST, PUT, PATCH of DELETE gebruiken. query en request_body accepteren geneste JSON-sjablonen zoals { "customer": { "id": "{{customer_id}}" } }. Een volledige plaatshouder behoudt het oorspronkelijke JSON-type. Plaatshouders in de URL worden gecodeerd en mogen alleen na een vaste, publieke HTTPS-host staan. Zonder request_body ontvangen tools die geen GET zijn { "arguments": {...}, "call": { "callId": "...", "agentId": "...", "toolCallId": "...", "idempotencyKey": "..." } }. response_path selecteert een veld met puntnotatie. Eenvoudige parameters worden nog steeds geaccepteerd; input_schema ondersteunt daarnaast geneste objecten, arrays, enums en numerieke grenzen. Externe schemaverwijzingen en reguliere expressies worden niet geaccepteerd.
static_args: waarden die met elke aanroep worden meegestuurd, wat het model ook schrijft, zoals een winkel-id; ze vullen ook {{name}} in het adres en de body.extract: [{name, path}] bewaart velden uit het antwoord van een functie (data.id) voor het {{name}} van latere functies, zodat het customer_id van een opzoeking in de volgende bestelling kan zonder dat het model het herhaalt. De velden van een startopzoeking worden op dezelfde manier bewaard.reject_when: tot 5 regels {on: caller|agent, pattern, negate}; zolang ze allemaal gelden voor de laatste woorden, wordt de functie niet uitgevoerd en krijgt de agent reject_message.model_says: bij elke aanroep schrijft het model één zin die wordt gezegd terwijl de functie draait, in plaats van de vaste speak_before.Koppel een app onder Integraties → Webhooks en meldingen → Gekoppelde apps en gebruik daarna „Een kant-en-klare functie toevoegen” op het tabblad Kennis en tools van de agent; je hebt geen eigen endpoint nodig:
check_availability (vrije tijden op een datum) en book_appointment (boekt de tijd die de beller koos) toe. Tijden in Google Calendar volgen de tijdzone, open dagen, uren en afspraakduur die je instelt; Cal.com gebruikt de eigen beschikbaarheid van het gebeurtenistype, en een reserve-e-mailadres dat je instelt voor als de beller er geen opgeeft.save_to_sheet toe, dat een rij toevoegt met de kolommen die je opgeeft, plus het id en de tijd van het gesprek.notify_team toe, dat een door de agent geschreven bericht in een Slack-kanaal (incoming webhook) plaatst.Het besturingsvlak van EvaSay voert deze functies uit met het account dat je hebt gekoppeld; noch de worker noch de agentdefinitie bewaart de inloggegevens van de app. Bij het lezen van een agent via de API verschijnen ze als kind: "app" (met app, action, connection_id, app_config); stuur ze ongewijzigd terug bij het vervangen van tools om ze te behouden. Apps worden alleen in het dashboard gekoppeld.
Zet run_at_start: true op een van de tools van een agent en die wordt aangeroepen zodra elk gesprek begint, voordat de agent begroet of antwoordt. Parameters met de namen caller_number, called_number, direction, channel of call_id worden voor hem ingevuld. De velden die hij teruggeeft vullen {{variables}} in first_message, system_prompt en idle_messages (velden een niveau dieper als {{customer.name}}), en het hele antwoord wordt als achtergrond aan de agent gegeven. Een begroeting met variabelen wacht tot 3 seconden op het antwoord; wat niet wordt gevonden blijft leeg. Per agent kan één tool bij de start draaien.
Inloggegevens worden in de serveromgeving ingesteld voor je werkruimte en bestemming; vraag support@evasay.com om een credential_ref in te richten. Zet geen API-sleutels in agentdefinities, headers, prompts of toolparameters. Je adapter kan CRM-inloggegevens in zijn eigen omgeving bewaren.
Bekijk een tool voordat je verzoeken naar het bedrijfssysteem doet:
{
"arguments": { "customer_id": "customer-123" },
"dry_run": true,
"mock_result": { "name": "Alex", "order_status": "shipped" }
}
Een voorbeeld valideert de parameters en toont het samengestelde verzoek; het voert geen gesprek en neemt geen contact op met het bedrijfssysteem. Zet dry_run=false voor een echte uitvoering. Een echte schrijftest vereist ook confirmed=true en idempotency_key (8–128 letters, cijfers, punten, underscores, dubbele punten of koppeltekens). Testantwoorden bevatten ok, status, duration_ms en een begrensd resultaat. Ze geven geen inloggegevens terug. Lees- en schrijftests vereisen schrijfrechten in de werkruimte.
Tijdens een gesprek dragen zakelijke verzoeken een stabiele Idempotency-Key. Je zakelijke endpoint moet die respecteren. Identieke schrijfacties binnen een gesprek worden gededupliceerd, ook bewerkingen met onbekende uitkomst na een time-out. Een andere bedoelde bewerking heeft een afzonderlijk zakelijk argument nodig, zoals operation_id. EvaSay herhaalt schrijfacties niet automatisch. Gebeurtenissen van toolgebruik bevatten status en duur; de gesprekstestfunctie blijft een tekstsimulatie, geen test van toolgebruik.
POST /mcp/discover accepteert { "url": "https://crm.example.com/mcp", "credential_ref": "crm" } en geeft de tools en schema's van de server terug. Registreer alleen de geselecteerde tool:
{
"name": "lookup_customer",
"description": "Find a CRM customer by confirmed ID.",
"kind": "mcp",
"url": "https://crm.example.com/mcp",
"mcp_tool": "get_customer",
"credential_ref": "crm",
"read_only": true,
"input_schema": {
"type": "object",
"properties": { "customer_id": { "type": "string" } },
"required": ["customer_id"]
}
}
Alleen geregistreerde tools worden beschikbaar voor de agent. Externe verbindingen ondersteunen Streamable HTTP met JSON- of SSE-antwoorden op verzoeken, publieke HTTPS-bestemmingen en vooraf geconfigureerde inloggegevens. Oudere SSE-endpoints, OAuth-onderhandeling, door de server geïnitieerde sampling/elicitation en binaire bijlagen worden niet ondersteund. Ontdekking geeft niet automatisch toegang tot alle tools van de server. Het schema van de externe tool moet inline zijn en de ondersteunde subset van JSON Schema gebruiken.