MCP-server
SuperSpace draait een Model Context Protocol (MCP)-server zodat AI-assistenten namens jou je sites, DNS, domeinen en meer kunnen beheren. Het is een stateless, OAuth-only, JSON-RPC 2.0-endpoint op POST /mcp op je merk-host, dat een zorgvuldig samengestelde subset van de REST API blootstelt als MCP-tools — brede leestoegang plus een kleine set veilige writes.
Een client verbinden
Moderne MCP-clients verbinden rechtstreeks met SuperSpace via remote HTTP — geen lokale bridge of configuratiebestand vereist. Wijs je client naar het SuperSpace MCP-endpoint en autoriseer in de browser.
Snel starten
| Transport | Streamable HTTP (remote) |
| URL | https://control.superspace.nl/mcp |
| Headers / credentials | Geen — authenticatie gebeurt na de setup via de OAuth-browserflow |
Er zijn vooraf geen headers, tokens of omgevingsvariabelen te configureren. Nadat je de server hebt toegevoegd, vraagt je client je om in te loggen bij SuperSpace en toegang te autoriseren; de token wordt voor je opgehaald en opgeslagen.
Gebruik je eigen merk-host
Vervang control.superspace.nl door je SuperSpace merk-hostnaam. White-labelmerken hebben elk hun eigen host (bijvoorbeeld brand.example.com). De /mcp-URL moet overeenkomen met het merk waartegen je autoriseert — accesstokens zijn vergrendeld op het merk waaronder ze zijn uitgegeven (zie Authenticatie hieronder).
Claude (desktop)
Claude ondersteunt SuperSpace als een custom connector — geen handmatige configuratie nodig. Zie Anthropic's Get started with custom connectors using remote MCP voor alle details.
- Open Customize → Connectors → Add custom connector.
- Geef het een Name (bijvoorbeeld
SuperSpace). - Stel de Remote MCP server URL in op
https://control.superspace.nl/mcp. - Klik op Add.

Eenmaal toegevoegd vraagt Claude je om je te authenticeren met je SuperSpace-account om de verbinding te voltooien.
OpenAI Codex (desktop)
- Open Settings → MCP Servers → Add Server.
- Voer de server-URL
https://control.superspace.nl/mcpin. Er zijn naast de URL geen extra velden nodig. - Sla op.

