Oversigt
Sprucely.ios MCP API’er eksponerer dashboardplatformen for AI-assistenter og tredjepartssoftware via Model Context Protocol (MCP), en åben standard til at forbinde AI-modeller med værktøjer over HTTP. Enhver MCP-kompatibel klient kan oprette hostede dashboards, liste og undersøge dem samt programmatisk tilføje data til dem. Dashboards oprettet via API’erne tilhører din konto og kan deles, indlejres eller redigeres yderligere i tjenesten. For at indlejre de færdige dashboards på din egen side, se noterne om enkel dashboard-integration. Bruger du Claude, er den hurtigste vej i gang Sprucely.io-konnektoren.
Forbindelse
MCP-serveren serveres over Streamable HTTP på:
https://www.sprucely.io/mcpEnhver MCP-klient kan forbinde til dette endpoint. Eksempelvis registrerer én kommando serveren i Claude Code:
claude mcp add --transport http sprucely https://www.sprucely.io/mcpDu kan også kalde serveren direkte med JSON-RPC 2.0 over HTTP. De fleste MCP-klienter udfører protokol-håndtrykket automatisk; anmodningen nedenfor lister de tilgængelige værktøjer ved hjælp af en API-nøgle:
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"}'Autentificering
Anmodninger godkendes med en standard Authorization Bearer-header. To typer af legitimationsoplysninger understøttes.
API-nøgler - Opret API-nøgler i MCP-sektionen af din profil. Nøgler starter med spr_mcp_, vises kun én gang ved oprettelse, og kan tilbagekaldes når som helst. Brug dem til scripts, servere og headless MCP-klienter.
OAuth 2.1 - Interaktive MCP-klienter kan i stedet lade brugere logge ind med deres Sprucely.io-konto via OAuth 2.1. Autorisationsserveren understøtter authorization code-flowet med PKCE (påkrævet), refresh tokens og dynamisk klientregistrering, så kompatible klienter selv konfigurerer sig automatisk ud fra ressourcemetadataene:
https://www.sprucely.io/.well-known/oauth-protected-resourceTilgængelige scopes: openid, offline_access, dashboards:read og dashboards:write. Scopes håndhæves pr. værktøj: create_dashboard, add_data og set_sharing kræver dashboards:write og returnerer en fejl uden det. De øvrige værktøjer har kun brug for dashboards:read.
For klienter, der kræver manuel konfiguration, er autorisationsserverens endpoints:
https://www.sprucely.io/oauth/.well-known/openid-configuration- autorisationsserverens metadatahttps://www.sprucely.io/oauth/auth- autorisationsendpoint (PKCE påkrævet)https://www.sprucely.io/oauth/token- token-endpointhttps://www.sprucely.io/oauth/reg- dynamisk klientregistreringhttps://www.sprucely.io/oauth/jwks- signeringsnøgler (JWKS)https://www.sprucely.io/oauth/token/revocation- tilbagekaldelse af tokenshttps://www.sprucely.io/oauth/token/introspection- token-introspektion
Værktøjer
MCP-serveren eksponerer otte værktøjer: create_dashboard, get_dashboard, list_dashboards, add_data, get_dataset_schema, set_sharing, get_embed_code og storage_status.
Dataset- og dashboard-parametrene nedenfor er ikke et MCP-specifikt format - det er nøjagtig den samme dataset-/dashboard-JSON, der er dokumenteret på Dataformat-siden og bruges alle andre steder i tjenesten (den selvstændige, indlejrbare runtimes import-API, AI-genererede layouts og dashboard-editoren), så alt, der er skrevet mod den reference, gælder også her.
create_dashboard - Opretter et hostet dashboard ud fra et integreret datasæt og et widget-træ, og returnerer visnings- og indlejringslinks. Parametre:
name- dashboardets titel (påkrævet)dataset- det datasæt, der skal visualiseres:name,headers(kolonnenavne),types(én databasetype pr. header -VARCHAR,BOOLEAN,INTEGER,BIGINT,FLOAT,DOUBLE,DATEellerTIMESTAMP) ogentries(rækker, hver et array af værdier i header-rækkefølge), op til 100 kolonner og 50.000 rå entries på rækkeniveau pr. kald (påkrævet). Entries må ikke være foraggregerede: send én række pr. underliggende post, og lad hvert diagramsdataFunctionberegne optællinger, summer, gennemsnit og lignende ved gengivelsen.dashboard- 1 til 40 widgets på øverste niveau, fra top til bund (påkrævet). Hver widget er endash_chart(en diagramtype -area,bar,cell,dot,hexbinellerline- kolonnetilknytninger forx,y,dogr, en valgfridataFunctionog en valgfri titel), endash_table, endash_text-blok, endash_spacer, eller endash_stacker_hor/dash_stacker_ver-beholder. Stakke kan indlejres rekursivt - en staks egne underelementer kan indeholde yderligere stakke - for at arrangere widgets i rækker og kolonner af vilkårlig dybde. Hvilke kolonnetyper (kategoriske, kontinuerlige eller dato/tid) hver diagramtypesx/y/d/r-dimensioner accepterer, og hvordan tidsopdeling af en datokolonne medseasonX/seasonYgør den kategorisk, er dokumenteret for hvert felt via tools/list og på Dataformat-siden.theme- valgfrie dashboard-brede farver (baggrund, tekst, primære/subtile/sekundære accenter); enhver widget kan stadig tilsidesætte sin egen farve eller baggrundshared- om dashboardet kan ses af alle med linket (valgfri, standard false). Nye dashboards er private, indtil du sætter denne til true eller kalderset_sharingbagefter.
Resultatet indeholder det nye dashboards dashboardId og datasetId (nødvendige for add_data, get_dataset_schema, set_sharing og get_embed_code bagefter), samt dets url, viewUrl og iframe-indlejringssnippet. Eksempel - opret et dashboard med et søjlediagram og en dashboard-bred accentfarve:
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 - Returnerer et dashboards navn, delingsstatus, datasæt-id’er og links. Parameter: dashboardId (påkrævet). Eksempel:
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 - Lister dashboards i din konto, sorteret efter seneste opdatering, hver med sine egne datasetIds, så et datasæt kan sendes direkte til get_dataset_schema eller add_data uden et separat get_dashboard-kald. Parametre: limit og offset til paginering, query til et navnefilter, der ikke skelner mellem store og små bogstaver (alle valgfrie). Eksempel:
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 - Tilføjer entries til et eksisterende dashboards datasæt; alle dashboards, der bruger datasættet, opdateres automatisk. Parametre:
dashboardId- dashboardet, der skal tilføjes til (påkrævet)entries- rækker justeret positionsmæssigt til datasættets headers, op til 50.000 pr. kald (påkrævet) - den samme regel om rå entries på rækkeniveau, som gælder forcreate_dashboard. Kaldget_dataset_schemaførst, hvis du ikke allerede kender dashboardets nøjagtige kolonnenavne/-rækkefølge. Brug det til at indlæse store datasæt i batches eller til at holde dashboards opdaterede.run_id- en valgfri idempotensnøgle for denne specifikke batch (valgfri). Hvis et tidligereadd_data-kald med sammedashboardIdogrun_idallerede lykkedes, returnerer et gentaget kald det tidligere resultat i stedet for at tilføje rækkerne endnu en gang, så en batch trygt kan forsøges igen efter en timeout eller afbrudt forbindelse - brug en nyrun_idpr. forskellig batch (f.eks. et UUID eller en hash af dens indhold).
Eksempel:
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 - Returnerer et datasæts kolonnenavne og -typer. Brug det, før du kalder add_data (eller bygger et nyt diagram mod det samme datasæt), når de nøjagtige kolonnenavne/rækkefølge/typer ikke allerede kendes, f.eks. i en ny session eller når en anden agent har oprettet dashboardet. Parameter: datasetId (påkrævet). Eksempel:
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 - Slår et dashboards offentlige link til eller fra. At slå det fra tilbagekalder også adgangen for enhver tidligere revision af dashboardet, så et link, der tidligere er blevet delt, holder op med at virke. Parametre: dashboardId og shared (begge påkrævet). Eksempel:
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 - Returnerer det delbare visningslink og en iframe-indlejringssnippet for et dashboard - det samme link/den samme indlejringskode, som create_dashboard og set_sharing allerede returnerer, til når de skal bruges igen for sig selv. Linket virker kun for andre, så længe dashboardet er delt. Parameter: dashboardId (påkrævet). Eksempel:
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 - Rapporterer, hvor meget lagerplads kontoen har brugt, og hvor meget der er tilbage, nyttigt før et create_dashboard- eller add_data-kald, der er stort nok til at risikere at overskride abonnementets lagergrænse. Ingen parametre. Eksempel:
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
}Grænser og fejl
- MCP-endpointet accepterer 25 anmodninger pr. minut pr. klient og anmodningsindhold på op til 25 MB - indlæs større datasæt i
add_data-batches. - Datasæt accepterer op til 100 kolonner og 50.000 rækker pr. kald, og et dashboard accepterer op til 40 widgets på hvert indlejringsniveau. Gemte dashboards tæller med i abonnementets lagerkvote - kald
storage_statusfor at tjekke resterende plads før et stortcreate_dashboard- elleradd_data-kald. - Der bruges standard HTTP-statuskoder: 401 for manglende eller ugyldige legitimationsoplysninger (med en WWW-Authenticate-udfordring, der peger på ressourcemetadataene), 403 for tilbagekaldte eller utilstrækkelige legitimationsoplysninger, 413 for for store anmodninger og 429 ved rate limiting.