メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
データベースにクエリする必要のある AI エージェントは、通常、手書きのツールやサイドカープロセスを通してデータベースと会話します。vsql_mcp 拡張機能はその層を取り除きます。VillageSQL プロセス自体の内部で Model Context Protocol サーバーを実行するため、あらゆる MCP クライアントがスキーマを発見し、クエリを直接実行できます。

vsql_mcp の機能

vsql_mcp は Rust 製の拡張機能で、サーバープロセス内のバックグラウンドワーカーから、Streamable HTTP トランスポート(仕様リビジョン 2025-06-18)で MCP を提供します。6 つのツールを公開します: list_schemas、list_tables、describe_table、query、explain、および write です。write ツールは有効にした場合にだけ現れ、デフォルトでは無効です。 vsql_mcp はプレビュー拡張機能です。VEF のプレビュー機能である thread_worker、sys_var、status_var、および sql_query を使うため、サーバーはプレビュー拡張機能を許可して起動する必要があります。
インストールの前にフラグを確認します。

サンプルデータの作成

このガイドでは、エージェントがクエリできる実在のものとして、専用のデータベースと小さな posts テーブルを使います。

拡張機能のインストール

インストールすると、その設定変数とステータス変数が登録されます。次のセクションで有効にするまで、どのポートでも待ち受けは始まりません。

最小権限アカウントの作成

vsql_mcp は、query、write、explain、およびテーブル DDL リソースを含むほとんどのツール呼び出しを、設定したアカウントを使ってサーバーへのループバック接続で実行します。そのアカウントなしでプロセス内で実行されるのは、list_schemas、list_tables、および describe_table だけです。このガイドが使う 1 つのデータベースに範囲を絞った、SELECT のみの専用アカウントを作成します。
このアカウントの権限が、実際のアクセス境界です。後述する vsql_mcp 自身のガードレールは、これらの権限の代わりではなく、その上に重ねて適用されます。

サーバーの設定と有効化

vsql_mcp のすべての設定は SET GLOBAL vsql_mcp.<name> 変数です。db_url を上で作成したアカウントに向け、サーバーを 1 つのスキーマに絞り、ベアラートークンを必須にして、有効にします。
待ち受けていることを確認します。
http_port はデフォルトの 3100 を示しています。サーバーは http://127.0.0.1:3100/mcp で待ち受け、127.0.0.1 にのみバインドします。リモート接続を直接受け付けることはありません。それが必要なら、リバースプロキシの背後に置くのはあなたの責任です。

サーバーが MCP を話すことの検証

実際のクライアントを接続する前に、MCP のハンドシェイクで HTTP エンドポイントを直接検証します。ベアラートークンのないリクエストは拒否されます。
トークンがあれば initialize は成功し、Mcp-Session-Id ヘッダーを返します。
この接続での以降のすべてのリクエストには、このセッション ID が必要です。省略すると、黙ってデフォルトになるのではなく、JSON-RPC エラーで失敗します。
notifications/initialized を送ってから、initialize のレスポンスから得たセッション ID を使って、利用可能なツールを一覧にします。
一覧にあるのは 6 つではなく 5 つのツールです。allow_write がまだ OFF なので write はなく、今接続するエージェントは、使えないツールを前提に計画を立てることがありません。

MCP 経由でのツールの呼び出し

list_tables は、公開されたスキーマにある 1 つのテーブルを示します。
query は SELECT を実行し、実際の行を返します。
これは posts テーブルの実際のサンプルデータで、直接の SQL 接続ではなく MCP プロトコルを通して返されたものです。 query は単一の読み取り専用ステートメントしか受け付けません。それ以外は、データベースに届く前に拒否されます。

実際のクライアントの接続

上の手順は、サーバーが生の HTTP クライアントに正しく応答することを証明します。エージェントが実際に使えることを証明するには、サーバーを Claude Code に登録し、セッションの管理を任せます。
local config は、サーバーをこの 1 つのプロジェクトに限定します。すべてのプロジェクトで使えるようにするには、代わりに --scope user を渡します。claude mcp list は接続状態を示します。
Claude Code は自身で initialize のハンドシェイクを行い、セッションをネゴシエートし、サーバーが MCP で応答することを確認しました。このガイドが SET GLOBAL ステートメントで設定し、上で手作業でテストしたのと同じサーバーです。ここからは、mcp_guide データベースについてエージェントに質問すると、curl で示したとおりに list_tables、describe_table、および query を経由します。 vsql_mcp に stdio トランスポートはありません。サーバーはデータベースプロセス内で動くため、クライアントが起動する子プロセスはありません。stdio しか話せないクライアントや、ベンダーのクラウド経由でプロキシされて 127.0.0.1 に到達できないリモートクライアントには、エンドポイントの前に stdio から HTTP へのブリッジかトンネルが必要です。

