dbmcp について
dbmcpは、AIアシスタントをMySQL、MariaDB、PostgreSQL、SQLiteに接続する単一バイナリのMCPサーバーです。スキーマ確認とクエリのツールを備え、デフォルトで読み取り専用で動作し、対応データベースではSSHトンネルも利用できます。
主な機能
- 01MySQL、MariaDB、PostgreSQL、SQLiteに対応
- 02スキーマ探索とSQLクエリのツール
- 03デフォルトで読み取り専用
- 04stdioとHTTPのトランスポート
- 05対応データベース向けの組み込みSSHトンネル
活用シーン
- 01データベースのスキーマやオブジェクトを調べる
- 02対応するSQLデータベースにクエリを実行する
- 03SSH踏み台経由でデータベースに接続する
MCP 対応
データベースの探索、クエリ、DDL、実行計画確認のツールをMCPクライアントに公開します。クライアントはstdioで起動するか、HTTPトランスポートに接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e HTTP_HOST -e HTTP_PORT -e HTTP_ALLOWED_ORIGINS -e HTTP_ALLOWED_HOSTS -e HTTP_AUTH_TOKEN ghcr.io/haymon-ai/dbmcp:0.15.2HTTP_HOSTHTTP bind hostHTTP_PORTHTTP bind portHTTP_ALLOWED_ORIGINSAllowed CORS origins (comma-separated)HTTP_ALLOWED_HOSTSAllowed host names (comma-separated)HTTP_AUTH_TOKENシークレットBearer token required on every request; mandatory for non-loopback bindsローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/haymon-ai/dbmcp:0.15.2stdioStreamable HTTPツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Database MCP
SQL データベース向けの単一バイナリの MCP サーバーです。実行時の依存関係なしで、AI アシスタントを MySQL/MariaDB、PostgreSQL、または SQLite に接続できます。

