Ga naar inhoud

Een AI-agent koppelen

CloudQube stelt dezelfde bouwstenen die je dashboard gebruikt beschikbaar aan AI-agents: een MCP-server op https://cloudqube.eu/mcp en een REST-API op https://cloudqube.eu/agent/v1. Een agent werkt onder een agentsleutel die jij aanmaakt, en elke sleutel draagt een beleid: op welke projecten hij werkt, hoeveel projecten hij mag aanmaken, en welke acties op jouw goedkeuring moeten wachten. Jij blijft de verantwoordelijke eigenaar, en de agent werkt met een eigen, beperkte sleutel in plaats van met jouw login.

Een sleutel is vastgezet op één project of geldt voor al je projecten. Vastzetten werkt in beide richtingen. Een vastgezette sleutel kan niet bij je andere projecten, en kan er ook geen nieuwe aanmaken, want een project dat hij aanmaakt valt buiten zijn eigen bereik en is voor hem onzichtbaar zodra het bestaat. project.create op een vastgezette sleutel antwoordt project_scope_pinned.

“Hoeveel projecten hij mag aanmaken” is dus alleen een instelling bij sleutels voor al je projecten. Zet een sleutel vast als de agent aan iets bestaands werkt; geef hem al je projecten als hij zijn eigen project moet opzetten.

Een nieuw account is beperkt tot één sleutel per project en in totaal één door een agent aangemaakt project, welke sleutels het ook aanmaakt. Die grenzen vervallen vanzelf zodra het account een afgeronde betaling heeft die ouder is dan de betwistingstermijn van kaarten en geen chargeback; policy.status toont het niveau en de ruimte.

Voeg de server toe en laat de client je aanmelden: hij vindt onze autorisatieserver, opent de CloudQube-login en toont een toestemmingsscherm waarop je een bestaande sleutel kiest of er een aanmaakt met de veilige standaardwaarden. Tokens zijn een uur geldig en vernieuwen zichzelf; een sleutel intrekken beëindigt ze bij de volgende aanroep.

Maak een sleutel aan onder Account → Agents (hij wordt één keer getoond) en geef hem mee als header. Elke streamable-HTTP-client werkt zo, en de REST-API neemt dezelfde bearer-sleutel.

Mistral is de Europese optie: Le Chat en de Vibe-CLI spreken allebei MCP.

In Le Chat of Mistral Work koppel je via de URL. Open Connectors, klik op + Add Connector, ga naar het tabblad Custom MCP Connector, zet de server-URL op https://cloudqube.eu/mcp en klik op Connect. Le Chat herkent OAuth 2.1 en leidt je door het CloudQube-toestemmingsscherm. Een connector toevoegen is een beheerdersactie; op de plannen Free, Pro en Student is de accounteigenaar de beheerder.

De Vibe-CLI koppel je met een sleutel, omdat Vibe nog geen OAuth doet voor MCP-servers. Zet dit in ~/.vibe/config.toml:

[[mcp_servers]]
name = "cloudqube"
transport = "streamable-http"
url = "https://cloudqube.eu/mcp"
headers = { "Authorization" = "Bearer cq_ak_..." }
Tool Wat hij doet Standaardmodus
policy.status elke limiet die voor de sleutel geldt, in één aanroep lezen
project.list / project.get / project.create / project.delete je projecten; verwijderen vraagt jou eerst aanmaken toegestaan bij een sleutel voor al je projecten, geweigerd bij een vastgezette; verwijderen vraagt
domain.search beschikbaarheid en prijs voor maximaal 10 namen lezen
domain.register koop een domein in een project voor de prijs die domain.search toonde; goedkeuren is betalen, uit je domeintegoed of bij het afrekenen vraagt jou eerst
domain.set_autorenew onze verlenging van het domein aan- of uitzetten; dezelfde instelling als de schakelaar in het dashboard toegestaan
dns.list_records / dns.set_record / dns.delete_record records op het domein van het project toegestaan; bij een nieuw account vragen wijzigingen aan MX, TXT, NS en CAA eerst
mailbox.create / mailbox.status een ontvangende mailbox op het domein, records automatisch ingesteld toegestaan
mail.send versturen vanuit de mailbox van het project, binnen het maandquotum van het project toegestaan
site.deploy / site.status publiceer een statische site vanuit inline bestanden (MCP) of een zip (REST); spa_routing zet routing voor single-page apps aan of uit; het kale domein verwijst door naar de site eerste publicatie per project vraagt
qube.catalog / qube.install / qube.uninstall de diensten die het account kan toevoegen (analytics, monitoring, e-mail, een statische site, enzovoort), er een aan een project toevoegen, er een verwijderen catalogus is lezen; toevoegen toegestaan; verwijderen vraagt jou eerst
actions.list / actions.get wat de sleutel deed, en de staat van alles wat geparkeerd staat lezen

