Metabase MCP Server
The Metabase MCP Server connects your Metabase instance to AI assistants via the Model Context Protocol (MCP), enabling natural language interaction with business intelligence assets without manual navigation.
Collection Management: Get, create, update, and delete collections (with optional color and parent hierarchy).
Chart (Card) Management: List all saved charts/questions, get query results, and create (bar, line, pie, scatter, pivot-table, KPI metrics, etc.), update, or delete charts using SQL or MBQL queries.
Dashboard Management: List, get, create, update, copy, and delete dashboards; retrieve cards/items within a dashboard; support for tabs, filters, layout, and embedding settings.
Database Management: List connected databases and create, update, or delete database connections (any supported engine).
User Management: List all users, get the current authenticated user, and create, update, or delete user accounts (with group assignments and superuser flag).
Group Management: List, create (with optional LDAP DN), and delete user groups.
SQL Execution: Run native SQL queries directly against any connected database and retrieve results.
Enables natural language interaction with Metabase business intelligence assets, including creating and managing dashboards, charts, collections, executing SQL queries, administering databases, users, and groups.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Metabase MCP Server show me last month's sales by region"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
📊 Metabase MCP Server
📚 Table of Contents
Related MCP server: Metabase MCP Server
😊 What is this tool about?
Metabase MCP Server is a backend integration layer that connects your Metabase instance with AI assistants using the Model Context Protocol (MCP). This allows business leaders, product managers and analysts to interact with business intelligence assets like dashboards and charts using natural language—through any MCP client (e.g., Claude Desktop).
Instead of navigating through menus or constructing SQL queries manually, you can:
You can ask a question and get an instant insight.
Generate dashboards and charts by describing what you want.
Manage user access and database connections through simple instructions.
This project makes Metabase not just a dashboarding tool—but a conversational, intelligent business assistant.
🎥 Video Walkthrough
Watch this video to see the Metabase MCP Server in action:
📐 Architecture Diagram

