Skip to main content
Glama
CleanCodeStar

PostgreSQL MCP Server

PostgreSQL MCP Server

Python 3.10+ License: MIT uv MCP

一个面向 PostgreSQL 的 Model Context Protocol (MCP) 服务。它基于 FastMCP 和 psycopg 构建,通过环境变量连接 PostgreSQL server,并以 database + schema 双层白名单 控制 MCP 客户端可以访问的范围。

PostgreSQL 的访问层级是:

PostgreSQL server / cluster
└── database
    └── schema
        └── table / view / index / function ...

因此本服务的当前上下文也是:

current_database + current_schema

切换 database 时会重新建立连接;切换 schema 时会在当前 database 内设置 search_path

功能特性

  • 🚀 面向 PostgreSQL server 的多 database 访问:允许在配置白名单内切换 database。

  • 🗂️ database + schema 双层白名单:每个 database 都有独立的 schema 白名单。

  • 🔐 安全的 search_path 设置:使用 psycopg 的 Identifier 处理 schema 名,避免手写拼接风险。

  • 🧰 清晰的 MCP 工具前缀:所有工具均以 pg_ 开头,便于和其他 MCP 服务共存。

  • 👁️ 只读模式:设置 POSTGRES_READ_ONLY=true 后,仅允许 SELECTWITHEXPLAINSHOW

  • 🛡️ SQL 安全审计:阻止多语句、注释注入、跨 schema 访问、权限变更、函数/过程/触发器/扩展等高风险操作。

  • 📚 常用元数据工具:支持列出 database、schema、表,描述表结构,统计表数量。

  • 📄 分页查询pg_execute_sqlSELECT/WITH 支持 limitoffset

工具列表

工具

说明

pg_test_connection

测试当前 database + schema 上下文是否可连接。

pg_get_current_context

返回当前 database、schema、允许的 database、当前 database 下允许的 schema。

pg_list_databases

列出配置允许访问的 database,并标记当前 database。

pg_switch_database

切换当前 database,可选同时切换目标 database 下的 schema。

pg_list_schemas

列出指定 database 或当前 database 中可见的非系统 schema。

pg_switch_schema

在当前 database 内切换当前 schema。

pg_execute_sql

在当前上下文执行 SQL。查询返回 datacount,写入返回 affected_rows

pg_list_tables

列出指定 database/schema 或当前上下文下的表和视图。

pg_describe_table

返回指定表的字段、数据类型、是否可空、默认值、主键标记。

pg_count_tables

统计指定 database/schema 或当前上下文下的普通表数量。

安装

推荐使用 uv

uv sync

运行服务:

uv run pg-mcp-server

环境变量

变量名

说明

必填

示例

POSTGRES_HOST

PostgreSQL 主机地址

127.0.0.1

POSTGRES_PORT

PostgreSQL 端口

5432

POSTGRES_USER

PostgreSQL 用户名

postgres

POSTGRES_PASSWORD

PostgreSQL 密码

your_password

POSTGRES_DEFAULT_DATABASE

启动后的默认 database

appdb

POSTGRES_DEFAULT_SCHEMA

默认 database 下的默认 schema

app

POSTGRES_ALLOWED_DATABASES

允许访问的 database,多个值用英文逗号分隔

appdb,reportdb

POSTGRES_DATABASE_SCHEMAS

每个 database 允许访问的 schema 映射

appdb:app,public;reportdb:reporting,analytics

POSTGRES_DATABASE_DEFAULT_SCHEMAS

每个 database 的默认 schema 映射

appdb:app;reportdb:reporting

POSTGRES_READ_ONLY

是否开启只读模式

false

POSTGRES_LOG_LEVEL

日志级别

INFO

不再使用旧的 POSTGRES_DATABASEPOSTGRES_SCHEMAPOSTGRES_ALLOWED_SCHEMAS 配置。

快速开始

单 database 配置

只允许访问 appdbapppublic 两个 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"
$env:POSTGRES_DATABASE_SCHEMAS="appdb:app,public"
$env:POSTGRES_READ_ONLY="false"
uv run pg-mcp-server

多数据库、多 Schema 配置

允许访问多个 database,并为每个 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 pg-mcp-server

上面的配置表示:

appdb
  default schema: app
  allowed schemas: app, public

reportdb
  default schema: reporting
  allowed schemas: reporting, analytics

auditdb
  default schema: audit
  allowed schemas: audit, archive

配置规则:

  • POSTGRES_ALLOWED_DATABASES 控制允许访问哪些 database。

  • POSTGRES_DATABASE_SCHEMAS 控制每个 database 下允许访问哪些 schema,格式为 database:schema1,schema2;database2:schema3,schema4

  • POSTGRES_DATABASE_DEFAULT_SCHEMAS 控制切换到某个 database 时默认使用哪个 schema。

  • POSTGRES_DEFAULT_DATABASEPOSTGRES_DEFAULT_SCHEMA 是服务启动后的初始上下文,必须在对应白名单中。

