Summarize a Metabase dashboard every Monday with the numbers that moved

Every Monday: the numbers on one Metabase dashboard against last week, with the two that moved most called out in plain language.

Runs
Mondays at 8:30
Posts
Report card

From your apps to your board

How the skill works: your agent reads dashboard from Metabase; metabase address, dashboard id from What you tell it, mondays at 8:30, and gives you report card and the report in the chat.

Reads

  • MetabaseDashboard
  • What you tell itMetabase address, Dashboard ID
reads
Your agentClaude Code, Codex, Cursor or GeminiMondays at 8:30
posts

You get

  • Report cardOn your board, updated in place every run
  • The report in the chatEvery run, with or without Briefkin

What you get

  • Headline: the two numbers that moved most, in a sentence each.
  • Every number on the dashboard: this week, last week, change.
  • Skipped cards: tables and charts left out, so nobody wonders.
  • A link to the dashboard.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

AcmeMetabase dashboard weekly digest · Claude Code

Support tickets up 31%, churned accounts down

On Weekly KPIs, support tickets rose to 214 (+31%), mostly after the billing page change. Churned accounts fell from 12 to 9.

NumberThis weekLast weekChange
New signups1,2841,146+12%
Activated accounts512497+3%
MRR$48,210$46,520+3.6%
Churned accounts912-25%
Support tickets214163+31%
NPS4143-2 pts
Done
An example with made-up numbers. Your agent posts your real ones.

What it does

The weekly KPI dashboard gets built, shared in a channel, and then opened by two people. Everyone else wants the three sentences: what went up, what went down, and whether anyone should worry.

The agent runs each question on the dashboard through the Metabase API, for this week and last week when the dashboard has a date filter, and writes those sentences. It keeps the dashboard as the source of truth, so the numbers in the card are the numbers anyone gets when they click through.

How it works

  1. 1Read the dashboard

    GET <metabase>/api/dashboard/:id with the x-api-key header returns dashcards (each with its id, card_id and card.display) and the dashboard's parameters, including any date filter.

  2. 2Run each card for two weeks

    For number, trend and progress cards, POST /api/dashboard/:dashboard-id/dashcard/:dashcard-id/card/:card-id/query with the date parameter set to last week, then to the week before. Without a date filter, POST /api/card/:card-id/query and use the first row of data.rows.

  3. 3

    3Compare

    Change and percent change per number. Skip tables with many rows unless the card has a total. Rank by absolute percent change and pick the two that moved most, ignoring tiny bases (a count going from 2 to 4 is not news).

  4. 4

    4Write the digest

    One line per number with this week, last week and change, then two plain sentences about the biggest moves, and the dashboard link for anyone who wants the charts.

  5. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/metabase-dashboard-weekly-digest/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the metabase-dashboard-weekly-digest skill

    Or paste the prompt instead of installing:

    promptUsing the Metabase API with my API key (read only), read dashboard <id> (GET /api/dashboard/:id). For each number, trend or progress card, run it for last week and the week before through POST /api/dashboard/:id/dashcard/:dashcard-id/card/:card-id/query with the dashboard's date filter set to each week; if there is no date filter, run POST /api/card/:card-id/query and use the current value. Give me a table of every number with this week, last week and change, skipping multi-row tables and saying which cards you skipped. Then write two plain sentences about the two numbers that moved most in percent, ignoring very small bases, and include the dashboard link.
  3. Put it on a schedule

    Mondays at 8:30, from cron on any machine where Claude Code is signed in:

    crontab30 8 * * 1 claude -p "Run the metabase-dashboard-weekly-digest skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: metabase-dashboard-weekly-digest
description: "Every Monday: the numbers on one Metabase dashboard against last week, with the two that moved most called out in plain language. Use when the user asks for this, or when it runs on a schedule."
---

# Metabase dashboard weekly digest

Every Monday: the numbers on one Metabase dashboard against last week, with the two that moved most called out in plain language.

The weekly KPI dashboard gets built, shared in a channel, and then opened by two people. Everyone else wants the three sentences: what went up, what went down, and whether anyone should worry.

