Functionele omschrijving
Moeilijkheidsgraad: Moeilijk

De tools achter de configuratiedeur /mcpconfig: waarmee een omgeving wordt ingericht. Producten en prijzen, het front en het thema, e-mailsjablonen en de boekingsworkflow. Een sleutel met scope config opent deze deur; hoe je verbindt staat in Een AI-agent verbinden met de MCP-server. Het dagelijkse werk zit achter een andere deur — zie MCP operationele tools.

Plan en toepassen zijn twee tools

Elke schrijvende handeling bestaat hier uit twee tools: ..._plan laat zien wat er zou veranderen en schrijft niets, ..._apply voert het uit. Dat is geen formaliteit maar de kern van hoe deze deur veilig te gebruiken is: je laat een plan zien aan iemand die er ja op zegt, en pas dan wordt er iets geschreven. Ze hebben elk hun eigen recht, dus je kunt iemand wel laten kijken en niet laten wijzigen.

Een _apply die niets aantreft om te wijzigen is een succes en geen fout: als de waarde al stond zoals gevraagd, meldt het antwoord dat er niets veranderde. Een client die zijn antwoord kwijtraakte kan dus gewoon opnieuw proberen.

Twee sloten en het productieslot

Voordat hier iets geschreven wordt, moeten twee sloten open staan: één die de leverancier zet voor de hele omgeving, en één die de licentiehouder zelf zet. Staat er één dicht, dan wordt ook het plan geweigerd — anders zou de deur die je niet open kunt doen wel in detail vertellen wat erachter staat.

Daarbovenop geldt voor de zwaarste tools een derde voorwaarde: op een productieomgeving worden ze helemaal niet uitgevoerd. Dat zijn de tools met niveau 2 in de tabel hieronder — de statussen en de automatische statusovergangen. Die verzetten bepaalt welke e-mail bij welke statuswijziging uitgaat, en dat is bij de eerstvolgende taakverwerking echte post aan echte klanten. Thema-CSS wijzigen mag wel op productie: dat is te zien en terug te draaien.

De tools

