Skip to content
Machine Learning
Skill

/metabase

Create and manage Metabase questions, dashboards, and public links. Use when the user wants to build metrics dashboards, create saved questions with SQL queries, or share analytics publicly.

BOOST
From plugin
civitai
7.3k48 skills15 agents3 commands
Install
$ npx -y skills add civitai/civitai --skill metabase --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/metabase

Context preview

The summary Claude sees to decide when to auto-load this skill.

Create and manage Metabase questions, dashboards, and public links. Use when the user wants to build metrics dashboards, create saved questions with SQL queries, or share analytics publicly.

SKILL.md

metabase.SKILL.md
name: metabase
description: Create and manage Metabase questions, dashboards, and public links. Use when the user wants to build metrics dashboards, create saved questions with SQL queries, or share analytics publicly.

Metabase Skill

Create questions, dashboards, and public links on Civitai's Metabase instance.

Running Commands

node .claude/skills/metabase/metabase.mjs <command> [options]

**A value that starts with `--` needs `--flag=value`.** Every flag except `--required` and `--json` takes a value, and a bare `--flag` (or one whose value begins with `--`) is an error rather than a silent `true`. This bites most often with SQL opening on a `--` comment line:

--query="-- daily totals
SELECT ..."

`create-question` reads the card back after creating it and fails if the stored SQL is not what was sent.

Commands

run-query — Ad-hoc SQL query

node .claude/skills/metabase/metabase.mjs run-query --database 3 --query "SELECT count() FROM views"

create-question — Saved question with optional variables

Variables are auto-detected from `{{variable}}` syntax in the query, or can be specified explicitly.

# Auto-detected variables
node .claude/skills/metabase/metabase.mjs create-question \
  --name "Challenge Review Purchases" \
  --database 3 \
  --collection 232 \
  --query "SELECT * FROM buzzTransactions WHERE description LIKE 'Challenge review:%' AND toDate(date) >= {{start_date}}" \
  --description "Tracks guaranteed review buzz purchases"

# Explicit variable definitions (for types like date, number, etc.)
node .claude/skills/metabase/metabase.mjs create-question \
  --name "User Activity" \
  --database 3 \
  --query "SELECT * FROM views WHERE userId = {{user_id}}" \
  --variables '{"user_id":{"id":"user_id","name":"user_id","display-name":"User ID","type":"number"}}'

**Variable types:** `text`, `number`, `date`, `date/single`, `date/range`, `date/month-year`, `date/quarter-year`, `date/relative`, `date/all-options`

run-card — Run a SAVED question, with its parameters

`run-query` runs ad-hoc SQL, which does **not** tell you whether a saved card works: a card whose parameters are mis-wired stores the right SQL and still returns nothing. Run the card itself to check.

node .claude/skills/metabase/metabase.mjs run-card --id 3301 --params '{"from":"2026-09-09","to":"2026-10-01"}'
node .claude/skills/metabase/metabase.mjs run-card --id 3303          # no parameters

Names in `--params` are `{{variable}}` names; an unknown one is an error rather than a silently ignored filter.

update-question — Change SQL, display, description, or archive it

# Replace the SQL (reads the card back and fails if the stored query differs)
node .claude/skills/metabase/metabase.mjs update-question --id 123 --query "SELECT 1"   --variables '{"from":{"id":"f","name":"from","display-name":"From","type":"date"}}'

# Description, or retire a superseded card
node .claude/skills/metabase/metabase.mjs update-question --id 123 --description "..."
node .claude/skills/metabase/metabase.mjs update-question --id 123 --archived true

# Change to bar chart
node .claude/skills/metabase/metabase.mjs update-question --id 123 --display bar

# Change to line chart with custom settings
node .claude/skills/metabase/metabase.mjs update-question --id 123 --display line \
  --visualization '{"graph.dimensions":["date"],"graph.metrics":["count"]}'

**Pass real SQL as `--query-file`, not `--query`.** A query with a comment header does not survive a shell argument intact, and a swallowed value is parsed as boolean `true` — which writes a card with no query and reports success. `create-question` and `run-query` take `--query-file` too.

An empty or whitespace-only `--query-file` is refused, because a file's emptiness is invisible to the caller — the program opened it, not them. An inline `--query " "` is still accepted: it was typed deliberately by someone who can see what they typed.

A write that contains a `{{snippet: ...}}` reference also verifies the snippet tag landed, not just the SQL. The two fail independently: a dropped tag leaves the query byte-identical and the card unrunnable.

Write a reference as `{{snippet: name}}`, lowercase. `{{snippet:name}}` is fine — Metabase normalises the missing space — but it does **not** normalise a space *before* the colon, and it **preserves the case of the prefix**. Both `{{snippet : name}}` and `{{SNIPPET: name}}` are references Metabase demands a tag for under that exact spelling, which this tool does not write, so the card cannot run. Both are refused rather than written.

🔴 **A comment line whose only content is `--` breaks parameter binding for the whole query** on the ClickHouse driver: every variable fails with *"we got more parameters than we can handle"*, which points at neither the line nor the cause. **Indentation does not save it** — an indented `--`, the usual form inside a CTE, breaks binding the same way. A trailing space or tab is the fix.

`create-question`, `update-question`, `run-query`, `create-snippet` and `update-snippet` all refuse text containing one. **No test can catch this**: the query runs clean until a variable is *bound*, so an unparameterised run and a card that merely exists both look correct. The guard is the only check that reaches it.

**Display types:** `table`, `bar`, `line`, `area`, `pie`, `scalar`, `row`, `funnel`, `map`, `scatter`, `waterfall`, `combo`, `smartscalar`, `progress`, `gauge`, `pivot`

create-dashboard — New dashboard

node .claude/skills/metabase/metabase.mjs create-dashboard \
  --name "Challenge Metrics" \
  --collection 232 \
  --description "Overview of challenge engagement and revenue"

add-to-dashboard — Add questions to a dashboard

# Add 3 cards in a 2-column layout
node .claude/skills/metabase/metabase.mjs add-to-dashboard \
  --dashboard 456 \
  --cards "101,102,103" \
  --cols 2

The `--co

Read more
Ships withcivitai

A repository of models, textual inversions, and more

Get the whole plugin

Other skills on civitai.