AI 助手也能安全查 PostgreSQL:推荐一个开源的 PostgreSQL MCP Server
AI 助手也能安全查 PostgreSQL:推荐一个开源的 PostgreSQL MCP Server

如果你已经开始在日常开发中使用 AI 助手,很可能会遇到一个很现实的问题:AI 能写 SQL,但它怎么安全地访问真实数据库?
直接把数据库连接暴露给 AI 客户端,风险太高;只让 AI 根据人类复制粘贴的数据做分析,又太低效。这个时候,MCP(Model Context Protocol)就很适合做中间层:它把数据库能力包装成一组可控工具,让 AI 客户端通过工具访问数据,而不是随意碰数据库。
今天推荐的这个项目,就是一个面向 PostgreSQL 的 MCP 服务:
项目名:postgresql-mcp-server
它基于 FastMCP 和 psycopg 构建,通过环境变量连接 PostgreSQL,并用 database + schema 双层白名单 控制 AI 助手可以访问的范围。
为什么值得关注?
很多数据库 MCP 工具只解决了“能不能连上”的问题,但真正落到开发、测试、运维和数据分析场景时,更关键的是:
- AI 能不能只访问允许的 database?
- AI 能不能只访问指定 schema?
- AI 执行 SQL 时能不能拦住危险语句?
- 是否可以一键开启只读模式?
- 多个 MCP 服务同时接入时,工具名是否足够清晰?
postgresql-mcp-server 的核心思路很直接:让 AI 具备数据库上下文,同时把边界提前定义清楚。

PostgreSQL 的访问层级天然是:
PostgreSQL server / cluster
└── database
└── schema
└── table / view / index / function ...
所以这个服务也把当前上下文设计成:
current_database + current_schema
切换 database 时重新建立连接;切换 schema 时在当前 database 内设置 search_path。这比单纯传一个连接串更清晰,也更适合在 AI 工具调用中表达边界。
核心亮点
1. 支持多 database 访问
很多 PostgreSQL 项目并不是只有一个 database。比如业务库、报表库、审计库可能分开管理。
这个项目支持在白名单内切换 database:
appdb
default schema: app
allowed schemas: app, public
reportdb
default schema: reporting
allowed schemas: reporting, analytics
auditdb
default schema: audit
allowed schemas: audit, archive
AI 助手可以通过 pg_switch_database 切换到允许访问的 database,但不能越过配置边界。
2. database + schema 双层白名单
项目不是只做 database 级别控制,而是继续细化到 schema:
$env:POSTGRES_ALLOWED_DATABASES="appdb,reportdb,auditdb"
$env:POSTGRES_DATABASE_SCHEMAS="appdb:app,public;reportdb:reporting,analytics;auditdb:audit,archive"
这意味着:
appdb下只能访问app、publicreportdb下只能访问reporting、analyticsauditdb下只能访问audit、archive
对于有多租户、多业务域、报表隔离、权限边界要求的项目,这个设计非常实用。
3. 可开启只读模式
如果你只希望 AI 助手帮你查询、解释、分析数据,而不希望它修改数据,可以开启只读模式:
$env:POSTGRES_READ_ONLY="true"
开启后,pg_execute_sql 仅允许以下语句类型:
SELECTWITHEXPLAINSHOW
这对生产环境旁路查询、数据分析助手、BI 辅助排查等场景尤其友好。
4. 内置 SQL 安全审计
项目在执行 SQL 前会做安全检查,降低 MCP 自动化场景中的误操作风险。
它会拦截:
- 多语句执行,例如
SELECT ...; DROP TABLE ... - SQL 注释注入
- 跨 schema 访问
CALL、DO、EXEC、GRANT、REVOKE等高风险语句- 角色、用户、数据库、扩展、函数、过程、触发器、策略等对象的高风险 DDL
同时,它允许常见查询中的别名、CTE、子查询和列限定符,避免安全策略过于粗暴影响正常使用。
5. 工具命名清晰,全部使用 pg_ 前缀
当一个 AI 客户端同时接入多个 MCP 服务时,工具名很容易混在一起。这个项目里的工具统一以 pg_ 开头,一眼就能看出它们属于 PostgreSQL。

