Metabase Skill
Create questions, dashboards, and public links on Civitai's Metabase instance.
Running Commands
node .claude/skills/metabase/metabase.mjs <command> [options]
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
update-question — Change display type or visualization
# 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"]}'
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 --cols flag controls cards per row (default: 2). Uses Metabase's 24-column grid.
add-dashboard-filter — Add interactive filters
node .claude/skills/metabase/metabase.mjs add-dashboard-filter \
--dashboard 456 \
--filtername "Date Range" \
--filtertype "date/range" \
--slug "date_range" \
--target '[{"card_id":101,"target":["variable",["template-tag","start_date"]]}]'
set-dropdown — Make a variable a dropdown list
Converts a {{variable}} template tag into a dropdown with a static list of values. The variable must already exist in the question's SQL query.
# Basic dropdown
node .claude/skills/metabase/metabase.mjs set-dropdown \
--id 2608 \
--variable period \
--values "day,week,month,year" \
--default day \
--required
# Metric selector
node .claude/skills/metabase/metabase.mjs set-dropdown \
--id 2608 \
--variable as \
--values "purchases,buzz,users" \
--default purchases \
--required
| Flag | Description |
|---|---|
--id |
Question (card) ID |
--variable |
Name of the {{variable}} in the SQL query |
--values |
Comma-separated list of allowed values |
--default |
Default selected value |
--required |
Make the filter required |
set-date-picker — Make a variable a date picker
Converts a {{variable}} template tag into a date picker widget.
node .claude/skills/metabase/metabase.mjs set-date-picker \
--id 2608 \
--variable since \
--default "2026-02-13" \
--required
| Flag | Description |
|---|---|
--id |
Question (card) ID |
--variable |
Name of the {{variable}} in the SQL query |
--default |
Default date (YYYY-MM-DD) |
--required |
Make the filter required |
set-parameters — Full parameter JSON (advanced)
Set all parameters at once with full Metabase parameter JSON. Use get --type question --id <id> to see the current parameter structure.
node .claude/skills/metabase/metabase.mjs set-parameters \
--id 2608 \
--parameters '[{"slug":"as","type":"string/=","values_source_type":"static-list",...}]'
share — Generate public link
# Share a question
node .claude/skills/metabase/metabase.mjs share --type question --id 101
# Share a dashboard
node .claude/skills/metabase/metabase.mjs share --type dashboard --id 456
list — Browse a collection
node .claude/skills/metabase/metabase.mjs list --collection 232
node .claude/skills/metabase/metabase.mjs list --collection 232 --type question
search — Find questions/dashboards
node .claude/skills/metabase/metabase.mjs search --query "challenge" --type question
get — View full details
node .claude/skills/metabase/metabase.mjs get --type question --id 101
node .claude/skills/metabase/metabase.mjs get --type dashboard --id 456
list-collections / list-databases
node .claude/skills/metabase/metabase.mjs list-collections
node .claude/skills/metabase/metabase.mjs list-databases
Databases
| ID | Name | Engine | Notes |
|---|---|---|---|
| 3 | ClickHouse | clickhouse | Analytics, events, buzz transactions |
| 2 | Prod | postgres | Main application database |
| 35 | Buzz DB | postgres | Buzz-specific database |
Key Collections
| ID | Name |
|---|---|
| 232 | Challenges |
| 100 | Buzz Analytics |
| 102 | Daily Analytics |
| 430 | Community Analytics |
| 331 | Feature Performance |
| 530 | Revenue |
| 133 | Social Metrics |
| 106 | System Performance |
Workflow: Build a Question with Dropdowns
# 1. Create the question with {{variables}} in SQL
node .claude/skills/metabase/metabase.mjs create-question \
--name "My Metric" \
--database 3 \
--collection 232 \
--display bar \
--query "SELECT date_trunc({{period}}, date) AS period, CASE WHEN {{as}} = 'count' THEN count()::Int64 WHEN {{as}} = 'sum' THEN sum(amount)::Int64 END AS total FROM buzzTransactions WHERE date >= {{since}} GROUP BY period ORDER BY period"
# 2. Configure dropdowns and date pickers
node .claude/skills/metabase/metabase.mjs set-dropdown --id <id> --variable as --values "count,sum" --default count --required
node .claude/skills/metabase/metabase.mjs set-dropdown --id <id> --variable period --values "day,week,month,year" --default day --required
node .claude/skills/metabase/metabase.mjs set-date-picker --id <id> --variable since --default "2026-01-01" --required
# 3. Share publicly
node .claude/skills/metabase/metabase.mjs share --type question --id <id>
Workflow: Build a Dashboard End-to-End
# 1. Create questions (see above for dropdown setup)
node .claude/skills/metabase/metabase.mjs create-question --name "Daily Revenue" --database 3 --collection 530 --query "SELECT toDate(date) as day, sum(amount) FROM buzzTransactions GROUP BY day ORDER BY day DESC LIMIT 30"
# 2. Create dashboard
node .claude/skills/metabase/metabase.mjs create-dashboard --name "Revenue Overview" --collection 530
# 3. Add questions to dashboard
node .claude/skills/metabase/metabase.mjs add-to-dashboard --dashboard <id> --cards "<q1>,<q2>,<q3>" --cols 3
# 4. Share publicly
node .claude/skills/metabase/metabase.mjs share --type dashboard --id <id>
How Dropdowns Work
Metabase has two layers for variables in native queries:
Template tags — defined in
dataset_query.native.template-tags. These create the{{variable}}placeholders in the SQL. Set via--variablesoncreate-question.Parameters — defined in the top-level
parametersarray on the card. These control the UI widget (text input, dropdown, date picker). Set viaset-dropdown,set-date-picker, orset-parameters.
By default, {{variable}} template tags render as plain text inputs. To make them dropdowns:
- Use
set-dropdownto configure a static list of values - Use
set-date-pickerto configure a date picker widget - Each command reads the existing template tag ID and wires it up correctly
Important: Each call to set-dropdown or set-date-picker preserves other existing parameters. You can call them one at a time.
Tips
- Always specify
--collectionwhen creating questions/dashboards to keep things organized - Use
--displaywithupdate-questionorcreate-questionto set chart type - Variables in queries (
{{var}}) are auto-detected — no need to manually define simple text variables - For date/number variables, use
--variableswith explicit type definitions - After creating a question, use
set-dropdownandset-date-pickerto configure widgets - The
add-to-dashboardcommand auto-positions cards in a grid layout - Public links work for both questions and dashboards
- Use
[[AND col < {{optional_var}}]]syntax for optional filters (omitted when empty)