使用说明
sql-mcp
一个模型上下文协议(MCP)服务器,允许Claude检查PostgreSQL 数据库模式,并使用自然语言运行只读查询。
它做什么
| 工具 | 说明 |
|---|---|
list_tables |
列出所有表/视图(名称、列数、主键) |
describe_table |
一个表的完整架构:列、类型、PK、FK |
run_query |
执行只读SQL查询,以表的形式返回结果 |
get_full_schema |
将整个模式转储为JSON(用于复杂的多表查询) |
建筑
Claude Desktop
│ MCP (stdio)
▼
sql_mcp/server.py ← MCP server, 4 tools, async SQLAlchemy engine
└── database.py ← async engine, schema introspection, safe run_select
关键设计决策:
- 异步端到端 --SQLAlchemy异步引擎+asyncpg驱动程序意味着每个数据库
呼叫无阻塞。不
asyncio.to_thread()需要(与devops-mcp不同)。 - 只读执行 —
run_select()拒绝任何不符合以下条件的声明 从...开始SELECT / WITH / EXPLAIN / TABLE在它到达DB之前。 - 排帽 --结果上限为
MAX_QUERY_ROWS(默认值500)以防止 避免失控的查询淹没上下文窗口。 - 架构筛选 —
ALLOWED_SCHEMAS限制Claude可以使用哪些模式 看,这样您就可以安全地将其指向生产数据库。
需求
- Python 3.11+
- 紫外线 包管理器
- Docker(用于演示Postgres容器)
设置
git clone https://github.com/Kamalesh-Kavin/sql-mcp
cd sql-mcp
# Install dependencies
uv sync
# Copy and fill in your DB URL
cp .env.example .env
启动演示数据库(一次性)
# Create network + volume
docker network create sql_mcp_network
docker volume create sql_mcp_data
# Start Postgres on port 5434
# (5433 may be taken by a local Postgres instance on macOS)
docker run -d \
--name sql-mcp-db \
--network sql_mcp_network \
-v sql_mcp_data:/var/lib/postgresql/data \
-e POSTGRES_USER=sql_mcp_user \
-e POSTGRES_PASSWORD=sql_mcp_pass \
-e POSTGRES_DB=sql_mcp_demo \
-p 5434:5432 \
postgres:16
# Seed the e-commerce demo schema
uv run python -m sql_mcp.seed
运行烟雾测试
uv run python smoke_test.py
所有6个测试部分都应打印 PASS.
连接到克劳德桌面
增添 ~/Library/Application Support/Claude/claude_desktop_config.json:
"sql-assistant": {
"command": "/Users/yourname/.local/bin/uv",
"args": [
"--directory", "/path/to/sql-mcp",
"run", "sql-mcp"
]
}
重新启动Claude Desktop,然后尝试:
- “列出数据库中的所有表”
- “描述订单表”
- “按总支出显示前5位客户”
- “每个状态下有多少个订单?”
- “哪些产品从未被订购过?”
演示模式
users ──< orders ──< order_items >── products
| 表 | 说明 |
|---|---|
users |
来自8个国家的8位客户 |
products |
4个类别的10个产品 |
orders |
10个订单状态(待定/已支付/已发货/已取消) |
order_items |
16个将订单与产品关联起来的行项目 |
环境变量(.env)
| 变量 | 默认值 | 描述 |
|---|---|---|
DATABASE_URL |
-- | asyncpg连接URL(postgresql+asyncpg://...) |
ALLOWED_SCHEMAS |
public |
要公开的逗号分隔模式;空白=全部 |
MAX_QUERY_ROWS |
500 |
对每个查询返回的行设置硬上限 |