ToolsLezen/schrijvenNiveauOmschrijving
env_describe / config_diff_vs_baseline / recent_changeslezen-Wat is deze omgeving, wat wijkt af van een verse installatie, en wat is er onlangs gewijzigd
object_explain / pricing_explain / availability_why_not_bookablelezen-Uitleg bij één product: de instellingen, de prijsopbouw, en waarom het op een datum niet boekbaar is
object_create / object_update / object_set_periods / object_set_extras / object_set_participantsschrijven1Producten aanmaken en wijzigen, met hun periodes, extra opties en deelnemerstypen, en de boekingsinstellingen: deelnemerslimieten, buffertijden en hoe ver vooruit je boekt
object_copyschrijven1Een product kopiëren naar een nieuw, direct boekbaar product: kalender, prijzen, openingstijden, opties, vragen, deelnemers, resources en statusmails gaan mee. De kopie staat eerst uit en kan meteen aan een locatie hangen
object_set_opening_hoursschrijven1Openingstijden in groepen (bijvoorbeeld standaard en zomer): per weekdag van–tot, en open, gesloten of op aanvraag
object_set_price_schemasschrijven1De prijzen per periode, in groepen: per weekdag en tijdvak de prijs, het prijstype en de btw
object_set_calendarschrijven1De kalender: welke prijsgroep en welke openingstijden-groep op welke data gelden. Een datum zonder kalenderregel is niet boekbaar
object_set_questionsschrijven1Boekingsvragen met type, verplicht en antwoordmogelijkheden. De opbouw geldt in alle talen
object_set_resourcesschrijven1Welke resources een product bezet (ruimte, opstelling, medewerker, materiaal) en hoe
object_set_attributesschrijven1Adres, GPS-locatie en de eigen velden van een product, zoals soort ruimte of capaciteit. Het plan toont hoe jouw omgeving elk eigen veld noemt
resource_describe / resource_create / resource_updatelezen/schrijven1Resources beheren: ruimtes, medewerkers, opstellingen en materiaal, met aantal en buffertijden
vat_describelezen-De btw-tarieven van de omgeving, en welk tarief standaard is
franchise_describe / franchise_create / franchise_updatelezen/schrijven1Locaties (vestigingen) beheren: naam en adres, en hoeveel locaties je licentie toestaat
franchise_set_objectsschrijven1Welke producten een locatie verkoopt
product_set_activeschrijven1Een product aan- of uitzetten
combi_create / combi_updateschrijven1Arrangementen samenstellen
combi_copyschrijven1Een arrangement kopiëren, met onderdelen, opties, prijzen, kalender en statusmails. De kopie staat eerst uit
combi_set_partsschrijven1De onderdelen van een arrangement, in volgorde: welke producten en periodes het boekt, en of een onderdeel optioneel is
combi_set_extrasschrijven1De opties van een arrangement
combi_set_price_schemas / combi_set_calendarschrijven1De prijzen en de kalender van een arrangement
theme_describe / theme_set_variables / theme_set_css / theme_set_logo / theme_rebuildlezen/schrijven1Het front-thema: kleuren en variabelen, eigen CSS, logo, en opnieuw compileren
theme_patch_cssschrijven1Een deel van de eigen CSS wijzigen: een kleur, een regel of een benoemd blok, zonder de hele stylesheet opnieuw te sturen
media_upload_linkschrijven1Een eenmalige uploadlink naar de mediabibliotheek, voor een logo, stylesheet of lettertype
media_fetchschrijven1Een bestand van de eigen website naar de mediabibliotheek halen
brand_set_logoschrijven1Het huisstijllogo
content_block_describe / content_block_create / content_block_updatelezen/schrijven1De blokken waaruit een frontpagina is opgebouwd
content_block_deleteschrijven1Een blok verwijderen. Geweigerd zolang het nog ergens gebruikt wordt: op een pagina, in een thema, in een ander blok of in een formulier
content_block_patchschrijven1Een deel van een blokveld wijzigen, bijvoorbeeld één filter in het script van de zoek-en-boekpagina, zonder het hele veld opnieuw te sturen
menu_describe_items / menu_set_itemslezen/schrijven1De items van een menu als lijst: volgorde, uitklapmenu's, de pagina waar een item naartoe gaat en het label per taal
page_describe / page_create / page_updatelezen/schrijven1Contentpagina's in het front
page_list / page_check_linkslezen-Alle contentpagina's, en welke interne links in menu's, contentblokken en de homepage nergens naartoe gaan
page_deleteschrijven1Een pagina verwijderen. Geweigerd als een andere taalversie ernaar verwijst, tenzij je die verwijzing meteen laat opruimen
theme_set_menuschrijven1Welk menu de kop van een thema per taal toont
homepage_setschrijven1Welke pagina het front opent als een bezoeker op het basisadres komt
template_describe / template_create / template_update / template_section_setlezen/schrijven1E-mail- en pdf-sjablonen en hun kop-, voet- en css-onderdelen
template_deleteschrijven1Een sjabloon verwijderen. Geweigerd zolang het nog ergens gebruikt wordt; het antwoord noemt waar. Een actief sjabloon wordt alleen verwijderd als je vraagt het eerst uit te zetten
workflow_describelezen-De hele boekingsworkflow in één antwoord: statussen, handmatige en automatische overgangen, en welk sjabloon bij welke overgang hoort — inclusief controles op sjablonen die nergens meer naar wijzen
status_setschrijven2Een boekingsstatus wijzigen: of hij bezetting inneemt, en waar iemand een boeking met de hand naartoe mag verplaatsen
status_createschrijven1Een nieuwe boekingsstatus (de code is alleen cijfers), met dezelfde instellingen als status_set. Een nieuwe status bezet standaard een plaats, net als in het scherm
auto_set / auto_deleteschrijven2Automatische statusovergangen: van welke status naar welke, op welk moment, en welke e-mail of sms daarbij hoort
status_override_set / status_override_deleteschrijven2Welke e-mail of sms bij een statusovergang van één product of arrangement uitgaat. Een regel verwijderen maakt die overgang stil: er valt niets terug op een standaard
payment_schedule_describe / payment_schedule_set / payment_schedule_deletelezen/schrijven2Betaalschema's: de termijnen, hun teksten en voor welk product of arrangement ze gelden. Verwijderen wordt geweigerd zolang een automatisering op de termijn wacht
user_profile_describe / user_profile_create / user_profile_updatelezen/schrijven1Gebruikersprofielen: de korting voor een groep klanten (vast bedrag of percentage), en welke klantstatus het profiel toekent
user_profile_set_objectsschrijven1Voor welke producten een profiel geldt, en daarmee welke producten klanten met dat profiel in het front zien
customer_status_describe / customer_status_createlezen/schrijven1Klantstatussen: mag reserveren, mag factureren, naar welke statussen een klant mag, het profiel dat de status toekent, en de kleuren
customer_status_updateschrijven2Een bestaande klantstatus wijzigen. Dat geldt meteen voor alle klanten die al in die status staan
telnyx_diagnoselezen-Diagnose van de telefonische assistent bij Telnyx: welke MCP-tools hij mag gebruiken en of hij ze in recente gesprekken aanriep
language_listlezen-De talen van de omgeving (actief, standaard) en welke onderdelen vertaalbaar zijn
language_activateschrijven1Een fronttaal aan- of uitzetten; het plan telt wat er in die taal nog leeg staat
language_missing_reportlezen-Per onderdeel de teksten die in de brontaal wel en in de nieuwe taal nog niet gevuld zijn, met de brontekst erbij
translation_get / translation_setlezen/schrijven1Vertalingen lezen en opslaan, tot 50 tegelijk, over alle vertaalbare onderdelen heen

