🚀 數據庫 MCP 服務器
一個只讀的 Model Context Protocol (MCP) 服務器,用於安全地訪問數據庫,支持多種數據庫,具備只讀訪問、雙傳輸模式、SQL 安全防護和查詢限制等特性。
🚀 快速開始
從源碼構建
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 操作,保障數據安全。
- 雙傳輸模式:支持 stdio (本地) 和 Streamable HTTP (遠程) 兩種傳輸模式。
- SQL 安全防護:具備註入防護、多語句阻止、危險函數檢測等功能。
- 查詢限制:有結果集限制和超時保護。
📦 安裝指南
從源碼構建
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
📚 詳細文檔
命令行參數
| 參數 |
說明 |
默認值 |
--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