Overzicht
De Sprucely.io MCP API’s ontsluiten het dashboardplatform voor AI-assistenten en software van derden via het Model Context Protocol (MCP), een open standaard voor het koppelen van AI-modellen aan tools over HTTP. Elke MCP-compatibele client kan programmatisch gehoste dashboards maken, deze opvragen en inspecteren, en er data aan toevoegen. Dashboards die via de API’s zijn gemaakt, horen bij uw account en kunnen verder worden gedeeld, ingesloten of bewerkt in de service. Zie voor het insluiten van de resulterende dashboards op uw eigen site de notities over eenvoudige dashboardintegratie. Gebruikt u Claude, dan is de Sprucely.io-connector de snelste manier om te beginnen.
Verbinden
De MCP-server wordt aangeboden via Streamable HTTP op:
https://www.sprucely.io/mcpElke MCP-client kan verbinding maken met dit endpoint. Zo registreert bijvoorbeeld één opdracht de server in Claude Code:
claude mcp add --transport http sprucely https://www.sprucely.io/mcpU kunt de server ook rechtstreeks aanroepen met JSON-RPC 2.0 over HTTP. De meeste MCP-clients voeren de protocolhandshake automatisch uit; het onderstaande verzoek geeft de beschikbare tools weer met behulp van een API-sleutel:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Authenticatie
Verzoeken worden geautoriseerd met een standaard Authorization Bearer-header. Twee typen credentials worden ondersteund.
API-sleutels - Maak API-sleutels aan in het MCP-gedeelte van uw profiel. Sleutels beginnen met spr_mcp_, worden alleen getoond op het moment van aanmaken, en kunnen op elk moment worden ingetrokken. Gebruik ze voor scripts, servers en headless MCP-clients.
OAuth 2.1 - Interactieve MCP-clients kunnen gebruikers in plaats daarvan laten aanmelden met hun Sprucely.io-account via OAuth 2.1. De autorisatieserver ondersteunt de authorization code flow met PKCE (verplicht), refresh tokens en dynamische clientregistratie, zodat compatibele clients zichzelf automatisch configureren op basis van de resource-metadata:
https://www.sprucely.io/.well-known/oauth-protected-resourceBeschikbare scopes: openid, offline_access, dashboards:read en dashboards:write. Scopes worden per tool afgedwongen: create_dashboard, add_data en set_sharing vereisen dashboards:write en geven zonder die scope een foutmelding terug. De overige tools hebben alleen dashboards:read nodig.
Voor clients die handmatige configuratie vereisen, zijn dit de endpoints van de autorisatieserver:
https://www.sprucely.io/oauth/.well-known/openid-configuration- metadata van de autorisatieserverhttps://www.sprucely.io/oauth/auth- autorisatie-endpoint (PKCE verplicht)https://www.sprucely.io/oauth/token- token-endpointhttps://www.sprucely.io/oauth/reg- dynamische clientregistratiehttps://www.sprucely.io/oauth/jwks- ondertekeningssleutels (JWKS)https://www.sprucely.io/oauth/token/revocation- intrekken van tokenshttps://www.sprucely.io/oauth/token/introspection- introspectie van tokens
Tools
De MCP-server biedt acht tools: create_dashboard, get_dashboard, list_dashboards, add_data, get_dataset_schema, set_sharing, get_embed_code en storage_status.
De dataset- en dashboardparameters hieronder zijn geen MCP-specifiek formaat - het is exact dezelfde dataset-/dashboard-JSON die wordt gedocumenteerd op de pagina Dataformaat en die overal elders in de service wordt gebruikt (de import-API van de standalone insluitbare runtime, AI-gegenereerde indelingen en de dashboardeditor), dus alles wat tegen die referentie is geschreven, geldt ook hier.
create_dashboard - Maakt een gehost dashboard van een inline dataset en een widgetboomstructuur, en retourneert weergave- en insluitlinks. Parameters:
name- de dashboardtitel (verplicht)dataset- de te visualiseren dataset:name,headers(kolomnamen),types(één databasetype per header -VARCHAR,BOOLEAN,INTEGER,BIGINT,FLOAT,DOUBLE,DATEofTIMESTAMP) enentries(rijen, elk een array van waarden in de volgorde van de headers), tot 100 kolommen en 50.000 ruwe rijen op recordniveau per aanroep (verplicht). Rijen mogen niet vooraf zijn geaggregeerd: verstuur één rij per onderliggend record, en laat dedataFunctionvan elke grafiek aantallen, sommen, gemiddelden enzovoort berekenen op het moment van renderen.dashboard- 1 tot 40 widgets op het hoogste niveau, van boven naar beneden (verplicht). Elke widget is eendash_chart(een grafiektype -area,bar,cell,dot,hexbinofline- kolomtoewijzingen voorx,y,denr, een optioneledataFunctionen een optionele titel), eendash_table, eendash_text-blok, eendash_spacer, of eendash_stacker_hor/dash_stacker_ver-container. Stapelaars worden recursief genest - de eigen children van een stapelaar kunnen op hun beurt weer stapelaars bevatten - om widgets te ordenen in rijen en kolommen van willekeurige diepte. Welke kolomsoorten (categorisch, continu of datum/tijd) elk grafiektype accepteert voor de dimensiesx/y/d/r, en hoe het groeperen van een datumkolom in tijdsperioden metseasonX/seasonYdeze categorisch maakt, wordt bij elk veld gedocumenteerd via tools/list en op de pagina Dataformaat.theme- optionele dashboardbrede kleuren (achtergrond, tekst, primaire/subtiele/secundaire accenten); elke widget kan nog steeds zijn eigen kleur of achtergrond overschrijvenshared- of het dashboard zichtbaar is voor iedereen met de link (optioneel, standaard false). Nieuwe dashboards zijn privé totdat u dit instelt op true of achterafset_sharingaanroept.
Het resultaat bevat de dashboardId en datasetId van het nieuwe dashboard (nodig voor add_data, get_dataset_schema, set_sharing en get_embed_code achteraf), plus de url, viewUrl en het iframe-insluitfragment. Voorbeeld - een dashboard maken met een staafdiagram en een dashboardbrede accentkleur:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "create_dashboard",
"arguments": {
"name": "Regional Sales",
"dataset": {
"name": "Sales",
"headers": ["region", "revenue"],
"types": ["VARCHAR", "DOUBLE"],
"entries": [
["North", 1250.5],
["South", 980.25],
["East", 1420.0]
]
},
"dashboard": {
"type": "dash",
"children": [
{ "type": "dash_chart", "chartType": "bar", "x": "region", "d": "revenue", "dataFunction": "sum", "title": "Revenue by region" }
]
},
"theme": { "themePrimary": "#6E2BDC" }
}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"dashboardId": "dash_a1b2c3d4",
"datasetId": "data_e5f6g7h8",
"name": "Regional Sales",
"shared": false,
"rows": 3,
"columns": 2,
"url": "https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4",
"viewUrl": "https://www.sprucely.io/service/dashboards/view/123/dash_a1b2c3d4",
"iframe": "<iframe src=\"https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4\" style=\"width:100%;height:640px;border:0\" title=\"Sprucely dashboard\" loading=\"lazy\"></iframe>"
}get_dashboard - Retourneert de naam, deelstatus, dataset-ID’s en links van een dashboard. Parameter: dashboardId (verplicht). Voorbeeld:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_dashboard",
"arguments": {
"dashboardId": "dash_a1b2c3d4"
}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"dashboardId": "dash_a1b2c3d4",
"name": "Regional Sales",
"shared": false,
"archived": false,
"datasetIds": ["data_e5f6g7h8"],
"source": "mcp",
"updatedAt": "2026-07-29T10:15:00.000Z",
"url": "https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4",
"viewUrl": "https://www.sprucely.io/service/dashboards/view/123/dash_a1b2c3d4",
"iframe": "<iframe src=\"https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4\" style=\"width:100%;height:640px;border:0\" title=\"Sprucely dashboard\" loading=\"lazy\"></iframe>"
}list_dashboards - Geeft de dashboards in uw account weer, gesorteerd op laatste update, elk met zijn eigen datasetIds zodat een dataset rechtstreeks kan worden doorgegeven aan get_dataset_schema of add_data zonder aparte aanroep van get_dashboard. Parameters: limit en offset voor paginering, query voor een niet-hoofdlettergevoelig naamfilter (allemaal optioneel). Voorbeeld:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "list_dashboards",
"arguments": {
"limit": 10,
"query": "sales"
}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"total": 1,
"limit": 10,
"offset": 0,
"hasMore": false,
"dashboards": [
{
"dashboardId": "dash_a1b2c3d4",
"name": "Regional Sales",
"shared": false,
"datasetIds": ["data_e5f6g7h8"],
"source": "mcp",
"updatedAt": "2026-07-29T10:15:00.000Z",
"url": "https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4",
"viewUrl": "https://www.sprucely.io/service/dashboards/view/123/dash_a1b2c3d4",
"iframe": "<iframe src=\"https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4\" style=\"width:100%;height:640px;border:0\" title=\"Sprucely dashboard\" loading=\"lazy\"></iframe>"
}
]
}add_data - Voegt rijen toe aan de dataset van een bestaand dashboard; elk dashboard dat de dataset gebruikt, wordt automatisch vernieuwd. Parameters:
dashboardId- het dashboard waaraan wordt toegevoegd (verplicht)entries- rijen die positioneel zijn afgestemd op de headers van de dataset, tot 50.000 per aanroep (verplicht) - dezelfde regel voor ruwe rijen op recordniveau als bijcreate_dashboardis van toepassing. Roep eerstget_dataset_schemaaan als u de exacte kolomnamen/volgorde van het dashboard nog niet kent. Gebruik dit om grote datasets in batches te laden of om dashboards actueel te houden.run_id- een optionele idempotentiesleutel voor deze specifieke batch (optioneel). Als een eerdere aanroep vanadd_datamet dezelfdedashboardIdenrun_idal is geslaagd, retourneert een herhaalde aanroep dat eerdere resultaat in plaats van de rijen een tweede keer toe te voegen, zodat een batch veilig opnieuw kan worden geprobeerd na een timeout of verbroken verbinding - gebruik een nieuwerun_idper afzonderlijke batch (bijvoorbeeld een UUID of een hash van de inhoud).
Voorbeeld:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "add_data",
"arguments": {
"dashboardId": "dash_a1b2c3d4",
"entries": [
["West", 875.0]
],
"run_id": "batch-2026-07-29T10:20:00Z"
}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"dashboardId": "dash_a1b2c3d4",
"datasetId": "data_e5f6g7h8",
"addedRows": 1,
"url": "https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4",
"viewUrl": "https://www.sprucely.io/service/dashboards/view/123/dash_a1b2c3d4",
"iframe": "<iframe src=\"https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4\" style=\"width:100%;height:640px;border:0\" title=\"Sprucely dashboard\" loading=\"lazy\"></iframe>"
}
# Calling again later with the same dashboardId + run_id (e.g. after a dropped
# connection) is safe: the rows are not appended twice, and the response also
# carries "duplicate": true instead of appending again.get_dataset_schema - Retourneert de kolomnamen en -typen van een dataset. Gebruik dit voordat u add_data aanroept (of een nieuwe grafiek bouwt op dezelfde dataset) wanneer de exacte kolomnamen/volgorde/typen nog niet bekend zijn, bijvoorbeeld in een nieuwe sessie of wanneer een andere agent het dashboard heeft gemaakt. Parameter: datasetId (verplicht). Voorbeeld:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "get_dataset_schema",
"arguments": {
"datasetId": "data_e5f6g7h8"
}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"datasetId": "data_e5f6g7h8",
"headers": ["region", "revenue"],
"types": ["VARCHAR", "DOUBLE"]
}set_sharing - Schakelt de openbare link van een dashboard in of uit. Uitschakelen trekt ook de toegang voor elke eerdere revisie van het dashboard in, zodat een link die in het verleden is gedeeld, niet meer werkt. Parameters: dashboardId en shared (beide verplicht). Voorbeeld:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "set_sharing",
"arguments": {
"dashboardId": "dash_a1b2c3d4",
"shared": true
}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"dashboardId": "dash_a1b2c3d4",
"shared": true,
"url": "https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4",
"viewUrl": "https://www.sprucely.io/service/dashboards/view/123/dash_a1b2c3d4",
"iframe": "<iframe src=\"https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4\" style=\"width:100%;height:640px;border:0\" title=\"Sprucely dashboard\" loading=\"lazy\"></iframe>"
}get_embed_code - Retourneert de deelbare weergavelink en een iframe-insluitfragment voor een dashboard - dezelfde link/insluitcode die create_dashboard en set_sharing al retourneren, voor wanneer deze afzonderlijk opnieuw nodig zijn. De link werkt voor anderen alleen zolang het dashboard wordt gedeeld. Parameter: dashboardId (verplicht). Voorbeeld:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 8,
"method": "tools/call",
"params": {
"name": "get_embed_code",
"arguments": {
"dashboardId": "dash_a1b2c3d4"
}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"dashboardId": "dash_a1b2c3d4",
"shared": true,
"url": "https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4",
"viewUrl": "https://www.sprucely.io/service/dashboards/view/123/dash_a1b2c3d4",
"iframe": "<iframe src=\"https://www.sprucely.io/service/dashboards/embed/123/dash_a1b2c3d4\" style=\"width:100%;height:640px;border:0\" title=\"Sprucely dashboard\" loading=\"lazy\"></iframe>"
}storage_status - Rapporteert hoeveel opslag het account heeft gebruikt en hoeveel er nog resteert, nuttig voordat u een create_dashboard- of add_data-aanroep doet die groot genoeg is om de opslaglimiet van het abonnement te riskeren. Geen parameters. Voorbeeld:
curl -X POST https://www.sprucely.io/mcp \
-H "Authorization: Bearer spr_mcp_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 9,
"method": "tools/call",
"params": {
"name": "storage_status",
"arguments": {}
}
}'
# Result (result.structuredContent in the JSON-RPC response):
{
"used": 5242880,
"limit": 104857600,
"percent": 5,
"plan": "Regular",
"over": 0,
"blocked": false
}Limieten en fouten
- Het MCP-endpoint accepteert 25 verzoeken per minuut per client en requestbodies tot 25 MB - laad grotere datasets in batches via
add_data. - Datasets accepteren tot 100 kolommen en 50.000 rijen per aanroep, en een dashboard accepteert tot 40 widgets op elk niveau van nesting. Opgeslagen dashboards tellen mee voor het opslagquotum van uw abonnement - roep
storage_statusaan om de resterende ruimte te controleren voordat u een grotecreate_dashboard- ofadd_data-aanroep doet. - Er worden standaard HTTP-statuscodes gebruikt: 401 voor ontbrekende of ongeldige credentials (met een WWW-Authenticate-challenge die verwijst naar de resource-metadata), 403 voor ingetrokken of onvoldoende credentials, 413 voor te grote verzoeken en 429 bij rate limiting.