TL;DR Connect the data source in claude.ai (Customize > Connectors) and ask Claude Code to "build a dashboard of … from my X connector". Then open Sources and click a number: you get its query, its rows and when it was last refreshed. Anything that comes from a local MCP server, from
ghor from a CSV is published as a file and won't refresh on its own.
When you ask Claude Code for a dashboard (or a metrics page, a KPI tracker, a scorecard) and your account has Claude Dashboards, still in beta, Claude doesn't hand-write an HTML page the way it does for a regular artifact. It starts the artifact from the Dashboard type, whose central rule is that no figure is typed into the page (only a constant you chose, like a goal line). Every figure, chart and table comes from a named source, and when that source is a live query, it runs again when someone opens, refreshes or filters the dashboard.
How Claude ends up on the Dashboard type
Claude Code's Artifact tool first checks which types your account offers. In this session, on v2.1.318, the account offered five (Dashboard, Design, Design System, Docs and Slides), and the tool's first step for a new page starts with these lines:
For a dashboard, metrics page, KPI tracker or scorecard, start from the
Dashboard type: publish with `type_url`:
"https://claude.ai/artifact/GZLZthZ2sQjn7T16skfdeF",
a `title`, no files and `auto_open: "after_first_write"`, then follow the
instructions that result carries.
From there Claude doesn't publish a .html from your folder. It writes the sources (one query or one file each) into the dashboard's store apart from the page, whose HTML holds marks where the numbers go.
A number on the page is an empty slot with data-source and data-field that a script fills from its source; if what it shows doesn't match the data, the type reports it back to Claude. Whatever one query can't work out (combining two connectors, or a query with a file) becomes a named calculation, and anyone who opens the dashboard can read its formula.
Two kinds of source
| Live query | Attached file | |
|---|---|---|
| What it is | A call to a claude.ai connector: connector, tool and arguments | A CSV, TSV or JSON uploaded to the dashboard |
| When it updates | When someone opens, refreshes or filters the dashboard | When someone uploads a new version, or a scheduled task does |
| Whose access | By default each reader's own: two people can see different data. If someone shares the connector, everyone sees that person's results | Nobody's: anyone who can open the dashboard can read it |
| When something's missing | A reader without that connector gets a notice and an offer to connect it | With a window set (staleAfterHours), it shows as stale once that passes |
Someone who opens a public link without signing in to claude.ai, or who is outside your organization, sees the page without its live parts. And the second column is the warning worth reading twice: a CSV of customer data attached to a dashboard shared with your whole organization can be read by your whole organization, even by people with no access to the system it came from.
The Claude Code trap: your local MCP server doesn't make it
In the terminal, Claude reads data from plenty of places the published page can't reach. The docs are explicit: the page can only call connectors from your claude.ai account, and the servers in your .mcp.json feed Claude while it builds, not the dashboard afterwards. The same goes for gh, psql or a script in your repo.
When the data comes from there, the Dashboard type doesn't fake a query: it saves the rows as a file and tells Claude to say why it isn't live. To make it a live query, the server has to exist as a connector in claude.ai (/mcp lists it as claude.ai <name>); otherwise a scheduled task can keep the file current.
What Sources shows you
Sources is the dashboard's side panel. One row per source, with its title, and on hover, how long ago it loaded (plus the connector, for a query). Click a marked number and its source opens with that figure:
- Query: Query (each argument, filters shown as chips with their current value, plus the connector and tool), Transform (when the answer had to be turned into rows) and Result, the rows with the cell you clicked highlighted.
- Calculation: Formula (its inputs and the function's text) and Result.
- File: File.
This is how the type stores an attached file. It's the source behind the sample dashboard in the illustration, with 32 invented rows of PRs per repo:
{
"title": "Sample PR review times",
"description": "Invented by Claude for a demo: weekly PRs merged and median review hours for four fictional repos, Sep 7 to Oct 26, 2026. No real team or data.",
"source": { "kind": "file", "name": "pr-review-times.json", "url": "/_blob/59262aba..." },
"fixed": true,
"updated": { "at": "2026-11-01T17:30:00Z", "by": "Claude" }
}
The fixed: true tells Sources not to offer connecting it to live data, and the title starts with "Sample" because Claude made the rows up: the type requires it to say so.
Ask for yours
1. Connect the source in claude.ai
Under Customize > Connectors: BigQuery, Snowflake, Databricks, Redshift, ClickHouse or the app where the data lives (Salesforce, GitHub). If it needs a fresh sign-in, Claude asks you for it before it reaches for other data.
2. Ask the question, not the chart
Build a dashboard of how many hours a PR takes to get reviewed in each repo,
week by week since September, from my GitHub connector.
Name the connector and, if you know it, the table. "How do this month's signups by channel compare with last month's?" gets you further than "a signups chart".
3. Read the hand-over
Claude finishes by saying what it assumed, which connector each reader needs, that anyone who can open the dashboard can read an attached file and, if it made up sample rows, which numbers those are. That's where you find out whether anything ended up without a live connection.
4. Check one number in Sources
Click the figure you care about most and read its Query. If it isn't counting what you meant, tell Claude in the same session. From Sources you can also download a source's rows as CSV and, as an editor, change the query, test it and roll back to an earlier version. To pick it up another day, it's in your /artifacts list like any artifact you own, and Enter attaches it.
Hand-written page or dashboard
| Regular artifact | Dashboard | |
|---|---|---|
| Where the numbers live | Inside the HTML, or fetched by the page's own code | In their sources, never typed into the page |
| When they change | When Claude publishes again, or on load if the page calls connectors | On open, refresh or filter |
| How you check them | By reading the page's code or asking Claude | In Sources, number by number |
| What it's for | Walking through a PR, comparing options, explaining | Questions you keep asking of your data |
If what you want is to understand a change before you delegate it, that's still an artifact you sculpt by hand.
Official docs: Share session output as artifacts · Get started with Claude Dashboards
Requirements
- Claude Dashboards is in beta on Pro, Max, Ultra, Team and Enterprise. On Enterprise it's off until an Owner turns it on under Organization settings > Artifacts. It counts toward your usage limit like any other work.
- A session signed in with
/loginon the Anthropic API, Claude Code v2.1.281 or later, not in-pmode: with an API key, a gateway, Bedrock, Vertex or Foundry there are no artifacts. The docs also leave them out for organizations with CMEK, HIPAA or Zero Data Retention. - On Team and Enterprise, live queries also need the Enable artifact connectors toggle in the organization's settings.
- Artifact tool output from Claude Code v2.1.318, on November 5, 2026.