Metabase MCP (headless) について
Metabase MCP (headless) は、API キーまたはメールアドレスとパスワードで、AI エージェント、アプリ、ジョブから Metabase に接続するサーバーです。クエリ、コンテンツ管理、管理操作のツールセットを選択でき、ローカルの stdio とベアラートークン保護の HTTP に対応します。
主な機能
- 01Metabase の各領域を扱う 178 個のツール
- 02ツールセット選択と個別ツールの有効・無効化
- 03stdio とベアラー認証付き HTTP モード
- 04読み取り専用モードとツールの安全性注釈
- 05簡潔で上限付き、ページ分割対応のクエリ結果
- 06一般的なワークフロー向けリソースとプロンプト
活用シーン
- 01テーブルの探索と分析データのクエリ
- 02ダッシュボードやカードの作成・整理
- 03CI での Metabase 管理の自動化
- 04HTTP 経由で選択した Metabase ツールを提供
MCP 対応
MCP サーバーとして、Metabase のツール、リソース、プロンプトを提供します。MCP クライアントは stdio または Streamable HTTP で接続でき、サーバーは API キーまたはメールアドレスとパスワードで Metabase に認証します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @serdnaley/metabase-mcpMETABASE_URLMetabase base URL, e.g. https://metabase.example.comMETABASE_API_KEYシークレットMetabase API key (or set METABASE_EMAIL + METABASE_PASSWORD)METABASE_EMAILLogin email (alternative to an API key)METABASE_PASSWORDシークレットLogin password (alternative to an API key)METABASE_READ_ONLY_MODEtrue hides all write toolsMETABASE_TOOLSETSComma list of toolsets or presets (all, query, content, admin)METABASE_TOOLS_ENABLEExtra tools to enable (names or globs)METABASE_TOOLS_DISABLETools to disable (names or globs); always winsMETABASE_CUSTOM_HEADERSシークレットExtra headers for every Metabase request (e.g. Cloudflare Access)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
@serdnaley/metabase-mcp
Metabase 向けのヘッドレス MCP サーバーです。 シンプルな API キーだけで、Metabase をあらゆる AI エージェント、アプリ、CI ジョブ、サーバーに接続できます。OAuth フローもブラウザーも、切り替えが必要な管理者設定もありません。
- ヘッドレス認証。 必要なのは Metabase API キー(またはメールアドレスとパスワード)だけです。インタラクティブな OAuth ログインが使えないサーバー、CI、コンテナー、独自のアプリやエージェントでも動作します。Metabase に組み込まれた MCP は OAuth のみと説明されており、0.60 以降では管理者による有効化が必要です。
- ローカルでもサービスとしても実行可能。 デスクトップクライアント向けの stdio、または共有環境やサーバーへのデプロイ向けのベアラートークン認証付き Streamable HTTP に対応しています。Metabase の認証情報はサーバー上に保持されます。
- 幅広い機能を網羅。 Metabase のクエリと操作に対応する 178 個のツールを備えています。ダッシュボード、質問、コレクション、ユーザー、グループ、権限、データベース、設定、アラート、トランスフォーム、エクスポートなどを扱えます。
- 必要なツールだけを利用可能。 ツールセットとツールごとの有効化・無効化により、モデルのコンテキストを小さく保てます。すべてのツールに読み取り専用/破壊的操作のヒントが付いているため、クライアントは読み取りを自動承認できます。
- あらゆる Metabase に対応。 Metabase OSS(無料版)と有料エディションで動作し、0.59 と 0.64 でテスト済みです。キャッシュ、モデルの永続化、モデレーションなどの有料限定機能は、インスタンスで利用可能な場合に動作します。CI では無料版を対象にテストしています。
Metabase 組み込みの MCP やその他の Metabase MCP サーバーとの比較については、docs/comparison.md をご覧ください。ツールの全カタログは serdnaley.github.io/metabase-mcp にあります。
機能
- 178 個の MCP ツール、33 個のツールセットに対応:検索、データベース、テーブル、コレクション、カード、ダッシュボード、アクション、データセット、ユーザー、グループ、権限、セグメント、リビジョン、設定、アラート、サブスクリプション、用語集、ドキュメント、タイムライン、ブックマーク、モデレーション、スニペット、X線分析、キャッシュ、永続化、アップロード、メトリクス、測定値、トランスフォーム、エクスポート、API キー、埋め込み、タスクとログ
- ツールセット:必要なものだけを読み込み(
METABASE_TOOLSETS=query)、グロブを使って個別のツールを追加または除外できます - ツールの注釈:すべてのツールに
readOnlyHint/destructiveHint/idempotentHintを付与 - stdio または HTTP:共有環境へのデプロイ向けに、ベアラー認証付き Streamable HTTP に対応
- 読み取り専用モード:環境変数を 1 つ設定するだけで、すべての書き込みツールを非表示にできます
- 大規模な結果への安全対策:クエリ結果の簡潔化、行数とレスポンスサイズの上限、ページング
- リソースとプロンプト:データベース、カード、ダッシュボード、コレクションを閲覧できます。すぐに使えるワークフローも用意しています
- 管理作業の自動化:ユーザー、グループ、権限、設定、データベース接続、トランスフォーム
- 型安全:Metabase の OpenAPI 仕様から生成した HTTP クライアント
- 設定不要:
npxで実行でき、インストールは不要です
インストール
Claude Desktop(ワンクリックバンドル)
最新リリースからmetabase-mcp-X.Y.Z.mcpbをダウンロードして開くと、Claude DesktopにMetabaseのURLとAPIキーを入力するフォームが表示されます。Node.jsのセットアップやJSONの編集は不要です。
Claude Desktop(JSON設定)
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または%APPDATA%\Claude\claude_desktop_config.json(Windows)を編集します。
{
"mcpServers": {
"metabase": {
"command": "npx",
"args": ["-y", "@serdnaley/metabase-mcp"],
"env": {
"METABASE_URL": "https://your-metabase.example.com",
"METABASE_API_KEY": "mb_xxx"
}
}
}
}
保存後、Claude Desktopを再起動してください。
Claude Code(CLI)
claude mcp add metabase \
--env METABASE_URL=https://your-metabase.example.com \
--env METABASE_API_KEY=mb_xxx \
-- npx -y @serdnaley/metabase-mcp
または、.claude/mcp.jsonに追加します。
{
"mcpServers": {
"metabase": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@serdnaley/metabase-mcp"],
"env": {
"METABASE_URL": "https://your-metabase.example.com",
"METABASE_API_KEY": "mb_xxx"
}
}
}
}
Cursor
~/.cursor/mcp.json(グローバル)または.cursor/mcp.json(プロジェクト)に追加します。
{
"mcpServers": {
"metabase": {
"command": "npx",
"args": ["-y", "@serdnaley/metabase-mcp"],
"env": {
"METABASE_URL": "https://your-metabase.example.com",
"METABASE_API_KEY": "mb_xxx"
}
}
}
}
保存後、Cursorを再起動してください。
Windsurf
~/.codeium/windsurf/mcp_config.jsonに追加します。
{
"mcpServers": {
"metabase": {
"command": "npx",
"args": ["-y", "@serdnaley/metabase-mcp"],
"env": {
"METABASE_URL": "https://your-metabase.example.com",
"METABASE_API_KEY": "mb_xxx"
}
}
}
}
Cline(VS Code)
ClineのMCP設定(MCP Serversアイコンからアクセスできます)に追加します。
{
"mcpServers": {
"metabase": {
"command": "npx",
"args": ["-y", "@serdnaley/metabase-mcp"],
"env": {
"METABASE_URL": "https://your-metabase.example.com",
"METABASE_API_KEY": "mb_xxx"
}
}
}
}
Continue(VS Code)
.continue/config.yamlに追加します。
mcpServers:
- name: metabase
command: npx
args:
- "-y"
- "@serdnaley/metabase-mcp"
env:
METABASE_URL: "https://your-metabase.example.com"
METABASE_API_KEY: "mb_xxx"
Zed
Zedのsettings.jsonに追加します。
{
"context_servers": {
"metabase": {
"command": "npx",
"args": ["-y", "@serdnaley/metabase-mcp"],
"env": {
"METABASE_URL": "https://your-metabase.example.com",
"METABASE_API_KEY": "mb_xxx"
}
}
}
}
リモート/HTTP(Streamable HTTPに対応するすべてのクライアント)
まずHTTPモードでサーバーを起動し(HTTPモードを参照)、そのサーバーをクライアントに指定します。Claude Codeの場合:
claude mcp add --transport http metabase https://mcp.example.com/mcp \
--header "Authorization: Bearer $MCP_HTTP_TOKEN"
汎用JSON設定(Cursor、VS Codeなど):
{
"mcpServers": {
"metabase": {
"url": "https://mcp.example.com/mcp",
"headers": { "Authorization": "Bearer <MCP_HTTP_TOKEN>" }
}
}
}
設定
| 変数 | 必須 | 説明 |
|---|---|---|
METABASE_URL | はい | MetabaseインスタンスのベースURL |
METABASE_API_KEY | いいえ* | 認証用APIキー |
METABASE_EMAIL | いいえ* | セッションベース認証用のメールアドレス |
METABASE_PASSWORD | いいえ* | セッションベース認証用のパスワード |
METABASE_READ_ONLY_MODE | いいえ | trueに設定すると書き込みツールを無効にします |
METABASE_CUSTOM_HEADERS | いいえ | セッションログインを含む、すべてのリクエストで送信する追加のHTTPヘッダー(下記参照) |
METABASE_TOOLSETS | いいえ | 読み込むツールセットまたはプリセットのカンマ区切りリスト(デフォルト:すべて)。ツールセットを参照 |
METABASE_TOOLS_ENABLE | いいえ | ツールセットに加えて読み込むツール(名前またはグロブ。例:get_card,export_*) |
METABASE_TOOLS_DISABLE | いいえ | 読み込まないツール(名前またはグロブ)。有効化設定より常に優先されます |
METABASE_MAX_ROWS | いいえ | クエリツールの行数上限(デフォルトは500)。大きな結果を参照 |
METABASE_MAX_RESPONSE_CHARS | いいえ | すべてのツール応答のサイズ上限(デフォルトは100000) |
MCP_TRANSPORT | いいえ | stdio(デフォルト)またはhttp。コマンドラインで--httpを指定した場合も同じです |
MCP_HTTP_HOST / MCP_HTTP_PORT | いいえ | HTTPのバインドアドレス。デフォルトは127.0.0.1:3333(PORTも使用できます) |
MCP_HTTP_TOKEN | HTTPモード | クライアントが送信する必要のあるベアラートークン(16文字以上) |
MCP_HTTP_ALLOW_NO_AUTH | いいえ | trueにすると、ループバックホストでのみトークンなしのHTTPを実行します |
*METABASE_API_KEY、またはMETABASE_EMAILとMETABASE_PASSWORDの両方を指定する必要があります。APIキーの使用を推奨します。
カスタムヘッダー
MetabaseがCloudflare Accessのサービストークンなど、独自のヘッダーを必要とするプロキシの背後にある場合は、METABASE_CUSTOM_HEADERSを使用します。JSONオブジェクトを指定します。
METABASE_CUSTOM_HEADERS='{"CF-Access-Client-Id": "xxx.access", "CF-Access-Client-Secret": "yyy"}'
または、改行または;で区切ったName: value形式のペアを指定します。
METABASE_CUSTOM_HEADERS='CF-Access-Client-Id: xxx.access; CF-Access-Client-Secret: yyy'
認証ヘッダー(X-API-Key、X-Metabase-Session)は、同じ名前のカスタムヘッダーより常に優先されます。不正な値が指定されている場合、サーバーは起動時に停止します。
ツールセット
各ツールのドメインはツールセット(dashboards、users、transforms などです。全リストはツールを参照してください)です。プリセットでまとめて選択できます。
| プリセット | 対象 |
|---|---|
all | すべて(デフォルト) |
query | データの探索とクエリ:検索、データベース、テーブル、データセット、カード、メトリクス、メジャー、セグメント、エクスポート、アクティビティ、X線分析 |
content | コンテンツの作成と整理:コレクション、カード、ダッシュボード、ドキュメント、スニペット、タイムライン、アラートなど |
admin | インスタンスの運用:ユーザー、権限、設定、データベース、テーブル、キャッシュ、アップロード、変換、アクションなど |
METABASE_TOOLSETS=query,dashboards # analyst assistant
METABASE_TOOLS_ENABLE=create_card # plus one write tool
METABASE_TOOLS_DISABLE='delete_*' # never delete anything
優先順位は、強い順に 読み取り専用モード > METABASE_TOOLS_DISABLE > METABASE_TOOLS_ENABLE > METABASE_TOOLSETS です。不明なツールセットがあると、起動時にサーバーが停止します。有効化/無効化パターンに一致するものがない場合は、警告がログに記録されます。起動ログ(stderr)には、有効なツールの数が表示されます。
大きな結果
クエリツール(execute_query、execute_card_query、run_metric)は、コンパクトな表示を返します。これにはcolumns(名前、型)とrowsが含まれ、Metabaseの列内部情報、results_metadata、インサイトは含まれません。生のレスポンスを取得するには、verbose: trueを指定してください。結果はMETABASE_MAX_ROWS行に制限され(呼び出しごとにmax_rowsを指定できますが、上限を超えることはできません)、offsetでページ分割されます。残りの結果を取得する方法はnoteに記載されます。各ツールのレスポンスはコンパクトなJSONで、METABASE_MAX_RESPONSE_CHARS文字に制限されます。SELECT * FROM ORDERSの10/100/500行の結果では、未整形のレスポンスと比べて94%/76%/60%小さくなります。結果セット全体を取得するには、output_pathを指定してエクスポートツールを使用してください。
リソースとプロンプト
ツールに加えて、サーバーは閲覧用のMCP リソース(コンパクトなJSON)として、metabase://databases、metabase://database/{id}/schema、metabase://card/{id}、metabase://dashboard/{id}、metabase://collection/{id}(ルートコレクションの場合はroot)を提供します。また、一般的なワークフロー用のプロンプトとして、explore-database、build-dashboard、explain-card、audit-permissionsを提供します。どちらもツールの選択設定に従います。リソースには対応するツールセットが必要で、プロンプトには使用するすべてのツールが必要です(そのため、読み取り専用モードではbuild-dashboardは表示されません)。
HTTP モード(共有/サーバーへのデプロイ)
METABASE_URL=https://metabase.example.com \
METABASE_API_KEY=mb_xxx \
MCP_TRANSPORT=http MCP_HTTP_HOST=0.0.0.0 MCP_HTTP_PORT=3333 \
MCP_HTTP_TOKEN="$(openssl rand -hex 32)" \
npx -y @serdnaley/metabase-mcp
クライアントはAuthorization: Bearer <MCP_HTTP_TOKEN>を指定してhttp://<host>:3333/mcpに接続します。GET /healthは認証なしで応答し、情報は開示しません。このエンドポイントはステートレス(セッションなし)なので、水平方向にスケールできます。localhost以外で使用する場合は、TLS(リバースプロキシ)経由にしてください。トークンを持つ全員がMetabase APIキーのユーザーとして動作するため、対象者ごとに専用のキー、トークン、ツールセットを用意してください。
または、コンテナとして実行できます(ghcr.io/serdnaley/metabase-mcp、amd64 + arm64、デフォルトでHTTPモード):
docker run -p 3333:3333 \
-e METABASE_URL=https://metabase.example.com -e METABASE_API_KEY=mb_xxx \
-e MCP_HTTP_TOKEN="$(openssl rand -hex 32)" \
ghcr.io/serdnaley/metabase-mcp
Metabase API キーの取得
- Metabaseインスタンスに移動します
- 歯車アイコン > 管理者設定 > 認証 > APIキーをクリックします
- 「APIキーを作成」をクリックします
- 名前を付け、適切なグループ(例:管理者)を選択します
- キーをコピーします。キーは
mb_で始まります
使用例
「注文の傾向を示すダッシュボードを作成する」
AI アシスタントは次の操作を行います:
searchとget_database_metadataを使用してデータを確認しますcreate_cardを使用して質問を作成します(例:月別の注文数、製品別の売上)create_dashboardを使用してダッシュボードを作成しますupdate_dashboard_cardsを使用して、レイアウトに合わせてカードを配置します
「第4四半期のレポートをすべてArchiveコレクションに移動する」
AI アシスタントは次の操作を行います:
searchを使用して第4四半期のレポートカードを探します- 必要に応じて
create_collectionを使用してArchiveコレクションを作成します - 各カードで
update_cardを使用して、新しいコレクションに移動します
「分析データベースにはどのようなテーブルがありますか?」
AI アシスタントは次の操作を行います:
list_databasesを使用してデータベースを探しますget_database_metadataを使用して、すべてのテーブル、フィールド、リレーションシップを一覧表示します
ツール
パラメーターを含む完全なカタログは、ツールカタログサイトを参照してください(コードから生成されています)。
Read tools (79, always available)
| Toolset | Tools |
|---|---|
Search (search) | search |
Databases (databases) | list_databases, get_database, get_database_metadata, list_database_schemas, get_database_schema |
Tables & Fields (tables) | get_table, get_table_query_metadata, get_field, get_field_values |
Collections (collections) | get_collection_tree, list_collections, get_collection, list_collection_items |
Cards (cards) | list_cards, get_card, execute_card_query |
Dashboards (dashboards) | list_dashboards, get_dashboard |
Actions (actions) | list_actions, get_action |
Dataset (ad-hoc queries) (dataset) | execute_query |
Users & Groups (users) | list_users, get_user, get_current_user, list_groups, get_group |
Permissions (permissions) | get_permissions_graph, get_collection_permissions |
Segments (segments) | list_segments, get_segment |
Revisions (revisions) | list_revisions |
Settings (settings) | list_settings, get_setting |
Alerts & Subscriptions (notifications) | list_alerts, get_alert, list_dashboard_subscriptions, list_notifications |
X-Rays (xrays) | generate_xray |
Activity & Tasks (activity) | get_activity, get_recent_items, get_popular_items |
Snippets (snippets) | list_snippets, get_snippet |
Glossary (glossary) | list_glossary_terms, get_glossary_term |
Documents (documents) | list_documents, get_document |
Timelines (timelines) | list_timelines, get_timeline |
Bookmarks (bookmarks) | list_bookmarks |
EID Translation (eid-translation) | translate_entity_ids |
Metrics (metrics) | list_metrics, get_metric, run_metric, list_metric_dimensions, get_metric_dimension_values |
Measures (measures) | list_measures, get_measure |
Transforms (transforms) | list_transforms, get_transform, list_transform_runs, get_transform_run, list_transform_jobs, list_transform_tags |
Exports (exports) | export_card_query, export_query, export_dashboard_pdf |
API Keys (api-keys) | list_api_keys |
Embedding (embedding) | get_embedding_status, create_embed_url |
Tasks & Logs (diagnostics) | list_tasks, get_task, list_task_types, list_task_runs, get_scheduler_info, get_server_logs, list_log_presets, get_premium_token_status |
書き込みツール(99 個、読み取り専用モードでは非表示)
| ツールセット | ツール |
|---|---|
データベース (databases) | create_database, update_database, delete_database, validate_database, sync_database_schema |
テーブルとフィールド (tables) | update_table, update_field, rescan_field_values, discard_field_values, reorder_fields |
コレクション (collections) | create_collection, update_collection |
カード (cards) | create_card, update_card, delete_card, copy_card, create_card_public_link, delete_card_public_link |
ダッシュボード (dashboards) | create_dashboard, update_dashboard, delete_dashboard, copy_dashboard, update_dashboard_cards, create_dashboard_public_link, delete_dashboard_public_link |
アクション (actions) | create_action, update_action, delete_action, execute_action, create_action_public_link, delete_action_public_link |
ユーザーとグループ (users) | create_user, update_user, deactivate_user, reactivate_user, create_group, update_group, delete_group, add_group_member, remove_group_member |
権限 (permissions) | update_permissions_graph, update_collection_permissions |
セグメント (segments) | create_segment, update_segment, delete_segment |
リビジョン (revisions) | revert_revision |
設定 (settings) | update_setting |
アラートとサブスクリプション (notifications) | send_notification, create_alert, update_alert, delete_alert, create_dashboard_subscription, update_dashboard_subscription, delete_dashboard_subscription |
キャッシュ (cache) | invalidate_cache, update_cache_config |
モデルの永続化 (persistence) | persist_model, unpersist_model, refresh_persisted_model |
アップロード (upload) | upload_csv |
スニペット (snippets) | create_snippet, update_snippet, delete_snippet |
用語集 (glossary) | create_glossary_term, update_glossary_term, delete_glossary_term |
ドキュメント (documents) | create_document, update_document, delete_document |
タイムライン (timelines) | create_timeline, update_timeline, delete_timeline, create_timeline_event, update_timeline_event, delete_timeline_event |
ブックマーク (bookmarks) | create_bookmark, delete_bookmark |
モデレーション (moderation) | create_moderation_review |
メトリクス (metrics) | create_metric, update_metric |
メジャー (measures) | create_measure, update_measure |
変換 (transforms) | create_transform, update_transform, delete_transform, run_transform, cancel_transform_run, create_transform_job, run_transform_job, delete_transform_job, create_transform_tag |
API キー (api-keys) | create_api_key, update_api_key, regenerate_api_key, delete_api_key |
埋め込み (embedding) | set_static_embedding, set_resource_embedding |
タスクとログ (diagnostics) | set_log_levels, reset_log_levels |
METABASE_TOOLSETS のプリセット:all(すべて);query(search、databases、tables、dataset、cards、metrics、measures、segments、exports、activity、xrays);content(search、collections、cards、dashboards、documents、snippets、timelines、bookmarks、glossary、revisions、moderation、notifications、exports);admin(users、permissions、settings、databases、tables、cache、persistence、upload、transforms、actions、activity、eid-translation、api-keys、embedding、diagnostics)。
セキュリティ
読み取り専用モードでもexecute_queryを利用できます。 設定された Metabase アカウントがアクセスできる任意のデータベースに対して、任意の SQL を実行できます。Metabase は独自の権限モデルを適用しますが、このツールが追加の制限を設けることはありません。
書き込み操作を防ぐには、Metabase 自体で、Metabase API キーまたはアカウントに読み取り専用のデータベース権限が設定されていることを確認してください。
エクスポートではローカルファイルに書き込むことができます。 export_card_query、export_query、export_dashboard_pdfは読み取り専用モードでも利用でき(Metabase から読み取るだけです)、output_pathを指定すると、MCP サーバーを実行しているマシン上のその絶対パスに書き込みます。overwrite: trueを渡さない限り、既存のファイルを上書きすることはありません。Metabase はクエリの実行時と同じアクセスチェックをエクスポートにも適用します。独立した「結果のダウンロード」権限は Pro/Enterprise でのみ利用できます。
読み取り専用モードはセキュリティ境界ではありません。 METABASE_READ_ONLY_MODEは書き込みツールを非表示にするだけです。キーが実際にできることは Metabase で決まり、API キーには、そのグループの権限に加えてすべてのユーザーの権限が適用されます。読み取り専用のアシスタントには、キーをコレクションへの閲覧のみアクセス権を持つグループに設定し、「クエリの作成」をクエリビルダーのみ(またはなし)に設定したうえで、「すべてのユーザー」の権限もそれ以上に広がらないように制限してください。調査結果とセットアップのチェックリストについては、docs/read-only-and-permissions.mdを参照してください。
HTTP モードではベアラートークンが必要です。 MCP_TRANSPORT=httpは、ループバックホスト上でMCP_HTTP_ALLOW_NO_AUTH=trueが設定されている場合を除き、MCP_HTTP_TOKENがないと起動しません。トークンは一定時間で比較され、ループバックホストでは Host ヘッダーのチェックによって DNS リバインディングがブロックされます。このトークンには、設定された Metabase キーができることすべてを実行する権限があるため、そのキーと同様に取り扱い、localhost の外部では TLS 経由でエンドポイントを公開してください。
生 SQL はワンクリックで実行されます。 読み取りツールにはexecute_queryとexport_queryを含め、readOnlyHint: trueが設定されているため、クライアントが自動承認する場合があります。⚠️ SQL はそのまま送信されます。このサーバーはINSERT/UPDATE/DELETE/DDLをブロックせず、どちらのツールの説明にもその旨が記載されています。SQL による書き込みを防ぐ必要がある場合は、ネイティブクエリを実行できないグループの Metabase API キー(または読み取り専用権限を付与されたデータベースユーザー)を使用してください。docs/read-only-and-permissions.mdを参照してください。
アクションの種類は制限されています。 create_actionツールで許可されるアクションの種類は、queryとimplicitのみです。任意の外部リクエストを行う可能性がある HTTP アクションはブロックされます。
開発
bun install
bun run dev # Start the MCP server
bun run build # Build for npm
bun run generate-types # Regenerate types from Metabase OpenAPI spec
テスト
テストは Docker 経由で実際の Metabase インスタンスに対して実行されます。
docker compose up -d # Start Metabase (pinned version, see docker-compose.yml)
./tests/ci/wait-for-metabase.sh # Wait for ready (~15s)
bun test # 276 tests
docker compose down # Stop Metabase
Metabase v0.64.3.4(CI で固定されているバージョン)およびv0.59.6で検証済みです。別のリリースを試すには、次を実行してください。
MB_IMAGE=metabase/metabase:latest docker compose up -d。CI では、固定バージョンを更新する前に上流 API の変更を検知できるよう、週に一度、metabase:latestでもブロッキングなしのジョブとしてテストスイートを実行します。
アクション、トランスフォーム、CSV のアップロードは、docker-compose.ymlの Postgres「Test Warehouse」に対して実行されます。有料プランまたは不足しているサービスが必要な機能(モデレーション、キャッシュの無効化、モデルの永続化、またはウェアハウス自体)は、SKIP … (environment)というログ行を出して明示的にスキップされます。それ以外の API エラーが発生した場合、テストは失敗します。
仕組み
AI Client (Claude, Cursor, etc.)
↓ MCP protocol (stdio)
MCP Tool (zod schema + handler)
↓
Service function (business logic)
↓
openapi-fetch (type-safe HTTP client)
↓
Metabase REST API
このサーバーは Metabase のOpenAPI 仕様から TypeScript 型を生成し、型安全な API 呼び出しにopenapi-fetchを使用します。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。