😋

📘 MySQLと接続するMCPサーバーを作ってみた

に公開

はじめに

こちらの記事を読んで、「自分でもMCP Serverを使って何か作ってみたい!」という気持ちが湧きました。

そこで今回は、まず手軽に試せる題材として、ローカル環境のMySQLデータベースと接続するMCPサーバーを作ってみました。
自然言語でSQLを投げて、データベースの中身を読み取れたり、確認できたりすると便利だなと思ったのがきっかけです。

この記事では、そのMCPサーバーの構成や設定手順、実際にクエリを投げてみた結果、そして実装のポイントについて紹介します。

設定手順

https://github.com/nsh58/mcp-server-mysql/tree/main

以下の手順で開発環境をセットアップできます。

① 仮想環境を作成

uv venv

このコマンドを実行すると、カレントディレクトリに .venv/ フォルダが作成されます。

② 仮想環境をアクティブにする

source .venv/bin/activate

③ 依存パッケージをインストールする

uv pip install -r requirements.txt

このコマンドで、プロジェクトに必要なPythonライブラリが一括でインストールされます。

④ LLMアプリの設定ファイルに下記を追記します。

{
  "mcpServers": {
    "mysql": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/mcp-server-mysql",
        "run",
        "main.py"
      ],
      "env": {
        "MYSQL_HOST": "${db_host}",
        "MYSQL_PORT": "${db_port}",
        "MYSQL_USER": "${db_user}",
        "MYSQL_PASSWORD": "${db_password}",
        "MYSQL_DATABASE": "${db_name}"
      }
    }
}

⑤ LLMアプリを再起動

試してみた結果

ローカルでMySQLを起動してみます。

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=sample_db -p 13306:3306 -d mysql:lts

Claudeで実行してみます。

本当にデータが入っているか確認してみます。

入ってますね!

🛠改善点

現時点では、1回のリクエストで任意のSQLを直接実行できてしまう設計になっており、使い方によっては大量のクエリを一度に発行してしまうリスクがあります。

そのため、以下のような改善が必要です。

  • クエリの種類を限定する
    SELECT のみを許可し、UPDATEDELETE などの副作用を持つクエリはブロックする。

  • 複数ステートメントの制限
    セミコロン(;)で複数のクエリを一括実行することを防ぐ。sqlparse を使ってクエリを解析し、単一ステートメントのみ許可する。

  • クエリ実行前のバリデーション強化
    危険なキーワードの検出、構文エラーの事前検知など、事前チェックの仕組みを導入する。

  • 実行時間や負荷の制限
    タイムアウトや LIMIT の強制付与など、長時間実行されるクエリを防ぐ。

  • パラメータ付きクエリへの対応
    プレースホルダーとバインド変数を利用した安全なクエリ構築をサポートし、将来的な自動補完支援にもつなげる。


現状は「実験用」や「開発者向けツール」としての位置づけにとどまり、本番用途や一般ユーザー向けツールとしてはまだ実用的とは言いがたい状態です。今後はクエリ実行のガードレールを設け、安全性と信頼性の高い形へ進化させていくことが求められます。

Discussion