機能 ✨
- マルチデータベース — 1 つのバイナリで MySQL/MariaDB、PostgreSQL、SQLite に対応
- MCP ツール — スキーマの検出(
listDatabases、listTables、listViews、listTriggers、listFunctions、listProcedures、listMaterializedViews)、データアクセス(readQuery、writeQuery)、DDL(createDatabase、dropDatabase、dropTable)、およびexplainQuery。読み取り専用モードでは書き込みツール(writeQuery、createDatabase、dropDatabase、dropTable)が非表示になります。バックエンドごとの対応状況については、MCP ツールを参照してください。 - 単一バイナリ — 約 7 MB、Python/Node/Docker は不要
- 複数のトランスポート — stdio(Claude Desktop、Cursor 用)および HTTP(リモート/複数クライアント用)
- 2 層の設定 — CLI フラグ > 環境変数。バックエンドごとに適切なデフォルト値を設定
- SSH トンネル — 組み込みクライアントを使用し、SSH 踏み台サーバー経由で MySQL/MariaDB/PostgreSQL に接続できます。パスワードまたは鍵による認証、
known_hostsによる検証、自動再接続に対応
インストール 📦
macOS、Linux、WSL:
curl -fsSL https://dbmcp.haymon.ai/install.sh | bash
Windows PowerShell:
irm https://dbmcp.haymon.ai/install.ps1 | iex
Windows CMD:
curl -fsSL https://dbmcp.haymon.ai/install.cmd -o install.cmd && install.cmd && del install.cmd
Docker、Cargo、その他の方法については、インストールのドキュメントを参照してください。
クイックスタート 🚀
.mcp.json を使用する(推奨)
プロジェクトのルートに .mcp.json ファイルを追加します。MCP クライアントがこのファイルを読み取り、サーバーを自動的に設定します。
stdio トランスポート — クライアントがサーバープロセスを起動して管理します:
{
"mcpServers": {
"dbmcp": {
"command": "dbmcp",
"args": ["stdio"],
"env": {
"DB_BACKEND": "mysql",
"DB_HOST": "127.0.0.1",
"DB_PORT": "3306",
"DB_USER": "root",
"DB_PASSWORD": "secret",
"DB_NAME": "mydb"
}
}
}
}
HTTP トランスポート — 自分でサーバーを起動し、クライアントが接続します:
# Start the server first
dbmcp http --db-backend mysql --db-user root --db-name mydb --port 9001
{
"mcpServers": {
"dbmcp": {
"type": "http",
"url": "http://127.0.0.1:9001/mcp"
}
}
}
注: HTTP トランスポートには
"type": "http"フィールドが必須です。これがない場合、Claude Code などのクライアントは設定を拒否します。
ベアラートークンを必須にするには、サーバーを HTTP_AUTH_TOKEN 付きで起動し、クライアントからトークンを送信します:
HTTP_AUTH_TOKEN="$(openssl rand -hex 32)" dbmcp http --db-backend mysql --db-user root --db-name mydb
{
"mcpServers": {
"dbmcp": {
"type": "http",
"url": "http://127.0.0.1:9001/mcp",
"headers": { "Authorization": "Bearer ${DBMCP_TOKEN}" }
}
}
}
CLI フラグを使用する
# MySQL/MariaDB
dbmcp stdio --db-backend mysql --db-host localhost --db-user root --db-name mydb
# PostgreSQL
dbmcp stdio --db-backend postgres --db-host localhost --db-user postgres --db-name mydb
# SQLite
dbmcp stdio --db-backend sqlite --db-name ./data.db
# PostgreSQL through an SSH bastion (DB host is resolved by the bastion)
dbmcp stdio --db-backend postgres --db-host db.internal --db-user postgres --db-name mydb \
--ssh-host bastion.example.com --ssh-user deploy --ssh-key ~/.ssh/id_ed25519
# HTTP transport (loopback only, no token required)
dbmcp http --db-backend mysql --db-user root --db-name mydb --port 9001
# HTTP transport on all interfaces — a bearer token is REQUIRED
HTTP_AUTH_TOKEN=change-me dbmcp http --db-backend mysql --db-user root --db-name mydb --host 0.0.0.0 --port 9001
警告: ループバック以外のアドレス(例:
--host 0.0.0.0)にバインドすると、そのポートに接続できるすべてのユーザーにデータベースが公開されます。その場合、HTTP_AUTH_TOKENが設定されていない限り、dbmcpは起動を拒否します。Host/Origin の許可リストはブラウザーの DNS リバインディング攻撃から保護するためのものであり、認証ではありません。
環境変数を使用する
DB_BACKEND=mysql DB_USER=root DB_NAME=mydb dbmcp stdio
設定 ⚙️
設定は明確な優先順位で読み込まれます:
CLI フラグ > 環境変数 > デフォルト値
環境変数は通常、MCP クライアントによって(サーバー設定の env または envFile を通じて)設定されます。
サブコマンド
| サブコマンド | 説明 |
|---|---|
stdio | stdio モードで実行 |
http | HTTP/SSE モードで実行 |
version | バージョン情報を表示して終了 |
サブコマンドは必須です。サブコマンドを指定せずに dbmcp を実行すると、使い方のヘルプが表示され、ゼロ以外のステータスで終了します。
データベースオプション(すべてのサブコマンドで共通)
| フラグ | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--db-backend | DB_BACKEND | (必須) | mysql、mariadb、postgres、または sqlite |
--db-host | DB_HOST | localhost | データベースのホスト(トンネリング時は SSH サーバーから見たホスト) |
--db-port | DB_PORT | バックエンドのデフォルト | 3306(MySQL/MariaDB)、5432(PostgreSQL) |
--db-user | DB_USER | バックエンドのデフォルト | root(MySQL/MariaDB)、postgres(PostgreSQL) |
--db-password | DB_PASSWORD | (空) | データベースのパスワード |
--db-name | DB_NAME | (空) | データベース名または SQLite のファイルパス |
--db-charset | DB_CHARSET | 文字セット(MySQL/MariaDB のみ) |
SSL/TLS オプション
| フラグ | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--db-ssl | DB_SSL | false | SSL を有効にする |
--db-ssl-ca | DB_SSL_CA | CA 証明書のパス | |
--db-ssl-cert | DB_SSL_CERT | クライアント証明書のパス | |
--db-ssl-key | DB_SSL_KEY | クライアントキーのパス | |
--db-ssl-verify-cert | DB_SSL_VERIFY_CERT | true | サーバー証明書を検証する |
SSH トンネルオプション
| フラグ | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--ssh-host | SSH_HOST | SSH サーバーのホスト。設定するとトンネルが有効になります | |
--ssh-port | SSH_PORT | 22 | SSH サーバーのポート |
--ssh-user | SSH_USER | SSH ユーザー | |
--ssh-password | SSH_PASSWORD | SSH パスワード | |
--ssh-key | SSH_KEY | SSH 秘密鍵のパス(OpenSSH、PKCS#1、PKCS#8、SEC1) | |
--ssh-key-passphrase | SSH_KEY_PASSPHRASE | SSH 秘密鍵のパスフレーズ | |
--ssh-known-hosts | SSH_KNOWN_HOSTS | ~/.ssh/known_hosts | known_hosts ファイルのパス(デフォルト:~/.ssh/known_hosts) |
--ssh-strict-host-key-checking | SSH_STRICT_HOST_KEY_CHECKING | yes | ホストキーのポリシー:yes は不明なホストを拒否し、accept-new は初回接続時に信頼し、no は検証を無効にします(安全ではありません) |
--ssh-keepalive-interval | SSH_KEEPALIVE_INTERVAL | 30 | SSH キープアライブの間隔(秒、0 で無効) |
--ssh-local-port | SSH_LOCAL_PORT | 一時ポート | ローカルトンネルのポート(デフォルト:一時ポート) |
トンネルは MySQL/MariaDB/PostgreSQL のみで利用でき、組み込みの SSH クライアントを使用します(ssh バイナリは不要です)。--db-host/--db-port は SSH サーバーによって解決されます。キーとパスワードの両方が設定されている場合は、まずキーが試されます。ホストキーのポリシー、制限事項、トラブルシューティングについては、SSH トンネルを参照してください。
サーバーオプション
| フラグ | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--db-read-only | DB_READ_ONLY | true | 書き込みクエリをブロックする |
--db-max-pool-size | DB_MAX_POOL_SIZE | 5 | 接続プールの最大サイズ(最小:1) |
--db-connection-timeout | DB_CONNECTION_TIMEOUT | (未設定) | 接続タイムアウト(秒、最小:1) |
--db-query-timeout | DB_QUERY_TIMEOUT | 30 | クエリ実行のタイムアウト(秒) |
--db-page-size | DB_PAGE_SIZE | 100 | ページ分割されたツールレスポンスあたりの最大項目数(範囲:1~500) |
ロギングオプション
| フラグ | 環境変数 | デフォルト | 説明 |
|---|---|---|---|
--log-level | LOG_LEVEL | info | ログレベル(trace/debug/info/warn/error) |
HTTP 専用オプション(http サブコマンドでのみ使用可能)
| フラグ | デフォルト | 説明 |
|---|---|---|
--host | 127.0.0.1 | バインドするホスト |
--port | 9001 | バインドするポート |
--allowed-origins | localhost の各種表記、任意のポート | 許可するブラウザーのオリジン(カンマ区切り、:* は任意のポートに一致します)。CORS プリフライトとサーバー側の Origin 拒否の両方に適用されます。 |
--allowed-hosts | localhost,127.0.0.1,::1 | 信頼する Host ヘッダー(カンマ区切り)。サーバー側で適用され、HTTP/2 の :authority も考慮されます。 |
--auth-token | (未設定) | すべてのリクエストで必要となる Bearer トークン(Authorization: Bearer <token>)。CLI 引数は ps で表示されるため、HTTP_AUTH_TOKEN 環境変数を使用してください。ループバック以外にバインドする場合は必須です。 |
--dangerously-allow-unauthenticated | false | トークンなしでループバック以外にバインドすることを許可します(HTTP_DANGEROUSLY_ALLOW_UNAUTHENTICATED)。呼び出し元を認証するリバースプロキシの背後でのみ使用してください。 |
セキュリティに関する注意:デフォルトの
--allowed-originsでは、localhost/127.0.0.1/[::1]上の任意のポートから配信されるブラウザーページが許可されるため、ローカルの Web アプリであればどれでもサーバーを呼び出せます。共有マシンや開発用マシンでは、HTTP_AUTH_TOKENを設定するか、--allowed-originsを信頼するオリジン(例:http://localhost:5173)に限定してください。
MCP ツール 🧩
listDatabases
アクセス可能なデータベースの一覧を、cursor/nextCursor を使ってページ分割して返します。反復処理の詳細はカーソルページネーションを参照してください。SQLite では使用できません。
listTables
データベース内のテーブル一覧を、cursor/nextCursor を使ってページ分割して返します。反復処理の詳細はカーソルページネーションを参照してください。
パラメーター:database(アクティブなデータベースがデフォルトです。SQLite には database パラメーターがありません)、cursor、search、detailed。
search は省略可能な大文字・小文字を区別しない LIKE/ILIKE パターンで、ワイルドカードとして %(任意の文字列)と _(任意の1文字)を使用できます。名前が users で始まるテーブルには users%、部分一致には %order% を指定します。ワイルドカードを含まない単語を指定すると、テーブル名の完全一致のみが対象になります。
detailed(デフォルトは false)によって、レスポンスの形式が切り替わります。
- 簡易(デフォルト) —
tablesは、テーブル名のみを格納したソート済み JSON 配列です。 - 詳細(
detailed: true) —tablesはテーブル名をキーとする JSON オブジェクトです。各値には、テーブルのschema、kind、owner、comment、columns[]、constraints[]、indexes[]、triggers[]が含まれます。1回の呼び出しでテーブル一覧とテーブルごとのメタデータの両方が返されます。
listViews
データベース内のビュー一覧を、cursor/nextCursor を使ってページ分割して返します。MySQL/MariaDB、PostgreSQL(public スキーマ)、SQLite で使用できます。パラメーター:database(アクティブなデータベースがデフォルトです。SQLite には database パラメーターがありません)、cursor、search、detailed。SQLite では簡易形式のみが返され、search と detailed は受け付けられません。
search は省略可能な大文字・小文字を区別しない LIKE/ILIKE パターンで、ワイルドカードとして %(任意の文字列)と _(任意の1文字)を使用できます。カーソルの連続性を保つため、ページ分割された呼び出しでは search の値を同一に保つ必要があります。
detailed(デフォルトは false)によって、レスポンスの形式が切り替わります。
- 簡易(デフォルト) —
viewsは、ビュー名のみを格納したソート済み JSON 配列です。ビュー名はスキーマごとに一意のため、重複はありません。 - 詳細(
detailed: true) —viewsはビュー名のみをキーとする JSON オブジェクトです。各値には、バックエンドごとのメタデータが含まれます。PostgreSQL ではschema、owner、description、definitionが公開されます。MySQL/MariaDB ではschema、definer、security、checkOption、updatable、characterSetClient、collationConnection、definitionが公開されます。バックエンドごとの取得元列、列挙値の一覧、意図的に省略されている項目については、listViewsリファレンスを参照してください。
反復処理の詳細はカーソルページネーションを参照してください。
listTriggers
テーブル上のユーザー定義トリガーを、cursor / nextCursor を使用してページネーションしながら一覧表示します。内部制約トリガーと外部キー制約トリガーは除外されます。MySQL/MariaDB、PostgreSQL(public スキーマ)、SQLite で利用できます。パラメーター:database(アクティブなデータベースがデフォルト。SQLite では database パラメーターはありません)、cursor、search、detailed。
search は任意の大文字小文字を区別しない LIKE / ILIKE パターンで、ワイルドカードとして %(任意の文字列)と _(1 文字)を使用できます。カーソルの連続性を保つため、ページネーションを伴う呼び出しでは search の値を同一にする必要があります。
detailed(デフォルトは false)を指定すると、レスポンスの形式が切り替わります。
- 概要(デフォルト) —
triggersは、トリガー名のみを含むソート済みの JSON 配列です。 - 詳細(
detailed: true) —triggersはトリガー名をキーとする JSON オブジェクトです。各値には、バックエンドごとのメタデータ(タイミング、イベント、定義、PostgreSQL のstatus/functionNameや MySQL/MariaDB のセッションコンテキストフィールドなど、バックエンド固有の追加情報)が含まれます。バックエンドごとのフィールド一覧は、listTriggersのリファレンスを参照してください。
反復処理の詳細については、カーソルページネーションを参照してください。
listFunctions
ユーザー定義の SQL 関数を、cursor / nextCursor を使用してページネーションしながら一覧表示します。PostgreSQL では、集約関数、ウィンドウ関数、プロシージャは除外されます。MySQL/MariaDB では、ロード可能な UDF(mysql.func)は除外されます。MySQL/MariaDB および PostgreSQL(public スキーマ)で利用できます。SQLite では利用できません。パラメーター:database(アクティブなデータベースがデフォルト)、cursor、search、detailed。
search は任意の大文字小文字を区別しない LIKE / ILIKE パターンで、ワイルドカードとして %(任意の文字列)と _(1 文字)を使用できます。カーソルの連続性を保つため、ページネーションを伴う呼び出しでは search の値を同一にする必要があります。
detailed(デフォルトは false)を指定すると、レスポンスの形式が切り替わります。
- 概要(デフォルト) —
functionsは、関数名のみを含むソート済みの JSON 配列です。PostgreSQL ではオーバーロードごとに 1 回ずつ表示されるため、関数名が重複することがあります。 - 詳細(
detailed: true) —functionsは関数シグネチャをキーとする JSON オブジェクトです。各値には、バックエンドごとのメタデータ(言語、引数、戻り値の型、定義、PostgreSQL のvolatility/strict/parallelSafetyや MySQL/MariaDB のセッションコンテキストフィールドなど、バックエンド固有の追加情報)が含まれます。PostgreSQL のキーはname(arguments)(オーバーロードを区別)で、MySQL/MariaDB のキーは関数名のみ(オーバーロードなし)です。バックエンドごとのフィールド一覧は、listFunctionsのリファレンスを参照してください。
反復処理の詳細については、カーソルページネーションを参照してください。
listProcedures
ユーザー定義のストアドプロシージャを一覧表示します。cursor / nextCursor によるページネーションに対応しています。MySQL/MariaDB および PostgreSQL(public スキーマ、PostgreSQL 11+)で利用できます。SQLite では利用できません。パラメーター:database(アクティブなデータベースがデフォルト)、cursor、search、detailed。
search は、大文字と小文字を区別しない任意の LIKE / ILIKE パターンです。ワイルドカードとして %(任意の文字列)と _(1文字)を使用できます。カーソルを継続して使用するには、ページネーションを行う呼び出し間で search の値を同一に保つ必要があります。
detailed(デフォルトは false)でレスポンスの形式を切り替えます。
- Brief(デフォルト) —
proceduresは、プロシージャ名のみを格納したソート済みの JSON 配列です。PostgreSQL のオーバーロードはオーバーロードごとに1回表示されます(同じ名前の文字列が重複することがあります)。 - Detailed(
detailed: true) —proceduresはプロシージャのシグネチャをキーとする JSON オブジェクトです。各値には、バックエンドごとのメタデータ(言語、引数、セキュリティ、定義、PostgreSQL のownerや MySQL/MariaDB のdeterministic/sqlDataAccess/ セッションコンテキストのフィールドなど、バックエンド固有の追加情報)が含まれます。PostgreSQL のキーはname(arguments)です(オーバーロードは区別され、引数が0個のプロシージャはname()がキーになります)。MySQL/MariaDB のキーは名前のみです(オーバーロードはありません)。バックエンドごとのフィールド一覧については、listProceduresのリファレンスを参照してください。
反復処理の詳細については、カーソルページネーションを参照してください。
listMaterializedViews
public スキーマのマテリアライズドビューを一覧表示します。cursor / nextCursor によるページネーションに対応しています。PostgreSQL 専用で、MySQL/MariaDB または SQLite では利用できません。パラメーター:database(アクティブなデータベースがデフォルト)、cursor、search、detailed。
search は、大文字と小文字を区別しない任意の ILIKE パターンです。ワイルドカードとして %(任意の文字列)と _(1文字)を使用できます。SQL のメタ文字('、;、--)はパラメーター値としてバインドされ、クエリに直接埋め込まれることはありません。カーソルを継続して使用するには、ページネーションを行う呼び出し間で search の値を同一に保つ必要があります。
detailed(デフォルトは false)でレスポンスの形式を切り替えます。
- Brief(デフォルト) —
materializedViewsは、マテリアライズドビュー名のみを格納したソート済みの JSON 配列です。マテリアライズドビュー名はスキーマ内で一意のため、重複はありません。 - Detailed(
detailed: true) —materializedViewsはマテリアライズドビュー名のみをキーとする JSON オブジェクトです。各値には、schema、owner、description(COMMENT ON MATERIALIZED VIEWがない場合はnull)、definition(pg_matviews.definitionから取得した SELECT 本文をそのまま格納)、populated(WITH NO DATAで作成され、一度もリフレッシュされていないマテリアライズドビューではfalse)、indexed(インデックスが1つ以上存在する場合はtrue)が含まれます。REFRESH MATERIALIZED VIEW CONCURRENTLYには、一意インデックスも必要です。詳細モードでは、意図的に列メタデータ、tablespace、ストレージパラメーター、一意インデックスの検出を省略します。これらの情報はdefinition、listTables(detailed=true)、またはpg_indexesに対するreadQueryで取得できます。ソース列と運用上の仕様については、listMaterializedViewsのリファレンスを参照してください。
反復処理の詳細については、カーソルページネーションを参照してください。
readQuery
読み取り専用の SQL クエリ(SELECT、SHOW、DESCRIBE、USE、EXPLAIN)を実行します。多層防御として、常に SQL 検証を適用します。パラメーター:query、database、cursor。SELECT の結果は cursor / nextCursor によるページネーションに対応しています。SHOW、DESCRIBE、USE、EXPLAIN は1ページのみを返し、cursor を無視します。反復処理の詳細については、カーソルページネーションを参照してください。
writeQuery
書き込みを行う SQL クエリ(INSERT、UPDATE、DELETE、CREATE、ALTER、DROP)を実行します。読み取り専用モードが無効の場合にのみ利用できます。パラメーター:query、database。
createDatabase
データベースが存在しない場合に作成します。読み取り専用モードが無効の場合にのみ利用できます。SQLite では利用できません。パラメーター:database。
dropDatabase
既存のデータベースを削除します。現在接続中のデータベースは削除できません。読み取り専用モードが無効の場合にのみ利用できます。SQLite では利用できません。パラメーター:database。
dropTable
データベースからテーブルを削除します。テーブルに外部キー依存先がある場合、データベースのエラーがユーザーに表示されます。PostgreSQL では、cascade パラメーターを指定すると CASCADE で強制的に削除できます。読み取り専用モードが無効の場合にのみ利用できます。パラメーター:database、table、cascade(PostgreSQL のみ)。
explainQuery
SQL クエリの実行計画を返します。実際の実行統計を取得するためのオプションの analyze パラメーターをサポートしています(PostgreSQL および MySQL/MariaDB)。読み取り専用モードでは、クエリを実際に実行するため、EXPLAIN ANALYZE は読み取り専用ステートメントに対してのみ許可されます。SQLite では EXPLAIN QUERY PLAN が使用されます(ANALYZE はサポートされません)。読み取り専用モードにかかわらず、常に利用できます。パラメーター:query、database、analyze(PostgreSQL/MySQL のみ)。
セキュリティ 🔒
- 読み取り専用モード(デフォルト) — 書き込みツールは AI アシスタントに表示されません。
readQueryでは AST ベースの SQL 検証が適用されます - 単一ステートメントの強制 — 複数ステートメントのインジェクションを解析時にブロックします
- 危険な関数のブロック —
LOAD_FILE()、INTO OUTFILE、INTO DUMPFILEを AST で検出します - 識別子の検証 — データベース名とテーブル名について、制御文字と空文字列を検証します
- HTTP ベアラー認証 —
HTTP_AUTH_TOKENによりAuthorization: Bearer <token>を強制します(定数時間比較を使用し、認証失敗時は 401 を返します)。ループバック以外のアドレスにバインドする場合、トークンがなければ起動を拒否します - Origin と Host の許可リスト — サーバー側での拒否(403)に加え、CORS プリフライトを適用します。HTTP トランスポートで設定可能です。ブラウザーを利用した DNS リバインディング攻撃を防ぎますが、認証の代わりにはなりません
- SSL/TLS — 個別の
DB_SSL_*変数で設定します - SSH ホストキー検証 — SSH トンネルはサーバーキーを
known_hostsと照合します(デフォルトはyes)。SSH パスワードとパスフレーズがログに記録されることはありません - PII のマスキング(オプトイン、デフォルトではオフ) — 有効にすると、クエリツールの出力は正規表現ベースのマスカーを通過し、検出された PII の範囲を、7 つのカテゴリにわたる46 種類の組み込みエンティティタイプ(個人情報(メールアドレス)、金融情報(カード、IBAN、英国の銀行口座、ソートコード、米国 ABA ルーティングコード、CVV)、政府発行 ID(SSN、ITIN、EIN、英国/米国のパスポート、NHS、NINO、SIN、VAT)、連絡先(電話番号)、ネットワーク(IP、URL、MAC)、デジタル ID(API キー、JWT、PEM 秘密鍵、パスワードハッシュ)、暗号資産ウォレット)を対象に書き換えます。切り替え:
--pii/PII_ENABLE。演算子:--pii-operator/PII_OPERATOR—replace(デフォルト。<EMAIL_ADDRESS>のようなエンティティ対応のプレースホルダー)、mask(長さを維持した*)、redact(削除)、hash(SHA-256 の 16 進数表記)のいずれかです。--pii-categories/PII_CATEGORIESで対象を任意のサブセットに限定できます(カンマ区切り。例:financial,government)。未設定の場合は、すべての組み込みタイプが有効になります。対象範囲:クエリツールの出力ペイロードのみです。詳細については、PII の設定を参照してください。 - ML/NER によるマスキング(実行時のオプトイン、デフォルトではオフ) — 正規表現では検出できない
PERSON、LOCATION、ORGANIZATION、NATIONALITY_RELIGION_POLITICS、FACILITYを追加で検出します。有効にするには、--pii-ner/PII_NER_ENABLEの切り替えに加えて、ユーザーが用意したモデルディレクトリが必要です。検出されるエンティティはモデルのラベルに応じて異なります(CoNLL モデルでは人物/場所/組織が検出され、OntoNotes クラスのモデルでは NRP と施設も追加されます)。推論には ONNX Runtime を使用します(モデルディレクトリにはconfig.json、tokenizer.json、model.onnxが必要です。推奨モデル:MIT ライセンスのdslim/bert-base-NERを ONNX にエクスポートし、高速化のため int8 量子化したもの)。フェイルクローズ方式です。読み込めないモデルがあると起動を中止し、推論エラーが発生するとリクエストを失敗させます。黙ってフォールバックすることはありません。--pii-categoriesの設定が適用されます。v1 では英語に対応しています。 - 認証情報のマスキング — データベースのパスワードがログやデバッグ出力に表示されることはありません
テスト 🧪
# Unit tests
cargo test --workspace --lib --bins
# Integration tests (requires Docker)
./tests/run.sh
# Filter by engine
./tests/run.sh --filter mariadb
./tests/run.sh --filter mysql
./tests/run.sh --filter postgres
./tests/run.sh --filter sqlite
# With MCP Inspector
npx @modelcontextprotocol/inspector ./target/release/dbmcp stdio
# HTTP mode testing
curl -X POST http://localhost:9001/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0.1"}}}'
プロジェクト構成 🗂️
これは、次のクレートで構成される Cargo ワークスペースです。
| クレート | パス | 説明 |
|---|---|---|
dbmcp | . (ルート) | バイナリのシム |
dbmcp-cli | crates/cli/ | CLI の解析、トランスポート、サーバーの起動 |
dbmcp-sql | crates/sql/ | 共通のエラー型、検証、識別子ユーティリティ |
dbmcp-config | crates/config/ | 設定用構造体と検証 |
dbmcp-server | crates/server/ | 共通の MCP ツール実装とサーバー情報 |
dbmcp-mysql | crates/mysql/ | MySQL/MariaDB バックエンドのハンドラーと操作 |
dbmcp-postgres | crates/postgres/ | PostgreSQL バックエンドのハンドラーと操作 |
dbmcp-sqlite | crates/sqlite/ | SQLite バックエンドのハンドラーと操作 |
dbmcp-pii | crates/pii/ | クエリ出力における PII の検出と匿名化 |
dbmcp-sql-lineage | crates/sql-lineage/ | 列レベルの SQL リネージ抽出 |
dbmcp-ssh | crates/ssh/ | データベース接続用 SSH トンネル |
sqlx-json | crates/sqlx-json/ | sqlx 向けの型安全な行から JSON への変換(RowExt トレイト) |
開発 🧰
cargo build # Development build
cargo build --release # Release build (~7 MB)
cargo test # Run tests
cargo clippy --workspace --tests -- -D warnings # Lint
cargo fmt # Format
cargo doc --no-deps # Build documentation
ライセンス 📄
このプロジェクトは MIT ライセンスの下でライセンスされています。詳細は LICENSE ファイルをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。