MCP configuratie-tools
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
| Tools | Lezen/schrijven | Niveau | Omschrijving |
|---|---|---|---|
| env_describe / config_diff_vs_baseline / recent_changes | lezen | - | Wat is deze omgeving, wat wijkt af van een verse installatie, en wat is er onlangs gewijzigd |
| object_explain / pricing_explain / availability_why_not_bookable | lezen | - | 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_participants | schrijven | 1 | Producten aanmaken en wijzigen, met hun periodes, extra opties en deelnemerstypen, en de boekingsinstellingen: deelnemerslimieten, buffertijden en hoe ver vooruit je boekt |
| object_copy | schrijven | 1 | Een 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_hours | schrijven | 1 | Openingstijden in groepen (bijvoorbeeld standaard en zomer): per weekdag van–tot, en open, gesloten of op aanvraag |
| object_set_price_schemas | schrijven | 1 | De prijzen per periode, in groepen: per weekdag en tijdvak de prijs, het prijstype en de btw |
| object_set_calendar | schrijven | 1 | De kalender: welke prijsgroep en welke openingstijden-groep op welke data gelden. Een datum zonder kalenderregel is niet boekbaar |
| object_set_questions | schrijven | 1 | Boekingsvragen met type, verplicht en antwoordmogelijkheden. De opbouw geldt in alle talen |
| object_set_resources | schrijven | 1 | Welke resources een product bezet (ruimte, opstelling, medewerker, materiaal) en hoe |
| object_set_attributes | schrijven | 1 | Adres, 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_update | lezen/schrijven | 1 | Resources beheren: ruimtes, medewerkers, opstellingen en materiaal, met aantal en buffertijden |
| vat_describe | lezen | - | De btw-tarieven van de omgeving, en welk tarief standaard is |
| franchise_describe / franchise_create / franchise_update | lezen/schrijven | 1 | Locaties (vestigingen) beheren: naam en adres, en hoeveel locaties je licentie toestaat |
| franchise_set_objects | schrijven | 1 | Welke producten een locatie verkoopt |
| product_set_active | schrijven | 1 | Een product aan- of uitzetten |
| combi_create / combi_update | schrijven | 1 | Arrangementen samenstellen |
| combi_copy | schrijven | 1 | Een arrangement kopiëren, met onderdelen, opties, prijzen, kalender en statusmails. De kopie staat eerst uit |
| combi_set_parts | schrijven | 1 | De onderdelen van een arrangement, in volgorde: welke producten en periodes het boekt, en of een onderdeel optioneel is |
| combi_set_extras | schrijven | 1 | De opties van een arrangement |
| combi_set_price_schemas / combi_set_calendar | schrijven | 1 | De prijzen en de kalender van een arrangement |
| theme_describe / theme_set_variables / theme_set_css / theme_set_logo / theme_rebuild | lezen/schrijven | 1 | Het front-thema: kleuren en variabelen, eigen CSS, logo, en opnieuw compileren |
| theme_patch_css | schrijven | 1 | Een deel van de eigen CSS wijzigen: een kleur, een regel of een benoemd blok, zonder de hele stylesheet opnieuw te sturen |
| media_upload_link | schrijven | 1 | Een eenmalige uploadlink naar de mediabibliotheek, voor een logo, stylesheet of lettertype |
| media_fetch | schrijven | 1 | Een bestand van de eigen website naar de mediabibliotheek halen |
| brand_set_logo | schrijven | 1 | Het huisstijllogo |
| content_block_describe / content_block_create / content_block_update | lezen/schrijven | 1 | De blokken waaruit een frontpagina is opgebouwd |
| content_block_delete | schrijven | 1 | Een 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_patch | schrijven | 1 | Een 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_items | lezen/schrijven | 1 | De 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_update | lezen/schrijven | 1 | Contentpagina's in het front |
| page_list / page_check_links | lezen | - | Alle contentpagina's, en welke interne links in menu's, contentblokken en de homepage nergens naartoe gaan |
| page_delete | schrijven | 1 | Een pagina verwijderen. Geweigerd als een andere taalversie ernaar verwijst, tenzij je die verwijzing meteen laat opruimen |
| theme_set_menu | schrijven | 1 | Welk menu de kop van een thema per taal toont |
| homepage_set | schrijven | 1 | Welke pagina het front opent als een bezoeker op het basisadres komt |
| template_describe / template_create / template_update / template_section_set | lezen/schrijven | 1 | E-mail- en pdf-sjablonen en hun kop-, voet- en css-onderdelen |
| template_delete | schrijven | 1 | Een 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_describe | lezen | - | 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_set | schrijven | 2 | Een boekingsstatus wijzigen: of hij bezetting inneemt, en waar iemand een boeking met de hand naartoe mag verplaatsen |
| status_create | schrijven | 1 | Een 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_delete | schrijven | 2 | Automatische statusovergangen: van welke status naar welke, op welk moment, en welke e-mail of sms daarbij hoort |
| status_override_set / status_override_delete | schrijven | 2 | Welke 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_delete | lezen/schrijven | 2 | Betaalschema'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_update | lezen/schrijven | 1 | Gebruikersprofielen: de korting voor een groep klanten (vast bedrag of percentage), en welke klantstatus het profiel toekent |
| user_profile_set_objects | schrijven | 1 | Voor welke producten een profiel geldt, en daarmee welke producten klanten met dat profiel in het front zien |
| customer_status_describe / customer_status_create | lezen/schrijven | 1 | Klantstatussen: mag reserveren, mag factureren, naar welke statussen een klant mag, het profiel dat de status toekent, en de kleuren |
| customer_status_update | schrijven | 2 | Een bestaande klantstatus wijzigen. Dat geldt meteen voor alle klanten die al in die status staan |
| telnyx_diagnose | lezen | - | Diagnose van de telefonische assistent bij Telnyx: welke MCP-tools hij mag gebruiken en of hij ze in recente gesprekken aanriep |
| language_list | lezen | - | De talen van de omgeving (actief, standaard) en welke onderdelen vertaalbaar zijn |
| language_activate | schrijven | 1 | Een fronttaal aan- of uitzetten; het plan telt wat er in die taal nog leeg staat |
| language_missing_report | lezen | - | 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_set | lezen/schrijven | 1 | Vertalingen 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:
object_create: het product zelf.object_set_periods: hoe lang je het boekt, bijvoorbeeld een uur, een dagdeel of een dag.object_set_opening_hours: wanneer het open is, in een of meer groepen.object_set_price_schemas: de prijzen per periode, in een of meer groepen.object_set_calendar: welke prijsgroep en openingstijden-groep op welke data gelden.- Waar nodig
object_set_extras,object_set_participants,object_set_questions,object_set_resourcesenobject_set_attributes. product_set_active: aanzetten.availability_why_not_bookablevertelt 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:00is middernacht,26:00is 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.
franchise_describelaat de bestaande locaties zien, en hoeveel locaties je licentie toestaat.franchise_createmaakt een locatie met naam en adres. De naam in andere talen zet je mettranslation_set.franchise_set_objectskoppelt de producten. Metobject_copykun je een nieuw product ook meteen aan een locatie hangen.- Met
content_block_patchpas 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_menunoemt 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_setwaarschuwt 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.hrefin 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.
- 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). - Laten gebruiken. De assistent zet het bestand daarna als logo (
brand_set_logooftheme_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_csseerst 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.
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.user_profile_set_objects: voor welke producten het profiel geldt.customer_status_create: de klantstatus, met wat de klant mag en het profiel dat de status toekent.customer_status_describelaat 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_objectswaarschuwt 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:
language_activate_planlaat zien hoeveel teksten er per onderdeel nog leeg staan. Pas na akkoord zetlanguage_activate_applyde taal aan.language_missing_reportgeeft de werkvoorraad: per onderdeel welke teksten ontbreken, met de brontekst erbij.- De agent vertaalt en
translation_set_planlaat per tekst zien wat er zou veranderen.translation_set_applyslaat 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.


