Metabase MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOST | No | Host for HTTP transports | localhost |
| PORT | No | Port for HTTP transports | 3200 |
| LOG_LEVEL | No | Logging level (DEBUG, INFO, WARNING, ERROR) | INFO |
| TRANSPORT | No | Transport protocol (stdio, streamable-http) | streamable-http |
| METABASE_URL | Yes | Your Metabase instance URL | |
| METABASE_API_KEY | Yes | Your Metabase API key (starts with mb_) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_metabase_collectionB | Retrieve a single Metabase collection by ID. Args: collection_id (int): ID of the collection. Returns: Dict[str, Any]: Collection metadata. |
| create_metabase_collectionB | Create a new Metabase collection. Args: name (str): Name of the collection. color (str, optional): Hex color code. parent_id (int, optional): ID of the parent collection. Returns: Dict[str, Any]: Newly created collection metadata. |
| update_metabase_collectionB | Update an existing Metabase collection. Args: collection_id (int): ID of the collection to update. name (str, optional): New name. color (str, optional): New color. parent_id (int, optional): New parent collection ID. Returns: Dict[str, Any]: Updated collection metadata. |
| delete_metabase_collectionC | Delete a Metabase collection. Args: collection_id (int): ID of the collection to delete. Returns: Dict[str, Any]: Confirmation of the collection deletion. |
| get_metabase_cardsB | Get a list of all saved questions (cards). Returns: Dict[str, Any]: Cards metadata including names, ids, collections. |
| get_card_query_resultsB | Get the results of a card's query. Args: card_id (int): ID of the card. Returns: Dict[str, Any]: Query result data. |
| create_metabase_cardA | Create a new card (chart or table) in Metabase via the /api/card endpoint. This function creates a visual card using either SQL or MBQL queries and supports all chart types including pie, donut, bar, table, and KPI-style metrics. Args: name (str): Display name of the card in Metabase. Returns: Dict[str, Any]: A dictionary representing the created card including: - id (int) - name (str) - dataset_query (dict) - visualization_settings (dict) - created_at, updated_at, etc. Example: >>> await create_metabase_card( name="Seats Sold by Destination (Donut with Outer Ring)", display="pie", dataset_query={ "type": "native", "native": { "query": "SELECT destination, SUM("seatsSold") AS total_seats_sold FROM "Flight" GROUP BY destination" }, "database": 2 }, visualization_settings={ "pie": { "category": "destination", "metric": "total_seats_sold", "labels": true, "inner_radius": 0.6, "outer_radius": 0.95, "show_values": true, "outer_ring": true }, "show_legend": true, "legend_position": "right" }, collection_id=3 ) |
| update_metabase_cardB | Update an existing card in Metabase. Args: card_id (int): ID of the card to update. name (str, optional): New name of the card. dataset_query (Dict[str, Any], optional): Dataset query definition. display (str, optional): Display type. type (str, optional): Card type. visualization_settings (Dict[str, Any], optional): Visualization settings. collection_id (int, optional): ID of the collection. description (str, optional): Description of the card. parameter_mappings (list, optional): Parameter mappings. collection_position (int, optional): Position in the collection. result_metadata (list, optional): Metadata for results. cache_ttl (int, optional): Cache TTL. parameters (list, optional): Query parameters. dashboard_id (int, optional): Dashboard ID. dashboard_tab_id (int, optional): Dashboard tab ID. entity_id (str, optional): Entity ID. Returns: Dict[str, Any]: Updated card metadata. |
| delete_metabase_cardC | Delete a card from Metabase. Args: card_id (int): ID of the card to delete. Returns: Dict[str, Any]: Deletion confirmation. |
| get_metabase_dashboardsB | Get a list of dashboards in Metabase. Returns: Dict[str, Any]: Dashboard metadata including id, name, and cards. |
| get_dashboard_by_idB | Get a dashboard by ID. Args: dashboard_id (int): ID of the dashboard. Returns: Dict[str, Any]: Dashboard metadata including id, name, cards, and tabs. |
| get_dashboard_cardsB | Get cards in a dashboard. Args: dashboard_id (int): ID of the dashboard. Returns: Dict[str, Any]: Cards in the dashboard. |
| get_dashboard_itemsC | Get all items in a dashboard. Args: dashboard_id (int): ID of the dashboard. Returns: Dict[str, Any]: All items in the dashboard. |
| create_metabase_dashboardB | Create a new dashboard in Metabase. Args: name (str): Name of the dashboard. description (str, optional): Dashboard description. collection_id (int, optional): Collection ID. parameters (list, optional): Parameters for the dashboard. tabs (list, optional): Tabs for the dashboard (list of {"name": "Tab Name"}). cache_ttl (int, optional): Cache time to live in seconds. collection_position (int, optional): Position in the collection. Returns: Dict[str, Any]: Created dashboard metadata. |
| update_metabase_dashboardA | Update an existing dashboard in Metabase using structured inputs and auto-fallback behavior. This function allows partial updates to a dashboard. If you don't pass optional fields like
Args: dashboard_id (int): The ID of the dashboard to update. Returns:
Dict[str, Any]:
JSON object containing updated dashboard metadata from Metabase.
Includes fields like:
- Behavior:
- If Example: >>> await update_metabase_dashboard( dashboard_id=1, name="Updated Flight Dashboard", dashcards=[ DashboardCard(card_id=123, row=0, col=0, size_x=4, size_y=3), DashboardCard(card_id=124, row=0, col=4, size_x=4, size_y=3) ], tabs=[DashboardTab(name="Overview")], width="fixed" ) |
| delete_metabase_dashboardB | Delete a dashboard from Metabase. Args: dashboard_id (int): ID of the dashboard to delete. Returns: Dict[str, Any]: Deletion confirmation. |
| copy_metabase_dashboardB | Copy a dashboard. Args: from_dashboard_id (int): ID of the source dashboard to copy. name (str): Name for the new dashboard. description (str, optional): Description for the new dashboard. collection_id (int, optional): Collection ID for the new dashboard. is_deep_copy (bool, optional): Whether to perform a deep copy (copy linked cards too). collection_position (int, optional): Position in the collection. Returns: Dict[str, Any]: New dashboard metadata. |
| get_metabase_databasesB | Get a list of connected databases in Metabase. Returns: Dict[str, Any]: List of database metadata. |
| create_metabase_databaseA | Create a new database connection in Metabase. Args: name (str): Name of the database. engine (str): Database engine. details (Dict[str, Any]): Connection details. auto_run_queries (bool, optional): Enable auto run. cache_ttl (int, optional): Cache time-to-live. is_full_sync (bool, optional): Whether to perform full sync. schedule (Dict[str, Any], optional): Sync schedule. timezone (str, optional): Timezone for the database. metadata_sync (bool, optional): Enable metadata sync. Returns: Dict[str, Any]: Created database metadata. |
| update_metabase_databaseB | Update an existing database connection in Metabase. Args: database_id (int): ID of the database to update. name (str, optional): Name of the database. details (Dict[str, Any], optional): Connection details. auto_run_queries (bool, optional): Enable auto run. cache_ttl (int, optional): Cache time-to-live. is_full_sync (bool, optional): Whether to perform full sync. schedule (Dict[str, Any], optional): Sync schedule. timezone (str, optional): Timezone for the database. metadata_sync (bool, optional): Enable metadata sync. Returns: Dict[str, Any]: Updated database metadata. |
| delete_metabase_databaseB | Delete a database connection from Metabase. Args: database_id (int): ID of the database to delete. Returns: Dict[str, Any]: Deletion confirmation. |
| get_metabase_usersB | Get a list of users in Metabase. Returns: Dict[str, Any]: User metadata including id, email, groups, etc. |
| create_metabase_userB | Create a new user in Metabase. Args: first_name (str): User's first name. last_name (str): User's last name. email (str): Email address. password (str): Account password. login_attributes (dict, optional): Additional login metadata. group_ids (list, optional): List of group IDs to assign the user. is_superuser (bool, optional): Whether the user is a superuser. Returns: Dict[str, Any]: Created user metadata. |
| update_metabase_userB | Update an existing user in Metabase. Args: user_id (int): ID of the user to update. first_name (str, optional): Updated first name. last_name (str, optional): Updated last name. email (str, optional): Updated email address. password (str, optional): Updated password. login_attributes (dict, optional): Updated login metadata. group_ids (list, optional): Updated group IDs. is_superuser (bool, optional): Updated superuser flag. Returns: Dict[str, Any]: Updated user metadata. |
| delete_metabase_userB | Delete a user from Metabase. Args: user_id (int): ID of the user to delete. Returns: Dict[str, Any]: Deletion confirmation. |
| get_metabase_current_userA | Get current logged-in user info from Metabase. Returns: Dict[str, Any]: User details like id, email, groups, etc. |
| get_metabase_groupsB | Get a list of groups (roles) in Metabase. Returns: Dict[str, Any]: Group metadata including id, name, etc. |
| create_metabase_groupB | Create a new group (role) in Metabase. Args: name (str): Name of the group to create. ldap_dn (str, optional): LDAP Distinguished Name if applicable. Returns: Dict[str, Any]: Created group metadata. |
| delete_metabase_groupA | Delete a group (role) from Metabase. Args: group_id (int): ID of the group to delete. Returns: Dict[str, Any]: Deletion confirmation. |
| execute_sql_queryA | Execute a native SQL query through Metabase. Args: database_id (int): ID of the database to execute the query on. native_query (str): The SQL query to execute. parameters (list, optional): Query parameters. Returns: Dict[str, Any]: Query execution result. Notes: - For PostgreSQL databases, column names are be case-sensitive - Use double quotes around column names with mixed case (e.g., "columnName") - Example with quoted column names: SELECT "userId", "orderDate", COUNT(*) FROM "Orders" GROUP BY "userId", "orderDate" |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 30 tools
Most tools are distinct by resource and action, but there is notable overlap between get_dashboard_cards, get_dashboard_items, and get_dashboard_by_id, which could confuse agents about which to use for retrieving dashboard content. Additionally, execute_sql_query and get_card_query_results serve different purposes but might be conflated for query execution.
All tool names follow a consistent snake_case pattern with a clear verb_noun structure (e.g., create_metabase_card, delete_metabase_user, update_metabase_dashboard). The prefix 'metabase' is uniformly applied, and verbs like get, create, update, delete are used predictably across resources.
With 30 tools, this server is overly heavy for typical MCP usage, likely causing cognitive overload and inefficiency. While Metabase is a complex platform, the tool set could be more streamlined by consolidating overlapping getters or removing less critical operations to improve usability.
The tool set provides comprehensive CRUD coverage for all major Metabase entities (cards, dashboards, collections, databases, groups, users), plus auxiliary operations like copying dashboards and executing SQL queries. There are no obvious gaps; agents can perform full lifecycle management and query execution seamlessly.