はじめに
ここ一年でClaude DesktopなどをはじめとするMCP対応AIツールとMCPサーバーを組み合わせ、DBに対してLLMを活用したクエリ作成、データ検索などLLM利用の関心が高まっていると非常に感じます。
MySQLにもMCPサーバーがいくつかあるのですが、単一のDBインスタンスとしか接続できないというものが多く、複数の検証環境のDBに同時にアクセスして検索できると良いのになぁと考えていました。
今回、軽量かつ安全に複数のMySQLインスタンスにアクセスしLLMを利用できるmysql-mcp-server というMySQL専用のMCPサーバーを実際に触ってみたので、ご紹介したいと思います。
本MCPサーバーの開発者はAlkin Tezuysal氏で、2025 Oracle ACE PRO などを受賞されているMySQL界隈を牽引されている方です。
検証環境の構成
今回の検証環境の全体構成は以下の通りです。
Claude DesktopからWLS2上のMCPサーバーを経由し、ローカル環境のMySQLとOCI上のMDSに対して問い合わせできる構成としています。

検証環境の前提条件
- Claude Desktop が Windows にインストール済みであること
- WSL2 に Oracle Linux 8.10 がインストール済みであること
- Oracle Linux 8.10 にMySQL がインストールされていること
- OCI の MySQL インスタンスがローカル環境からアクセス可能であること
mysql-mcp-sever の特徴
- MySQL 8.0、8.4、9.0以降をサポート
- 完全に読み取り専用
- SELECT/SHOW/DESCRIBE/EXPLAIN以外のすべてをブロック
- マルチDSN構成をサポート
- 複数のMySQLインスタンスに接続し、問い合わせが可能
- ベクトル検索をサポート
- MySQL 9.0以降を対象にベクトル列への類似検索が可能
- Claude Desktop MCPとのネイティブ統合
- クエリタイムアウトや接続プールの設定
- 構造化ログ、監査ログの出力
mysql-mcp-server 環境構築
mysql-mcp-server インストール
インストール方法はgithubで公開されています。
今回は、WLS2上に githubからバイナリを clone してインストールしました。
MCPサーバー用MySQLユーザーの作成
SELECT 権限のみ持つユーザーが推奨ユーザーとなっています。
|
1 2 |
CREATE USER 'mcp'@'localhost' IDENTIFIED BY 'P_ssw0rd'; GRANT SELECT ON *.* TO 'mcp'@'localhost'; |
また、MySQL HeatWave インスタンスでユーザー作成する場合は、localhostではなくホストのIPアドレスを指定する必要がありますので注意してください。
|
1 |
CREATE USER 'mcp'@'%' IDENTIFIED BY 'P_ssw0rd'; |
Claude Desktop 設定
Claude Desktop の設定ファイル:claude_desktop_config.json に以下の設定を追記します。
今回はWSL2上で mysql-mcp-sever を起動する設定です。
設定する環境変数が多かったので、 start.sh で環境変数設定と MCP サーバー起動を行うようにしています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
"mcpServers": { "mysql": { "command": "wsl", "args": [ "-d", "OracleLinux_8_10", "-e", "bash", "-c", "cd /home/user/mysql-mcp-server && ./start.sh" ] } } |
start.sh(環境変数設定とMCPサーバーを起動スクリプト)は以下の通りです。各環境変数については後程説明します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/bash ### 環境変数の設定 ### ## ローカルのMySQLの設定 export MYSQL_DSN_1="mcp:P_ssw0rd@tcp(localhost:3306)/world?parseTime=true" export MYSQL_DSN_1_NAME="World" export MYSQL_DSN_1_DESC="World database" ## OCI上のMySQL HeatWaveの設定 export MYSQL_DSN_2="mcp:P_ssw0rd@tcp(1.2.3.4:3306)/heatwave?parseTime=true" export MYSQL_DSN_2_NAME="heatwave" export MYSQL_DSN_2_DESC="heatwave database" ## ベクター検索有効化 export MYSQL_MCP_VECTOR=1 ## 拡張ツール有効化 export MYSQL_MCP_EXTENDED=1 ## 監査ログのパス設定&有効化 export MYSQL_MCP_AUDIT_LOG=/var/log/mysql-mcp-audit.jsonl ## 接続設定 export MYSQL_MAX_ROWS=200 export MYSQL_QUERY_TIMEOUT_SECONDS=30 ### MCPサーバー起動 ### ./bin/mysql-mcp-server |
設定可能な環境変数についてはgithub のドキュメントをご確認ください。
claude_desktop_config.json の設定後は Claude Desktopを再起動し設定を反映させます。
これでMCPサーバーを経由して、MySQLにアクセスできるようになりました。ここからは便利な機能について使ってみたのでご紹介します。
マルチDSN構成
mysql-mcp-server では、マルチDSN構成を設定することで複数の MySQLインスタンスにアクセスすることができます。
設定方法は接続させたいDBごとに環境変数を設定するだけです。詳細はgithub のドキュメントをご確認ください。
ここでは、 ローカルのMySQLへの接続を World、MySQL HeatWaveへの接続を sakilaと名付けています。
|
1 2 3 4 5 6 7 8 9 |
## ローカルのMySQLの設定 export MYSQL_DSN_1="mcp:P_ssw0rd@tcp(localhost:3306)/world?parseTime=true" export MYSQL_DSN_1_NAME="World" export MYSQL_DSN_1_DESC="World database" ## OCI上のMySQL HeatWaveの設定 export MYSQL_DSN_2="mcp:P_ssw0rd@tcp(1.2.3.4:3306)/sakila?parseTime=true" export MYSQL_DSN_2_NAME="sakila" export MYSQL_DSN_2_DESC="sakila database" |
マルチDNS構成にすることで複数のDBからデータを検索してくれるようになります。
下記画像では、sakilaデータベース(OCI上のMySQL HeatWave)に接続していたが、関連する情報があるWorldデータベース(ローカルのMySQL)へ自動的に接続を切り替えて検索していることがわかります。