Modi zijn per sleutel en per tool: allow, confirm (parkeert voor jouw goedkeuring) of deny (staat niet in de toollijst). Geen enkele sleutel kan een DNS-zone verwijderen. domain.register staat altijd op confirm: je kunt het niet op allow zetten, want jouw goedkeuring is je toestemming als houder van het domein. De enige keuze bij die tool is confirm of deny, en het aanmaakscherm stelt hem zo: mag deze sleutel überhaupt domeinen kopen? Een sleutel die dat mag, vraagt jou nog steeds bij elke aankoop. Lijkt een naam op een bekend merk, dan waarschuwt het goedkeuringsscherm je; keur hem alleen goed als jij de rechten op die naam hebt. Namen onder .it en .es vereisen een verklaring die alleen jij kunt afleggen; agents kunnen die niet bestellen. Registreer ze vanuit het dashboard.

Een aanroep die jou nodig heeft geeft meteen pending_approval met een action_id terug, zodat de agent niet op de aanroep blijft wachten. Je krijgt een e-mail en ziet hem onder Account → Goedkeuringen met de exacte argumenten; keur goed of af, en de agent haalt het resultaat op via actions.get of de webhook die je op de sleutel instelde. Goedkeuringen verlopen na 72 uur.

Geld beweegt alleen als jij goedkeurt. Een domeinaankoop wacht op jou, en goedkeuren is de betaling: uit je domeintegoed als dat de prijs dekt, anders op een afrekenpagina waar de goedkeuring je naartoe stuurt; de getoonde prijs is exclusief btw, en het verzoek zegt wat er wordt afgeschreven. Sleutels hebben geen eigen bestedingslimiet, omdat het enige wat een agent kan kopen zijn domeinen, die altijd op jouw goedkeuring wachten, en projecten, die meetellen voor het aantal projecten dat de sleutel mag aanmaken. Nieuwe accounts hebben daarnaast een maandplafond over al hun sleutels, dat policy.status toont. Het account heeft ook limieten voor domeinbestellingen (hoeveel er binnen de betwistingstermijn van kaarten mag openstaan, en hoeveel bestellingen per dag en per maand); een bestelling daarboven mislukt met order_limit, en de limieten gaan omhoog naarmate het account een betaalgeschiedenis opbouwt. Voordat facturatie is ingesteld kan een sleutel nog steeds alles doen wat geen geld kost, zoals DNS-records wijzigen en een site publiceren. De aanroep naar de registrar loopt zodra de betaling is afgerond, en actions.get meldt order_status en daarna de vervaldatum. Een geparkeerd verzoek draagt approval_url, de pagina waar jij beslist.

Elke wijzigende aanroep neemt een idempotency_key; een herhaling geeft de oorspronkelijke uitkomst terug, dus een nieuwe poging brengt nooit twee keer in rekening en maakt nooit twee keer aan.

  • Leesacties maken nooit iets aan; een leesactie op een project zonder de betreffende dienst antwoordt qube_not_installed in plaats van die te installeren.
  • Een sleutel bevriest automatisch na een reeks mislukte aanroepen of een chargeback op het account; bevroren sleutels kunnen nog lezen, en je heft de bevriezing op vanuit het dashboard.
  • Elke aanroep is één regel in je activiteitenfeed, met argumenten, uitkomst en kosten. We houden zelf ook de uitgaven van agents in de gaten, zodat een op hol geslagen agent binnen het uur opvalt.
  • Elk domein wordt geregistreerd op je bedrijfsprofiel. Een agent kan geen eigen houdergegevens aanleveren.
MCP REST
project.create POST /agent/v1/projects
domain.search GET /agent/v1/domains/search?project_id=…&names=a.eu,b.nl
domain.register POST /agent/v1/domains
dns.set_record PUT /agent/v1/dns/records
mailbox.create POST /agent/v1/mailboxes
mail.send POST /agent/v1/mail/send
site.deploy POST /agent/v1/sites/deploy (multipart zip)
policy.status GET /agent/v1/policy
actions.get GET /agent/v1/actions/{id}

Schrijfacties nemen een header Idempotency-Key en antwoorden 202 wanneer ze geparkeerd worden. Elke fout komt in dezelfde vorm terug, bijvoorbeeld {"error": "over_cap", "message": "..."}.

  • Metadata van de beschermde resource: https://cloudqube.eu/.well-known/oauth-protected-resource
  • Autorisatieserver: https://cloudqube.eu/oauth (dynamische clientregistratie, PKCE)