Na het opslaan vraagt Codex je om je te authenticeren met je SuperSpace-account om de verbinding te voltooien.
Transport
POST /mcpdraagt het JSON-RPC-verzoek.GET,PUT,PATCHenDELETEgeven405 Method Not Allowedterug.- De request-body is een enkel JSON-RPC-object. Batch-arrays worden geweigerd (
-32600); misvormde JSON geeft-32700(parse error) terug. - Een notificatie (een verzoek zonder
id, zoalsnotifications/initialized) geeft202terug met een lege body. - CORS is ingeschakeld voor
/mcp(origins*, methodenGET/POST/OPTIONS). Een browser-Origin, indien aanwezig, moet overeenkomen met de request-host, anders wordt het verzoek geweigerd met403(Origin not allowed); niet-browserclients sturen geenOrigin, wat is toegestaan. - De optionele
MCP-Protocol-Version-header moet, indien meegestuurd, een van2025-06-18,2025-03-26of2024-11-05zijn, anders400. - Rate limit: 6000 verzoeken / 10 minuten, gekoppeld per OAuth-token.
Authenticatie
De MCP-server accepteert alleen OAuth 2.1-accesstokens (session- en API-sleutel-credentials worden geweigerd — zie OAuth 2.1). Naast de normale OAuth-controles (merkisolatie, accountlidmaatschap, proefaccounts worden geblokkeerd) moet de token audience-bound aan deze MCP-resource zijn volgens RFC 8707: de resource moet gelijk zijn aan https://<host>/mcp.
Een token dat is uitgegeven voor de REST API (geen resource), of voor de /mcp van een ander merk, wordt geweigerd met 401:
{ "jsonrpc": "2.0", "id": null, "error": { "code": -32600, "message": "invalid_token: token audience is not valid for this MCP resource" } }
met de header:
WWW-Authenticate: Bearer resource_metadata="https://<host>/.well-known/oauth-protected-resource/mcp"
De audience wordt vastgelegd wanneer de token wordt geautoriseerd en wordt overgeërfd over refreshes heen. (Omgekeerd wordt een MCP-audience-token geweigerd op /api — zie Authenticatie.) mcp-remote voert deze audience-bound autorisatie automatisch uit.
Protected-resource-metadata (RFC 9728)
GET /.well-known/oauth-protected-resource
GET /.well-known/oauth-protected-resource/mcp
{
"resource": "https://<host>/mcp",
"authorization_servers": ["https://<host>"],
"scopes_supported": ["sites:read","sites:write","domains:read","domains:write","dns:read","dns:write","billing:read"],
"bearer_methods_supported": ["header"]
}
Een client volgt authorization_servers naar de authorization-server-metadata om de authorize- en token-endpoints te ontdekken, en draait dan de standaard PKCE-flow.
JSON-RPC-methoden
| Methode | Resultaat |
|---|---|
initialize |
{ "protocolVersion": "2025-06-18", "capabilities": { "tools": { "listChanged": false } }, "serverInfo": { "name": "cloudpress-mcp", "version": "1" } } (echoot een ondersteunde aangevraagde versie) |
ping |
{} |
tools/list |
{ "tools": [ ... ] } — gefilterd tot de tools die de scopes van de token toestaan |
tools/call |
Voert een tool uit (zie resultaatvorm) |
notifications/* |
Bevestigd, geen response (202) |
| al het andere | -32601 Method not found |
JSON-RPC-foutcodes: -32700 parse error · -32600 invalid request / batch / origin / version / auth · -32601 method not found · -32602 invalid params (onbekende tool, insufficient_scope met data.required_scope, ontbrekende request_id) · -32603 internal error.
Scopes en zichtbaarheid van tools
Elke tool vereist een OAuth-scope uit hetzelfde vocabulaire als de REST API. tools/list geeft alleen de tools terug die de scopes van je token dekken. Het aanroepen van een tool waarvoor je geen scope hebt, geeft een JSON-RPC-fout binnen een 200-response terug (geen HTTP 403):
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32602, "message": "insufficient_scope", "data": { "required_scope": "sites:write" } } }
Idempotency
Elke write-tool vereist een arguments.request_id (een idempotency-sleutel); het weglaten ervan geeft -32602 (request_id is required for this tool) terug. Aanroepen worden gededupliceerd per token, tool en request_id, met een fingerprint van de overige argumenten:
- Het herhalen van een voltooide aanroep geeft het oorspronkelijk opgeslagen resultaat terug (geen heruitvoering).
- Dezelfde
request_iddie nog in behandeling is, geeft een succesresultaat terug metstructuredContent.status="processing". - Dezelfde
request_idmet andere argumenten geeft een foutresultaat terug (isError: true) — gebruik een nieuwerequest_id.
Sleutels worden ongeveer 24 uur bewaard. Een paar create-tools zijn expliciet niet-idempotent omdat de onderliggende POST een nieuw record aanmaakt (een reclaim zou het kunnen dupliceren): create_dns_zone, create_edge_rule, create_waf_custom_rule, create_rate_limit, create_access_list en activate_shield. Vermijd blinde retries op deze — gebruik de bijbehorende update_*-tool om een bestaand record te wijzigen. Elke tool adverteert zijn gedrag in tools/list via annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).
Tool-resultaten
Een succesvolle tools/call geeft zowel een tekstblok als gestructureerde data terug (dezelfde payload, gerenderd vanuit de REST API-templates zodat de shapes overeenkomen met de gedocumenteerde antwoorden):
{ "content": [ { "type": "text", "text": "<JSON string>" } ], "structuredContent": { }, "isError": false }
Business-fouten zijn geen JSON-RPC-fouten — ze komen terug als een normaal resultaat met "isError": true en een tekstbericht. Secret-redactie wordt op beide emits toegepast: get_site bevat site.ssh alleen als de token ook sites:write heeft, en get_order strijkt altijd SSH-data weg.
Tool-catalogus
65 tools, alle gescoped tot het geautoriseerde account. Reads zijn breed; writes dekken DNS-records/-zones, site rename en restart, CDN-caching en cache purge, edge rules, en het volledige Shield-oppervlak (activate/deactivate, WAF-instellingen en managed/custom rules, rate limits, access lists, bot detection). Hieronder markeert * een vereist argument en markeert ✎ een write-tool (die een request_id vereist).
Sites
| Tool | Scope | Argumenten | Opmerkingen |
|---|---|---|---|
list_sites |
sites:read |
— | Actieve sites |
get_site |
sites:read |
id* |
Bevat SSH-credentials alleen als de token ook sites:write heeft |
rename_site ✎ |
sites:write |
id*, name*, request_id* |
Alleen naam (geen planwijziging) |
restart_site ✎ |
sites:write |
id*, request_id* |
Async container-restart |
DNS
| Tool | Scope | Argumenten |
|---|---|---|
list_dns_zones |
dns:read |
page, per_page |
get_dns_zone |
dns:read |
id* |
create_dns_zone ✎ |
dns:write |
name*, request_id* |
delete_dns_zone ✎ |
dns:write |
id*, request_id* |
get_dns_metrics |
dns:read |
id*, date_from, date_to |
list_dns_records |
dns:read |
dns_zone_id*, page, per_page |
get_dns_record |
dns:read |
dns_zone_id*, id* |
create_dns_record ✎ |
dns:write |
dns_zone_id*, record_type* (integer code), value*, request_id*, plus ttl, name, priority, weight, port, flags, record_tag, comment |
update_dns_record ✎ |
dns:write |
dns_zone_id*, id*, request_id*, plus ttl, value, priority, weight, port, flags, record_tag, comment |
delete_dns_record ✎ |
dns:write |
dns_zone_id*, id*, request_id* |
Domeinen en registratie
| Tool | Scope | Argumenten | Opmerkingen |
|---|---|---|---|
list_domains |
domains:read |
page, per_page |
Site-hostnamen |
get_domain |
domains:read |
id* |
|
list_domain_registrations |
domains:read |
q |
|
get_domain_registration |
domains:read |
id* |
|
list_domain_contacts |
domains:read |
q |
|
get_domain_contact |
domains:read |
id* |
id is een integer, geen GUID |
check_domain_availability |
domains:read |
domain* |
Beschikbaarheid en prijzen |
search_domains |
domains:read |
base_name* |
Multi-TLD-zoekopdracht |
suggest_domains |
domains:read |
domain* |
Registrar-suggesties |
Registrar-writes (register/transfer, contact-CRUD, glue hosts) worden niet als tools blootgesteld — gebruik de REST API.
CDN, cache, logs en metrics
Site-gescoped. Reads gebruiken sites:read; writes gebruiken sites:write. CDN-reads en -writes hebben een geprovisionde pull zone nodig (anders cdn_not_active).
| Tool | Scope | Argumenten | Opmerkingen |
|---|---|---|---|
get_cdn_status |
sites:read |
id* |
Overzicht pull-zone-status |
get_cdn_caching |
sites:read |
id* |
Caching-instellingen (smart cache, expirations, vary-toggles, stale-while-*) |
get_cache_status |
sites:read |
id* |
Status van de cachelaag (redis/nginx/bunny) |
get_cdn_metrics |
sites:read |
id*, period of period_start, step |
|
get_cdn_logs |
sites:read |
id*, plus filters (from, to, period, status, cache_status, country, url_contains, limit, offset, order) |
Venster van max. 3 dagen |
get_cdn_logs_summary |
sites:read |
Dezelfde filters | Geaggregeerd |
get_origin_logs |
sites:read |
id*, date (MM-DD-YYYY) |
|
get_resource_metrics |
sites:read |
id*, kind[], period_start, period_end, step |
Geen bereik geeft een actuele snapshot terug |
update_cdn_caching ✎ |
sites:write |
id*, request_id*, plus elk caching-veld |
Merge — stuurt alleen de keys die je meegeeft; geeft de vernieuwde config terug |
purge_cdn_cache ✎ |
sites:write |
id*, request_id* |
Purget de volledige pull-zone-cache |
Edge rules
Site-gescoped, CDN actief. Reads gebruiken sites:read; writes gebruiken sites:write. Systeem (CPRESS -)-rules zijn verborgen en kunnen niet worden aangemaakt, bijgewerkt, verwijderd of getoggeld.
| Tool | Scope | Argumenten | Opmerkingen |
|---|---|---|---|
list_edge_rules |
sites:read |
id* |
Geeft de Bunny Guid van elke rule terug plus leesbare labels |
create_edge_rule ✎ |
sites:write |
id*, request_id*, ActionType*, plus ActionParameter1/2/3, TriggerMatchingType, Triggers, ExtraActions, Description, Enabled, OrderIndex |
Niet-idempotent (maakt een nieuwe rule aan). Bunny PascalCase-shape |
update_edge_rule ✎ |
sites:write |
id*, guid*, request_id*, plus elk create-veld |
Merge (stuur alleen wat verandert) — een MCP-gemak; de REST-update is een volledige vervanging |
delete_edge_rule ✎ |
sites:write |
id*, guid*, request_id* |
Vereist de destroy-rol |
toggle_edge_rule ✎ |
sites:write |
id*, guid*, enabled*, request_id* |
In- of uitschakelen |
Shield
Site-gescoped. Reads gebruiken sites:read; writes gebruiken sites:write. Plan-gated (shield_not_in_plan); reads en writes hebben een geprovisionde shield-zone nodig (shield_not_active).
| Tool | Scope | Argumenten | Opmerkingen |
|---|---|---|---|
get_shield_status |
sites:read |
id* |
Configsamenvatting (geen engine-config) |
get_waf_config |
sites:read |
id* |
Volledige WAF-config incl. engine-config (paranoia levels en protocol allow-lists) |
list_waf_managed_rules |
sites:read |
id* |
Catalogus van managed rules (rule-id's voor update_shield) |
list_waf_custom_rules |
sites:read |
id* |
Custom rules en hun id's |
list_rate_limits |
sites:read |
id* |
Rate-limit-rules en hun id's |
list_access_lists |
sites:read |
id* |
Custom allow-/block-lists en hun id's |
list_curated_access_lists |
sites:read |
id* |
Curated Bunny threat lists (geen REST-equivalent) |
get_shield_events |
sites:read |
id*, date, continue |
Event-log |
get_shield_metrics |
sites:read |
id*, view (individual of overview) |
Niet plan-gated |
activate_shield ✎ |
sites:write |
id*, request_id* |
Niet-idempotent; cdn_not_active als er geen pull zone is |
deactivate_shield ✎ |
sites:write |
id*, request_id* |
Vereist de destroy-rol; soft (schakelt WAF en DDoS uit) |
update_shield ✎ |
sites:write |
id*, request_id*, plus WAF- / sensitivity- / protocol- / DDoS- / plan_type- / learning_mode- / whitelabel_response_pages-velden |
Merge (alle velden optioneel) |
update_bot_detection ✎ |
sites:write |
id*, request_id*, plus execution_mode- / sensitivity- / fingerprint-velden |
Alleen premium; merge |
create_waf_custom_rule ✎ |
sites:write |
id*, request_id*, rule_name*, action_type*, variable_type*, operator_type*, severity_type*, value*, plus variable_subselector, rule_description |
Alleen premium, niet-idempotent |
update_waf_custom_rule ✎ |
sites:write |
id*, rule_id*, request_id*, plus dezelfde rule-velden |
Volledige vervanging; niet premium-gated |
delete_waf_custom_rule ✎ |
sites:write |
id*, rule_id*, request_id* |
Vereist de destroy-rol |
create_rate_limit ✎ |
sites:write |
id*, request_id*, rule_name*, action_type*, match_variable*, operator_type*, severity_type*, value*, request_count*, timeframe*, plus block_time, counter_key_type, rule_description |
Niet-idempotent. rule_name en rule_description: alleen letters, cijfers en spaties |
update_rate_limit ✎ |
sites:write |
id*, rule_id*, request_id*, plus dezelfde velden |
Volledige vervanging |
delete_rate_limit ✎ |
sites:write |
id*, rule_id*, request_id* |
Vereist de destroy-rol |
create_access_list ✎ |
sites:write |
id*, request_id*, name*, type*, content*, plus description, checksum, action (allow/block) |
Niet-idempotent; stelt ook de list-action in |
update_access_list ✎ |
sites:write |
id*, list_id*, request_id*, plus name, content, checksum, action |
Content volledige vervanging |
delete_access_list ✎ |
sites:write |
id*, list_id*, request_id* |
Vereist de destroy-rol |
update_curated_access_list ✎ |
sites:write |
id*, configuration_id*, request_id*, plus is_enabled, action (integer) |
Curated list in-/uitschakelen/action (geen REST-equivalent; alleen verkoopbare plannen) |
Orders en subscriptions
Alleen-lezen, scope billing:read.
| Tool | Argumenten | Opmerkingen |
|---|---|---|
list_orders |
page, per_page |
|
get_order |
id* |
SSH-data wordt altijd weggestreken |
list_subscriptions |
page, per_page |
|
get_subscription |
id* |
Niet beschikbaar als tools
Site create/delete/resize, back-ups en restores, SSO, users/roles/accounts/API-sleutels, carts en order-writes (waaronder domain orders), registrar/contact/glue-host-writes, site-domain- en certificaat-writes, taken, en alle billing-writes worden bewust niet via MCP blootgesteld. Gebruik daarvoor de REST API — met een session- of API-sleutel-credential waar de operatie OAuth-geblokkeerd is.
Geavanceerd: handmatige installatie (stdio-bridge)
Alleen nodig voor oudere clients zonder remote MCP-ondersteuning
De meeste clients verbinden nu rechtstreeks via remote HTTP (zie Een client verbinden hierboven). Gebruik de onderstaande bridge alleen met een oudere client die stdio spreekt en niet rechtstreeks met het remote /mcp-endpoint kan praten.
De mcp-remote-bridge draait lokaal over stdio en proxyt naar SuperSpace, waarbij hij de OAuth-login voor je afhandelt (hij opent een browser om te autoriseren en cachet daarna de token).
Bewerk het MCP-configuratiebestand van je client (bijvoorbeeld claude_desktop_config.json) en voeg SuperSpace toe onder het mcpServers-object:
"superspace": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://control.superspace.nl/mcp"
]
}
Als npx niet op het PATH van de client staat — vaak het geval, omdat GUI-apps je shell-omgeving niet erven — en je mise hebt geïnstalleerd, gebruik die dan om npx te leveren:
"superspace": {
"command": "mise",
"args": [
"x",
"--",
"npx",
"-y",
"mcp-remote",
"https://control.superspace.nl/mcp"
]
}
Herstart vervolgens de client volledig. De eerste keer dat hij verbindt, opent er een browservenster zodat je kunt autoriseren via SuperSpace OAuth; keur het account goed en de verbinding is voltooid.