また、デフォルトの接続先DBは「環境変数で最初に設定したDNS情報のDB」となります。
問い合わせ自体は、同じクエリをブロードキャスト的に複数のDBに送信するのではなく、単一の接続先DBに対してクエリを実行します。
そのため、最初の接続先で問い合わせがヒットしないと問い合わせが失敗することがあります。
(下記画像では、デフォルトの接続先DBにデータがなかったため問い合わせが失敗したケース)

そこで、Claude Desktopと組み合わせて使用する場合、「以降の質問は全てアクセスできるデータベースから検索して回答してください」 と指示しておくことで、質問に応じてLLM側でデータベースを切り替えて検索してくれるので非常に便利です。

また複数のDBに同じようなデータがあると「現在接続しているDBから検索を始め、ヒットした段階で検索を終了し回答する」場合があります。全てのデータベースを走査したい場合「全てのデータベースから調べてください。」などと指示しておくと全データベースに接続してくれます。
REST APIモード
ChatGPT、Gemini、または任意の HTTP クライアントで使用するために、HTTP REST API モードを有効にすることも可能です。
環境変数は以下のように設定します。
|
1 2 |
export MYSQL_MCP_HTTP=1 # REST API モードを有効化 export MYSQL_HTTP_PORT=9306 # REST API モードの HTTP ポート |
使用できる API エンドポイントは github のドキュメント をご確認ください。
注意事項として、マルチDNS構成を設定していてもリクエストは「現在の接続中のDB」に対してのみ送信されます。
一回のリクエストでDBを横断的に検索することは出来ないため、DBを跨ぐ問い合わせをする場合は接続DBを切り替えた上で再度問い合わせが必要です。
|
1 2 3 4 |
### 接続先DBをheatwaveデータベースに切り替え $ curl -X POST http://localhost:9306/api/connections/use -H "Content-Type: application/json" -d '{"name": "heatwave"}' #### 以降、heatwaveデータベースに問い合わせる |
ベクトル検索
mysql-mcp-sever ではベクトル列に対する類似性検索をサポートしています。
MySQL Heatwave ではベクトル関数の DISTANCE 関数が使用できるため、ベクトル列に対する類似検索が可能になります。
環境変数を以下のように設定し、ベクトル検索を有効化します。
|
1 |
export MYSQL_MCP_VECTOR=1 |
Clauede Desktop で「cherry という単語に最も近い単語を5件表示してください」と質問すると、実行クエリ内でDISTANCE関数を使用し類似検索を実行してくれます。