write ツール

allow_write はデフォルトで OFF で、オフのまま write を呼び出すと、データベースに触れることなく即座に失敗します。
allow_write を ON にすると、ツールは tools/list に現れますが、アカウント自身の権限は引き続き適用されます。mcp_user がまだ SELECT しか持っていないため、同じ呼び出しは今度はデータベース層で失敗します。
データベースに対する UPDATE を付与すると、同じ呼び出しが通り、実際に行が変更されます。
allow_write とアカウントの権限は 2 つの別々のゲートで、実際の書き込みには両方が開いている必要があります。max_rows が読み取りを制限するような行数の上限は、書き込みにはありません。条件のない DELETE は、他のどの設定に関わらずテーブルを空にします。本番データベースへの書き込みアクセスを持つエージェントは、広い書き込みアクセスを持つ他の自律プロセスと同じリスクを伴います。エージェントにとっては筋が通っていてもあなたにとってはそうでない計画に基づいて、人間のレビュー手順が捕まえるより速く行動する可能性があります。db_url には、受け入れられる影響範囲に正確に一致する権限を持つアカウントを与え、allow_write は、デモで必要だったからと放置するデフォルトではなく、データベースごとに下す決定として扱ってください。 このガイドでは、先に進む前に allow_write をオフに戻し、UPDATE を取り消します。これは、エージェントが常時アクセスできるデータベースにとって、より安全な通常状態でもあります。

エージェントの到達範囲を絞る

2 つの設定が、アカウントの権限だけよりもさらにエージェントの到達範囲を絞ります。1 つのアカウントが vsql_mcp 以外にも使われている場合に役立ちます。 max_rows は、1 回の query 呼び出しが返す行数を制限し、結果に truncated の印を付けます。
allowed_tables は、ステートメントが触れてよいテーブルを制限します。これは、EXPLAIN FORMAT=JSON でステートメントの実行計画を作成することで検査されます。2 つ目のテーブルを追加して、適用されるところを見てみます。
同じスキーマに secrets があり、allowed_tables を posts のみに設定した状態では、posts は引き続き動き、secrets は拒否されます。
list_tables も除外されたテーブルの名前を出さなくなるため、list_tables だけを頼りに作業するエージェントは、secrets の存在を知ることがありません。
この許可リストの判定は、アカウントの権限から読み取るのではなく、ステートメントの実行計画に含まれるテーブルに基づいて行われます。そのため、ストアド関数の中までは見通せず、db_url のアカウントが呼び出せる関数を読み取りツールが呼ぶことも止めません。allowed_tables と max_rows は、アカウントの権限の上に重ねるガードレールとして扱い、権限そのものを絞ることの代わりにはしないでください。

よくある質問

エージェントはデータベースの認証情報に直接アクセスする必要がありますか?

いいえ。エージェントは、vsql_mcp.bearer_token に設定したベアラートークンで vsql_mcp に対して認証します。vsql_mcp.db_url が指定するデータベースアカウントは、拡張機能がツールのクエリを実行するために内部でだけ使われます。エージェントがそのアカウントのパスワードを見ることはありません。

複数のスキーマを公開できますか?

はい。ただし、vsql_mcp.schema を空のままにすると、予想以上のものが公開されます。その場合 list_schemas は、mysql、sys、および performance_schema を含むサーバー上のすべてのスキーマを返し、db_url のアカウントが到達できるものでフィルタリングしません。この一覧は、アカウントの接続経由ではなく、プロセス内で information_schema.SCHEMATA に対して実行されるためです。発見の範囲を制限するのは、vsql_mcp.schema を 1 つのスキーマに絞ることです。query と write が実際に読めるものは引き続きアカウントの権限が決めるため、一覧にあるスキーマが必ずしも読めるとは限りません。

vsql_mcp は TLS をサポートしていますか?

はい。vsql_mcp.ssl_cert と vsql_mcp.ssl_key の両方に PEM ファイルのパスを設定すると、vsql_mcp.ssl_port(デフォルト 3143)で HTTPS を提供します。どちらか一方を空にすると、ポート設定に関わらず TLS はオフになります。

ポートの変更がすぐに反映されないのはなぜですか?

ポートと TLS の設定は、次にサーバーを有効にしたときに反映されます。変更した後、vsql_mcp.vsql_mcp_enabled を OFF にしてから ON に切り替えてください。

トラブルシューティング

関連項目