Skip to main content

How to set up Metabase

Authentication

Metabase authenticates with an API key:
  1. In Metabase, go to AdminSettingsAuthenticationAPI keys
  2. Create a key and assign it to a group. The key inherits that group’s permissions, so give it a group that can see the databases and collections you want to reach from Cargo
  3. Copy the key — Metabase only shows it once
  4. In Cargo, enter:
    • Instance URL: the address of your Metabase, for example https://mycompany.metabaseapp.com
    • API Key: the key you just created
Cargo verifies the connection by listing the databases the key can see.

Metabase actions

Run question

Runs a saved question and returns its rows. Configuration:
  • Question: the saved question to run
  • Parameters (optional): Metabase parameter objects, each with a type, a target and a value
Values are returned unformatted, so numbers stay numbers and dates stay dates rather than arriving as the strings shown in the Metabase interface.

Run SQL

Runs a SQL query against a database connected to Metabase. Configuration:
  • Database: the target database
  • SQL: the query to run
The API key’s group needs native query permission on that database. Metabase caps this endpoint at 2000 rows; when a result hits the cap the action reports that it was truncated.

Search entities

Searches questions, models, metrics, dashboards, collections and tables. Configuration:
  • Query: the search term
  • Entity types (optional): restrict the search
  • Limit (optional): defaults to 25, up to 100

Metabase data models

Fetch question

Syncs the rows of a saved question into a Cargo model. Configuration:
  • Question: the saved question to sync
  • ID column: the column that uniquely identifies a row
  • Title column: the column used as the record title
Features:
  • Full refresh: each run replaces the model with a fresh snapshot, since Metabase exposes no cursor over a question’s results
  • Minimum interval: 1 hour between syncs
Metabase results have no identifier of their own, which is why you pick the ID column yourself. Choose one that is unique and stable across runs — a primary key from the underlying table, or the grouping column of an aggregate. If a run comes back with rows but no ID values, the sync fails on purpose rather than overwriting what was synced last time. A question that returns 50,000 rows or more is rejected: add a filter or an aggregation to narrow it down. Column names come from the question’s columns and must contain only letters, numbers, underscores and spaces. Rename them in Metabase if a sync reports invalid columns.

MCP server

Metabase hosts its own MCP server, so a Metabase connector can be attached directly to a Cargo agent. The agent gets Metabase’s own tools: searching tables and metrics, reading entities, constructing and executing queries, running SQL, and creating questions and dashboards. Before this works, a Metabase admin must turn the MCP server on under AdminAIMCP, and AI features must be enabled for the instance. If the connector authenticates but the agent cannot reach any tools, that setting is the first thing to check.

Best practices

  • Give the API key its own group with the narrowest permissions that cover your use case, rather than reusing an admin group
  • Prefer saved questions over ad-hoc SQL for anything recurring: the question stays reviewable in Metabase and its columns are typed
  • Aggregate in Metabase before syncing. Full refresh means every run pays for the whole result set, so a question returning a rolled-up few thousand rows beats one returning raw events
  • Use the MCP server for exploratory questions from agents, and actions for the deterministic steps of a workflow