REST API の場合、"query":[0.1, 0.2, 0.3]の部分に検索したいベクトル値をセットし、/api/vector/search エンドポイントにリクエストします。
|
1 2 3 4 5 6 7 8 9 10 |
curl -X POST http://localhost:9306/api/vector/search \ -H "Content-Type: applicatio/json" \ -d '{"database": "heatwave", \ "table": "items", \ "column": "embedding", \ "query": [0.1, 0.2, 0.3], \ "limit": 5, \ "select": "id, name", \ "distance_func": "cosine" \ }' |
MyVectorプラグインを使用したベクトル検索
MySQL 公式ドキュメントにもあるように、DISTANCE関数は MySQL HeatWave でのみ使用可能で、MySQL Community エディションやMySQL Enterprise エディションでは使用できません。
DISTANCE() is available only for users of HeatWave MySQL on OCI; it is not included in MySQL Commercial or Community distributions.
そのため、通常これらのエディションではベクトル検索ができないのですが、MyVector というサードパーティーのプラグインをインストールすることでカスタムベクトル関数が使用できるようにします。
(インストール方法などの詳細はgithubのドキュメントをご確認ください。)
ただし、MyVectorをインストールしても類似検索を試みると以下のエラーが発生します。
|
1 |
{"success":false,"error":"vector search failed (MySQL 9.0+ required): Error 1370 (42000): execute command denied to user 'mcp'@'localhost' for routine 'world.DISTANCE'"} |
どうやら mysql-mcp-server では、ベクトル検索では DISTANCE 関数の使用を試みるため、MySQL内に定義されてない場合はエラーになるようです。(MyVectorプラグインでインストールされるのは myvector_distance関数)
そこで、少し手間ですが LLM に MyVector プラグインのカスタムベクトル関数を提示することで、きちんとカスタムベクトル関数を使用してベクトル検索ができるようになります。
これで MySQL Community エディションでもベクトル検索ができるようになります。

また、REST API の Vector エンドポイント/api/vector/searchを使用する場合も同様のエラーが発生します。
REST API で MyVectorプラグインを使ったベクトル検索を行う場合は、/api/queryエンドポイントからmyvector_distance関数を使用したクエリを実行するしかなさそうです。
|
1 2 3 |
curl -X POST http://localhost:9306/api/quey \ -H "Content-Type: applicatio/json" \ -d '{"sql": "myvector_distance関数を使ったクエリ", "database":"データベース"}' |
拡張ツール
mysql-mcp-server では SHOW/DESCRIBE/EXPLAIN コマンドが拡張ツールとして有効化でき、SELECT文の実行計画を取得したり、テーブル定義、インデックス一覧出力が可能になります。
有効化しておくことで LLM が質問に応じてこれらの情報を利用して回答できるようになるため基本的に有効化しておくことをオススメします。
|
1 |
export MYSQL_MCP_EXTENDED=1 |
クエリタイムアウト / 最大行数制御
実行時間が長いクエリや巨大な結果セットが返却されるクエリが実行されても、無駄にリソースを消費しないよう制御設定が行えます。
|
1 2 |
export MYSQL_MAX_ROWS=200 # 最大行数 export MYSQL_QUERY_TIMEOUT_SECONDS=30 # タイムアウト秒数 |
Claude Desktopでは(設定次第ですが)生成クエリを事前に確認してから実行できますが、実行してみたら実は予想以上に実行時間が掛かるものだったというケースもあり得ると思うので、このようなセーフティーがあるのは安心です。
私はClaude Desktopの設定としてクエリ実行を「常に許可」しているので、問い合わせをするとLLMが自動でどんどんクエリ実行してしまうので、安心できます。
まとめ
マルチDNS構成とMySQLの関数を使用したベクトル検索ができる点は非常に便利だと感じました。
サービスごとに異なるMySQLインスタンスに分かれているケース、検証環境ごとにMySQLインスタンスが分かれているケースなどにおいて、複数のMySQLインスタンスを切り替えてアクセスできるのは使い勝手の良さに繋がるかと思います。
特にClaude Desktop と連携することで、LLM側で自動的に接続先DBを切り替えて検索してくれるので、いちいち接続を切り替える手間がかからないのも良かったです。
機会がありましたら是非、mysql-mcp-server を使って検証してみて下さい。

