Compose dashboard
compose_dashboardCreate queries + widgets + a dashboard ATOMICALLY in one call, with a real 12-column grid layout (auto-packed unless you pass one: KPI row on top, charts in half-width pairs, tables full-width). Pass ONE of: widgets (create_widget-shaped specs), fromFeed (feedId + dataType), or fromBank (bankId + dataType) — fromBank builds the curated starter directly from a connected bank with NO feed. WITH `widgets`, if the widgets read data you MUST also pass `dataSource` (bankId or feedId + dataType) to bind them, or they render "No data source". PREFER THIS over the create_dashboard → create_widget → attach_widget sequence: one call cannot leave orphaned library widgets or a single-column stack. Returns the dashboard id, slug, path, and created widget ids.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
operationId | string | optional | Input for operationId. |
name | string | required | Input for name. |
description | string | optional | Input for description. |
icon | string | optional | Input for icon. |
folderId | string | null | optional | Input for folderId. |
visibility | "private" | "workspace" | "public-link" | "public-indexed" | optional | Default "workspace". |
widgets | object[] | optional | Widgets to create + pin. Provide either widgets OR fromFeed. |
setupWidgets | object[] | optional | Design widget placements that stay in setup until a data source is chosen. |
fromFeed | object | optional | Alternative to widgets: build the curated starter dashboard for this feed (KPI row + signature charts + records table). |
fromBank | object | optional | Alternative to widgets/fromFeed: build the curated starter dashboard reading a CONNECTED BANK directly (no feed needed — the render plane reads the bank live). Use this when the user has a bank connected but no feed for the data type. |
dataSource | object | optional | With `widgets`: BIND every data-driven widget (chart/table/kpi) to this source, so the dashboard has real data. REQUIRED for a custom `widgets` dashboard whose widgets read data — otherwise they render "No data source". Pass exactly one of bankId (a connected bank — no feed needed) or feedId, plus the dataType. Resolve it from list_buildable_insights (prefer a live bank source). Ignored for fromBank/fromFeed (those bind their own source). |
layout | object[] | optional | Explicit 12-col grid cells matched to widgets by index. Omit to auto-pack (KPI row on top, charts in half-width pairs, tables full-width). |
filters | unknown[] | optional | Initial DashboardFilter[]. A pinned date_range filter is added when absent. |
draft | boolean | optional | Create as a staged DRAFT: hidden from the dashboards list until committed via commit_dashboard_draft (renderable via direct link meanwhile). |
Example call
The tool call an MCP client sends (required arguments shown with placeholder values).
{"tool": "compose_dashboard","arguments": {"name": "value"}}