使用说明
Metabase MCP Server
Connect any AI agent to your Metabase instance.
Read-only tools · MBQL + native SQL · cross-DB analysis · data export
Quick Start · Tools · Configuration · Examples · Troubleshooting
一 主控程序 为AI代理提供只读访问权限的服务器 元数据库 例子探索模式、查询数据库、运行保存的问题、跨数据库比较数据以及导出结果——所有这些都是通过自然对话完成的。
适用于Claude Code、Cursor和任何兼容MCP的客户端。
快速开始
git clone https://github.com/arkanji/metabase-mcp-server.git
cd metabase-mcp-server
npm install && npm run build
然后将其添加到您的AI客户端:
Claude Code — .mcp.json
{
"mcpServers": {
"metabase": {
"command": "node",
"args": ["/path/to/metabase-mcp-server/dist/index.js"],
"env": {
"METABASE_URL": "https://metabase.example.com",
"METABASE_API_KEY": "mb_xxxxxxxxxxxxx"
}
}
}
}
Cursor — .cursor/mcp.json
{
"mcpServers": {
"metabase": {
"command": "node",
"args": ["/path/to/metabase-mcp-server/dist/index.js"],
"env": {
"METABASE_URL": "https://metabase.example.com",
"METABASE_API_KEY": "mb_xxxxxxxxxxxxx"
}
}
}
}
配置
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
METABASE_URL |
是 | -- | 您的元数据库实例URL。请执行 不 包含 /api. |
METABASE_API_KEY |
是 | -- | 如何生成一个 -转到“管理”>“设置”>“API密钥”。 |
METABASE_EXPORT_DIR |
没有 | ~/Downloads/ |
在哪里 export_dataset 写入CSV/JSON文件。 |
工具
发现
| 工具 | 它做什么 |
|---|---|
list_databases |
列出所有连接的数据库 |
list_tables |
列出数据库中的表 |
get_table_fields |
获取表的列名、ID和类型 |
preview_table |
示例行以了解数据形状 |
search |
按关键字查找已保存的问题、仪表板或表格 |
询问
| 工具 | 它做什么 |
|---|---|
query_dataset |
运行结构化MBQL查询(聚合、过滤器、分组) |
run_native_query |
运行原始SQL查询(需要对API键拥有SQL权限) |
run_saved_question |
按ID执行已保存的问题 |
get_card_metadata |
在不运行的情况下检查已保存问题的定义 |
list_saved_questions |
列出所有已保存的问题,可选择按数据库列出 |
仪表盘
| 工具 | 它做什么 |
|---|---|
list_dashboards |
列出所有仪表板 |
get_dashboard |
获取仪表板的卡片和布局详细信息 |
分析与导出
| 工具 | 它做什么 |
|---|---|
cross_db_overlap |
查找两个数据库中的重叠值(例如CRM和营销部门之间的共享电子邮件) |
export_dataset |
使用自动分页功能将最多50万行导出为CSV/JSON |
示例
“上个月我们接到了多少订单?”
代理人将:
list_databases→ 查找您的订单数据库list_tables→ 查找订单表get_table_fields→ 获取日期和状态字段IDquery_dataset→ 使用日期筛选器运行计数聚合
“将所有活跃客户导出到CSV”
代理人将:
- 发现表和字段ID
export_dataset→ 自动分页通过2000行元数据库上限,写入~/Downloads/
“哪些客户同时存在于我们的CRM和营销数据库中?”
代理人将:
- 识别两个数据库中的电子邮件字段
cross_db_overlap→ 获取两侧,在内存中计算交点
运作原理
You ──→ AI Agent ──→ MCP Server ──→ Metabase REST API ──→ Your Databases
(Claude, (this (x-api-key auth,
Cursor) project) read-only)
需要了解的关键事项:
- 只读 --没有写操作。验证本机SQL查询以拒绝
INSERT,UPDATE,DELETE,DROP等等。 - 2000排帽 --元数据库将查询结果限制为2000行。使用聚合进行分析,或
export_dataset用于完整数据提取(自动分页高达500K行)。 - 30秒超时 -每个API请求在30秒后超时,以防止挂起连接。
- MBQL --元数据库的结构化查询语言。列由字段ID(而不是名称)引用,因此始终调用
get_table_fields先去查一下。
安全
- API密钥 通过环境变量传递,并作为
x-api-key标题。它们从未在工具响应中记录或公开。 - 写入操作保护 —
run_native_query拒绝以write关键字开头的查询(INSERT,UPDATE,DELETE,DROP,ALTER,TRUNCATE,CREATE,GRANT,REVOKE).这是一个基本的前缀检查,而不是一个全面的SQL解析器——元数据库自己的权限系统是主要的访问控制。 - 代码中没有秘密 --服务器在启动时仅从env-var读取凭据。
故障排除
| 问题 | 原因 | 修复 |
|---|---|---|
METABASE_URL environment variable is required |
缺少环境变量 | 集 METABASE_URL 在你的 .mcp.json env块或shell |
Metabase API error 401 |
无效或过期的API密钥 | 在元数据库管理>设置>API密钥中生成新密钥 |
Metabase API error 403 |
密钥缺少此操作的权限 | 请在元数据库中检查密钥的权限组。本机SQL需要显式的“本机查询”权限。 |
Metabase API returned empty response |
URL错误或元数据库已关闭 | 验证 METABASE_URL 指向您的实例(无尾随 /api) |
Write operations are not allowed |
SQL查询以INSERT/UPDATE等开头。 | 此服务器是只读的。仅使用SELECT查询。 |
| 查询返回空结果 | 字段ID或筛选器错误 | 调用 get_table_fields 要验证字段ID,则 preview_table 检查数据形状 |
| 导出挂起 | 非常大的数据集+缓慢的元数据库 | 添加过滤器以减少行数。出口上限为50万行。 |
发展
npm run dev # Watch mode — recompiles on save
npm run build # One-time build
npm start # Run the server
应适用于支持以下功能的任何Metabase版本 /api/dataset 端点和API密钥认证(一般为v0.44+)。
贡献
欢迎发布问题和PR。请打开 问题 首先讨论重大变化。
许可证
Built by Arkanji