🚀 Getting Started
1. Set Up Metabase (If you haven't already)
Follow the official Metabase installation guide: Metabase Docs
2. Install uv Package Manager
Install uv which includes Python and package management:
Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | shOr install via package managers:
# macOS
brew install uv
# Windows (via Scoop)
scoop install uv
# Windows (via Chocolatey)
choco install uvFor more information about uv installation and usage, please visit the official documentation: https://docs.astral.sh/uv/getting-started/installation/
3. Clone or Download the Repository
You need to get this tool onto your computer. You can either download it manually or use Git. Open your computer's Terminal (Mac) or Command Prompt (Windows). Navigate to the folder where you unzipped the files or want to clone the project:
# Example (replace with your actual path):
cd ~/Downloads/metabase-mcp-server-devOption 1: Download ZIP
Go to the GitHub repository
Click the green "Code" button
Select "Download ZIP"
Unzip the downloaded file to a location like your Documents folder
Option 2: Use Git If you're familiar with Git, run this in your terminal:
git clone https://github.com/CW-Codewalnut/Metabase-MCP-Server.git
cd Metabase-MCP-Server
4. Install dependencies
This command will automatically:
Install the required Python version (if not already available)
Create a virtual environment for the project
Install all necessary packages and dependencies
uv sync5. Configure Your Credentials
You have three options to configure your Metabase credentials for the MCP Server:
Option 1: Using a .env file (Recommended)
Create a .env file in the project root:
METABASE_URL=http://localhost:3000
METABASE_API_KEY=mb_xxx_your_key
PORT=3200
HOST=localhost
TRANSPORT=streamable-http
LOG_LEVEL=INFOOption 2: Using command-line arguments Pass configuration directly via command line:
uv run src/metabase_mcp_server.py --metabase-url http://localhost:3000 --metabase-api-key "YOUR_API_KEY" --port 3200 --host localhost --transport streamable-http --log-level INFOOption 3: Using environment variables in MCP client config
Configure directly in your MCP client without a .env file (see examples below).
{
"mcpServers": {
"metabase": {
"type": "stdio",
"command": "C:\\Users\\YourName\\Projects\\metabase-mcp-server\\.venv\\Scripts\\python.exe",
"args": [
"C:\\Users\\YourName\\Projects\\metabase-mcp-server\\src\\metabase_mcp_server.py"
],
"env": {
"METABASE_URL": "http://localhost:3000",
"METABASE_API_KEY": "mb_xxx_your_key",
"PORT": 3200,
"HOST": "localhost",
"TRANSPORT": "streamable-http",
"LOG_LEVEL": "INFO"
}
}
}
}6. Connect to Your MCP client
Choose your preferred MCP clients like Claude Desktop app, Claude Code, Cursor, Windsurf etc., and add the Metabase MCP server in their respective configuration files. All MCP clients follow a similar configuration pattern.
Configuration Examples
For stdio transport (recommended for local MCP server):
Windows:
{
"mcpServers": {
"metabase": {
"type": "stdio",
"command": "C:\\Users\\YourName\\Projects\\metabase-mcp-server\\.venv\\Scripts\\python.exe",
"args": [
"C:\\Users\\YourName\\Projects\\metabase-mcp-server\\src\\metabase_mcp_server.py"
]
}
}
}Mac:
{
"mcpServers": {
"metabase": {
"type": "stdio",
"command": "/Users/YourName/Projects/metabase-mcp-server/.venv/bin/python",
"args": [
"/Users/YourName/Projects/metabase-mcp-server/src/metabase_mcp_server.py"
]
}
}
}Key Differences:
Windows uses backslashes
\\in pathsmacOS/Linux uses forward slashes
/in pathsMake sure to match the correct format based on your OS to avoid errors
Important Notes:
Replace
FULL_PATHwith the actual absolute path to your project directoryAfter saving configuration changes, restart your MCP client to apply the new settings
For project-specific tools in Cursor, create a
.cursor/mcp.jsonfile in your project directoryFor global tools in Cursor, create a
~/.cursor/mcp.jsonfile in your home directory
For streamable-http transport (recommended for remote MCP server):
{
"mcpServers": {
"metabase": {
"type": "streamable-http",
"url": "http://localhost:3200/mcp/"
}
}
}Compatible MCP clients
Click on any client to visit their official MCP setup documentation:
Client | Official MCP Documentation |
Anthropic's official MCP guide for Claude Desktop | |
Official Claude Code MCP setup documentation | |
Cursor's official MCP configuration guide | |
Windsurf official MCP setup documentation | |
Cline's official MCP quickstart guide | |
VS Code Copilot MCP server configuration |
Once you have added the configuration, the MCP server should be visible in your MCP client.
🔧 Configuration Options
The Metabase MCP Server supports flexible configuration through environment variables, command-line arguments, or a combination of both.
Environment Variables
Variable | Description | Default Value | Example |
| Your Metabase instance URL | Required |
|
| Your Metabase API key | Required |
|
| Transport protocol |
|
|
| Host for HTTP transports |
|
|
| Port for HTTP transports |
|
|
| Logging level |
|
|
Command-line Arguments
Argument | Description | Options | Default Value |
| Metabase instance URL | Any Metabase URL | Required |
| Metabase API key |
| Required |
| Transport protocol |
|
|
| Host for HTTP transports | Any host or IP |
|
| Port for HTTP transports | Any port number |
|
| Logging verbosity level |
|
|
Transport Protocols
Protocol | Description | Use Case |
stdio | Standard input/output communication | Best for local integrations (Claude Desktop, Cursor, etc.) |
streamable-http | HTTP-based streaming protocol | Ideal for remote deployments and web-based integrations |
sse | Server-Sent Events over HTTP | ⚠️ Deprecated - Not recommended for new setups |
Configuration Priority
Configuration values are applied in the following priority order (highest to lowest):
Command-line arguments (overrides everything)
Environment variables (overrides defaults)
Default values
Complete Command Examples
uv run src/metabase_mcp_server.py --transport streamable-http --host localhost --port 3200 --metabase-url http://127.0.0.1:3000 --metabase-api-key mb_xxx_your_key
Note: You don't need to pass every parameter when running the server. However, you must provide the Metabase URL and API key. Any parameters not specified will use their default values as shown above.
🔑 Getting Your Metabase API Key
To get your Metabase API key:
Log into your Metabase instance
Click on your profile picture (top-right corner)
Select "Account settings"
Navigate to the "API Keys" tab
Click "Create API Key"
Give your key a descriptive name (e.g., "MCP Server Key")
Copy the generated key (starts with
mb_)
⚠️ Important: Store your API key securely and never commit it to version control. The key provides full access to your Metabase instance.
📂 DXT File Support
You no longer need to go through the steps of cloning the repository and setting up the environment. Simply follow the steps below to install the Metabase MCP Server in your Claude Desktop App:
Download the DXT File
Check the link below to download the latest DXT file directly:
Download DXT FileOpen the Claude Desktop App
Once you have the file, open the Claude Desktop App on your system.Navigate to Extensions Settings
In the Claude Desktop App:Go to Files → Settings → Extensions
Then click on Advanced Settings.
Select the DXT File
In the Advanced Settings section, click on Choose File, select the downloaded DXT file.Enter the Required Details
After selecting the DXT file, a prompt will appear asking you to fill in the required details:Metabase URL: Enter your Metabase server URL.
API Key: Add the relevant API key for authentication.
Complete the Setup
After entering the necessary details, click Save to apply the configuration.
That's it! The Metabase MCP Server is now installed and ready to use in your Claude Desktop App.
How to Create Your Own DXT File
If you want to create your own DXT file, please visit the Official Guide:
Creating Your Own DXT File
🚀 Remote Deployment
For production use or team collaboration, you can deploy the Metabase MCP Server remotely. We use this approach internally at Codewalnut.
Docker Deployment
We've included Docker configuration files to make remote deployment straightforward.
Quick Start with Docker
# Build the Docker image
docker build -t metabase-mcp-server .
# Run with environment variables
docker run -d \
-p 3200:3200 \
-e METABASE_URL="http://your-metabase-instance.com" \
-e METABASE_API_KEY="mb_xxx_your_api_key" \
metabase-mcp-serverDocker Compose (Recommended)
version: "3.8"
services:
metabase-mcp:
build: .
ports:
- "3200:3200"
environment:
- METABASE_URL=http://your-metabase-instance.com
- METABASE_API_KEY=mb_xxx_your_api_key
##- PORT=3200
##- HOST=localhost
##- TRANSPORT=streamable-http
##- LOG_LEVEL=INFO
restart: unless-stoppedRemote HTTP/SSE transports are read-only by default. Set the matching ALLOW_*
environment variable to true only when the server is behind trusted access
controls and the configured Metabase API key is allowed to make those changes:
ALLOW_WRITE_TOOLS, ALLOW_ADMIN_TOOLS, and ALLOW_SQL_TOOL.
Connecting to Remote MCP Server
Once deployed, configure your MCP clients to connect to the remote server:
{
"mcpServers": {
"metabase": {
"type": "streamable-http",
"url": "http://server-ip:3200/mcp/"
}
}
}Deployment Options
Cloud Providers: AWS ECS, Google Cloud Run, Azure Container Instances
VPS/Dedicated Servers: DigitalOcean, Linode, Vultr
Container Platforms: Kubernetes, Docker Swarm
Platform-as-a-Service: Railway, Render, Fly.io
Security Considerations
Use HTTPS in production environments
Implement proper firewall rules
Consider VPN access for sensitive business data
Regularly rotate API keys
Monitor access logs
Need Help with Deployment?
Our team at CodeWalnut offers deployment and consulting services. Contact us for enterprise-grade setup and support.
🔍 Debugging with MCP Inspector
To debug and test your Metabase MCP Server setup, you can use the official MCP Inspector tool.
Prerequisites
First, install Node.js if you haven't already:
Download from: nodejs.org
Or install via package manager:
# macOS brew install node # Windows (via Chocolatey) choco install nodejs # Windows (via Scoop) scoop install nodejs
Install and Run MCP Inspector
# Install MCP Inspector globally
npm install -g @modelcontextprotocol/inspector
# Run the inspector with your Metabase MCP Server
npx @modelcontextprotocol/inspector uv run FULL_PATH/metabase-mcp-server/src/metabase_mcp_server.pyUsing MCP Inspector
The MCP Inspector provides:
Real-time tool testing - Execute MCP tools directly from the web interface
Request/Response monitoring - See exactly what data is being sent and received
Error debugging - Identify configuration or API issues quickly
Schema validation - Verify that your tools are properly defined
Once running, open your browser to http://localhost:5173 to access the inspector interface.
Common Debugging Scenarios
Connection issues - Verify your Metabase URL and API key
Permission errors - Check if your API key has the required permissions
🔧 Available Tools
Function | Description |
Collection Operations | |
| Get a collection by ID |
| Create a new collection |
| Update collection metadata |
| Delete a collection |
Chart (Card) Operations | |
| List all charts |
| Get results from a chart query |
| Create a new chart |
| Update an existing chart |
| Delete a chart |
Dashboard Operations | |
| List all dashboards |
| Get a dashboard by ID |
| Get cards in a dashboard |
| Get all dashboard items |
| Create a dashboard |
| Update a dashboard |
| Delete a dashboard |
| Create a copy of an existing dashboard |
Database Operations | |
| List databases |
| Create a new database connection |
| Update a database connection |
| Delete a database connection |
User Operations | |
| List all users |
| Get current user details |
| Create a new user |
| Update user info |
| Delete a user |
Group Operations | |
| List user groups |
| Create a user group |
| Delete a user group |
SQL Operations | |
| Execute a native SQL query |
🧪 Example Prompts to Try
Create a dashboard called 'Flight Overview' with a bar chart showing flights by destination city.
Run SQL:
SELECT origin, destination, COUNT(*) FROM flights GROUP BY origin, destination LIMIT 10.Create a card displaying total bookings last month grouped by region.
Delete the chart named 'Abandoned Queries'.
Update the dashboard 'Sales KPIs' to include a new revenue card.
Show all users in the 'Admin' group.
Create a new group called 'Finance Analysts'.
Connect to a Supabase database and list all tables.
🌐 Connect with Us
Stay connected and get support through our community channels:
🏢 Official Links
🌍 Website: codewalnut.com
📧 Email: nattu@codewalnut.com
📖 Blogs:
insights: codewalnut.com/insights
learn: codewalnut.com/learn
📱 Social Media
💼 LinkedIn: CodeWalnut
📺 YouTube: CodeWalnut Channel
🐦 Twitter/X: @codewalnut
📷 Instagram: @codewalnut
💬 Community Support
📧 Newsletter: Subscribe to CodeWalnut Newsletter (scroll down to find the email subscription option)
🐙 GitHub: codewalnut
🤝 Professional Services
Consulting: Custom Metabase integrations and AI solutions
Training: MCP and business intelligence workshops
Support: Enterprise-grade support and maintenance
📢 Follow us for updates on new MCP servers, AI integrations, and business intelligence tools!
📜 License
This project is licensed under the Apache License 2.0.
You can find the full license text in the LICENSE file.
Available Tools
30 toolscopy_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.
Inputs: from_dashboard_id (required), name (required), description, collection_id, +2 more. Returns: object
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.
dataset_query (dict):
Defines the query behind the chart.
Required structure:
- "type": "native" or "query"
- "native": { "query": "..." }, for SQL
- "query": {...}, for MBQL
- "database": database ID
display (str):
Visualization type. Common values:
- "table", "bar", "line", "pie", "area", "scatter", "funnel", "pivot-table", "map"
type (str, optional):
Card type, defaults to "question".
- "question": general chart or table
- "metric": for KPI display
- "model": reserved/legacy
visualization_settings (dict, optional):
Controls chart appearance and formatting. Structure varies by chart type.
── 📊 Bar / Line / Area ──
{
"graph": {
"x_axis": "destination",
"y_axis": ["seatsSold"],
"series": "flightType",
"metrics": ["seatsSold"],
"x_axis_label": "Destination",
"y_axis_label": "Seats Sold",
"x_axis_formatting": {
"scale": "ordinal",
"label_rotation": 45
},
"y_axis_formatting": {
"number_style": "decimal",
"suffix": " pax"
}
},
"show_legend": true,
"legend_position": "bottom"
}
── 🥧 Pie / Donut Charts ──
{
"pie": {
"category": "destination", # Label or group for slices
"metric": "seatsSold", # Size of each slice
"labels": true, # Show category names
"show_values": true, # Show numeric values inside slices
"inner_radius": 0.6, # Enables donut (0 = full pie)
"outer_radius": 0.95, # Size scaling (0.0 to 1.0)
"outer_ring": true # Enables dual-ring charts
},
"show_legend": true,
"legend_position": "right"
}
Notes on ring options:
- `inner_radius` creates a donut shape. Recommended: 0.5–0.8.
- `outer_radius` controls the size of the entire chart area.
- `outer_ring` enables comparison across rings, useful when the query returns multiple groupings/metrics.
── 📋 Table ──
{
"table.pivot_column": "flightType",
"column_settings": {
"seatsSold": {
"number_style": "decimal",
"suffix": " pax"
}
}
}
collection_id (int, optional):
Save card into a specific Metabase collection (folder).
description (str, optional):
Description or help text for the card.
parameter_mappings (list, optional):
Used when linking dashboard filters to this card.
Example:
[
{
"parameter_id": "flightType",
"card_id": 123,
"target": ["dimension", ["template-tag", "flightType"]]
}
]
collection_position (int, optional):
Optional order in the collection.
result_metadata (list, optional):
Optional field metadata describing result set.
cache_ttl (int, optional):
Cache duration (in seconds). 0 disables caching.
parameters (list, optional):
List of query parameters for SQL or MBQL filters.
Example: [{"name": "region", "type": "category", "slug": "region"}]
dashboard_id (int, optional):
Adds this card to an existing dashboard.
dashboard_tab_id (int, optional):
If the dashboard has tabs, specify the tab ID to attach the card to.
entity_id (str, optional):
External or custom ID for embedding/syncing cards.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 )
Inputs: name (required), dataset_query (required), display (required), type, +11 more. Returns: object
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.
Inputs: name (required), color, parent_id. Returns: object
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.
Inputs: name (required), description, collection_id, parameters, +3 more. Returns: object
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.
Inputs: name (required), engine (required), details (required), auto_run_queries, +5 more. Returns: object
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.
Inputs: name (required), ldap_dn. Returns: object
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.
Inputs: first_name (required), last_name (required), email (required), password (required), +3 more. Returns: object
delete_metabase_cardC
Delete a card from Metabase.
Args: card_id (int): ID of the card to delete.
Returns: Dict[str, Any]: Deletion confirmation.
Inputs: card_id (required). Returns: object
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.
Inputs: collection_id (required). Returns: object
delete_metabase_dashboardB
Delete a dashboard from Metabase.
Args: dashboard_id (int): ID of the dashboard to delete.
Returns: Dict[str, Any]: Deletion confirmation.
Inputs: dashboard_id (required). Returns: object
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.
Inputs: database_id (required). Returns: object
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.
Inputs: group_id (required). Returns: object
delete_metabase_userB
Delete a user from Metabase.
Args: user_id (int): ID of the user to delete.
Returns: Dict[str, Any]: Deletion confirmation.
Inputs: user_id (required). Returns: object
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"
Inputs: database_id (required), query (required), parameters. Returns: object
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.
Inputs: card_id (required). Returns: object
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.
Inputs: dashboard_id (required). Returns: object
get_dashboard_cardsB
Get cards in a dashboard.
Args: dashboard_id (int): ID of the dashboard.
Returns: Dict[str, Any]: Cards in the dashboard.
Inputs: dashboard_id (required). Returns: object
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.
Inputs: dashboard_id (required). Returns: object
get_metabase_cardsB
Get a list of all saved questions (cards).
Returns: Dict[str, Any]: Cards metadata including names, ids, collections.
Inputs: no named parameters. Returns: object
get_metabase_collectionB
Retrieve a single Metabase collection by ID.
Args: collection_id (int): ID of the collection.
Returns: Dict[str, Any]: Collection metadata.
Inputs: collection_id (required). Returns: object
get_metabase_current_userA
Get current logged-in user info from Metabase.
Returns: Dict[str, Any]: User details like id, email, groups, etc.
Inputs: no named parameters. Returns: object
get_metabase_dashboardsB
Get a list of dashboards in Metabase.
Returns: Dict[str, Any]: Dashboard metadata including id, name, and cards.
Inputs: no named parameters. Returns: object
get_metabase_databasesB
Get a list of connected databases in Metabase.
Returns: Dict[str, Any]: List of database metadata.
Inputs: no named parameters. Returns: object
get_metabase_groupsB
Get a list of groups (roles) in Metabase.
Returns: Dict[str, Any]: Group metadata including id, name, etc.
Inputs: no named parameters. Returns: object
get_metabase_usersB
Get a list of users in Metabase.
Returns: Dict[str, Any]: User metadata including id, email, groups, etc.
Inputs: no named parameters. Returns: object
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.
Inputs: card_id (required), name, dataset_query, display, +12 more. Returns: object
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.
Inputs: collection_id (required), name, color, parent_id. Returns: object
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
dashcards or tabs, the current values from the existing dashboard will be fetched and reused.
Args: dashboard_id (int): The ID of the dashboard to update.
name (str, optional):
New name for the dashboard. If not provided, the current name will be retained.
description (str, optional):
Updated description for the dashboard.
collection_id (int, optional):
ID of the collection (folder) to move the dashboard into.
If not provided, the existing collection is kept. However,
if a new collection has been created,
it is mandatory to pass the collection ID.
Failure to do so will result in the dashboard being moved to the default collection,
where the chart details may not exist.
parameters (List[dict], optional):
List of dashboard-level filters (used for interactive filtering).
If omitted, existing parameters will be preserved.
tabs (List[DashboardTab], optional):
List of tabs to set on the dashboard.
If not passed, the current tab configuration is reused.
Each tab includes:
- `id`: Tab ID (optional if new)
- `name`: Display name of the tab
dashcards (List[DashboardCard], optional):
List of cards to place in the dashboard layout.
If omitted, the existing card layout is retained.
Each card requires:
- `id`: Use negative numbers to auto generate the ids
or use any unique value but,
it must be unique within the dashboard
- `card_id`: ID of the saved chart
- `row`, `col`: Grid position (top-left = 0,0)
- `size_x`, `size_y`: Width/height in grid cells
- `parameter_mappings`: List of filter mappings
points_of_interest (str, optional):
Free-text notes that appear in the dashboard as "Points of Interest".
caveats (str, optional):
Free-text notes that appear in the dashboard as "Caveats".
enable_embedding (bool, optional):
Whether to enable embedding for this dashboard.
If omitted, the existing setting is reused.
embedding_params (EmbeddingParams, optional):
Optional embedding configuration. Includes:
- `url`: Optional embed URL override
- `custom_css`: Optional custom styling
archived (bool, optional):
Whether to archive the dashboard. Defaults to existing value if omitted.
position (int, optional):
Optional global ordering value (affects dashboard listing).
collection_position (int, optional):
Sort order inside its collection folder.
cache_ttl (int, optional):
Result caching time in seconds (e.g., 3600 = 1 hour). 0 disables caching.
width (str, optional):
Dashboard layout mode: "fixed" (grid) or "full" (fluid width).
Defaults to existing setting if omitted.
show_in_getting_started (bool, optional):
Whether to show this dashboard in Metabase’s “Getting Started” view.Returns:
Dict[str, Any]:
JSON object containing updated dashboard metadata from Metabase.
Includes fields like:
- id, name, description
- dashcards, tabs, parameters
- updated_at, created_at, etc.
Behavior:
- If dashcards is omitted, the existing layout will be preserved.
- If dashcards are passed without an id, id = -1 will be set automatically.
- If tabs are omitted, current dashboard tabs are reused.
- All unspecified fields fall back to the dashboard's current value.
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" )
Inputs: dashboard_id (required), name, description, collection_id, +13 more. Returns: object
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.
Inputs: database_id (required), name, details, auto_run_queries, +5 more. Returns: object
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.
Inputs: user_id (required), first_name, last_name, email, +4 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
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.
Maintenance
Related MCP Connectors
Connect AI assistants to Preset to explore data, charts, and dashboards in authorized workspaces.
Connect your ads, shop, analytics, social, CRM and finance platforms once, then let Claude, ChatGPT, Cursor or any MCP client read, join and explain your numbers. Public statistics from the World Bank, IMF, Eurostat, OECD, WHO and SEC filings come as context, searchable and chartable from the same tools. Read-only by design, every number carries its source.
Query, explore, and manage your databases through natural conversation.
Query your app's logs, metrics and incidents from your AI assistant.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Metabase databases and dashboards, allowing users to list and execute queries, access data visualizations, and interact with database resources through natural language.490 npm151-
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to interact with Metabase analytics platform, allowing them to query databases, manage dashboards, execute SQL queries, and organize collections through natural language.73 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Metabase analytics platform, allowing them to query databases, execute SQL, manage dashboards and cards, and access analytics data through natural language.73 npmMIT
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Metabase for database operations, SQL queries, dashboard management, and analytics automation.28MIT