metabase-mcp
Query your Metabase with AI agents. No API key. No admin begging. Just vibes and a cookie.
The problem
The official Metabase MCP wants an API key or your username/password. Cool in theory. Not so cool if your company won't give you one.
But you can log into Metabase in a browser. Which means you have a session cookie. Which means you have everything you need.
That's this.
Wait, should you even use this?
Honest answer: if you have an API key or username/password, just use the official Metabase MCP. It's proper, supported, and won't expire on you mid-conversation. Newer versions of Metabase also support Google login natively via the official MCP.
This project is for the rest of us: the people whose company guards API keys like they're nuclear launch codes and treats every Metabase upgrade request like a 6-month procurement process.
You'll love this if:
- Your org controls Metabase and you don't have credentials beyond your browser login
- Your Metabase version doesn't support the official MCP's Google login yet
- You'd rather fish a cookie out of DevTools than write another Jira ticket
- You want to query data with AI and get on with your life
You should know:
What it can do
Prerequisites
- Go 1.25.5+
- A Metabase instance you can log into
Install
go install github.com/Naveen-chava/metabase-mcp@latest
This puts the binary in ~/go/bin/. Make sure that's in your $PATH:
export PATH="$PATH:$(go env GOPATH)/bin"
Or build from source:
git clone https://github.com/Naveen-chava/metabase-mcp
cd metabase-mcp
go install .
Getting your session cookie
This is the one slightly sneaky step.
- Open Metabase in your browser and log in
- Open DevTools → Application → Cookies → select your Metabase domain
- Find
metabase.SESSIONand copy its value
That's your cookie. Treat it like a password; it grants the same access as your login session.
If the MCP starts throwing 401s, your session expired. Grab a fresh cookie and you're back.
Configuration
Inline (quick start):
METABASE_URL=https://metabase.company.com \
METABASE_SESSION=your-cookie \
./metabase-mcp
Via file (recommended, no restart when your cookie expires):
echo "your-cookie" > ~/.metabase-session
METABASE_URL=https://metabase.company.com \
METABASE_SESSION_FILE=~/.metabase-session \
./metabase-mcp
To rotate a stale cookie, just overwrite the file. No restart needed; the next request picks it up automatically.
The server expands
~and$HOMEin the session file path, so~/.metabase-sessionworks everywhere.
Claude Desktop
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"metabase": {
"command": "metabase-mcp",
"env": {
"METABASE_URL": "https://metabase.company.com",
"METABASE_SESSION_FILE": "~/.metabase-session"
}
}
}
}
Restart Claude Desktop. Done.
Claude Code
claude mcp add metabase metabase-mcp -s user -e METABASE_URL=https://metabase.company.com -e METABASE_SESSION_FILE=~/.metabase-session
Run as a single line. Backslash continuations can introduce invisible characters when copied from some terminals or browsers.
Cursor
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project-level):
{
"mcpServers": {
"metabase": {
"command": "metabase-mcp",
"env": {
"METABASE_URL": "https://metabase.company.com",
"METABASE_SESSION_FILE": "~/.metabase-session"
}
}
}
}
Restart Cursor and verify the server is connected under Settings → MCP.
Example prompts
- "What databases are connected to Metabase?"
- "Show me all tables in the Analytics DB"
- "What's in my personal collection?"
- "Run the 'Daily Active Users' question"
- "Search for anything related to revenue"
- "Run this SQL on the Analytics DB: SELECT count(*) FROM orders WHERE created_at > now() - interval 7 day"
- "Query the orders collection in MongoDB and group revenue by category"
- "Create a saved question that shows top customers by spend"
Project structure
metabase-mcp/
├── main.go # Startup, env vars, wires everything together
└── internal/
├── metabase/ # Metabase API client
│ ├── client.go # HTTP client with cookie auth
│ ├── types.go # API types
│ ├── databases.go
│ ├── collections.go
│ ├── cards.go
│ ├── dashboards.go
│ ├── tables.go
│ ├── search.go
│ ├── query.go
│ └── tests/ # HTTP-level tests (package metabase_test)
└── tools/ # MCP tool handlers
├── client.go # MetabaseClient interface
├── register.go # One place to add/remove tools
├── helpers.go # Shared utilities
├── databases.go
├── collections.go
├── cards.go
├── dashboards.go
├── tables.go
├── search.go
├── query.go
└── tests/ # Handler tests with mock client (package tools_test)
Running tests
go test ./...