Een product boekbaar maken

Een product is pas te boeken als het periodes, openingstijden, prijzen en een kalender heeft. De snelste weg is kopiëren: object_copy maakt een nieuw product als kopie van een bestaand, met alles erop en eraan, en zet het eerst uit. Je past daarna aan wat anders is en zet het aan met product_set_active.

Begin je vanaf nul, dan is de volgorde:

  1. object_create: het product zelf.
  2. object_set_periods: hoe lang je het boekt, bijvoorbeeld een uur, een dagdeel of een dag.
  3. object_set_opening_hours: wanneer het open is, in een of meer groepen.
  4. object_set_price_schemas: de prijzen per periode, in een of meer groepen.
  5. object_set_calendar: welke prijsgroep en openingstijden-groep op welke data gelden.
  6. Waar nodig object_set_extras, object_set_participants, object_set_questions, object_set_resources en object_set_attributes.
  7. product_set_active: aanzetten. availability_why_not_bookable vertelt waarom een product op een datum nog niet te boeken is.

Onderweg wordt een aantal dingen bewaakt:

  • Elke lijst is volledig. Je stuurt alle periodes, openingstijden of opties die er daarna moeten zijn. Wat niet in de lijst staat, verdwijnt. Bestaande regels worden bijgewerkt en houden hun nummer.
  • Een kalenderregel mag alleen groepen noemen die bestaan, en een groep die de kalender nog gebruikt, kan niet weg. Wissel je van prijsgroep, zet dan eerst de nieuwe groep neer, zet de kalender om en laat daarna de oude groep weg.
  • Overlappende tijden op één dag en overlappende kalenderregels worden geweigerd voordat er iets wordt opgeslagen.
  • Tijden schrijf je als uu:mm. 24:00 is middernacht, 26:00 is 02:00 de volgende dag.
  • Vragen bestaan per taal. De opbouw (type, verplicht, volgorde en de antwoordmogelijkheden) geldt in alle talen. De vraagtekst en de labels van de antwoorden vertaal je met translation_set. Een vraag die je weglaat, verdwijnt in alle talen.
  • Een GPS-locatie wordt opgeslagen op ongeveer zeven cijfers: 51.578721 wordt 51.57872, op ongeveer een meter nauwkeurig.
  • Een product, arrangement of locatie van een andere licentie bestaat voor deze tools niet.

Een arrangement richt je op dezelfde manier in: combi_create of combi_copy, dan combi_set_parts (welke producten en periodes het boekt), combi_set_extras, combi_set_price_schemas en combi_set_calendar. combi_update zet het aan, maar pas als het onderdelen heeft.

Meerdere locaties