工具列表
| 工具 | 作用 |
|---|---|
pg_test_connection |
测试当前 database + schema 上下文是否可连接 |
pg_get_current_context |
查看当前 database、schema、白名单和只读状态 |
pg_list_databases |
列出允许访问的 database |
pg_switch_database |
切换当前 database,可选同时切换 schema |
pg_list_schemas |
列出指定 database 或当前 database 中可见的非系统 schema |
pg_switch_schema |
在当前 database 内切换 schema |
pg_execute_sql |
执行 SQL,查询返回 data 和 count,写入返回 affected_rows |
pg_list_tables |
列出指定上下文下的表和视图 |
pg_describe_table |
查看表字段、数据类型、是否可空、默认值、主键标记 |
pg_count_tables |
统计指定上下文下的普通表数量 |
快速开始
项目使用 uv 管理依赖,安装很简单:
uv sync
启动服务:
uv run postgresql-mcp-server
如果是单 database 场景,可以这样配置:
$env:POSTGRES_HOST="127.0.0.1"
$env:POSTGRES_PORT="5432"
$env:POSTGRES_USER="postgres"
$env:POSTGRES_PASSWORD="your_password"
$env:POSTGRES_DEFAULT_DATABASE="appdb"
$env:POSTGRES_DEFAULT_SCHEMA="app"
$env:POSTGRES_ALLOWED_DATABASES="appdb"
$env:POSTGRES_DATABASE_SCHEMAS="appdb:app,public"
$env:POSTGRES_READ_ONLY="false"
uv run postgresql-mcp-server
如果是多 database、多 schema 场景,可以这样配置:
$env:POSTGRES_HOST="127.0.0.1"
$env:POSTGRES_PORT="5432"
$env:POSTGRES_USER="postgres"
$env:POSTGRES_PASSWORD="your_password"
$env:POSTGRES_DEFAULT_DATABASE="appdb"
$env:POSTGRES_DEFAULT_SCHEMA="app"
$env:POSTGRES_ALLOWED_DATABASES="appdb,reportdb,auditdb"
$env:POSTGRES_DATABASE_SCHEMAS="appdb:app,public;reportdb:reporting,analytics;auditdb:audit,archive"
$env:POSTGRES_DATABASE_DEFAULT_SCHEMAS="appdb:app;reportdb:reporting;auditdb:audit"
$env:POSTGRES_READ_ONLY="false"
uv run postgresql-mcp-server
MCP 客户端配置示例
如果你在 MCP 客户端中使用,可以参考下面的配置:
{
"mcpServers": {
"postgresql_mcp_server": {
"command": "uvx",
"args": ["postgresql-mcp-server@latest"],
"env": {
"POSTGRES_HOST": "127.0.0.1",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "your_password",
"POSTGRES_DEFAULT_DATABASE": "appdb",
"POSTGRES_DEFAULT_SCHEMA": "app",
"POSTGRES_ALLOWED_DATABASES": "appdb,reportdb",
"POSTGRES_DATABASE_SCHEMAS": "appdb:app,public;reportdb:reporting,analytics",
"POSTGRES_DATABASE_DEFAULT_SCHEMAS": "appdb:app;reportdb:reporting",
"POSTGRES_READ_ONLY": "false",
"POSTGRES_LOG_LEVEL": "INFO"
}
}
}
}
如果你还在本地开发,没有发布到包仓库,也可以让客户端在项目目录中通过 uv run 启动:
{
"mcpServers": {
"postgresql_mcp_server": {
"command": "uv",
"args": ["run", "postgresql-mcp-server"],
"cwd": "E:/PycharmProjects/postgresql-mcp-server",
"env": {
"POSTGRES_HOST": "127.0.0.1",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "your_password",
"POSTGRES_DEFAULT_DATABASE": "appdb",
"POSTGRES_DEFAULT_SCHEMA": "app",
"POSTGRES_ALLOWED_DATABASES": "appdb,reportdb",
"POSTGRES_DATABASE_SCHEMAS": "appdb:app,public;reportdb:reporting,analytics"
}
}
}
}
可以用它做什么?
场景一:AI 数据库排查助手
当线上出现问题时,AI 助手可以通过 MCP 工具查看表结构、执行只读查询、解释结果,帮助开发者快速定位问题。配合 POSTGRES_READ_ONLY=true,可以把风险控制在查询范围内。
场景二:开发环境 SQL 助手
在开发环境中,AI 可以帮你:
- 查看当前 schema 下有哪些表
- 描述某张表的字段和主键
- 分页查询样例数据
- 根据实际表结构辅助生成 SQL
这比让 AI 凭空猜字段名可靠得多。
场景三:报表库和业务库隔离
通过 database + schema 白名单,可以让 AI 访问报表库的 reporting、analytics schema,同时不暴露业务库里的敏感 schema。
场景四:团队内部 MCP 能力建设
如果你的团队正在把 AI 工具接入研发流程,这个项目可以作为数据库能力的基础组件。它的工具边界清晰,配置方式直观,也适合二次扩展。
和直接连接数据库相比,它好在哪里?
直接把数据库连接给 AI 客户端,相当于把所有风险都放到提示词约束里。但提示词不是权限系统。
这个项目的思路是把关键限制落在服务端:
- database 访问范围由环境变量决定
- schema 访问范围由白名单决定
- SQL 执行前经过安全审计
- 只读模式由服务端判断
search_path使用 psycopg 的安全标识符处理
换句话说,AI 助手可以更聪明,但数据库边界仍然应该由程序和权限来守。
小结
postgresql-mcp-server 是一个非常适合开发者尝试 MCP 数据库接入的开源项目。它没有把重点只放在“连上数据库”,而是进一步考虑了真实使用中的安全边界、上下文切换和工具可读性。
如果你正在做以下事情,它值得试一下:
- 给 AI 助手接入 PostgreSQL
- 在开发或测试环境中构建数据库查询助手
- 希望 AI 能理解真实表结构,而不是凭空生成 SQL
- 想用 MCP 做企业内部工具集成
- 需要 database/schema 级别的访问边界
项目地址:
https://github.com/CleanCodeStar/postgresql-mcp-server
欢迎 Star、试用、提 Issue,也欢迎基于它扩展更多 PostgreSQL 场景能力。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)