Ga naar inhoud

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.

  1. Open Customize → Connectors → Add custom connector.
  2. Geef het een Name (bijvoorbeeld SuperSpace).
  3. Stel de Remote MCP server URL in op https://control.superspace.nl/mcp.
  4. Klik op Add.

Het dialoogvenster Add custom connector van Claude

Eenmaal toegevoegd vraagt Claude je om je te authenticeren met je SuperSpace-account om de verbinding te voltooien.

OpenAI Codex (desktop)

  1. Open Settings → MCP Servers → Add Server.
  2. Voer de server-URL https://control.superspace.nl/mcp in. Er zijn naast de URL geen extra velden nodig.
  3. Sla op.

Het formulier Connect to a custom MCP van Codex

Na het opslaan vraagt Codex je om je te authenticeren met je SuperSpace-account om de verbinding te voltooien.

Transport

  • POST /mcp draagt het JSON-RPC-verzoek. GET, PUT, PATCH en DELETE geven 405 Method Not Allowed terug.
  • 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, zoals notifications/initialized) geeft 202 terug met een lege body.
  • CORS is ingeschakeld voor /mcp (origins *, methoden GET/POST/OPTIONS). Een browser-Origin, indien aanwezig, moet overeenkomen met de request-host, anders wordt het verzoek geweigerd met 403 (Origin not allowed); niet-browserclients sturen geen Origin, wat is toegestaan.
  • De optionele MCP-Protocol-Version-header moet, indien meegestuurd, een van 2025-06-18, 2025-03-26 of 2024-11-05 zijn, anders 400.
  • 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_id die nog in behandeling is, geeft een succesresultaat terug met structuredContent.status = "processing".
  • Dezelfde request_id met andere argumenten geeft een foutresultaat terug (isError: true) — gebruik een nieuwe request_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.