MCP-PostgreSQL-Ops 是一款专业的MCP服务器,用于对PostgreSQL数据库进行操作、监控和管理。它支持PostgreSQL 12 - 17版本,可通过自然语言查询实现全面的数据库分析、性能监控以及智能维护建议。大部分功能可独立运行,但在安装 pg_stat_statements 和(可选)pg_stat_monitor 扩展后,高级查询分析功能将得到增强。
pg_stat_statements 和 pg_stat_monitor 扩展,以实现高级查询分析。pg_stat_statements 和 pg_stat_monitor 识别慢查询。⚠️ 重要提示
docker-compose.yml中包含的postgresql容器仅用于快速启动测试。您可以根据需要调整环境变量,连接到自己的PostgreSQL实例。
💡 使用建议
若要使用自己的PostgreSQL实例而非内置测试容器,请按以下步骤操作:
- 更新
.env文件中的目标PostgreSQL连接信息(请参考POSTGRES_HOST、POSTGRES_PORT、POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB)。- 在
docker-compose.yml中注释掉(禁用)postgres和postgres-init-extensions容器,以避免启动内置测试数据库。
⚠️ 重要提示
虽然超级用户权限可以访问所有数据库和系统信息,但MCP服务器使用普通用户权限也能执行基本的监控任务。
git clone https://github.com/call518/MCP-PostgreSQL-Ops.git
cd MCP-PostgreSQL-Ops
### 检查并修改.env文件
cp .env.example .env
vim .env
### 无需修改默认值,但如果使用自己的PostgreSQL服务器,请编辑以下内容:
POSTGRES_HOST=host.docker.internal
POSTGRES_PORT=15432 # 主机访问的外部端口(映射到内部5432)
POSTGRES_USER=postgres
POSTGRES_PASSWORD=changeme!@34
POSTGRES_DB=ecommerce # 默认连接的数据库。超级用户可以访问所有数据库。
⚠️ 重要提示
PGDATA=/data/db是为Percona PostgreSQL Docker镜像预先配置的,该镜像需要此特定路径以确保正确的写入权限。
# 启动所有容器,包括内置的PostgreSQL进行测试
docker-compose up -d
# 替代方案:如果使用自己的PostgreSQL实例
# 在docker-compose.yml中注释掉postgres和postgres-init-extensions服务
# 然后使用自定义配置:
# docker-compose -f docker-compose.custom-db.yml up -d
⚠️ 重要提示
初始环境设置需要几分钟时间,因为容器按以下顺序启动:
- PostgreSQL 容器首先启动并初始化数据库。
- PostgreSQL扩展 容器安装扩展并创建全面的测试数据(约83K条记录)。
- MCP服务器 和 MCPO代理 容器在PostgreSQL准备好后启动。
- OpenWebUI 容器最后启动,加载Web界面可能需要额外的时间。
💡 使用建议
运行
docker-compose up -d后等待2 - 3分钟再访问OpenWebUI,以确保所有服务完全初始化。
🔍 检查容器状态(可选):
# 监控容器启动进度
docker-compose logs -f
# 检查所有容器是否正在运行
docker-compose ps
# 验证PostgreSQL是否准备好
docker-compose logs postgres | grep "ready to accept connections"
访问地址:http://localhost:3003/
swagger 提供的MCP工具功能列表可在MCPO API文档URL中找到。
http://localhost:8003/docspostgresql-ops 工具地址(例如,http://localhost:8003/postgresql-ops)以连接MCP工具。恭喜! 您的MCP PostgreSQL操作服务器现已可以使用。您可以开始使用自然语言查询探索您的数据库。
(推荐)将以下内容添加到您的Claude桌面配置文件中:
{
"mcpServers": {
"postgresql-ops": {
"command": "uvx",
"args": ["--python", "3.11", "mcp-postgresql-ops"],
"env": {
"POSTGRES_HOST": "127.0.0.1",
"POSTGRES_PORT": "15432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "changeme!@34",
"POSTGRES_DB": "ecommerce"
}
}
}
}
(可选)使用本地源代码运行:
{
"mcpServers": {
"postgresql-ops": {
"command": "uv",
"args": ["run", "python", "-m", "src.mcp_postgresql_ops.mcp_main"],
"env": {
"PYTHONPATH": "/path/to/MCP-PostgreSQL-Ops",
"POSTGRES_HOST": "127.0.0.1",
"POSTGRES_PORT": "15432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "changeme!@34",
"POSTGRES_DB": "ecommerce"
}
}
}
}
# 标准输入输出模式
uvx --python 3.11 mcp-postgresql-ops \
--type stdio
# HTTP模式
uvx --python 3.11 mcp-postgresql-ops \
--type streamable-http \
--host 127.0.0.1 \
--port 8080 \
--log-level DEBUG
{
"mcpServers": {
"Postgresql-A": {
"command": "uvx",
"args": ["--python", "3.11", "mcp-postgresql-ops"],
"env": {
"POSTGRES_HOST": "a.foo.com",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "postgres",
"POSTGRES_DB": "postgres"
}
},
"Postgresql-B": {
"command": "uvx",
"args": ["--python", "3.11", "mcp-postgresql-ops"],
"env": {
"POSTGRES_HOST": "b.bar.com",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "postgres",
"POSTGRES_DB": "postgres"
}
}
}
}
# 标准输入输出模式
PYTHONPATH=/path/to/MCP-PostgreSQL-Ops
python -m src.mcp_postgresql_ops.mcp_main \
--type stdio
# HTTP模式
PYTHONPATH=/path/to/MCP-PostgreSQL-Ops
python -m src.mcp_postgresql_ops.mcp_main \
--type streamable-http \
--host 127.0.0.1 \
--port 8080 \
--log-level DEBUG
| 属性 | 详情 |
|---|---|
PYTHONPATH |
MCP服务器导入Python模块的搜索路径 |
MCP_LOG_LEVEL |
服务器日志详细程度(DEBUG、INFO、WARNING、ERROR) |
FASTMCP_TYPE |
MCP传输协议(stdio用于CLI,streamable-http用于Web) |
FASTMCP_HOST |
HTTP服务器绑定地址(0.0.0.0表示所有接口) |
FASTMCP_PORT |
MCP通信的HTTP服务器端口 |
PGSQL_VERSION |
用于选择Docker镜像的PostgreSQL主版本 |
PGDATA |
Docker容器内的PostgreSQL数据目录(请勿修改) |
POSTGRES_HOST |
PostgreSQL服务器主机名或IP地址 |
POSTGRES_PORT |
PostgreSQL服务器端口号 |
POSTGRES_USER |
PostgreSQL连接用户名(需要读取权限) |
POSTGRES_PASSWORD |
PostgreSQL用户密码(支持特殊字符) |
POSTGRES_DB |
连接的默认数据库名称 |
POSTGRES_MAX_CONNECTIONS |
PostgreSQL的 max_connections 配置参数 |
DOCKER_EXTERNAL_PORT_OPENWEBUI |
Open WebUI容器的主机端口映射 |
DOCKER_EXTERNAL_PORT_MCP_SERVER |
MCP服务器容器的主机端口映射 |
DOCKER_EXTERNAL_PORT_MCPO_PROXY |
MCPO代理容器的主机端口映射 |
DOCKER_INTERNAL_PORT_POSTGRESQL |
PostgreSQL容器的内部端口 |
⚠️ 重要提示
POSTGRES_DB是在未指定特定数据库时操作的默认目标数据库。在Docker环境中,如果设置为非默认名称,该数据库将在PostgreSQL首次启动时自动创建。
💡 使用建议
内置的PostgreSQL容器使用端口映射
15432:5432,其中:
POSTGRES_PORT = 15432:主机访问和MCP服务器连接的外部端口。DOCKER_INTERNAL_PORT_POSTGRESQL = 5432:容器内部端口(PostgreSQL默认)。- 使用外部PostgreSQL服务器时,请将
POSTGRES_PORT设置为与服务器实际端口匹配。
⚠️ 重要提示
有关更多详细信息,请参阅 工具兼容性矩阵。
💡 使用建议
大多数MCP工具无需任何PostgreSQL扩展即可工作。一些高级性能分析工具需要以下扩展:
-- 查询性能统计(仅 `get_pg_stat_statements_top_queries` 需要)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- 高级监控(可选,`get_pg_stat_monitor_recent_queries` 使用)
CREATE EXTENSION IF NOT EXISTS pg_stat_monitor;
⚠️ 重要提示
对于新的PostgreSQL安装,在
postgresql.conf中添加以下内容:
shared_preload_libraries = 'pg_stat_statements'
然后重启PostgreSQL并运行上述 CREATE EXTENSION 命令。
pg_stat_statements 仅用于慢查询分析工具。pg_stat_monitor 是可选的,用于实时查询监控。⚠️ 重要提示
一些MCP工具需要特定的PostgreSQL配置参数来收集统计信息。请选择以下配置方法之一:
💡 使用建议
受这些设置影响的工具:
- get_user_functions_stats:需要
track_functions = pl或track_functions = all。- get_table_io_stats 和 get_index_io_stats:
track_io_timing = on可提供更准确的计时。- get_database_stats:
track_io_timing = on可增强I/O计时。
⚠️ 重要提示
应用任何方法后,验证设置:
SELECT name, setting, context FROM pg_settings WHERE name IN ('track_activities', 'track_counts', 'track_io_timing', 'track_functions') ORDER BY name;
name | setting | context
------------------+---------+-----------
track_activities | on | superuser
track_counts | on | superuser
track_functions | pl | superuser
track_io_timing | on | superuser
(4 rows)
在 postgresql.conf 中添加以下内容:
# 基本统计信息收集(通常默认启用)
track_activities = on
track_counts = on
# 函数统计工具所需
track_functions = pl # 启用PL/pgSQL函数统计信息收集
# 可选但推荐用于准确的I/O计时
track_io_timing = on # 启用I/O计时统计信息收集
然后重启PostgreSQL服务器。
对于Docker或命令行启动的PostgreSQL:
# Docker示例
docker run -d \
-e POSTGRES_PASSWORD=mypassword \
postgres:17 \
-c track_activities=on \
-c track_counts=on \
-c track_functions=pl \
-c track_io_timing=on
# 直接使用postgres命令
postgres -D /data \
-c track_activities=on \
-c track_counts=on \
-c track_functions=pl \
-c track_io_timing=on
对于无法修改 postgresql.conf 的托管PostgreSQL服务,使用SQL命令动态更改设置:
-- 启用基本统计信息收集(通常默认启用)
ALTER SYSTEM SET track_activities = 'on';
ALTER SYSTEM SET track_counts = 'on';
-- 启用函数统计信息收集(需要超级用户权限)
ALTER SYSTEM SET track_functions = 'pl';
-- 启用I/O计时统计信息(可选但推荐)
ALTER SYSTEM SET track_io_timing = 'on';
-- 不重启重新加载配置(单独运行)
SELECT pg_reload_conf();
💡 使用建议
会话级测试的替代方法:
-- 仅为当前会话设置(临时)
SET track_activities = 'on';
SET track_counts = 'on';
SET track_functions = 'pl';
SET track_io_timing = 'on';
⚠️ 重要提示
使用命令行工具时,分别运行每个SQL语句,以避免事务块错误。
pg_stat_statements;pg_stat_monitor 在托管引擎上不可用。ALTER SYSTEM 进行持久设置。-- 验证预加载设置
SHOW shared_preload_libraries;
-- 在目标数据库中启用扩展
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- 推荐的监控可见性
GRANT pg_read_all_stats TO <app_user>;
pg_stat_statements。”ecommerce 数据库中的所有表。”public 模式下表的大小。”ecommerce 数据库中 customers 表的详细模式信息。”ecommerce 数据库中 products 表的列详细信息和约束。”ecommerce 数据库 sales 模式中 orders 表的表结构,包括索引和外键。”inventory 数据库 public 模式中所有表的模式概述。”database_name 参数ecommerce 数据库中所有模式及其内容。”ecommerce 数据库中 sales 模式的详细信息。”inventory 数据库的模式结构和权限。”hr_system 数据库的模式概述,包括表计数和大小。”database_name 参数ecommerce 数据库中 customers 表的所有关系。”ecommerce 数据库 sales 模式中 orders 表的外键关系。”ecommerce 数据库的全数据库关系概述。”ecommerce 数据库中引用 products 表的所有表。”inventory 数据库中的跨模式关系。”database_name 参数table_name 可进行全数据库关系分析ecommerce 数据库中死元组比率较高的表。”database_nameinventory 数据库的膨胀概述。”public 模式的自动清理阈值百分比。”pg_stat_user_tables 进行无需扩展的自动清理监控pg_stat_activity 进行实时维护监控public 模式中的表膨胀情况。”ecommerce 数据库中死元组比率较高的表。”database_nameinventory 数据库的膨胀概述。”granted = false 过滤后的阻塞会话。”postgresql.conf 中 track_functions = pltrack_io_timing = on 可提供更准确的计时track_io_timing = on 可提供更准确的计时pg_stat_io 支持,包括计时、后端类型和上下文pg_statio_* 回退,提供缓冲区命中率include_system = true 参数包括系统表。”n_ins_since_vacuum),以优化维护计划pg_stat_statements)
inventory 数据库中的慢查询。”total_time → total_exec_time 映射;PG13+使用原生列pg_stat_monitor)
total_time → total_exec_time 映射;PG13+使用原生列💡 使用建议
所有工具都支持使用
database_name参数进行多数据库操作。这允许PostgreSQL超级用户从单个MCP服务器实例分析和监控多个数据库。
| 工具名称 | 是否需要扩展 | PG 12 | PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | 使用的系统视图/表 |
|---|---|---|---|---|---|---|---|---|
get_server_info |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | version()、pg_extension |
get_active_connections |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_activity |
get_postgresql_config |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_settings |
get_database_list |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_database |
get_table_list |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | information_schema.tables |
get_table_schema_info |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | information_schema.*、pg_indexes |
get_database_schema_info |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_namespace、pg_class、pg_proc |
get_table_relationships |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | information_schema.*(约束) |
get_user_list |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_user、pg_roles |
get_index_usage_stats |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_indexes |
get_database_size_info |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_database_size() |
get_table_size_info |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_total_relation_size() |
get_vacuum_analyze_stats |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_current_database_info |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_database、current_database() |
get_table_bloat_analysis |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_database_bloat_overview |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_autovacuum_status |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_autovacuum_activity |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_running_vacuum_operations |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_activity |
get_vacuum_effectiveness_analysis |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_table_bloat_analysis |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_database_bloat_overview |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_lock_monitoring |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_locks、pg_stat_activity |
get_wal_status |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_current_wal_lsn() |
get_database_stats |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_database |
get_table_io_stats |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_statio_user_tables |
get_index_io_stats |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_statio_user_indexes |
get_database_conflicts_stats |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_database_conflicts |
| 工具名称 | 是否需要扩展 | PG 12 | PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | 特殊功能 |
|---|---|---|---|---|---|---|---|---|
get_io_stats |
❌ 无需扩展 | ✅ 基本功能 | ✅ 基本功能 | ✅ 基本功能 | ✅ 基本功能 | ✅ 增强功能 | ✅ 增强功能 | PG16+:支持 pg_stat_io |
get_bgwriter_stats |
❌ 无需扩展 | ✅ | ✅ | ✅ | ✅ 特殊功能 | ✅ | ✅ | PG15:单独的检查点器统计信息 |
get_replication_status |
❌ 无需扩展 | ✅ 兼容 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | PG13+:wal_status、safe_wal_size;PG16+:增强的WAL接收器 |
get_all_tables_stats |
❌ 无需扩展 | ✅ 兼容 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | PG13+:跟踪自上次VACUUM以来的插入次数(n_ins_since_vacuum),以优化维护计划 |
get_user_functions_stats |
⚙️ 需要配置 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 需要 track_functions = pl |
| 工具名称 | 需要的扩展 | PG 12 | PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | 注意事项 |
|---|---|---|---|---|---|---|---|---|
get_pg_stat_statements_top_queries |
pg_stat_statements |
✅ 兼容 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | PG12:total_time → total_exec_time;PG13+:原生 total_exec_time |
get_pg_stat_monitor_recent_queries |
pg_stat_monitor |
✅ 兼容 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | ✅ 增强功能 | PG12:total_time → total_exec_time;PG13+:原生 total_exec_time |
⚠️ 重要提示
PostgreSQL 18支持:PostgreSQL 18目前处于测试阶段,Percona Distribution PostgreSQL尚未支持。待PostgreSQL 18达到稳定版本并提供发行版支持后,将添加相应支持。
.env 文件中的连接参数。get_server_info 检查扩展状态。CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION pg_stat_monitor;
track_functions 设置SHOW track_functions; -- 应为 'pl' 或 'all'
💡 使用建议
托管服务(如AWS RDS等)的快速修复方法:
ALTER SYSTEM SET track_functions = 'pl';
SELECT pg_reload_conf();
SHOW track_io_timing; -- 应为 'on'
💡 使用建议
快速修复方法:
ALTER SYSTEM SET track_io_timing = 'on';
SELECT pg_reload_conf();
postgresql.conf 并重启服务器。ALTER SYSTEM SET + SELECT pg_reload_conf()。SET parameter = value 为当前会话设置。limit 参数减少结果集大小。⚠️ 重要提示
有关更多详细信息,请参阅 工具兼容性矩阵。
# "使用 get_server_info 检查版本和可用功能"
# 使用MCP检查器进行测试
./scripts/run-mcp-inspector-local.sh
# 直接执行以进行调试
python -m src.mcp_postgresql_ops.mcp_main --log-level DEBUG
# 测试版本兼容性(需要不同的PostgreSQL版本)
# 修改.env中的POSTGRES_HOST以指向不同版本
# 运行测试(如果有)
uv run pytest
MCP服务器可自动适应PostgreSQL 12 - 17版本。要跨版本进行测试:
本项目遵循 MIT许可证,您可以自由使用、修改和分发。
由同一作者开发的其他MCP服务器:
我们始终欢迎新的贡献者!无论您是修复拼写错误、添加新的监控工具还是改进文档,每一份贡献都将使这个项目变得更好。
贡献方式:
💡 使用建议
代码库的设计非常便于添加新工具。请查看
mcp_main.py中现有的@mcp.tool()函数。
[MCPO Swagger URL] http://localhost:8003/postgresql-ops/docs