关于 PostgreSQL MCP Server
面向 MCP 客户端的 Python MCP 服务,用于检查 PostgreSQL 架构并查询数据库。它提供只读分析工具,也单独提供可修改数据或架构的写入工具。
主要功能
- 01发现表和架构
- 02执行有行数限制的只读 SQL 查询
- 03解释查询计划
- 04检查关系和索引
- 05预览行并搜索 SQL 例程
- 06访问表元数据资源
适用场景
- 01探索陌生数据库的架构
- 02检查查询计划和索引详情
- 03获取有限行数的数据进行分析
MCP 相关
向兼容 MCP 的客户端提供 PostgreSQL 检查与查询工具,以及表列表和架构资源。只读查询在只读事务中运行;另有写入工具,可在数据库用户权限允许时修改数据或架构。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx mdev-postgresql-mcp-serverPOSTGRES_HOSTPostgreSQL hostPOSTGRES_PORTPostgreSQL portPOSTGRES_USERPostgreSQL usernamePOSTGRES_PASSWORD密钥PostgreSQL passwordPOSTGRES_DBPostgreSQL database namePOSTGRES_READ_QUERY_LIMITMaximum rows returned by read queries本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
PostgreSQL MCP 服务
一个 Python Model Context Protocol(MCP)服务,用于通过兼容 MCP 的客户端检查和查询 PostgreSQL 数据库。它提供架构发现、安全的只读查询执行、查询计划说明、表预览、索引分析、关系检查,以及用于获取表元数据的 PostgreSQL 资源。
功能
- 列出 public 架构中的表并检查表架构
- 在 PostgreSQL 只读事务中执行只读 SQL
- 说明查询计划,而不直接执行目标查询
- 以固定行数上限预览表数据
- 检查外键关系和索引
- 提供用于获取表列表和架构详情的被动 MCP 资源
安全模型
postgresql_execute_read_query 以 PostgreSQL 只读事务模式运行,通过 POSTGRES_READ_QUERY_LIMIT 限制返回行数,并在执行后回滚。服务还包含 postgresql_execute_write_query,它只接受单条 INSERT、UPDATE、DELETE、CREATE、ALTER、DROP 或 TRUNCATE 语句;如果连接的数据库用户拥有相应权限,该工具可以修改数据或架构。请勿在 MCP 客户端中自动批准具有写入能力的工具。对于公开或共享用途,请使用专用的 PostgreSQL 只读用户运行服务。
要求
- Python 3.11+
- PostgreSQL 数据库
- 兼容 MCP 的客户端,例如 Claude Desktop、Cursor、VS Code 或其他 MCP 宿主
安装
发布到 PyPI 后,可像安装标准 Python MCP 软件包一样安装或运行此服务:
uvx mdev-postgresql-mcp-server
从源代码进行本地开发:
git clone https://github.com/musaddiq-dev/postgresql-mcp-server.git
cd postgresql-mcp-server
python -m venv .venv
source .venv/bin/activate
pip install -e .
配置
复制示例环境文件,并填写数据库连接详情。
cp .env.example .env
| 变量 | 描述 | 必需 | 默认值 |
|---|---|---|---|
POSTGRES_HOST | PostgreSQL 主机 | 是 | localhost |
POSTGRES_PORT | PostgreSQL 端口 | 是 | 5432 |
POSTGRES_USER | PostgreSQL 用户名 | 是 | 无 |
POSTGRES_PASSWORD | PostgreSQL 密码 | 否 | 无 |
POSTGRES_DB | PostgreSQL 数据库名称 | 是 | 无 |
LOG_LEVEL | 写入 stderr 的 Python 日志级别 | 否 | INFO |
POSTGRES_READ_QUERY_LIMIT | 只读查询返回的最大行数 | 否 | 1000 |
只读用户示例:
CREATE USER mcp_readonly WITH PASSWORD 'change-me';
GRANT CONNECT ON DATABASE your_database TO mcp_readonly;
GRANT USAGE ON SCHEMA public TO mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mcp_readonly;
运行
mdev-postgresql-mcp-server
在 PyPI 发布前,从本地检出目录运行:
python -m postgresql_mcp_server.server
MCP 客户端配置
对于已发布的软件包,建议使用 uvx。使用 stdio 的 MCP 服务必须只向 stdout 写入协议消息;此服务通过 Python 日志记录将日志写入 stderr。
Claude Desktop / Cursor / Windsurf / Cline
大多数 MCP 客户端接受以下 mcpServers JSON 格式:
{
"mcpServers": {
"postgresql": {
"command": "uvx",
"args": ["mdev-postgresql-mcp-server"],
"env": {
"POSTGRES_HOST": "localhost",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "mcp_readonly",
"POSTGRES_PASSWORD": "change-me",
"POSTGRES_DB": "your_database"
}
}
}
}
在此仓库中进行本地开发时,请改用已安装的控制台脚本路径:
{
"mcpServers": {
"postgresql": {
"command": "/absolute/path/to/postgresql-mcp-server/.venv/bin/mdev-postgresql-mcp-server",
"args": [],
"env": {
"POSTGRES_HOST": "localhost",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "mcp_readonly",
"POSTGRES_PASSWORD": "change-me",
"POSTGRES_DB": "your_database"
}
}
}
}
Claude Code CLI
claude mcp add postgresql \
--env POSTGRES_HOST=localhost \
--env POSTGRES_PORT=5432 \
--env POSTGRES_USER=mcp_readonly \
--env POSTGRES_PASSWORD=change-me \
--env POSTGRES_DB=your_database \
-- uvx mdev-postgresql-mcp-server
VS Code MCP
VS Code 在其 MCP 配置中使用相同的 command/args/env 模式:
{
"servers": {
"postgresql": {
"type": "stdio",
"command": "uvx",
"args": ["mdev-postgresql-mcp-server"],
"env": {
"POSTGRES_HOST": "localhost",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "mcp_readonly",
"POSTGRES_PASSWORD": "change-me",
"POSTGRES_DB": "your_database"
}
}
}
}
工具
| 工具 | 用途 | 安全性 |
|---|---|---|
postgresql_list_tables | 列出 public 架构中的基础表 | 只读 |
postgresql_describe_table | 显示表的列和元数据 | 只读 |
postgresql_execute_read_query | 在只读事务模式下执行有行数限制的 SQL | 只读 |
postgresql_execute_write_query | 执行并提交单条获准的修改类 SQL 语句 | 具有破坏性 |
postgresql_explain_query | 返回单条查询的 PostgreSQL EXPLAIN 输出 | 只读 |
postgresql_get_database_summary | 返回数据库版本和表数量 | 只读 |
postgresql_get_relationships | 检查外键关系 | 只读 |
postgresql_analyze_indexes | 检查索引及其大小 | 只读 |
postgresql_preview_table | 返回表中最多 10 行数据 | 只读 |
postgresql_search_sql_definitions | 搜索 public 架构中的 SQL 例程/函数 | 只读 |
资源
postgres://list_tables返回 public 架构中的表名。postgres://schema/{table_name}返回为某个表生成的架构语句。
冒烟检查
无需数据库即可验证语法:
python -m py_compile src/postgresql_mcp_server/server.py
配置好数据库后,启动服务并使用 MCP 客户端调用 list_tables。
分发
此服务通过标准 Python MCP 分发渠道发布:
- PyPI 软件包:
mdev-postgresql-mcp-server - MCP Registry 名称:
io.github.musaddiq-dev/postgresql-mcp-server - 运行时提示:
uvx - 传输方式:
stdio
此 README 顶部的 mcp-name 标记是通过 MCP Registry 所有权验证的必要条件。用户在本地 MCP 客户端配置中应优先使用 uvx mdev-postgresql-mcp-server。
安全说明
- 请勿提交包含凭据的
.env文件或 MCP 客户端配置。 - 使用遵循最小权限原则的数据库用户。
- 将
execute_write_query视为具有破坏性的操作,并要求用户在 MCP 客户端中明确批准。 - 运行可执行写入操作的工具前,请检查生成的 SQL。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。