Przegląd
Interfejsy API MCP Sprucely.io udostępniają platformę dashboardów asystentom AI i oprogramowaniu zewnętrznemu za pośrednictwem Model Context Protocol (MCP) - otwartego standardu łączenia modeli AI z narzędziami przez HTTP. Każdy klient zgodny z MCP może programowo tworzyć hostowane dashboardy, wyświetlać ich listę, sprawdzać ich szczegóły oraz dopisywać do nich dane. Dashboardy utworzone przez te API należą do Twojego konta i można je udostępniać, osadzać lub dalej edytować w serwisie. Aby osadzić powstałe dashboardy na własnej stronie, zapoznaj się z notatkami na temat prostej integracji dashboardu. Jeśli korzystasz z Claude, najszybszym sposobem, by zacząć, jest konektor Sprucely.io.
Połączenie
Serwer MCP jest dostępny przez Streamable HTTP pod adresem:
https://www.sprucely.io/mcpKażdy klient MCP może połączyć się z tym punktem końcowym. Na przykład jedno polecenie rejestruje serwer w Claude Code:
claude mcp add --transport http sprucely https://www.sprucely.io/mcpMożesz też wywołać serwer bezpośrednio za pomocą JSON-RPC 2.0 przez HTTP. Większość klientów MCP przeprowadza uzgadnianie protokołu automatycznie; poniższe żądanie wyświetla listę dostępnych narzędzi przy użyciu klucza API:
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"}'Uwierzytelnianie
Żądania są autoryzowane za pomocą standardowego nagłówka Authorization Bearer. Obsługiwane są dwa typy poświadczeń.
Klucze API - Twórz klucze API w sekcji MCP swojego profilu. Klucze zaczynają się od spr_mcp_, są widoczne tylko raz, w momencie utworzenia, i można je unieważnić w dowolnej chwili. Używaj ich w skryptach, na serwerach i w klientach MCP bez interfejsu użytkownika (headless).
OAuth 2.1 - Interaktywne klienty MCP mogą zamiast tego pozwolić użytkownikom zalogować się na konto Sprucely.io za pomocą OAuth 2.1. Serwer autoryzacji obsługuje przepływ kodu autoryzacji z PKCE (wymagane), tokeny odświeżania oraz dynamiczną rejestrację klienta, dzięki czemu zgodne klienty konfigurują się automatycznie na podstawie metadanych zasobu:
https://www.sprucely.io/.well-known/oauth-protected-resourceDostępne zakresy: openid, offline_access, dashboards:read i dashboards:write. Zakresy są egzekwowane dla każdego narzędzia osobno: create_dashboard, add_data i set_sharing wymagają dashboards:write i bez niego zwracają błąd. Pozostałe narzędzia potrzebują wyłącznie dashboards:read.
Dla klientów wymagających ręcznej konfiguracji, punkty końcowe serwera autoryzacji są następujące:
https://www.sprucely.io/oauth/.well-known/openid-configuration- metadane serwera autoryzacjihttps://www.sprucely.io/oauth/auth- punkt końcowy autoryzacji (wymagane PKCE)https://www.sprucely.io/oauth/token- punkt końcowy tokenówhttps://www.sprucely.io/oauth/reg- dynamiczna rejestracja klientahttps://www.sprucely.io/oauth/jwks- klucze podpisujące (JWKS)https://www.sprucely.io/oauth/token/revocation- unieważnianie tokenówhttps://www.sprucely.io/oauth/token/introspection- introspekcja tokenów
Narzędzia
Serwer MCP udostępnia osiem narzędzi: create_dashboard, get_dashboard, list_dashboards, add_data, get_dataset_schema, set_sharing, get_embed_code i storage_status.
Poniższe parametry dataset i dashboard nie są formatem specyficznym dla MCP - to dokładnie ten sam JSON zbioru danych/dashboardu, opisany na stronie format danych i używany wszędzie indziej w serwisie (w API importu samodzielnego, osadzalnego środowiska uruchomieniowego, w układach generowanych przez AI oraz w edytorze dashboardów), więc wszystko, co napisano względem tamtego dokumentu referencyjnego, dotyczy również tego miejsca.
create_dashboard - Tworzy hostowany dashboard z wbudowanego zbioru danych i drzewa widżetów oraz zwraca linki do podglądu i osadzenia. Parametry:
name- tytuł dashboardu (wymagane)dataset- zbiór danych do zwizualizowania:name,headers(nazwy kolumn),types(jeden typ bazy danych na każdy nagłówek -VARCHAR,BOOLEAN,INTEGER,BIGINT,FLOAT,DOUBLE,DATElubTIMESTAMP) orazentries(wiersze, każdy jako tablica wartości w kolejności nagłówków), do 100 kolumn i 50 000 surowych wpisów na poziomie wiersza na wywołanie (wymagane). Wpisy nie mogą być wstępnie zagregowane: wyślij jeden wiersz na każdy rekord źródłowy, a policzenie sum, średnich itd. pozostaw funkcjidataFunctiondanego wykresu w momencie renderowania.dashboard- od 1 do 40 widżetów najwyższego poziomu, od góry do dołu (wymagane). Każdy widżet todash_chart(typ wykresu -area,bar,cell,dot,hexbinlubline- mapowania kolumn dlax,y,dir, opcjonalnadataFunctioni opcjonalny tytuł),dash_table, blokdash_text,dash_spacerlub kontenerdash_stacker_hor/dash_stacker_ver. Kontenery typu stacker zagnieżdżają się rekurencyjnie - dzieci kontenera mogą same zawierać kolejne kontenery - dzięki czemu widżety można układać w wiersze i kolumny o dowolnej głębokości. To, jakie rodzaje kolumn (kategoryczne, ciągłe lub data/czas) przyjmują wymiaryx/y/d/rdanego typu wykresu, oraz w jaki sposób grupowanie kolumny czasowej w powtarzający się okres za pomocąseasonX/seasonYczyni ją kategoryczną, jest udokumentowane przy każdym polu poprzez tools/list oraz na stronie Format danych.theme- opcjonalne kolory obowiązujące dla całego dashboardu (tło, tekst, akcenty podstawowy/subtelny/drugorzędny); każdy widżet może mimo to nadpisać własny kolor lub tłoshared- czy dashboard jest widoczny dla każdego, kto ma link (opcjonalne, domyślnie false). Nowe dashboardy są prywatne, dopóki nie ustawisz tej wartości na true lub nie wywołasz późniejset_sharing.
Wynik zawiera dashboardId i datasetId nowego dashboardu (potrzebne później do add_data, get_dataset_schema, set_sharing i get_embed_code), a także jego url, viewUrl oraz fragment kodu do osadzenia iframe. Przykład - utworzenie dashboardu z wykresem słupkowym i akcentem kolorystycznym obowiązującym dla całego dashboardu:
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 - Zwraca nazwę dashboardu, status udostępniania, identyfikatory zbiorów danych oraz linki. Parametr: dashboardId (wymagane). Przykład:
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 - Zwraca listę dashboardów na Twoim koncie, uporządkowaną według ostatniej aktualizacji, każdy z własnym polem datasetIds, dzięki czemu zbiór danych można przekazać bezpośrednio do get_dataset_schema lub add_data bez osobnego wywołania get_dashboard. Parametry: limit i offset do stronicowania, query do filtrowania po nazwie bez rozróżniania wielkości liter (wszystkie opcjonalne). Przykład:
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 - Dopisuje wpisy do zbioru danych istniejącego dashboardu; każdy dashboard korzystający z tego zbioru danych odświeża się automatycznie. Parametry:
dashboardId- dashboard, do którego mają zostać dopisane dane (wymagane)entries- wiersze dopasowane pozycyjnie do nagłówków zbioru danych, do 50 000 na wywołanie (wymagane) - obowiązuje ta sama zasada surowych wpisów na poziomie wiersza, co wcreate_dashboard. Jeśli nie znasz jeszcze dokładnych nazw/kolejności kolumn dashboardu, wywołaj najpierwget_dataset_schema. Użyj tego narzędzia, aby wczytywać duże zbiory danych partiami lub aktualizować dashboardy na bieżąco.run_id- opcjonalny klucz idempotencji dla tej konkretnej partii (opcjonalne). Jeśli wcześniejsze wywołanieadd_dataz tym samymdashboardIdirun_idjuż się powiodło, kolejne wywołanie zwraca ten sam poprzedni wynik zamiast ponownie dopisywać wiersze, dzięki czemu partię można bezpiecznie ponowić po przekroczeniu limitu czasu lub zerwaniu połączenia - dla każdej odrębnej partii użyj nowegorun_id(na przykład UUID lub skrótu jej zawartości).
Przykład:
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 - Zwraca nazwy i typy kolumn zbioru danych. Użyj go przed wywołaniem add_data (lub przed zbudowaniem nowego wykresu na tym samym zbiorze danych) za każdym razem, gdy dokładne nazwy/kolejność/typy kolumn nie są jeszcze znane, na przykład w nowej sesji lub gdy dashboard utworzył inny agent. Parametr: datasetId (wymagane). Przykład:
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 - Włącza lub wyłącza publiczny link dashboardu. Wyłączenie go cofa dostęp również do każdej wcześniejszej wersji dashboardu, więc link udostępniony w przeszłości przestaje działać. Parametry: dashboardId i shared (oba wymagane). Przykład:
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 - Zwraca link do podglądu dashboardu przeznaczony do udostępniania oraz fragment kodu iframe do jego osadzenia - ten sam link/kod osadzenia, który zwracają już create_dashboard i set_sharing, przydatny, gdy potrzebujesz ich ponownie, osobno. Link działa dla innych osób tylko wtedy, gdy dashboard jest udostępniony. Parametr: dashboardId (wymagane). Przykład:
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 - Zwraca informację o tym, ile pamięci wykorzystało konto i ile jej pozostało - przydatne przed wywołaniem create_dashboard lub add_data na tyle dużym, że mogłoby zbliżyć się do limitu pamięci Twojego planu. Brak parametrów. Przykład:
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
}Limity i błędy
- Punkt końcowy MCP przyjmuje 25 żądań na minutę na klienta oraz treści żądań o rozmiarze do 25 MB - większe zbiory danych wczytuj partiami za pomocą
add_data. - Zbiory danych przyjmują do 100 kolumn i 50 000 wierszy na wywołanie, a dashboard przyjmuje do 40 widżetów na każdym poziomie zagnieżdżenia. Zapisane dashboardy wliczają się do limitu pamięci Twojego planu - wywołaj
storage_status, aby sprawdzić dostępną jeszcze przestrzeń przed dużym wywołaniemcreate_dashboardlubadd_data. - Używane są standardowe kody stanu HTTP: 401 przy brakujących lub nieprawidłowych poświadczeniach (z wyzwaniem WWW-Authenticate wskazującym na metadane zasobu), 403 przy unieważnionych lub niewystarczających poświadczeniach, 413 przy zbyt dużych żądaniach i 429 przy przekroczeniu limitu żądań.