cd /news/ai-agents/build-a-dashboard-without-leaving-cl… · home › topics › ai-agents › article
[ARTICLE · art-169684] src=blog.devgenius.io ↗ pub= topic=ai-agents verified=true sentiment=↑ positive

Build a Dashboard Without Leaving Claude

The CanvasXpress MCP server can now build a live, linked, interactive dashboard directly inside a Claude chat from a single sentence prompt, using the MCP Apps extension to render a view at ui://canvasxpress/dashboard for its suggest_canvasxpress_dashboard and compose_canvasxpress_dashboard tools. In a demonstration, one tool call on the 344-row penguins table produced a ten-panel dashboard — a summary header, four ring cards, a filter panel and four charts — in which selecting rows in any panel selects the same rows in the rest, with the server building the dashboard in ordinary code rather than through the language model. Because Claude Desktop blocks network requests from the sandboxed view frame, dropped files are sent through the chat host in 60,000-character pieces, reassembled and kept by the server for 30 minutes; a 1,500-row sequencing QC table was recognized as per-sample QC and charted in full.

by read6 min views1 publishedNov 14, 2026

Part 8 of the CanvasXpress Dashboards series. Ask for a dashboard in a Claude chat and a live, linked, interactive one appears in the conversation. Here is how it works, what it builds, and where it stops.

Every earlier part of this series started from a spec, a builder, or a server. This one starts from a sentence in a chat window: “Build a dashboard from the penguins data.”

The CanvasXpress MCP server can answer that with an actual dashboard, drawn inside the conversation, not a screenshot and not a block of JSON. Select a point in one chart and the others select the same rows. It is the same coordination the rest of the series describes, delivered through a chat.

That result came from one tool call to a live server. The data was the 344-row penguins table that ships with the server, and the result held ten panels: a summary header, four ring cards, a filter panel and four charts. Selecting in any of them selects the same rows in the rest.

The mechanism is the MCP Apps extension. A tool can name a view in its metadata, and a chat client that supports the extension fetches that view and shows it next to the tool’s result. The CanvasXpress server names ui://canvasxpress/dashboard on both of its dashboard tools, suggest_canvasxpress_dashboard and compose_canvasxpress_dashboard.

The view is a small web page. It loads the CanvasXpress engine and the dashboards package from canvasxpress.org, takes the spec from the tool result, and calls the same renderDashboard function the rest of the series uses. So the dashboard in the chat is an ordinary new CanvasXpress(...) instance per panel, not a lookalike.

The model’s job is small. It decides when a dashboard is wanted and calls the tool. The server builds the dashboard with ordinary code, with no language model in that step, which is why it is fast and why the same table always gives the same dashboard.

The tool has one rule about data, and it is written into the tool’s own description so the model follows it:

A drop zone looks like a detour, so it is worth saying why it exists. The view’s own source explains it: the view runs in a sandboxed frame, and Claude Desktop does not let that frame make its own network requests. The one channel that works is a tool call made through the chat host. So the view reads your file in the browser and sends it to the server through the host, in pieces of 60,000 characters. The server reassembles it, keeps it for 30 minutes, and hands back a link. The view then asks for the dashboard using that link.

The alternative is to have the model read your file and type its rows into a tool call. That is slow and it is where mistakes creep in, so the tool description tells the model not to do it. The rows never pass through the model.

Here is the same chat after the file was dropped. It was a 1,500-row sequencing QC table. The server recognised it as per-sample QC, built the dashboard from all 1,500 rows, and titled it from the file’s name.

The server recognises three kinds of table and picks the dashboard to match.

Each dashboard also gets a header, a row of ring cards that summarise the whole table, and a What stands out strip when anything in the data qualifies. The strip is computed in the view from every row. It lists groups whose average sits far from the overall average, values more than 3.5 standard deviations from the mean, and any limits you declared, such as “Q30 below 85%”. Limits are never guessed. Only the ones you state are checked.

For the penguins table the strip reads “Species Gentoo: Flipper Length Mm averages 217, 16.3 above the overall 201 (123 of 344 rows)”. Each line carries its figures, so you can check it against the charts. Real questions span files: orders, customers and products, or patients, sites and arms. Drop two to six related files together, or pass several links, and the server joins them into one table. The file with the most rows is the base and keeps every row. Each other file is joined on a column name they share, provided that column identifies one row of the lookup file. A patient file is never multiplied by its visits. If no shared, unique column exists, the server says which files could not be related and asks you to name the key column the same in each. If the key exists but no values match, it says so and asks you to check that the values agree.

A dashboard that quietly uses the first 500 rows is worse than no dashboard. The tool refuses to. If a call says the table has more rows than it sent, the call is declined with a message asking for every row. The dashboard is built from the complete table or not at all, and the strip says how many rows it computed from.

When a call fails, the tool tells the model what to correct and invites a retry. After five failed attempts the model can ask for the fallback: a filter panel and bar charts built from whatever the table contains.

Two buttons sit above every dashboard, and they do different things.

Save downloads the dashboard’s spec as a JSON file named after the dashboard, through the chat host. Nothing is sent to a server. If the host will not allow a download, the view shows the JSON in a box with a Copy button instead. The file is the whole board, in the format the rest of this series describes.

Open in Builder takes the dashboard to the no-code builder. If the MCP server has been pointed at a dashboards server, the view first saves the spec there and then opens it directly. That needs two settings on the MCP server, the address of the dashboards install and a service token that matches the dashboards server’s own. The dashboard is saved private, under the service account’s name. A tool for publishing with a share link also exists, and a link beyond private needs that account to be allowed to share. Without those settings, the button opens the public builder at canvasxpress.org/dashboards. That page cannot receive an unsaved spec, so your dashboard does not come with you. Use Save first if you want to keep it.

Add https://canvasxpress.org/mcp to your chat client as a remote MCP server, then ask: "Build a dashboard from the penguins dataset." For your own data, say that the file is on your computer and that you will drag it onto the panel: "Use the CanvasXpress dashboards to build a dashboard from a file on my computer. I will drag it onto the panel."

The server, its tool descriptions and its tests are in github.com/neuhausi/canvasxpress-mcp. The dashboards package the view renders with is the one covered in the earlier parts of this series.

Back to the start of the series: From Charts to Dashboards*.*

Build a Dashboard Without Leaving Claude was originally published in Dev Genius on Medium, where people are continuing the conversation by highlighting and responding to this story.

── more in #ai-agents 4 stories · sorted by recency
── more on @canvasxpress 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/build-a-dashboard-wi…] indexed:0 read:6min 2026-11-14 · —