Verkoop je op meer dan één locatie, dan richt je per locatie een vestiging in en koppel je de producten die daar te boeken zijn. De zoek-en-boekpagina kan daarna op locatie filteren.

  1. franchise_describe laat de bestaande locaties zien, en hoeveel locaties je licentie toestaat.
  2. franchise_create maakt een locatie met naam en adres. De naam in andere talen zet je met translation_set.
  3. franchise_set_objects koppelt de producten. Met object_copy kun je een nieuw product ook meteen aan een locatie hangen.
  4. Met content_block_patch pas je de zoek-en-boekpagina aan, bijvoorbeeld om een locatiefilter toe te voegen, zonder het hele script opnieuw te sturen. Is het script tussendoor in de admin gewijzigd, dan wordt de wijziging geweigerd en leest de assistent het opnieuw.
  • Je licentie bepaalt hoeveel locaties je kunt aanmaken. Bij het maximum wordt een nieuwe locatie geweigerd; het maximum verhogen is een wijziging van je licentie.
  • Bestaande boekingen houden hun locatie. Moeten ze meeverhuizen naar de locatie waar het product nu hangt, vraag dat dan uitdrukkelijk.
  • De naam van een locatie moet uniek zijn. Twee locaties met dezelfde naam zijn voor een bezoeker niet te onderscheiden.

Het front inrichten

Een front bestaat uit contentblokken, pagina's die die blokken tonen, een menu, een thema en een homepage. Met de tools gaat dat in deze volgorde: blokken maken en vullen (content_block_create, content_block_update), er pagina's van maken (page_create), het menu vullen (menu_set_items), het menu aan het thema koppelen (theme_set_menu) en de homepage kiezen (homepage_set). Tot slot laat page_check_links zien of er nog links zijn die nergens naartoe gaan.

Onderweg wordt een aantal dingen bewaakt, zodat een fout niet pas bij de bezoeker opvalt:

  • De inhoud van een contentblok wordt vóór het opslaan gecontroleerd, op dezelfde manier als in de editor. Tekst die de pagina zou breken, zoals een losse accolade of een {if} zonder {/if}, wordt geweigerd. Plaats JavaScript en CSS met accolades tussen {literal} en {/literal}.
  • Het menu in de kop wordt per taal gekozen, en een taal zonder menu valt niet terug op een andere taal. Het plan van theme_set_menu noemt elke actieve taal die daarna geen menu heeft.
  • Een menu dat voor één taal is ingesteld, heeft alleen labels in die taal nodig. Een menu voor alle talen heeft een label in elke actieve taal nodig.
  • De homepage is één instelling voor alle talen. Wisselt een bezoeker van taal, dan volgt het front de gekoppelde taalversie van die pagina. Het plan van homepage_set waarschuwt voor elke actieve taal waarin de pagina geen versie heeft.
  • De linkcontrole kijkt alleen naar links waar een bezoeker op klikt. JavaScript telt niet mee, ook als daar iets als location.href in staat.

Logo en huisstijl aanleveren

Een logo of een complete stylesheet plak je niet in het gesprek met je assistent. Dat is traag, en één verkeerd teken maakt het bestand onbruikbaar. Het bestand gaat eerst naar de mediabibliotheek van je omgeving, en daarna verwijst de assistent ernaar.

  1. Bestand aanleveren. Vraag de assistent om een uploadlink (media_upload_link). Open de link, kies het bestand en klik op Uploaden. Staat het logo al op je eigen website, dan kan de assistent het ook zelf ophalen (media_fetch).
  2. Laten gebruiken. De assistent zet het bestand daarna als logo (brand_set_logo of theme_set_logo) of als stylesheet van het thema (theme_set_css). Je hoeft niets in de admin te plakken.

Voorbeeld: "Maak het logo op onze site en in de bevestigingsmail het logo dat ik nu upload, en maak de knoppen donkergroen." De assistent maakt een uploadlink, zet na je upload het logo, en past alleen de knopkleur aan met theme_patch_css. De rest van de stylesheet blijft onaangeroerd.

  • Een uploadlink werkt één keer en is standaard 15 minuten geldig. Wordt een bestand geweigerd, bijvoorbeeld omdat het geen afbeelding is, dan blijft de link bruikbaar.
  • Toegestaan: afbeeldingen (png, jpg, gif, webp, svg, ico), stylesheets (css) en lettertypen (woff, woff2, ttf, otf), tot 5 MB. Het bestandstype wordt uit de inhoud bepaald, niet uit de naam.
  • Ophalen kan alleen van de eigen domeinen van je licentie. Dat zijn de domeinen in de instelling CORS - Toegestane domeinen.
  • Voor deze tools heb je het recht menu_config_manage_media (media beheren) nodig, en de sloten hierboven moeten open staan.
  • Bij een kleine wijziging controleert theme_patch_css eerst of de stylesheet nog dezelfde is als toen de assistent hem las. Is hij tussendoor in de admin gewijzigd, dan wordt de wijziging geweigerd en leest de assistent hem opnieuw.

