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

在这里插入图片描述

项目地址:CleanCodeStar/postgresql-mcp-server

如果你已经开始在日常开发中使用 AI 助手,很可能会遇到一个很现实的问题:AI 能写 SQL,但它怎么安全地访问真实数据库?

直接把数据库连接暴露给 AI 客户端,风险太高;只让 AI 根据人类复制粘贴的数据做分析,又太低效。这个时候,MCP(Model Context Protocol)就很适合做中间层:它把数据库能力包装成一组可控工具,让 AI 客户端通过工具访问数据,而不是随意碰数据库。

今天推荐的这个项目,就是一个面向 PostgreSQL 的 MCP 服务:

项目名:postgresql-mcp-server

它基于 FastMCPpsycopg 构建,通过环境变量连接 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 下只能访问 apppublic
  • reportdb 下只能访问 reportinganalytics
  • auditdb 下只能访问 auditarchive

对于有多租户、多业务域、报表隔离、权限边界要求的项目,这个设计非常实用。

3. 可开启只读模式

如果你只希望 AI 助手帮你查询、解释、分析数据,而不希望它修改数据,可以开启只读模式:

$env:POSTGRES_READ_ONLY="true"

开启后,pg_execute_sql 仅允许以下语句类型:

  • SELECT
  • WITH
  • EXPLAIN
  • SHOW

这对生产环境旁路查询、数据分析助手、BI 辅助排查等场景尤其友好。

4. 内置 SQL 安全审计

项目在执行 SQL 前会做安全检查,降低 MCP 自动化场景中的误操作风险。

它会拦截:

  • 多语句执行,例如 SELECT ...; DROP TABLE ...
  • SQL 注释注入
  • 跨 schema 访问
  • CALLDOEXECGRANTREVOKE 等高风险语句
  • 角色、用户、数据库、扩展、函数、过程、触发器、策略等对象的高风险 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,查询返回 datacount,写入返回 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 访问报表库的 reportinganalytics 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 场景能力。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