🚀 Database MCP Server
データベースへの安全なアクセスを提供する読み取り専用のModel Context Protocol (MCP)サーバーです。
🚀 クイックスタート
ソースコードからのビルド
make
使用方法
db-mcp --driver=mysql --dsn="user:password@tcp(host:3306)/database?parseTime=true"
db-mcp --driver=postgres --dsn="host=localhost port=5432 user=user password=pass dbname=test sslmode=disable" --transport=http --http-port=8080
✨ 主な機能
- 複数のデータベースサポート: MySQL, PostgreSQL, SQLite, SQL Server, TiDB, GaussDB, ClickHouse
- 読み取り専用アクセス: SELECT、SHOW、DESCRIBE、EXPLAIN、USE操作のみ許可
- 2種類の伝送モード: stdio (ローカル) と Streamable HTTP (リモート)
- SQLセキュリティ保護: インジェクション防止、複数文の阻止、危険な関数の検出
- クエリ制限: 結果セットの制限、タイムアウト保護
📦 インストール
コマンドライン引数
| 引数 |
説明 |
デフォルト値 |
--driver |
データベースドライバ (mysql/postgres/sqlite/sqlserver/tidb/gaussdb/clickhouse) |
必須 |
--dsn |
データベース接続文字列 |
必須 |
--max-results |
最大返却行数 |
1000 |
--timeout |
クエリのタイムアウト秒数 |
30 |
--transport |
伝送方式 (stdio/http) |
stdio |
--http-port |
HTTPサービスのポート |
8080 |
--name |
MCPサーバー名 |
db-mcp |
--version |
サーバーバージョン |
1.0.0 |
--log-level |
ログレベル (debug/info/warn/error) |
info |
サポートされるデータベース
| データベース |
DSNの例 |
| MySQL |
user:pass@tcp(host:3306)/db?parseTime=true |
| TiDB |
user:pass@tcp(host:4000)/db?parseTime=true |
| PostgreSQL |
host=localhost port=5432 user=user dbname=test sslmode=disable |
| GaussDB |
host=localhost port=5432 user=user dbname=test sslmode=disable |
| SQLite |
file:/path/to/database.db または :memory: |
| SQL Server |
sqlserver://host:1433;database=db;user=user;password=pass;encrypt=disable |
| ClickHouse |
tcp://host:9000 |
💻 使用例
基本的な使用法
MCPツール
1. list_tables
データベース内のすべてのテーブルをリストします。
{
"tool": "list_tables",
"arguments": {}
}
2. describe_table
指定されたテーブルの構造情報を取得します。
{
"tool": "describe_table",
"arguments": {
"table_name": "users"
}
}
3. execute_query
読み取り専用のSQLクエリを実行します。
{
"tool": "execute_query",
"arguments": {
"query": "SELECT * FROM users WHERE active = 1 LIMIT 10"
}
}
4. get_table_sample
テーブルのサンプルデータを取得します。
{
"tool": "get_table_sample",
"arguments": {
"table_name": "users",
"limit": 5
}
}
5. get_table_count
テーブルの行数をカウントします。
{
"tool": "get_table_count",
"arguments": {
"table_name": "users"
}
}
高度な使用法
IDEの設定
Claude Desktop
{
"mcpServers": {
"db-mcp": {
"command": "/path/to/db-mcp",
"args": [
"--driver=mysql",
"--dsn=root:password@tcp(localhost:3306)/testdb?parseTime=true"
]
}
}
}
Cursor IDE
{
"mcpServers": {
"db-mcp": {
"command": "/path/to/db-mcp",
"args": [
"--driver=postgres",
"--dsn=host=localhost port=5432 user=postgres dbname=test"
]
}
}
}
HTTP伝送モード
Streamable HTTPモードを使用すると、HTTPを介してMCPサービスにアクセスできます。
db-mcp --driver=postgres --dsn="host=localhost port=5432 user=postgres dbname=test" --transport=http --http-port=8080
クライアントのアクセスエンドポイント: http://localhost:8080/mcp
🔧 技術詳細
セキュリティ
読み取り専用アクセス制限
以下のSQL操作のみ許可されます:
SELECT - データのクエリ
SHOW - データベース情報の表示
DESCRIBE / EXPLAIN - テーブル構造とクエリプランの確認
USE - データベースの切り替え
自動的に阻止される操作
| タイプ |
キーワード |
| データ変更 |
INSERT, UPDATE, DELETE, REPLACE, MERGE |
| テーブル構造 |
DROP, TRUNCATE, ALTER, CREATE, RENAME |
| 権限制御 |
GRANT, REVOKE |
| システム操作 |
EXEC, EXECUTE, CALL, LOAD |
| ファイル操作 |
INTO OUTFILE, INTO DUMPFILE |
| トランザクション制御 |
BEGIN, COMMIT, ROLLBACK, SAVEPOINT |
| 危険な関数 |
SLEEP, BENCHMARK, LOAD_FILE |
SQLインジェクション防止
- SQLコメント (
-- と /* */) を自動的に削除
- 複数文の実行を阻止 (
;)
- 疑わしいパターンを検出
クエリ制限
- 結果セットのサイズに自動的に
LIMIT を追加
- 設定可能なクエリタイムアウト
プロジェクト構造
db-mcp/
├── cmd/
│ └── main.go # アプリケーションのエントリーポイント
├── internal/
│ ├── config/
│ │ └── config.go # 設定管理
│ ├── database/
│ │ ├── connection.go # データベース接続
│ │ ├── readonly.go # 読み取り専用クエリのラッパー
│ │ └── sql_validator.go # SQLバリデータ
│ ├── mcp/
│ │ └── tools.go # MCPツールの定義
│ └── server/
│ └── server.go # MCPサーバーのラッパー
├── go.mod
├── go.sum
├── Makefile
└── README.md
依存関係
- Go 1.25.7+
- github.com/mark3labs/mcp-go v0.43.2
- gorm.io/gorm v1.31.1
- gorm.io/driver/mysql v1.6.0
- gorm.io/driver/postgres v1.5.4
- gorm.io/driver/sqlite v1.6.0
- gorm.io/driver/sqlserver v1.6.0
- gorm.io/driver/clickhouse v0.7.0
- github.com/spf13/cobra v1.9.1
📄 ライセンス
MIT