Klantprofielen en klantstatussen

Met een gebruikersprofiel geef je een groep klanten een eigen prijs: een vast bedrag of een percentage korting. Een profiel bepaalt ook welke producten die klanten in het front zien. Een klantstatus legt vast wat een klant mag, zoals reserveren of op factuur betalen, en kan de klant een profiel geven. Zo richt je bijvoorbeeld in: vaste klanten 10% korting, non-profit 25%, en een zwarte lijst die niet meer mag reserveren.

  1. user_profile_create: het profiel met de korting. Een percentage kan over de prijs vóór of na andere kortingen gaan, met of zonder opties.
  2. user_profile_set_objects: voor welke producten het profiel geldt.
  3. customer_status_create: de klantstatus, met wat de klant mag en het profiel dat de status toekent. customer_status_describe laat de bestaande statussen zien.

Onderweg wordt een aantal dingen bewaakt:

  • Een profiel zonder gekoppelde producten geldt voor alle producten. Koppel je er wel producten aan, dan zien klanten met dat profiel alleen die producten. Het plan van user_profile_set_objects waarschuwt in beide gevallen.
  • Een klant krijgt het profiel van zijn status pas bij de eerstvolgende statuswissel. Heeft hij nog geen login maar wel een e-mailadres, dan krijgt hij daarbij een login zonder wachtwoord. Het plan meldt dat.
  • Een bestaande klantstatus wijzigen (customer_status_update) heeft niveau 2: op een productieomgeving wordt het niet uitgevoerd. Mag reserveren en mag factureren veranderen namelijk meteen voor alle klanten die al in die status staan. Een nieuwe status raakt nog niemand.
  • Staat een klantstatus nog op de standaardinstelling van het systeem, dan maakt de eerste wijziging er een eigen kopie voor je licentie van, net als in het scherm.
  • De naam van een klantstatus zet je in de huidige taal. Andere talen vul je met translation_set.

Voor de profielen is het recht menu_object_userprofile nodig, voor de klantstatussen menu_config_status_customer.

Een extra taal toevoegen

Zet je een fronttaal aan, dan wordt er niets gekopieerd. Alles wat nog geen tekst in die taal heeft, blijft in het front leeg: de productnamen, de opties, de statussen, de labels van velden, de contentblokken, het menu en de pagina's. Er valt vrijwel nergens iets terug op de standaardtaal. De taaltools maken van dat handwerk één gestructureerde klus:

  1. language_activate_plan laat zien hoeveel teksten er per onderdeel nog leeg staan. Pas na akkoord zet language_activate_apply de taal aan.
  2. language_missing_report geeft de werkvoorraad: per onderdeel welke teksten ontbreken, met de brontekst erbij.
  3. De agent vertaalt en translation_set_plan laat per tekst zien wat er zou veranderen. translation_set_apply slaat het op.

Drie dingen worden altijd bewaakt. Een tekst die al gevuld is, wordt niet overschreven, tenzij dat uitdrukkelijk gevraagd wordt. Codes als {NAME} of ##OWNER_ID## en de HTML-opmaak van een tekst moeten na het vertalen precies zo terugkomen. En een tekst mag niet langer zijn dan het veld toestaat. Voor een contentpagina in een nieuwe taal is een eigen url nodig; die wordt niet van de oorspronkelijke pagina overgenomen.

E-mail- en pdf-sjablonen vallen hier buiten: dat zijn aparte documenten per taal, en die maak je met de sjabloontools.

Voor al deze tools is het recht menu_config_language nodig, plus het recht van het scherm waar de tekst normaal bewerkt wordt. Wie de producten niet mag wijzigen, kan ze via AI dus ook niet vertalen.

De exacte, altijd actuele lijst met alle invoervelden vraag je op met de standaard MCP-methode tools/list op de deur zelf. Wat je terugkrijgt hangt af van je rechten, dus een kortere lijst dan hier betekent meestal dat een recht ontbreekt.

Welke rechten elke tool nodig heeft, staat per recht op Rechten op AI-configuratietools.

BETA. Deze deur is nieuw en wordt nog doorontwikkeld. Toolnamen, invoervelden en niveaus kunnen tussen releases wijzigen zonder overgangsperiode. Gebruik de plan-variant voordat je iets toepast, en bouw er nog geen productie-integratie op die niet stuk mag.