只读模式

$env:POSTGRES_READ_ONLY="true"
uv run pg-mcp-server

只读模式开启后,pg_execute_sql 仅允许 SELECTWITHEXPLAINSHOW 开头的语句。

MCP 客户端配置

uvx 配置

适合包发布后使用:

{
  "mcpServers": {
    "pg_mcp_server": {
      "command": "uvx",
      "args": ["pg-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"
      }
    }
  }
}

多数据库、多 Schema 客户端配置

下面示例允许 MCP 客户端在 appdbreportdbauditdb 三个 database 间切换,并分别限制每个 database 可访问的 schema:

{
  "mcpServers": {
    "pg_mcp_server": {
      "command": "uvx",
      "args": ["pg-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,auditdb",
        "POSTGRES_DATABASE_SCHEMAS": "appdb:app,public;reportdb:reporting,analytics;auditdb:audit,archive",
        "POSTGRES_DATABASE_DEFAULT_SCHEMAS": "appdb:app;reportdb:reporting;auditdb:audit",
        "POSTGRES_READ_ONLY": "false",
        "POSTGRES_LOG_LEVEL": "INFO"
      }
    }
  }
}

使用该配置时,pg_switch_database 只能切换到 appdbreportdbauditdbpg_switch_schema 只能在当前 database 对应的 schema 白名单内切换。

本地开发配置

如果还没有发布到 PyPI,可以让 MCP 客户端在项目目录中通过 uv run 启动:

{
  "mcpServers": {
    "pg_mcp_server": {
      "command": "uv",
      "args": ["run", "pg-mcp-server"],
      "cwd": "E:/PycharmProjects/pg-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"
      }
    }
  }
}

不同 MCP 客户端对 cwd 字段的支持可能不同;如果客户端不支持 cwd,请把命令改成在项目目录中执行的绝对路径包装脚本,或使用已发布的 uvx pg-mcp-server 方式。

使用示例

查看当前上下文:

{}

切换到 reportdb 的默认 schema:

{
  "database": "reportdb"
}

切换到 reportdb.analytics

{
  "database": "reportdb",
  "schema": "analytics"
}

查询并分页:

{
  "sql": "SELECT id, name FROM users ORDER BY id",
  "fetch_results": true,
  "limit": 20,
  "offset": 0
}

描述指定上下文中的表:

{
  "database": "reportdb",
  "schema": "analytics",
  "table": "daily_metrics"
}

安全策略

这个服务的安全策略用于降低 MCP 自动化场景中的误操作风险,但不能替代数据库侧权限控制。生产环境建议使用最小权限账号,并只开放必要 database 和 schema。

服务会在执行 SQL 前进行以下审计:

  • 禁止多语句执行,例如 SELECT ...; DROP TABLE ...

  • 禁止 SQL 注释,降低注释截断和注入风险。

  • 禁止 CALLDOEXECGRANTREVOKE 等高风险语句。

  • 只允许表和索引类 DDL,例如 CREATE TABLEALTER TABLEDROP INDEX

  • 禁止角色、用户、数据库、扩展、函数、过程、触发器、策略等对象的 DDL。

  • 禁止访问当前 database 白名单之外的 schema.objectschema.table.column

  • 允许查询中的别名、CTE、子查询和表名作为列限定符,例如 u.idorders.id

  • 对三段式标识符只把第一段识别为 schema,例如 app.users.id 只校验 app 是否在当前 database 的 schema 白名单中,不会把 users.id 再误判为跨 schema 访问。

  • 允许访问 PostgreSQL 系统 schema 的只读元数据,例如 information_schemapg_catalog

PostgreSQL 原生连接不能直接跨 database 查询。本服务不会伪装支持跨 database SQL;如果需要跨 database 汇总,请分别切换 database 查询,或在数据库侧配置 postgres_fdw / dblink

开发与测试

同步依赖:

uv sync

运行单元测试:

uv run python -m unittest

语法检查:

uv run python -m py_compile pg_mcp_server.py

当前测试覆盖 SQL 安全审计、database/schema 白名单、database 切换、schema 切换、分页包装和 fake connection 执行顺序。

常见问题

为什么要同时配置 database 和 schema?

PostgreSQL 的 database 与 schema 是不同层级。客户端连接时必须连接某个 database;表和视图通常属于该 database 下的某个 schema。

切换 database 和切换 schema 有什么区别?

切换 database 会重新建立连接;切换 schema 只是在当前 database 内调整 search_path

可以直接执行跨 database SQL 吗?

不可以。PostgreSQL 单个连接不能直接跨 database 查询。请使用 MCP 工具分别切换 database 查询,或在数据库侧配置 postgres_fdw / dblink

这个服务可以替代数据库权限控制吗?

不可以。MCP 层的安全审计是额外保护,数据库账号仍应遵循最小权限原则。

License

MIT License. See LICENSE for details.

A
license - permissive license
-
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CleanCodeStar/pg-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server