前置条件
- 1已安装 Node.js 18 及以上版本(提供 npx 命令)
- 2已安装 Claude Code CLI(claude 命令可用)
- 3有一个可连接的 PostgreSQL 数据库(本地或远程均可)
- 4拥有数据库管理员权限,能创建只读账号
Claude Code 接入 PostgreSQL MCP 完整指南
本教程将带你把 PostgreSQL MCP Server 接入 Claude Code,让 AI 能够直接读取你的数据库结构、执行只读查询、生成报表 SQL 并给出索引优化建议。
配置完成后,你不再需要手动导出 CSV、粘贴建表语句、截图结果集——直接用自然语言描述需求,Claude 会自己去看表、写 SQL、跑查询、解释结果。
为什么要用 MCP 直连数据库
在写代码或排查线上问题时,最常见的卡点是「AI 不知道你的表长什么样」。传统做法与 MCP 方案的对比:
| 环节 | 传统做法 | 接入 PostgreSQL MCP 后 |
|---|---|---|
| 让 AI 了解表结构 | 手动复制建表 DDL 粘贴给 AI | AI 自己读取 schema,零手工搬运 |
| 写业务查询 | 人工描述字段,AI 猜字段类型 | AI 按真实字段与类型写 SQL |
| 验证 SQL 正确性 | 自己复制到数据库客户端执行 | AI 直接执行并返回结果集 |
| 排查数据问题 | 反复在客户端和对话框之间切换 | 一次对话内完成查数、归因、给结论 |
| 索引优化 | 凭经验判断 | 结合 pg_stat 统计信息给出建议 |
MCP(Model Context Protocol)本质是一套标准协议,让 AI 客户端以统一方式调用外部工具。数据库是它最适合落地的场景之一。
步骤一:检查运行环境
在开始配置前,先确认四个命令都能正常输出。
1node -v # 建议 v18 及以上
2npx -v # Node 自带,用于拉取 MCP Server
3claude --version # 确认 Claude Code CLI 已安装
4pg_isready -h localhost -p 5432 # 确认数据库可连通,正常返回 accepting connections提示
💡 提示:如果 claude 命令不存在,先执行 npm install -g @anthropic-ai/claude-code 安装 Claude Code,安装后用 claude login 完成授权。
步骤二:创建专用的只读数据库账号
这一步是整套方案的安全基石:永远不要用 superuser 或应用主账号连接 MCP。
用管理员账号登录数据库,创建一个只能读、不能写的专用角色:
1-- 1. 创建只读角色(请替换为强密码)
2CREATE ROLE claude_readonly LOGIN PASSWORD '换成强密码';
3
4-- 2. 允许连接目标库
5GRANT CONNECT ON DATABASE mydb TO claude_readonly;
6
7-- 3. 允许读取 public schema
8GRANT USAGE ON SCHEMA public TO claude_readonly;
9
10-- 4. 授予现有所有表的只读权限
11GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
12
13-- 5. 未来新建的表也自动可读,避免以后反复授权
14ALTER DEFAULT PRIVILEGES IN SCHEMA public
15 GRANT SELECT ON TABLES TO claude_readonly;验证只读是否生效:
1psql "postgresql://claude_readonly:你的密码@localhost:5432/mydb" -c "\dt"警告
⚠️ 警告:如果是生产库,强烈建议连接到只读副本(read replica)或脱敏后的 staging 库,而不是主库。AI 执行的是真实查询,一个没加 LIMIT 的全表扫描就可能拖慢线上业务。
步骤三:注册 PostgreSQL MCP Server
推荐用命令行添加,无需手工编辑配置文件。
1claude mcp add postgres -s user -- \
2 npx -y @modelcontextprotocol/server-postgres \
3 "postgresql://claude_readonly:你的密码@localhost:5432/mydb"命令拆解:
postgres— 这个 MCP Server 在本机的名字,后面/mcp里显示的就是它-s user— 作用域,可选local(当前项目,默认)、project(写入.mcp.json随仓库共享)、user(当前用户全局可用)--— 分隔符,后面的内容全部当作启动命令- 最后一段是数据库连接串
三种作用域怎么选
| 作用域 | 写入位置 | 适用场景 |
|---|---|---|
local | 本地会话配置 | 个人临时调试,不进版本库 |
project | 项目根目录 .mcp.json | 团队共享同一套数据源配置 |
user | 用户级配置 | 所有项目共用的个人数据库 |
提示
💡 提示:连接串里带明文密码,用 -s project 时务必确认 .mcp.json 已加入 .gitignore,否则密码会进版本库。更稳妥的做法是把连接串放进环境变量,配置里引用 ${POSTGRES_DSN}。
如果偏好手写配置,等价的 .mcp.json 写法如下:
1{
2 "mcpServers": {
3 "postgres": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "@modelcontextprotocol/server-postgres",
8 "postgresql://claude_readonly:你的密码@localhost:5432/mydb"
9 ]
10 }
11 }
12}远程数据库需要 SSL 时,在连接串末尾追加参数:
1postgresql://claude_readonly:密码@db.example.com:5432/mydb?sslmode=require步骤四:验证连接状态
1claude mcp list启动 Claude Code 并进入交互界面,输入 /mcp 查看所有 MCP Server 的实时状态。
成功
✅ 成功标志:postgres 后面显示 connected,并能看到它提供的 query 工具。若显示 failed,说明连接串或网络有问题,先回到步骤二用 psql 手工验证一遍。
步骤五:第一次提问
现在直接用自然语言提问,Claude 会自己调用 MCP 工具去探索数据库:
帮我看一下 public schema 下有哪些表,挑出订单相关的表,说明它的字段、类型和索引
接入后可以稳定使用的四类能力:
| 能力 | 说明 |
|---|---|
| 列出表 | 自动枚举指定 schema 下的所有表 |
| 读取表结构 | 返回字段名、类型、是否可空、注释 |
| 执行只读查询 | 运行 SELECT 语句并返回结果集 |
| 结构分析 | 基于真实数据给出索引与查询优化建议 |
场景应用示例
场景1:自动生成业务报表
使用示例:
统计最近 30 天每天的订单量和 GMV,按日期升序输出,并标出环比下跌超过 30% 的日期
预期效果:
- 自动识别订单表的时间字段与金额字段类型
- 生成带 date_trunc 的分组聚合 SQL 并执行
- 用窗口函数计算环比,直接标出异常日期
- 结果以表格形式返回,并附上可能的归因分析
场景2:慢查询与索引优化
使用示例:
1这条 SQL 跑了 8 秒,帮我看看执行计划,给出索引优化建议:
2SELECT * FROM orders WHERE user_id = 123 AND status = 'paid' ORDER BY created_at DESC LIMIT 20;预期效果:
- 读取目标表的现有索引定义
- 基于字段选择性判断应建复合索引及字段顺序
- 给出可直接执行的 CREATE INDEX 语句
- 说明索引带来的写入代价,避免盲目加索引
场景3:数据核对与异常排查
使用示例:
orders 表和 payments 表按 order_id 关联,帮我找出有订单但没有支付记录的脏数据,统计数量并列出前 10 条
预期效果:
- 自动判断两表的关联字段与外键关系
- 用 LEFT JOIN 或 NOT EXISTS 找出缺失记录
- 返回数量统计与样本数据
- 给出数据补全或清理的建议方案
场景4:把表结构转成代码
使用示例:
读一下 users 表的结构,帮我生成对应的 TypeScript 类型定义和一个带分页的查询函数
预期效果:
- 精确映射 Postgres 类型到 TypeScript(含可空字段)
- 生成完整的 interface 定义与分页查询函数
- 自动补上参数校验与总条数统计
- 代码可直接复制到项目中使用
安全红线
数据库接入 AI 是强能力,也是高风险操作,以下五条建议务必遵守:
| 风险 | 正确做法 |
|---|---|
| 账号权限过大 | 使用 SELECT-only 的专用账号,绝不用 superuser |
| 直连生产主库 | 连只读副本或 staging 库,隔离线上流量 |
| 密码进版本库 | .mcp.json 加 .gitignore,或用环境变量注入 |
| 全表扫描拖垮库 | 提问时明确时间范围,要求 AI 查询必须带 LIMIT |
| 敏感数据外泄 | 手机号、身份证等字段在库层做视图脱敏后再授权 |
警告
⚠️ 警告:官方的 @modelcontextprotocol/server-postgres 只提供只读查询,任何写操作都会被拒绝。这是刻意的安全设计,不要为了图方便替换成可执行写操作的第三方 server。
常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Failed to connect | 连接串错误或数据库未启动 | 用 psql 手工验证同一连接串 |
| spawn npx ENOENT | Node.js 未安装或不在 PATH | 重装 Node.js 并重启终端 |
| password authentication failed | 密码错误或 pg_hba.conf 未放行 | 检查密码,确认客户端 IP 在白名单 |
| 看不到任何表 | 缺少 USAGE 或 SELECT 授权 | 补执行 GRANT 语句并确认 schema 名 |
| SSL required | 云厂商强制 SSL | 连接串追加 ?sslmode=require |
| 查询长时间无响应 | 全表扫描或锁等待 | 加时间范围与 LIMIT,避开业务高峰 |
进阶玩法
- 多数据源并行:用不同名字添加多个 server(如
postgres_orders、postgres_users),Claude 会在同一轮对话中自动选择对应数据源 - 远程 MCP 服务:企业内可自建 HTTP MCP 服务,用
claude mcp add team-db --url https://mcp.company.com/postgres接入,统一管控凭据 - 与 Filesystem MCP 组合:一边读库一边读写代码文件,让 Claude 直接生成与表结构同步的 Repository 层代码
- 沉淀 SQL 片段库:把高频查询整理成
.sql文件放进项目,配合 Filesystem MCP 让 AI 直接复用
提示
💡 提示:MCP 生态更新很快,建议定期执行 claude mcp list 检查已配置的 server,并关注官方仓库的更新日志获取新能力。
使用示例
1自动生成业务报表
使用示例
统计最近 30 天每天的订单量和 GMV,按日期升序输出,并标出环比下跌超过 30% 的日期预期效果
自动识别订单表的时间字段与金额字段类型 生成带 date_trunc 的分组聚合 SQL 并执行 用窗口函数计算环比,直接标出异常日期 结果以表格形式返回,并附上可能的归因分析
2慢查询与索引优化
使用示例
这条 SQL 跑了 8 秒,帮我看看执行计划,给出索引优化建议:
SELECT * FROM orders WHERE user_id = 123 AND status = 'paid' ORDER BY created_at DESC LIMIT 20;预期效果
读取目标表的现有索引定义 基于字段选择性判断应建复合索引及字段顺序 给出可直接执行的 CREATE INDEX 语句 说明索引带来的写入代价,避免盲目加索引
3数据核对与异常排查
使用示例
orders 表和 payments 表按 order_id 关联,帮我找出有订单但没有支付记录的脏数据,统计数量并列出前 10 条预期效果
自动判断两表的关联字段与外键关系 用 LEFT JOIN 或 NOT EXISTS 找出缺失记录 返回数量统计与样本数据 给出数据补全或清理的建议方案
4把表结构转成代码
使用示例
读一下 users 表的结构,帮我生成对应的 TypeScript 类型定义和一个带分页的查询函数预期效果
精确映射 Postgres 类型到 TypeScript(含可空字段) 生成完整的 interface 定义与分页查询函数 自动补上参数校验与总条数统计 代码可直接复制到项目中使用
常见问题
Q执行 claude mcp list 显示连接失败(Failed to connect)怎么办?
先用 psql 或 pg_isready 用同一串连接串手工连一次,确认账号密码与端口无误。常见原因是密码中含有 @ # : 等特殊字符未做 URL 编码,请改用百分号编码(如 @ 写成 %40),或改用环境变量传连接串。远程库还需确认 pg_hba.conf 允许你的 IP 访问。
Q提示 spawn npx ENOENT 是什么问题?
Claude Code 找不到 npx,说明 Node.js 未安装或不在系统 PATH 中。执行 node -v 与 npx -v 检查;Windows 用户若在 Git Bash 中安装,请改用官方安装包重装 Node.js 并重启终端。
QMCP 连上了,但 Claude 说看不到任何表?
多半是权限没给全。确认已执行 GRANT USAGE ON SCHEMA 与 GRANT SELECT ON ALL TABLES,且 schema 名不是 public 时要换成实际 schema。另外只读账号默认看不到其他 schema 下的表,需要显式授权。
Q可以让 Claude 直接写库、改数据吗?
官方 server-postgres 只暴露只读查询能力,任何 INSERT、UPDATE、DROP 都会被拒绝。这是刻意的安全设计,不要为了图方便去换用可执行写操作的第三方 server。确实需要写库时,让 Claude 生成 SQL 脚本,人工审核后在 psql 中执行。