Queries are constructed into a handle before anything runs, which means the same handle can be executed for an answer now or saved as a question colleagues open later. The write side is real work, not a transcript: questions, metrics, dashboards and collections are created and patched in place, and deleting is archiving — reversible — rather than destruction.
An MCP server built into Metabase itself and served over Streamable HTTP at /api/metabase-mcp on your own instance. Everything it returns is scoped to the permissions of the user who connected.
- Tables, metrics, cards, dashboards and collections found by keyword or by plain description — search
- Metabase entities read by metabase:// URI, up to 5 per call, covering databases, schemas, tables, collections, questions, dashboards, metrics and transforms — read_resource
- A query built against a table or metric and handed back as an opaque query_handle you can run or save — construct_query
- Raw SQL constructed for a database without being run, ready to be saved as a question — construct_native_query
- Rows with column metadata, capped at 200 per request with a continuation_token for the next page — query, execute_query
- Raw SQL executed against a database, subject to the caller's native-query permission — execute_sql
- A saved question run by id, returning its rows and column metadata — execute_question
- Work saved back into Metabase as a question, a metric, a dashboard or a collection — create_question, create_metric, create_dashboard, create_collection
- Patch updates to what is already saved, including moving it between collections and archiving it as a reversible soft delete — update_question, update_metric, update_dashboard
A Metabase account on the instance, authorized over OAuth 2.0 — Metabase runs its own embedded OAuth server, so there is no external provider to set up. The endpoint is your own hostname with /api/metabase-mcp appended (the older /api/mcp path still resolves), and any client that speaks Streamable HTTP can connect. Tokens carry per-tool scopes such as agent:query:execute and agent:question:create, and execute_sql can be switched off for the whole instance through the mcp-execute-sql-enabled setting.
One command — claude mcp add metabase https://{your-metabase.example.com}/api/metabase-mcp --transport streamable-http
