MCP Database Server について
MCP Database Serverは、自然言語クエリとデータベース操作を通じて、AIエージェントにPostgreSQLおよびMySQLへのアクセスを提供します。スキーマ確認、読み取り専用のクエリ検証、APIキー保護を備えています。
主な機能
- 01PostgreSQLとMySQLに対応
- 02自然言語からSQLへの変換
- 03テーブル一覧とスキーマ確認
- 04読み取り専用クエリの検証
- 05APIキー保護付きエンドポイント
活用シーン
- 01自然言語でリレーショナルデータを検索
- 02クエリ前にテーブルと列を確認
- 03エージェントに制限付きの読み取り専用アクセスを提供
MCP 対応
MCPクライアントに、テーブル一覧、スキーマ詳細、サンプルデータ、自然言語クエリなどのデータベース操作を提供します。データベース操作用のHTTPエンドポイントも備えています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e DATABASE_URL docker.io/souhardyak/mcp-db-server:1.3.1DATABASE_URLDatabase connection URL. Defaults to local SQLite in /data/default.db.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
mcp-db-server
自然言語によるクエリに対応し、リレーショナルデータベース(PostgreSQL/MySQL)を AI エージェントに公開する MCP(Model Context Protocol)サーバーです。自然言語の質問を SQL クエリに変換し、構造化された結果を取得できます。
機能
- マルチデータベース対応:PostgreSQL と MySQL で動作します
- 自然言語から SQL へ:HuggingFace transformers を使用して、通常の英語のクエリを SQL に変換します
- RESTful API:データベース操作のための、FastAPI ベースのシンプルなエンドポイントを提供します
- 安全性を最優先:クエリの検証と結果数の制限を備えた読み取り専用の操作です
- Docker 対応:Docker Compose による完全なコンテナ化に対応しています
- 本番環境対応:ヘルスチェック、ロギング、エラー処理を備えています
- AI エージェントに最適:AI エージェントとの連携に特化して設計されています
バージョン 1.4.0 の変更点
- すべてのデータベース HTTP エンドポイントに必須の
X-API-Key認証を追加しました。ヘルスチェック用の/healthは引き続き公開されています。 - 認証情報付きの無制限な CORS を削除し、許可するオリジンを明示的に設定できるようにしました。
- HTTP のデフォルトバインドアドレスを
127.0.0.1に変更しました。 - テーブルルート経由の SQL インジェクションを防ぐため、既存のデータベーステーブルに対するテーブル名の検証を追加しました。
asyncpg接続で PostgreSQL のsslmode=requireとの互換性を追加しました。- 安全な API キー設定に対応するため、Docker Compose、環境変数の例、ドキュメントを更新しました。
- Docker イメージを公開しました:
souhardyak/mcp-db-server:1.4.0souhardyak/mcp-db-server:latest
- 次のイメージを GitHub Container Registry に公開する機能を追加しました:
ghcr.io/souhar-dya/mcp-db-server:1.4.0ghcr.io/souhar-dya/mcp-db-server:latest
API エンドポイント
| エンドポイント | メソッド | 説明 |
|---|---|---|
/health | GET | ヘルスチェックとサービスの状態 |
/mcp/list_tables | GET | 利用可能なすべてのテーブルと列数を一覧表示 |
/mcp/describe/{table_name} | GET | 特定のテーブルのスキーマ詳細を取得 |
/mcp/query | POST | 自然言語クエリを実行 |
/mcp/tables/{table_name}/sample | GET | テーブルのサンプルデータを取得 |
クイックスタート
オプション 1:Docker Compose(推奨)
-
クローンしてサービスを起動します:
git clone https://github.com/Souhar-dya/mcp-db-server.git cd mcp-db-server export MCP_API_KEY="$(openssl rand -hex 32)" docker-compose up --build -
エンドポイントをテストします:
# Health check curl http://localhost:8000/health # List tables (requires the configured API key) curl -H "X-API-Key: $MCP_API_KEY" http://localhost:8000/mcp/list_tables # Describe a table curl -H "X-API-Key: $MCP_API_KEY" http://localhost:8000/mcp/describe/customers # Natural language query curl -X POST "http://localhost:8000/mcp/query" \ -H "X-API-Key: $MCP_API_KEY" \ -H "Content-Type: application/json" \ -d '{"nl_query": "show top 5 customers by total orders"}'
オプション 2:ローカル開発
-
前提条件:
- Python 3.11+
- PostgreSQL または MySQL データベース
-
依存関係をインストールします:
pip install -r requirements.txt -
環境変数を設定します:
export DATABASE_URL="postgresql+asyncpg://user:password@localhost:5432/dbname" export MCP_API_KEY="$(openssl rand -hex 32)" # or for MySQL: # export DATABASE_URL="mysql+pymysql://user:password@localhost:3306/dbname" -
サーバーを実行します:
python -m app.server
サンプルデータベース
このプロジェクトには、現実的な e コマースデータを含むサンプルデータベースが付属しています:
- customers:顧客情報(サンプル顧客 10 件)
- orders:注文記録(サンプル注文 17 件)
- order_items:注文ごとの個別商品
- order_summary:注文データと顧客データを組み合わせたビュー
自然言語クエリの例
このサーバーは、さまざまな種類の自然言語クエリを理解できます:
# Get all customers
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "show all customers"}'
# Count orders by status
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "count orders by status"}'
# Top customers by order value
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "top 5 customers by total order amount"}'
# Recent orders
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "show recent orders from last week"}'
設定
環境変数
| 変数 | 説明 | デフォルト |
|---|---|---|
DATABASE_URL | データベース接続 URL 全体 | postgresql+asyncpg://postgres:postgres@localhost:5432/postgres |
DB_HOST | データベースのホスト | localhost |
DB_PORT | データベースのポート | 5432 |
DB_USER | データベースのユーザー名 | postgres |
DB_PASSWORD | データベースのパスワード | postgres |
DB_NAME | データベース名 | postgres |
HOST | サーバーのホスト | 127.0.0.1 |
PORT | サーバーのポート | 8000 |
MCP_API_KEY | データベースの HTTP ルートに必要な API キー | 未設定(API は無効) |
CORS_ALLOW_ORIGINS | 許可するブラウザーのオリジン(カンマ区切り) | 空(無効) |
データベース接続の例
# PostgreSQL
DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/mydb
# MySQL
DATABASE_URL=mysql+pymysql://user:pass@localhost:3306/mydb
# PostgreSQL with SSL
DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/mydb?sslmode=require
### Database Connection Examples
```bash
# PostgreSQL (local or cloud)
DATABASE_URL=postgresql+asyncpg://user:password@host:5432/dbname
# MySQL (local or cloud)
DATABASE_URL=mysql+aiomysql://user:password@host:3306/dbname
# PostgreSQL with SSL (cloud, e.g. Neon, Supabase, Aiven)
DATABASE_URL=postgresql+asyncpg://user:password@host:5432/dbname?sslmode=require
# MySQL with SSL (cloud, e.g. Aiven, PlanetScale)
DATABASE_URL=mysql+aiomysql://user:password@host:3306/dbname?ssl-mode=REQUIRED
注:
- MySQL のクラウドプロバイダーでは、URL 内の
ssl-modeパラメーターはドライバーによって無視されますが、クラウド接続では MCP サーバーで SSL が常に有効になります。- PostgreSQL のクラウド DB では
sslmode=requireを使用してください。MySQL では標準の URL を使用するだけで構いません。SSL は自動的に処理されます。ssl-modeまたはsslmodeに関するエラーが表示された場合は、URL を確認し、正しいドライバーのプレフィックス(mysql+aiomysqlまたはpostgresql+asyncpg)を使用していることを確認してください。
クラウドデータベースの例
# Neon (PostgreSQL)
DATABASE_URL=postgresql+asyncpg://username:[email protected]/dbname
# Aiven (MySQL)
DATABASE_URL=mysql+aiomysql://avnadmin:[email protected]:11079/defaultdb?ssl-mode=REQUIRED
クラウド DB を使用した Docker の利用
docker run -d \
-p 8000:8000 \
-e DATABASE_URL="<your_cloud_database_url>" \
-e MCP_API_KEY="<your_random_api_key>" \
souhardyak/mcp-db-server:latest
GitHub Container Registry も利用できます:
docker login ghcr.io
docker pull ghcr.io/souhar-dya/mcp-db-server:latest
docker run -d \
-p 8000:8000 \
-e DATABASE_URL="<your_database_url>" \
-e MCP_API_KEY="$MCP_API_KEY" \
ghcr.io/souhar-dya/mcp-db-server:latest
v*.*.* タグをプッシュすると、イメージが自動的に公開されます。このワークフローでは、対応する GitHub Release も作成されます。v1.4.0 などの既存のタグを公開するには、ワークフローの Run workflow アクションを開き、1.4.0 を入力してください。認証なしでプルできるようにする場合は、リポジトリの Packages 設定で GHCR パッケージの公開範囲を Public に設定してください。
トラブルシューティング
connect() got an unexpected keyword argument 'ssl-mode'が表示された場合は、無視してください。SSL は引き続き有効です。- ネットワークエラーが発生した場合は、ファイアウォールと DB の認証情報を確認してください。
- MySQL の非同期処理をサポートするには、URL で必ず
mysql+aiomysqlを使用してください。
### PostgreSQL SSL connection note
For PostgreSQL cloud providers, use an asyncpg URL and `sslmode=require`:
```bash
DATABASE_URL=postgresql+asyncpg://user:password@host:5432/dbname?sslmode=require
サーバーは sslmode=require を、asyncpg が必要とする ssl オプションに正規化します。互換性のあるクラウドデータベースに対して、CREATE、INSERT、SELECT、UPDATE、DELETE、DROP を使用した一時的な PostgreSQL の検証が正常に完了しました。テストデータは保持していません。実際のパスワードを含む接続 URL をコミットしたり、共有したりしないでください。
API キー認証
MCP_API_KEY は、生成してサーバーに設定する秘密情報です。リクエストヘッダー X-API-Key を通じて、すべてのデータベース HTTP エンドポイントを保護します。コンテナーのヘルスチェックに使用する /health エンドポイントは、引き続き公開されます。
Linux または macOS で強力なキーを生成します:
export MCP_API_KEY="$(openssl rand -hex 32)"
Windows PowerShell でキーを生成します:
$bytes = New-Object byte[] 32
[Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
$env:MCP_API_KEY = ([BitConverter]::ToString($bytes) -replace "-", "").ToLower()
キーを指定して Docker イメージを起動します:
docker run -d \
-p 8000:8000 \
-e DATABASE_URL="<your_database_url>" \
-e MCP_API_KEY="$MCP_API_KEY" \
souhardyak/mcp-db-server:latest
同じキーを使って、保護されたエンドポイントを呼び出します:
curl -H "X-API-Key: $MCP_API_KEY" http://localhost:8000/mcp/list_tables
キーはパスワードマネージャーまたはデプロイ用のシークレットストアに保管してください。Git にコミットしたり、公開イメージに含めたり、ログに記録したりしないでください。
セキュリティ機能
- 必須のHTTP認証:データベースAPIルートでは
X-API-Keyが必要です。/healthはヘルスチェック用に公開されたままです - 安全なネットワークのデフォルト設定:HTTPモードでは、明示的に別の設定をしない限り
127.0.0.1にバインドします - 制限付きCORS:オリジンを明示的に設定しない限り、クロスオリジンアクセスは無効です
- 読み取り専用操作:SELECTクエリのみ許可されます
- クエリの検証:危険なSQL操作を自動的に検出してブロックします
- 結果の制限:クエリごとに最大50行(設定可能)
- 入力のサニタイズ:SQLインジェクションを防止します
- 安全なデフォルト設定:初期状態から安全な構成になっています
アーキテクチャ
mcp-db-server/
├── app/
│ ├── __init__.py # Package initialization
│ ├── server.py # FastAPI application and endpoints
│ ├── db.py # Database connection and operations
│ └── nl_to_sql.py # Natural language to SQL conversion
├── .github/workflows/
│ └── docker-publish.yml # CI/CD pipeline
├── docker-compose.yml # Docker Compose configuration
├── Dockerfile # Container definition
├── init_db.sql # Sample database schema and data
├── requirements.txt # Python dependencies
└── README.md # This file
Model Context Protocol (MCP) との統合
このサーバーは、MCP対応のAIエージェントとシームレスに連携するよう設計されています。
- 標準化されたエンドポイント:MCPの規約に準拠したRESTful API
- 構造化されたレスポンス:AIでの利用に最適化されたJSONレスポンス
- エラー処理:一貫したエラーメッセージとステータスコード
- ドキュメント:OpenAPI/Swaggerドキュメントを
/docsで利用できます
VS Code MCP Store(レジストリ)への公開
VS Code MCPギャラリーでは、MCP Registryのメタデータが使用されます。このリポジトリには、レジストリへの公開用としてserver.jsonが含まれています。
1) Dockerイメージをビルドして公開する
docker build -t souhardyak/mcp-db-server:1.3.1 .
docker push souhardyak/mcp-db-server:1.3.1
2) サーバーメタデータを検証する
server.jsonは、OCIパッケージとstdioトランスポート用に構成されています。
name:io.github.Souhar-dya/mcp-db-serverregistryType:ociidentifier:docker.io/souhardyak/mcp-db-server:1.3.1
Dockerfileには、レジストリの所有者を示すアノテーションが含まれています。
io.modelcontextprotocol.server.name=io.github.Souhar-dya/mcp-db-server
3) MCP Registryに公開する
パブリッシャーをインストールし、メタデータを公開します。
mcp-publisher login github
mcp-publisher publish
公開後は、VS CodeのMCP機能など、レジストリを参照するMCP対応クライアントから検索・インストールできます。
4) VS Codeのローカル設定例
{
"servers": {
"mcp-db-server": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"DATABASE_URL=sqlite+aiosqlite:////data/default.db",
"souhardyak/mcp-db-server:1.3.1"
]
}
}
}
Dockerスモークテスト
tests/dockerにある専用のDockerスモークテストを使用します。
python tests/docker/smoke_test.py
このテストでは、Dockerデーモンへのアクセス、イメージのビルド、コンテナの起動、ヘルスステータスを検証します。
デプロイ
Docker Hub
# Pull the latest image
docker pull souhardyak/mcp-db-server:latest
# Run with your database
docker run -d \
-p 8000:8000 \
-e DATABASE_URL="your_database_url_here" \
souhardyak/mcp-db-server:latest
Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-db-server
spec:
replicas: 3
selector:
matchLabels:
app: mcp-db-server
template:
metadata:
labels:
app: mcp-db-server
spec:
containers:
- name: mcp-db-server
image: souhardyak/mcp-db-server:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
---
apiVersion: v1
kind: Service
metadata:
name: mcp-db-server-service
spec:
selector:
app: mcp-db-server
ports:
- port: 80
targetPort: 8000
type: LoadBalancer
テスト
ローカルでテストを実行する
# Start test database
docker-compose up postgres -d
# Wait for database to be ready
sleep 10
# Run tests
python -m pytest tests/ -v
手動テスト
# Test health endpoint
curl http://localhost:8000/health
# Test table listing
curl http://localhost:8000/mcp/list_tables
# Test natural language query
curl -X POST "http://localhost:8000/mcp/query" \
-H "Content-Type: application/json" \
-d '{"nl_query": "show me all customers from California"}'
コントリビューション
- リポジトリをフォークします
- 機能ブランチを作成します(
git checkout -b feature/amazing-feature) - 変更をコミットします(
git commit -m 'Add some amazing feature') - ブランチにプッシュします(
git push origin feature/amazing-feature) - プルリクエストを作成します
ライセンス
このプロジェクトはApache License 2.0の下でライセンスされています。詳細はLICENSEファイルをご覧ください。
📝 変更履歴
v1.3.0 (2025-12-24) - Dockerのパス修正
- 修正:Dockerコンテナ内のインポートパスの問題を解決しました。これにより、
from db import DatabaseManagerが失敗していました - 修正:Dockerfileとdocker-compose.ymlのヘルスチェックで、相対パスを絶対パスに変更しました
- 改善:
mcp_server.pyで堅牢なパス解決を使用するようになり、ローカル環境とDockerコンテナの両方で動作するようになりました - 更新:すべてのパス修正を含むDockerイメージを再ビルドしてプッシュしました
v1.2.0 (2025-11-03) - MySQLのカラムアクセス修正
- 修正:MySQLデータベースで発生する
Could not locate column in row for column 'column_name'エラーを解決しました - 修正:SQLAlchemyとの互換性を高めるため、
describe_tableメソッドでインデックスベースの行アクセスを使用するように変更しました - 改善:スキーマのイントロスペクションにおけるデータベース間の互換性を強化しました
- 解決:GitHub Issue #1
v1.1.0 (2025-09-28) - 非同期処理のバグ修正
- 修正:MCPサーバーで発生する
str can't be used in 'await' expressionエラーを解決しました - 改善:NLPクエリ処理がClaude Desktopとの統合で正しく動作するようになりました
- 強化:包括的なテスト用データベースセットアップスクリプトを追加しました
- 更新:バグ修正と依存関係の更新を含むDockerイメージを再ビルドしました
v1.0.0 (2025-09-25) - 初回リリース
- 初回:MCP データベースサーバーの完全な実装
- 追加:FastAPI を使用した RESTful API
- 追加:自然言語から SQL への変換
- 追加:Docker によるコンテナ化とデプロイ
- 追加:複数のデータベースをサポート(PostgreSQL、MySQL、SQLite)
謝辞
- 優れた Web フレームワークを提供する FastAPI
- 自然言語から SQL への変換機能を提供する HuggingFace Transformers
- データベース抽象化を提供する SQLAlchemy
- Model Context Protocol(MCP)コミュニティ
サポート
⭐ このプロジェクトがお役に立った場合は、ぜひスターを付けてください!
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。