The agent runs each question on the dashboard through the Metabase API, for this week and last week when the dashboard has a date filter, and writes those sentences. It keeps the dashboard as the source of truth, so the numbers in the card are the numbers anyone gets when they click through.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Metabase API key (Admin > Settings > Authentication > API Keys > Manage, Metabase 49 or later) in `METABASE_API_KEY`, in a group that can view the dashboard's collection and query its databases.
- The Metabase URL and the dashboard ID (the number in the dashboard's URL).

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Read the dashboard** (Metabase): `GET <metabase>/api/dashboard/:id` with the `x-api-key` header returns `dashcards` (each with its `id`, `card_id` and `card.display`) and the dashboard's `parameters`, including any date filter.
2. **Run each card for two weeks** (Metabase): For number, trend and progress cards, `POST /api/dashboard/:dashboard-id/dashcard/:dashcard-id/card/:card-id/query` with the date parameter set to last week, then to the week before. Without a date filter, `POST /api/card/:card-id/query` and use the first row of `data.rows`.
3. **Compare**: Change and percent change per number. Skip tables with many rows unless the card has a total. Rank by absolute percent change and pick the two that moved most, ignoring tiny bases (a count going from 2 to 4 is not news).
4. **Write the digest**: One line per number with this week, last week and change, then two plain sentences about the biggest moves, and the dashboard link for anyone who wants the charts.

## Route B: the browser

### What you need

- Signed in to Metabase with an account in a group that can view the dashboard's collection; the person signs in and passes SSO or 2FA first.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://store.metabase.com/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the dashboard**: Metabase Cloud instances are listed in the Metabase Store; a self-hosted Metabase has its own URL. Open the instance, then the dashboard from its collection or from the search bar (its ID is the number in the URL, `/dashboard/12`).
2. **Set the date filter to last week**: In the filter bar at the top of the dashboard, open the date filter and choose **Relative dates** > **Previous** > `1` **week**. Wait for every card to finish loading, then read each number, trend and progress card: the value shown, and on trend cards the comparison line under it.
3. **Set it to the week before**: Change the same filter to **Previous** `2` **weeks**, or **Specific dates** with the Monday to Sunday of the week before, and read the same cards again. A dashboard with no date filter shows one current value per card; keep it and compare with what you noted last Monday.
4. **Compare and write**: Change and percent change per number. Skip tables unless they have a total row, and ignore tiny bases. Write one line per number with this week, last week and change, then two plain sentences about the two numbers that moved most, and keep the dashboard URL for the card.

Note: A date filter that is not wired to a card leaves that card unchanged between the two reads; the agent should say so instead of reporting a 0% change. Cards that load slowly on a wide date range can show a stale value if read too early.

## The report

- **Headline**: the two numbers that moved most, in a sentence each.
- **Every number** on the dashboard: this week, last week, change.
- **Skipped cards**: tables and charts left out, so nobody wonders.
- A link to the dashboard.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "metabase-dashboard-weekly-digest/<date of this run, e.g. 2026-10-16>",
  "item_key": "metabase-dashboard-weekly-digest",
  "project": "Acme",
  "source": "Metabase dashboard weekly digest skill",
  "kind": "update",
  "title": "Support tickets up 31%, churned accounts down",
  "summary": "On **Weekly KPIs**, support tickets rose to **214** (+31%), mostly after the billing page change. Churned accounts fell from 12 to **9**.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Number",
          "This week",
          "Last week",
          "Change"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "New signups",
            "1,284",
            "1,146",
            "+12%"
          ],
          [
            "Activated accounts",
            "512",
            "497",
            "+3%"
          ],
          [
            "MRR",
            "$48,210",
            "$46,520",
            "+3.6%"
          ],
          [
            "Churned accounts",
            "9",
            "12",
            "-25%"
          ],
          [
            "Support tickets",
            "214",
            "163",
            "+31%"
          ],
          [
            "NPS",
            "41",
            "43",
            "-2 pts"
          ]
        ]
      }
    },
    {
      "type": "Links",
      "props": {
        "items": [
          {
            "label": "Open Weekly KPIs in Metabase",
            "url": "https://metabase.example.com/dashboard/12"
          }
        ]
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Mondays at 8:30 (`30 8 * * 1`). From cron, with the agent signed in on that machine:

```bash
30 8 * * 1 claude -p "Run the metabase-dashboard-weekly-digest skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/metabase-dashboard-weekly-digest#schedule

Source: https://briefkin.dev/skills/metabase-dashboard-weekly-digest

What your agent needs

  • A Metabase API key (Admin > Settings > Authentication > API Keys > Manage, Metabase 49 or later) in METABASE_API_KEY, in a group that can view the dashboard's collection and query its databases.

  • The Metabase URL and the dashboard ID (the number in the dashboard's URL).

Connecting Metabase

  1. Metabase MCP server, built into Metabase. An admin turns it on under Admin > AI > MCP, and the URL is https://your-metabase.example.com/api/metabase-mcp. In Claude Code run claude mcp add --scope user --transport http metabase https://your-metabase.example.com/api/metabase-mcp, then /mcp and Authenticate. In Claude, add the URL as a connector (Metabase is in the directory); Codex and Cursor take the same URL. It signs in with Metabase's own OAuth and runs with your Metabase permissions (docs).
  2. API with an API key. Under Admin > Settings > Authentication > API Keys, create a key and assign it to a group; it gets exactly that group's permissions. Store it in METABASE_API_KEY with METABASE_URL and send it as the X-API-Key header.

The MCP scopes decide what a client can do: agent:content:read and agent:query:run cover reports, while agent:content:write, agent:delivery:write and agent:sql:run let it edit content, create alerts or write SQL. For the API, put the key in a group that can view only the report's collections.

Questions

What if my dashboard has no date filter?

Then each card shows its own current value, and the agent compares it with the value it recorded last Monday, kept in a small file between runs. Adding a date filter wired to every card makes the comparison exact and lets you rerun any past week.

Does the API key see everything?

No, and that is the point: an API key gets the permissions of the group you assign it to. Put it in a group that can view this dashboard's collection and query its databases, nothing more.

Do I need Briefkin to use the Metabase dashboard weekly digest skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Metabase pages themselves: the agent opens store.metabase.com in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.