DEV Community

Cover image for Claude Dashboards on ClickHouse, through a semantic layer: a 10-minute tutorial
Sergei Semenkov
Sergei Semenkov

Posted on AI-assisted

Claude Dashboards on ClickHouse, through a semantic layer: a 10-minute tutorial

As of October 2026. You need a paid Claude plan (Pro, Max, Team or Enterprise); on Enterprise an owner has to turn Dashboards on.

On Tuesday I wrote about where the data goes when you use Claude Dashboards. Several people asked for the practical part: how do you actually get a live dashboard on a big ClickHouse table, and what does Claude do along the way?

Here it is, on the public eMondrian demo: 182 million US flights in ClickHouse, behind a semantic layer that defines measures like On-Time Rate once. Nothing to install. It took me about ten minutes, most of it reading what Claude was doing.

Disclosure: I'm the author of eMondrian, the open-source semantic layer used here.

Why not connect Claude to ClickHouse directly? You can: Claude Dashboards has its own ClickHouse connector. Then Claude writes SQL against your tables, and every table the connection can read is in play. Here the connection goes through a semantic layer instead. Claude sees cubes and measures that are already defined, such as On-Time Rate, writes MDX against them, and the server generates the SQL. You get the same numbers as in Excel and Power BI, and Claude reaches less of your database. More on that trade-off in Is your data safe with Claude Dashboards?

What you'll build

The finished Claude Dashboard with Delta selected: slicers, KPI cards, on-time rate by year and by month, the largest carriers

  • Year and carrier slicers
  • KPI cards: on-time rate and flights for the selection
  • On-time rate by year (1987–2026) and by month for the selected year
  • The largest carriers, with on-time rate on each bar
  • A panel with the exact MDX query behind each chart

Claude designs the page on every run, so yours will look a little different. The numbers won't.

Step 1. Add the connector (1 minute)

In claude.ai open Customize → Connectors, click + Add → Add custom connector and fill in:

  • Name: eMondrian demo
  • MCP server URL: https://demo.emondrian.com/emondrian/mcp

Adding the eMondrian demo as a custom connector

Click Continue. Claude checks the server; the demo needs no sign-in, so the connector is added right away. The demo's data is read-only and public, so that's fine here. For your own data it isn't — more on that at the end.

Open the connector to see its tools. For each one you choose whether Claude may use it always, only with your approval, or never:

Tool permissions for the eMondrian demo connector

Step 2. Start a dashboard (30 seconds)

Open Artifacts and pick Dashboard (Beta). You get an empty dashboard and a chat next to it.

Artifacts → Dashboard (Beta): an empty dashboard and the prompt

Step 3. Ask for it (1 minute)

Paste this prompt:

Using the eMondrian demo connector, build a dashboard for the OnTime cube: on-time rate by year, by month for 2025, and the largest carriers, with year and carrier slicers. Add a panel that shows the MDX each chart sends.

Be specific about measures and the cube. "Build me a flights dashboard" works too, but you'll spend the saved minute on corrections.

Step 4. Watch and approve (5 minutes)

Claude first reads the model, then tests each query before it writes the page. Every tool call asks for your approval, and the approval shows what will run:

  1. List catalogs — which models and cubes the server has.
  2. Get schema — dimensions, measures and their formulas. This is how Claude learns that On-Time Rate already exists and how it's defined, instead of inventing its own.
  3. Execute query — a few MDX test queries, one per chart shape.

The approval dialog shows the MDX query before it runs

Use Allow once if you want to read each query. Claude tests about ten of them, and the finished page asks again for each chart when it first loads, so once you've seen enough, click Always allow for Execute query. Without waiting on me, the build takes well under ten minutes.

A detail I liked: Claude checked how the slicers would substitute values into the queries, tested them with fixed values, and told me which part it couldn't test from the chat.

When the page opens for the first time, it shows a consent dialog, This artifact uses connectors, listing the eMondrian demo connector with a switch. Every viewer sees it before the page can query anything. The label says "Can read and make changes"; in practice the page calls one tool, Execute query, which only reads data.

Step 5. Use it

The dashboard is live: each chart is a stored query, not a picture of numbers. Pick another year or a carrier (or click a carrier's bar) and the charts re-query the server. The screenshot at the top shows Delta selected.

The numbers come from the semantic layer, so they match what Excel and Power BI show for the same model: 7,001,619 flights in 2025 with an on-time rate of 76.3%; for Delta, 1,026,332 flights and 79.1%.

Step 6. Look at the MDX

Scroll to the MDX panel. Every chart shows the query it sends, with the current slicer values filled in:

The MDX panel: the exact query behind each chart, and how many rows came back

SELECT
  {[Measures].[Flights], [Measures].[On-Time Rate]} ON COLUMNS,
  NON EMPTY [Time].[Year].Members ON ROWS
FROM [OnTime (attributes)]
WHERE (StrToMember("[Airline].[" || 'DL' || "]"))
Enter fullscreen mode Exit fullscreen mode

The answer is 30 rows: one per year Delta flew. The month chart is 12 rows.

This is the part I'd show a colleague who asks "where do these numbers come from". It's also what makes the security story simple: the page stores queries, and each one asks the server for a handful of aggregated rows.

Step 7. Change it by asking

Ask in the chat, for example:

Add a chart with cancellation rate by day of week for the selected year and carrier.

Claude tested the new query, found the Cancellation Rate measure already defined in the model instead of computing its own, and added the chart in under a minute.

The new chart after one more prompt

Step 8. Share it — with a catch

Dashboards start private. When you share one, each viewer runs the queries through their own connector, so they need the eMondrian demo connector too. A dashboard that uses connectors can't be opened with "Anyone with the link".

Sharing: private by default

What actually happened (30-second version)

  • Claude saw the model — cubes, measures, formulas. No raw rows.
  • The page stores queries. Every time someone opens it, the queries go from the browser through Anthropic's connector service to the eMondrian server, and only aggregates come back (a year by month is 12 rows).
  • So the numbers pass through Anthropic's cloud. On the public demo that doesn't matter. For your own data, read Is your data safe with Claude Dashboards? first.

Doing this on your own data

  1. Run eMondrian Community next to your database: git clone https://github.com/eMondrian/emondrian-community and ./setup.sh. It ships with ClickHouse and an OnTime sample.
  2. Define your cubes and measures. You can ask Claude Code to draft the schema over MCP; it validates and saves it for you.
  3. Connect Claude to your server. Two honest caveats:
    • A remote connector (as above) calls your server from Anthropic's cloud, so the server has to be reachable from the internet. Community's MCP has no sign-in — don't expose it with real data.
    • For local testing, use Claude Desktop or Claude Code with a local MCP server instead.

The Power BI and AI modules need a key; a free 30-day evaluation key is at emondrian.com/license.


eMondrian: Demo · GitHub · Docs

Sources: Get started with Claude Dashboards · Artifacts admin guide

Questions, or a dashboard you built on the demo? Leave a comment.

Top comments (0)