Обзор
MCP API Sprucely.io открывает платформу дашбордов для ИИ-ассистентов и стороннего ПО через Model Context Protocol (MCP) — открытый стандарт для подключения ИИ-моделей к инструментам по HTTP. Любой MCP-совместимый клиент может программно создавать размещённые дашборды, получать их список, просматривать их и добавлять в них данные. Дашборды, созданные через API, принадлежат вашему аккаунту и могут быть опубликованы, встроены или доработаны далее в сервисе. Инструкции по встраиванию готовых дашбордов на собственный сайт см. в разделе простая интеграция дашборда. Если вы используете Claude, быстрее всего начать работу поможет коннектор Sprucely.io.
Подключение
MCP-сервер обслуживается по протоколу Streamable HTTP по адресу:
https://www.sprucely.io/mcpПодключиться к этому адресу может любой MCP-клиент. Например, одна команда регистрирует сервер в Claude Code:
claude mcp add --transport http sprucely https://www.sprucely.io/mcpСервер также можно вызывать напрямую через JSON-RPC 2.0 по HTTP. Большинство MCP-клиентов выполняют рукопожатие протокола автоматически; запрос ниже получает список доступных инструментов с использованием 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"}'Аутентификация
Запросы авторизуются стандартным заголовком Authorization Bearer. Поддерживаются два типа учётных данных.
API-ключи — Создавайте API-ключи в разделе MCP вашего профиля. Ключи начинаются с spr_mcp_, показываются только один раз при создании и могут быть отозваны в любой момент. Используйте их для скриптов, серверов и MCP-клиентов без графического интерфейса.
OAuth 2.1 — Интерактивные MCP-клиенты могут вместо этого позволить пользователям входить через свой аккаунт Sprucely.io по протоколу OAuth 2.1. Сервер авторизации поддерживает authorization code flow с PKCE (обязательно), refresh-токены и динамическую регистрацию клиентов, поэтому совместимые клиенты настраиваются автоматически на основе метаданных ресурса:
https://www.sprucely.io/.well-known/oauth-protected-resourceДоступные области действия (scopes): openid, offline_access, dashboards:read и dashboards:write. Области действия проверяются для каждого инструмента: create_dashboard, add_data и set_sharing требуют dashboards:write и без неё возвращают ошибку. Остальным инструментам достаточно dashboards:read.
Для клиентов, которым требуется ручная настройка, конечные точки сервера авторизации таковы:
https://www.sprucely.io/oauth/.well-known/openid-configuration— метаданные сервера авторизацииhttps://www.sprucely.io/oauth/auth— конечная точка авторизации (требуется PKCE)https://www.sprucely.io/oauth/token— конечная точка токеновhttps://www.sprucely.io/oauth/reg— динамическая регистрация клиентовhttps://www.sprucely.io/oauth/jwks— ключи подписи (JWKS)https://www.sprucely.io/oauth/token/revocation— отзыв токенаhttps://www.sprucely.io/oauth/token/introspection— интроспекция токена
Инструменты
MCP-сервер предоставляет восемь инструментов: create_dashboard, get_dashboard, list_dashboards, add_data, get_dataset_schema, set_sharing, get_embed_code и storage_status.
Параметры набора данных и дашборда ниже — не особый формат, специфичный для MCP: это тот же самый JSON набора данных/дашборда, который описан на странице формат данных и используется повсюду в сервисе (в API импорта автономной встраиваемой среды выполнения, в макетах, сгенерированных ИИ, и в редакторе дашбордов), поэтому всё, что написано применительно к этому справочнику, действует и здесь.
create_dashboard — Создаёт размещённый дашборд из встроенного набора данных и дерева виджетов и возвращает ссылки для просмотра и встраивания. Параметры:
name— название дашборда (обязательный параметр)dataset— набор данных для визуализации:name,headers(названия столбцов),types(по одному типу базы данных на каждый заголовок —VARCHAR,BOOLEAN,INTEGER,BIGINT,FLOAT,DOUBLE,DATEилиTIMESTAMP) иentries(строки, каждая в виде массива значений в порядке заголовков), до 100 столбцов и 50 000 необработанных, построчных записей за один вызов (обязательный параметр). Записи не должны быть предварительно агрегированы: отправляйте по одной строке на каждую исходную запись и позвольтеdataFunctionкаждой диаграммы вычислять количество, суммы, средние значения и так далее непосредственно при отрисовке.dashboard— от 1 до 40 виджетов верхнего уровня, сверху вниз (обязательный параметр). Каждый виджет — этоdash_chart(тип диаграммы —area,bar,cell,dot,hexbinилиline— привязки столбцов к измерениямx,y,dиr, необязательныйdataFunctionи необязательный заголовок),dash_table, блокdash_text,dash_spacerили контейнерdash_stacker_hor/dash_stacker_ver. Стекеры вкладываются рекурсивно — дочерние элементы стекера сами могут включать другие стекеры, — что позволяет располагать виджеты в строки и столбцы произвольной глубины вложенности. То, какие виды столбцов (категориальный, непрерывный или дата/время) принимают измеренияx/y/d/rкаждого типа диаграммы, и как группировка столбца с датой по периоду с помощьюseasonX/seasonYделает его категориальным, описано для каждого поля через tools/list и на странице формата данных.theme— необязательные цвета для дашборда в целом (фон, текст, основной/приглушённый/дополнительный акценты); любой виджет всё равно может переопределить собственный цвет или фонshared— виден ли дашборд всем, у кого есть ссылка (необязательный параметр, по умолчанию false). Новые дашборды приватны, пока вы не установите значение true или не вызовете позжеset_sharing.
Результат содержит dashboardId и datasetId нового дашборда (понадобятся далее для add_data, get_dataset_schema, set_sharing и get_embed_code), а также его url, viewUrl и фрагмент кода iframe для встраивания. Пример — создание дашборда со столбчатой диаграммой и общим акцентным цветом дашборда:
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 — Возвращает название дашборда, статус публикации, идентификаторы наборов данных и ссылки. Параметр: dashboardId (обязательный). Пример:
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 — Выводит список дашбордов в вашем аккаунте, отсортированный по времени последнего обновления, с собственными datasetIds для каждого — так набор данных можно сразу передать в get_dataset_schema или add_data без отдельного вызова get_dashboard. Параметры: limit и offset для постраничного вывода, query для фильтра по названию без учёта регистра (все необязательные). Пример:
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 — Добавляет записи в набор данных существующего дашборда; все дашборды, использующие этот набор данных, обновляются автоматически. Параметры:
dashboardId— дашборд, в который добавляются данные (обязательный)entries— строки, позиционно выровненные с заголовками набора данных, до 50 000 за один вызов (обязательный параметр) — действует то же правило о необработанных, построчных данных, что и дляcreate_dashboard. Сначала вызовитеget_dataset_schema, если точные названия/порядок столбцов дашборда ещё не известны. Используйте этот инструмент, чтобы загружать большие наборы данных партиями или поддерживать дашборды в актуальном состоянии.run_id— необязательный ключ идемпотентности для конкретной партии (необязательный параметр). Если предыдущий вызовadd_dataс тем жеdashboardIdиrun_idуже завершился успешно, повторный вызов вернёт тот же результат вместо повторного добавления строк — благодаря этому партию можно безопасно повторить после тайм-аута или обрыва соединения. Используйте новыйrun_idдля каждой отдельной партии (например, UUID или хеш её содержимого).
Пример:
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 — Возвращает названия и типы столбцов набора данных. Используйте его перед вызовом add_data (или при построении новой диаграммы на основе того же набора данных), когда точные названия/порядок/типы столбцов заранее не известны — например, в новой сессии или если дашборд создал другой агент. Параметр: datasetId (обязательный). Пример:
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 — Включает или отключает публичную ссылку дашборда. Отключение отзывает доступ и для всех более ранних версий дашборда, поэтому ссылка, опубликованная ранее, перестаёт работать. Параметры: dashboardId и shared (оба обязательные). Пример:
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 — Возвращает ссылку для просмотра, которой можно поделиться, и фрагмент кода iframe для встраивания дашборда — тот же код ссылки/встраивания, который уже возвращают create_dashboard и set_sharing, на случай если он понадобится ещё раз отдельно. Ссылка работает для посторонних, только пока дашборд опубликован. Параметр: dashboardId (обязательный). Пример:
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 — Показывает, сколько хранилища использовано в аккаунте и сколько осталось — полезно перед вызовом create_dashboard или add_data, достаточно крупным, чтобы приблизиться к лимиту хранилища тарифа. Без параметров. Пример:
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
}Лимиты и ошибки
- Конечная точка MCP принимает до 25 запросов в минуту на клиента и тела запросов размером до 25 МБ — загружайте более крупные наборы данных партиями через
add_data. - Наборы данных принимают до 100 столбцов и 50 000 строк за один вызов, а дашборд — до 40 виджетов на каждом уровне вложенности. Сохранённые дашборды учитываются в квоте хранилища вашего тарифа — вызовите
storage_status, чтобы проверить оставшийся запас перед крупным вызовомcreate_dashboardилиadd_data. - Используются стандартные коды состояния HTTP: 401 для отсутствующих или недействительных учётных данных (с вызовом WWW-Authenticate, указывающим на метаданные ресурса), 403 для отозванных или недостаточных учётных данных, 413 для запросов избыточного размера и 429 при превышении лимита частоты запросов.