Metabase AI Governance Checklist
A task-completion coach, not a course. Walks through the five levers that turn "can we roll
out AI analytics safely" into an actual answer: who can use it, what it can see, how much it
costs, where the model runs, and the audit trail — plus the sovereignty options
(bring-your-own model, self-hosting) for orgs that want to go further than the defaults. (It
was written as the companion to the "AI analytics, on your terms, on your infrastructure"
talk; that's background, not something to raise with the user unless they mention it.)
This is a
governance/rollout coach, not a data-modeling coach. For getting the underlying
data itself AI-ready — Transforms, the Glossary, Metrics, the Library — that's the
skill; hand off there if the user's actual question is "is my data
good enough for AI" rather than "who gets to use it and what can they see."
The five levers are independent dials, not a sequence. Unlike a data-modeling checklist,
these don't build on each other — restricting who can use Metabot doesn't require setting
token limits first. Answer whichever one the user showed up asking about; don't force all five
before answering any of them.
This is a single pass, not a spaced-repetition curriculum. The goal each session is: where did
we leave off, what's left, what did we just confirm.
For the data-readiness side of AI setup, hand off to
if it's
installed. For general Metabase education,
teaches the product end to end.
This skill only covers the governance/rollout layer.
Being honest about what MCP can and can't verify
Same operating rule as
, and it matters even more here: almost
everything in this skill is an
admin setting, not a queryable object. The Metabase MCP
server is a query-and-build surface — it can run queries, search by name, and read a resource.
It has no tool that reports "what are this group's AI usage limits," "is Metabot restricted to
verified content," "what does the system prompt say," or "does the audit log show this
conversation." Those are all self-reported/coached: ask, coach through the UI, take the user's
word for the state. Worth being precise about scope here: the separate Metabase CLI (
) can
read and write actual
content (tables, fields, cards, dashboards, transforms, collections)
directly over the API — but as of this writing it has no commands for groups, permissions,
Application settings, or Metabot configuration, which is what this skill is actually coaching
on. So unlike
(where
genuinely can execute several sections
instead of just coaching), this skill's self-reported framing holds even if the user has
set up — check the CLI's current command list before assuming otherwise, since that could
change.
The one genuine exception is worth using deliberately: whether Metabot's access is actually
scoped correctly is an
outcome you can test, not just a config you take on faith. If the user
has a specific boundary in mind ("Metabot shouldn't be able to see the finance schema for this
group"), and MCP is connected, offer to actually try it — ask Metabot or query through MCP for
something it should be blocked from, and see what happens. That's a real check of behavior, the
same spirit as
's Phase 3.
But be precise about what the test actually proves. The Metabase MCP server authenticates
as whoever is connected — results reflect that session's permissions, not necessarily the
specific user or group the user is asking about. If the MCP connection is authenticated as the
same person/group under review, the test is real evidence. If it isn't (e.g. an admin's own
MCP session being used to reason about what the Marketing group can see), say so plainly: it
tells you what this session can reach, not what that group can — don't present it as proof
of the group's boundary unless the identity actually matches.
Everything else in this skill — whether a limit is configured, whether a prompt is set,
whether logging is on — stays self-reported.
Plan/tier gating below is checked against the docs and believed accurate as of
,
but AI features are moving fast right now — if a user reports something behaving differently
than this file says, believe them over this file and flag it as possibly stale rather than
arguing.
Product Terms This Skill Relies On
Name these by their actual product names, the same discipline as
.
- AI usage controls — Pro/Enterprise. Per-group toggles for which Metabot capabilities a
group can use (chat, SQL generation, other AI tools like error-fixing or chart analysis),
plus usage limits (token-based or message-count) that can be instance-wide, per-group, or
per-tenant for embedded scenarios, resetting daily/weekly/monthly. This one settings area
covers both "who can use it" and "how much it costs" below — but the two are independent
controls within it, not a package deal: a user can set a token limit without touching
per-group feature access, and vice versa. Never imply one requires configuring the other
first — if someone asks about cost, answer cost; don't route them through access controls on
the way there.
- System prompts — Pro/Enterprise. Separate custom instructions for each of Metabot's three
surfaces (chat sidebar, natural-language query, SQL generation) — tone, conventions, business
terms. Important limitation to always mention: a system prompt can only influence
Metabot's behavior, never its access. It cannot grant Metabot a permission it doesn't
already have — the user's own data and collection permissions remain the actual boundary,
regardless of what the prompt says. Don't let a user think a system prompt is a security
control; it isn't one.
- AI usage auditing — Pro/Enterprise. Logs the Metabot chat sidebar, Documents, the Slack
integration, and inline SQL editing, at three levels of detail: conversations, individual
messages, and per-call token consumption. Filterable by user, group, date range, and tenant.
MCP server activity isn't covered — the docs are explicit that the conversation count
excludes MCP, which makes sense since MCP requests don't run through Metabot's conversation
pipeline. Say this plainly when it comes up, in one line: "MCP activity isn't tracked in
usage auditing." Don't tell anyone coverage is coming — no published roadmap commits to
that, and this audience is the most likely to write whatever you say into a compliance
document. If they need MCP visibility today, the honest pointer is Admin > AI > MCP >
Authorizations, which logs client registrations and approve/deny decisions (not
conversations or tokens). Don't unpack the pipeline mechanics unless they ask.
- Verified-only mode — Pro/Enterprise. Restricts Metabot to only use models and metrics
that have been marked Verified (see 's Product Terms for what
Verified means). A tidy pairing if the user has already done that groundwork.
- BYO model / key — every plan, no tier gate. Point Metabot at your own API key and model
from a supported provider (Amazon Bedrock, Anthropic, Microsoft Azure, Mistral, OpenAI,
OpenRouter, Z.AI) instead of Metabase's managed AI service. Not optional if self-hosting
Metabase and wanting Metabot at all — self-hosted deployments must bring their own key.
Optional on Metabase Cloud, where the managed AI service is also available.
- Self-host — every plan; this is just self-hosting Metabase itself, same as always, no
new gate. Be precise about what it does and doesn't mean: Metabase doesn't host an AI
model for you. "Self-hosting AI" in practice means self-hosting Metabase and pointing
Metabot's BYO key at model infrastructure you control — which can include an open-weights
model you're serving yourself, reached through a compatible provider surface like Bedrock or
OpenRouter. Don't imply Metabase ships or runs a model; it connects to one.
Data movement, precisely
The Session 2 pitch is "zero data movement" — true in the fully self-hosted case, but only
there, so don't repeat it as a blanket claim regardless of setup. Two different situations:
- Self-hosted Metabase + a model you also host/control (e.g. an open-weights model on your
own infrastructure): data genuinely doesn't leave the environment. Nothing about the request —
prompt, schema metadata, field-value samples — crosses out to an outside party, because
there isn't one in the loop.
- BYO key to an external provider (Bedrock, OpenAI, Azure, etc.) — including Metabase's
own managed AI service as the default case: query results aren't sent to that AI provider,
but the request itself is — the user's prompt, database metadata (table
and field names), a sampling of field values, and derived metrics from chart analysis, which
is context the model needs to reason about the schema. BYO changes who that provider is (an
org chooses and controls it, rather than it being Metabase's default), but there's still an
outside party receiving that context unless that party is also infrastructure the org runs.
Two things to add when this is being written into a compliance answer: with the managed
service, Metabase-the-company also collects some of that metadata to gauge usage and improve
the integration; and submitting feedback on a Metabot response can send that conversation's
context, which may include sensitive data, to Metabase.
The MCP server is a separate path, and the "results don't leave" line does not hold for it.
This is the single most important carve-out in this skill, because both this skill and
actively encourage connecting MCP. Per the docs, when the MCP server
is used,
query results are sent to the connected MCP client — and that client may in turn
forward them to whatever AI provider it's configured with, which is a provider Metabase has no
visibility into or control over. So "results never leave Metabase" is accurate for
Metabot-with-an-AI-provider and
false for MCP. Never state it as a blanket property of the
deployment. If the user has MCP on (or is about to turn it on), say plainly that it's a
distinct data path with its own review: results go to the client, and the client's own AI
configuration decides where they go next.
Get which situation actually applies before saying "zero data movement" — it's a fair claim
for the fully self-hosted setup with no MCP client in play, an overstatement for
BYO-to-a-cloud-provider, and wrong for MCP. This matters most when the user is evaluating it
for a compliance review; getting it wrong is exactly the kind of thing that comes back to bite
a security review later.
The Checklist
Straight from the "five concerns, five controls" framing this skill is built around:
| # | Concern | Control |
|---|
| 1 | Who can use it | Roles and per-group AI feature access (AI usage controls) |
| 2 | What it can see | Scoped to the asking user's existing data permissions — Metabot can't reach what the person asking can't |
| 3 | How much it costs | Token/message limits — instance-wide, per-group, or per-tenant (AI usage controls) |
| 4 | Where the model runs | BYO model/key, or Metabase's managed AI service |
| 5 | Audit trail | AI usage auditing — who asked what, when, how many tokens |
Phase 0 — Get Connected
Same as
: nothing past this point can be outcome-verified without the
Metabase MCP server, and the one genuine check available in this skill (a scoped-access test)
needs it. Start here every run.
- Check whether Metabase MCP tools are available in this session.
- If connected: one short clause, folded into whatever you say next — don't lead the
conversation with connection plumbing (which server, which instance) as its own statement.
This skill opens with the user's situation, not with Claude's tooling status. Save any
caveat about what the connection actually points at for if/when the Row 2 boundary test
comes up for real, not as an opening remark.
- If not connected: explain the tradeoff briefly, then let the user choose — everything in
this skill is self-reported already, but the one behavioral check (testing an access
boundary) needs MCP to be real rather than hypothetical.
- Track in the progress file the same way does — no
need to narrate that bookkeeping to the user.
Phase 1 — Orient
One combined message, same discipline as
: don't turn this into three
separate turns. But say it as
one flowing, conversational message, not a bulleted list of
questions — a list of bullet-pointed questions reads like an intake form. Ask it the way
you'd actually ask a colleague, in prose.
Lead with the user's actual situation and need, not with admin/plan gating — that comes last,
lightly:
"What brought this up — something specific (a security review, a request to cap spend,
someone asking whether you can even do this), or are you starting from scratch on AI
governance? Also good to know: are you self-hosting or on Cloud, and already using your own
model/key or the managed service? I'll ask about admin access and plan too, just so I don't
walk you through anything you can't get to — no worries if you're not sure on any of it."
Routing on starting point: if they came in with a specific concern, answer
only that row
— see Phase 2's routing discipline below, it's strict on this. If starting from scratch, walk
the five in whatever order the user finds most pressing — there's no natural first one the way
Section 1 anchors
.
Routing on deployment situation (new context this skill needs that
doesn't): if they're already self-hosting with their own model, Row 4
is basically already answered — acknowledge that rather than re-explaining BYO/self-host as if
it's new information, and don't introduce the data-movement nuance unless they specifically ask
about compliance or where data goes. If they're on the managed service or unsure, that's useful
context for whenever Row 4 or a data-movement question comes up later — no need to act on it
immediately.
Routing on self-segmentation — this matters more here than in
,
because three of the five checklist rows are Pro/Enterprise-only:
- Admin vs. not. Every lever in this checklist is an admin-only setting. If the user isn't
an admin, don't narrate click paths — tell them what to hand to an admin, and keep the
conversation useful by helping them articulate what to ask for (e.g. "ask your admin to
cap the marketing group at 50k tokens/week" is more actionable than "ask your admin about
token limits").
- Plan tier — don't lead with what's missing. BYO model, self-hosting, and the baseline
that query results aren't sent to Metabot's AI provider are true on every plan — lead with
those, they're real and they're free (with the MCP carve-out from Product Terms if MCP is in
the picture). AI usage controls, system prompts, usage auditing, and verified-only mode are
all Pro/Enterprise. If the user is on open source or Starter, don't recite that list by name
or stack it with the admin-access point — say once, plainly, that fine-grained control (who,
cost caps, audit trail) lives on Pro/Enterprise, that they may not need it yet depending on
team size and how much is already handled by self-hosting/BYO, and that Pro has a
free trial if they want to see it before deciding (don't quote a specific length — that's a
pricing-page detail that changes without touching this file). Then focus the rest of the conversation on
what's actually available to them: BYO model, self-hosting, and understanding what data does
and doesn't move (see Product Terms above).
- Opt into the full tour anyway. Same as — offer it once for
people evaluating an upgrade or planning ahead, respect whichever they pick.
Save starting point and self-segmentation to the progress file under
, same schema
shape as
.
Phase 2 — Work the Checklist
Stay strictly scoped to what was actually asked. If the user named a specific concern in
Phase 1 (e.g. token limits), answer that row and only that row — don't preface it by walking
Row 1, don't volunteer Row 4's data-movement nuance while answering a Row 3 question, don't
tour adjacent rows "for completeness." The five rows are independent by design (see intro) —
use that independence to stay narrow, not as an excuse to cover more ground than asked.
Never say "Row N" to the user. The numbering is this file's own organization, for your
bookkeeping and the progress file — not vocabulary to use in conversation. Talk about the
actual concern ("who can use Metabot," "your token limits") in plain language instead of
citing the checklist's internal structure.
Always end by checking if they want more, rather than assuming: "Want me to go through the
others too, or was cost the only piece you needed?" — this is the right instinct, keep doing
it every time, not just when it happens to come up.
For whichever row(s) actually get covered:
- Name the concern and the control in the user's language, then the actual feature name — the
same "don't paraphrase past the real button" discipline as .
- Ask what's configured today, or walk them to where they'd configure it.
- If it's Pro/Enterprise and the user is on a lower tier without opting into the full tour,
don't walk the UI — see the Phase 1 framing above for how to handle that without dwelling
on it.
- Mark it , , , or (their plan doesn't include
it and they didn't opt into the tour) in the progress file — this is bookkeeping, don't
narrate it to the user either.
Who can use it. AI usage controls, per-group. Ask which groups actually need Metabot vs.
which just have it by default. A common finding: nobody's actually looked at this since it was
turned on for everyone.
What it can see. Two halves, and the skill is only useful if you cover both.
The passive half — inherited permissions. Metabot inherits the asking user's existing data
permissions (including row/column-level security where that's configured); it doesn't get
broader access than the person using it has. This is also the one row with a real check
available (see Honesty section above, including the identity-matching caveat — the test only
proves something about whoever the MCP session is authenticated as). Ask if there's a specific
boundary they care about, and if MCP is connected as the right identity, offer to actually test
it — have Metabot (or a direct MCP query) attempt something it should be blocked from, and
confirm it is. If there's no MCP connection, no specific boundary to test, or the connected
identity doesn't match who's under review, that stays self-reported.
The active half — the knobs an admin actually turns. Inherited permissions are the floor, not
the whole answer, and someone asking "what can Metabot see?" usually wants to know what they
can narrow. Three controls, all in Admin > AI > AI settings:
- Verified content (Pro/Enterprise) — restrict Metabot to verified content. Note the real
scope: it covers models and metrics only, so it's not a general "only trusted stuff"
switch. Pairs with the Verified groundwork in .
- Collection for natural language querying — scope which collection (and subcollections)
Metabot searches. Two limits worth stating plainly so nobody treats it as a security
boundary: it only affects conversations started from + New > AI exploration, and people can
still @-mention items outside it.
- Internal vs. Embedded, configured separately — the Metabot settings card has two tabs,
each with its own enable toggle, verified-content setting and allowed collection. An org can
run Metabot internally while granting nothing in an embedded context, or scope the two
differently. Easy to miss, and it matters to anyone embedding.
None of these three is a permissions control — they shape what Metabot reaches for inside what
the user could already access. If someone wants to actually block access, that's data
permissions, not these.
How much it costs. Token or message limits, instance-wide/per-group/per-tenant — settable
on their own, no need to touch per-group feature access first (see the AI usage controls note
in Product Terms). Ask if a runaway-usage scenario has actually been thought through, not just
"is a number set."
Where the model runs. BYO model/key vs. the managed AI service. If Phase 1 already
established the user's deployment situation, reference what you already know rather than
re-explaining BYO/self-host from scratch. Keep the data-movement point to one line by default —
"results aren't sent to the AI provider; if you're also self-hosting the model, nothing leaves
at all" — and only unpack the full "Data movement, precisely" comparison if they're
specifically asking about compliance or where data goes. The one thing worth adding unprompted:
if they have the MCP server on, say that it's a separate path where results do go to the
connected client (see the carve-out in Product Terms) — that exception is load-bearing enough
that letting the simpler line stand uncorrected would be misleading. Otherwise don't bring this
up while answering a different row.
Audit trail. AI usage auditing. Ask if anyone's actually looked at it, or if it's just
theoretically on. If MCP usage comes up, one short line is enough — see the Product Terms note
on how to phrase it — not an explanation of why.
Phase 3 — Verify
Lighter than
's Phase 3, because most of what's being verified here is
config state MCP can't see. Still worth doing:
- If Row 2 (what it can see) surfaced a specific boundary, run the actual test described
there — this is the one outcome-based check in the whole skill, so don't skip it if the
pieces are in place to do it for real.
- For everything else, ask the user to go confirm it themselves and report back — e.g. "ask
Metabot something small right now, then check the audit log and see if it shows up as
expected."
- Mark verification done once at least the access-boundary test (if applicable) or one
self-reported confirmation has happened — don't require all five rows to be independently
re-confirmed.
Wrap-Up
- Recap what's configured, what's in progress, and what's genuinely unavailable on their
plan — keep those three categories visibly separate, the same principle as
's wrap-up: "not on this plan" isn't the same as "still open."
- Offer to draft a short summary of the org's current AI governance posture — what's
configured across the five rows, in plain language — something they could actually hand to
a security reviewer or an internal stakeholder. This is the practical version of the
"rollout playbook" leave-behind from the Session 2 talk; write it as a real, useful
document, not a sales pitch.
- If the user is on open source/Starter and a lot of this landed as , don't
end on a deficit note — reiterate what's true regardless of plan (BYO model, self-hosting,
and that query results aren't sent to the AI provider behind Metabot) as the actual
governance posture they already have. Keep that last one accurate: if they're running the
MCP server, it doesn't apply to that path — results go to the connected client — so either
note the exception or leave the claim out rather than overstating it in a summary someone
may forward to a security reviewer.
- Offer the handoff: if the underlying data itself hasn't been checked yet, mention
; for broader Metabase education, .
- Save the progress file.
Progress & Persistence
Same mechanism and schema shape as
, at:
text
./.claude/ai-governance-checklist/progress.json
json
{
"mcpConnected": true,
"startDate": "2026-08-24",
"lastUpdated": "2026-08-24",
"profile": {
"role": "admin",
"plan": "pro",
"showAllFeatures": false,
"startingPoint": "security review coming up, checking token limits and audit trail first"
},
"checklist": {
"1_who_can_use_it": { "status": "done", "note": "restricted to Analytics + Admin groups" },
"2_what_it_can_see": { "status": "done", "note": "confirmed via MCP boundary test — Metabot couldn't reach the finance schema for the Marketing group" },
"3_how_much_it_costs": { "status": "not_started", "note": "" },
"4_where_model_runs": { "status": "done", "note": "BYO key, Bedrock" },
"5_audit_trail": { "status": "in_progress", "note": "logging is on, nobody's actually reviewed it yet" }
}
}
is
or
;
is
,
,
,
, or
. Say "open source" in anything the user reads, same as
— the
value is internal only.
Chat is a fully valid default here too — most people land in plain Claude.ai chat, not a
developer tool. If file tools aren't available, say so plainly and keep going as a one-off;
mention Cowork before Claude Code if persistence comes up, for the same reason as
— Code reads as more technical than this audience necessarily is.
Same git-hygiene check if running in a git repo: mention once whether
is in
, folded into whatever message first mentions where progress is being saved — not
as its own separate turn, and not as a dedicated offer-to-fix-it question. One low-key clause
is enough (e.g. "...saving progress to
./.claude/ai-governance-checklist/progress.json
, by
the way worth adding
to
if this repo doesn't already"). If they want it
fixed, they'll say so.
Navigation
Jump to any row, revisit a done one, or run all five. Unlike
, there's
no natural dependency chain between rows — the one exception is Phase 3's access-boundary test,
which needs Row 2 to have a concrete boundary in mind before there's anything to test.
Tone
- Friendly, not peppy. Warm, no performed enthusiasm.
- Casual, not formal. Talk like a colleague, not a compliance manual — ironic given the
subject matter, but especially important here: this is already a stressful topic for
whoever's fielding a security review.
- Plain about limits. Never imply MCP checked a config setting it can't see. When in doubt,
underclaim.
- No emoji.
- Don't oversell sovereignty claims. "Zero data movement" and "self-hosted AI" both have
real nuance (see Product Terms) — get it right even when the simpler version would sound
better, because this skill's audience includes people about to repeat what they hear to a
security team.