Postgres Pro
Postgres Pro 是一个开源的模型上下文协议 (MCP) 服务器,旨在为您和您的 AI 代理在整个开发过程中提供支持——从初始编码、测试和部署,一直到生产调优和维护。
crystaldba
Tools
analyze_workload_indexes
Analyze frequently executed queries in the database and recommend optimal indexes
list_schemas
List all schemas in the database
list_objects
List objects in a schema
get_object_details
Show detailed information about a database object
explain_query
Explains the execution plan for a SQL query, showing how the database will execute it and provides detailed cost estimates.
analyze_query_indexes
Analyze a list of (up to 10) SQL queries and recommend optimal indexes
analyze_db_health
Analyzes database health. Here are the available health checks: - index - checks for invalid, duplicate, and bloated indexes - connection - checks the number of connection and their utilization - vacuum - checks vacuum health for transaction id wraparound - sequence - checks sequences at risk of exceeding their maximum value - replication - checks replication health including lag and slots - buffer - checks for buffer cache hit rates for indexes and tables - constraint - checks for invalid constraints - all - runs all checks You can optionally specify a single health check or a comma-separated list of health checks. The default is 'all' checks.
get_top_queries
Reports the slowest SQL queries based on execution time, using data from the 'pg_stat_statements' extension.
execute_sql
Execute any SQL query
README
Postgres Pro MCP 服务器
[ 快速开始 | Discord 服务器 ]
概述
Postgres Pro 是一个开源的模型上下文协议 (MCP) 服务器,旨在为您和您的 AI 代理在整个开发过程中提供支持——从初始编码到测试和部署,再到生产调整和维护。
Postgres Pro 提供的功能远不止封装数据库连接。 例如,它提供:
- 基于现代工业级算法的索引调优,类似于商业数据库中的算法。 它可以高效地探索数千种可能的索引,从而为您的工作负载找到最佳解决方案。
- 通过提供基于生产数据分布和查询模式的“假设分析”场景,支持 LLM 主导的索引。
- 用于分析数据库健康状况的标准化清单,确保可信和可重复的结果。
Postgres Pro 还提供全面的模式信息,以支持 SQL 生成、受限和过滤的 SQL 执行以确保安全等等。
目录
演示
这是一个在 Cursor 中使用 Postgres Pro 来优化和修复 AI 生成的应用程序的演示。 我们最初使用 Replit 生成了该应用程序,但它编写的 SQLAlchemy 代码运行速度非常慢,导致该应用程序实际上无法使用。
我们使用 Cursor AI 代理和 Postgres Pro 来:
- 修复性能问题 - 包括 ORM 查询、索引和缓存
- 修复需要将数据连接到代码的错误
- 从单个提示添加新功能
两种观看演示的方式
- 阅读逐步说明
- 观看下面的视频
https://github.com/user-attachments/assets/24e05745-65e9-4998-b877-a368f1eadc13
功能
Postgres Pro 包含一套不断扩展的工具,涵盖以下几个领域:
-
数据库健康状况。 检查缓存命中率、监控 vacuum 健康状况、识别未使用的/重复的索引等等。
-
索引调优。 确保您的 SQL 查询高效运行并快速返回结果。 查找调优目标、验证 AI 生成的建议,或使用经典的索引优化算法生成候选索引。 使用 explain plans 和 假设索引 模拟添加索引后 Postgres 的性能。
-
模式信息。 通过数据库对象的详细模式信息(包括表、视图、序列、存储过程和触发器),帮助您的 AI 代理可靠且成功地生成 SQL。
-
受保护的 SQL 执行。 您可以选择快速或安全地工作:
- 无限制模式: 为开发环境提供完整的读/写访问权限。让您的 AI 代理修改数据、更改模式、删除表,以及您需要它做的任何事情。
- 限制模式: 通过强制执行检查以确保只读操作和限制资源消耗,从而在生产环境中限制访问,确保安全。
快速开始
前提条件
在开始之前,请确保您已具备:
- 数据库的访问凭据。
- Docker 或 Python 3.12 或更高版本。
访问凭据
您可以使用 psql
或 GUI 工具(例如 pgAdmin)来确认您的访问凭据是否有效。
Docker 或 Python
您可以选择使用 Docker 或 Python。 我们通常建议使用 Docker,因为 Python 用户可能会遇到更多特定于环境的问题。 但是,通常使用您最熟悉的方法更有意义。
安装
选择以下方法之一来安装 Postgres Pro:
选项 1:使用 Docker
拉取 Postgres Pro MCP 服务器 Docker 镜像。 此镜像包含所有必要的依赖项,提供了一种在各种环境中可靠运行 Postgres Pro 的方法。
docker pull crystaldba/postgres-mcp
选项 2:使用 Python
如果您已安装 pipx
,则可以使用以下命令安装 Postgres Pro:
pipx install postgres-mcp
否则,请使用 uv
安装 Postgres Pro:
uv pip install postgres-mcp
如果您需要安装 uv
,请参阅 uv 安装说明。
配置您的 AI 助手
我们提供了使用 Claude Desktop 配置 Postgres Pro 的完整说明。 许多 MCP 客户端都有类似的配置文件,您可以调整这些步骤以与您选择的客户端一起使用。
Claude Desktop 配置
您需要编辑 Claude Desktop 配置文件以添加 Postgres Pro。 此文件的位置取决于您的操作系统:
- MacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
%APPDATA%/Claude/claude_desktop_config.json
您还可以使用 Claude Desktop 中的“设置”菜单项来找到配置文件。
现在,您将编辑配置文件的 mcpServers
部分。
如果您使用 Docker
{
"mcpServers": {
"postgres": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URI",
"crystaldba/postgres-mcp",
"--access-mode=unrestricted"
],
"env": {
"DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
}
}
}
}
Postgres Pro Docker 镜像会自动重新映射主机名 localhost
,以便从容器内部工作。
- MacOS/Windows:自动使用
host.docker.internal
- Linux:自动使用
172.17.0.1
或适当的主机地址
如果您使用 pipx
{
"mcpServers": {
"postgres": {
"command": "postgres-mcp",
"args": [
"--access-mode=unrestricted"
],
"env": {
"DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
}
}
}
}
如果您使用 uv
{
"mcpServers": {
"postgres": {
"command": "uv",
"args": [
"run",
"postgres-mcp",
"--access-mode=unrestricted"
],
"env": {
"DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
}
}
}
}
连接 URI
将 postgresql://...
替换为您的 Postgres 数据库连接 URI。
访问模式
Postgres Pro 支持多种访问模式,让您可以控制 AI 代理可以对数据库执行的操作:
- 无限制模式:允许完全的读/写访问权限以修改数据和模式。它适用于开发环境。
- 限制模式:将操作限制为只读事务,并对资源利用率(目前仅为执行时间)施加约束。它适用于生产环境。
要使用限制模式,请在上面的配置示例中将 --access-mode=unrestricted
替换为 --access-mode=restricted
。
其他 MCP 客户端
许多 MCP 客户端都有类似于 Claude Desktop 的配置文件,您可以调整上面的示例以与您选择的客户端一起使用。
- 如果您使用的是 Cursor,您可以从“命令面板”导航到“Cursor 设置”,然后打开“MCP”选项卡以访问配置文件。
- 如果您使用的是 Windsurf,您可以从“命令面板”导航到“打开 Windsurf 设置页面”以访问配置文件。
- 如果您使用的是 Goose,请运行
goose configure
,然后选择“添加扩展”。
Postgres 扩展安装(可选)
要启用索引调优和全面的性能分析,您需要在数据库上加载 pg_statements
和 hypopg
扩展。
pg_statements
扩展允许 Postgres Pro 分析查询执行统计信息。 例如,这使其能够了解哪些查询运行缓慢或消耗大量资源。hypopg
扩展允许 Postgres Pro 在添加索引后模拟 Postgres 查询计划器的行为。
在 AWS RDS、Azure SQL 或 Google Cloud SQL 上安装扩展
如果您的 Postgres 数据库在云提供商托管的服务上运行,则 pg_statements
和 hypopg
扩展应该已在系统上可用。
在这种情况下,您只需使用具有足够权限的角色运行 CREATE EXTENSION
命令:
CREATE EXTENSION IF NOT EXISTS pg_statements;
CREATE EXTENSION IF NOT EXISTS hypopg;
在自管理的 Postgres 上安装扩展
如果您正在管理自己的 Postgres 安装,则可能需要执行其他工作。
在加载 pg_statements
扩展之前,您必须确保它已在 Postgres 配置文件中的 shared_preload_libraries
中列出。
hypopg
扩展也可能需要额外的系统级安装(例如,通过您的软件包管理器),因为它并不总是随 Postgres 一起提供。
使用示例
提问:
检查我的数据库的健康状况并识别任何问题。
分析慢查询
提问:
我的数据库中最慢的查询是什么?我该如何加快它们的速度?
获取有关如何加速的建议
提问:
我的应用程序很慢。我该如何让它更快?
生成索引建议
提问:
分析我的数据库工作负载并建议索引以提高性能。
优化特定查询
提问:
帮助我优化此查询:SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id WHERE orders.created_at > '2023-01-01';
MCP 服务器 API
MCP 标准 定义了各种类型的端点:工具、资源、提示和其他。
Postgres Pro 仅通过 MCP 工具 提供功能。 我们选择这种方法是因为 MCP 客户端生态系统 对 MCP 工具具有广泛的支持。 这与其他 Postgres MCP 服务器的方法形成对比,包括 参考 Postgres MCP 服务器,它们使用 MCP 资源 来公开模式信息。
Postgres Pro 工具:
工具名称 | 描述 |
---|---|
list_schemas |
列出 PostgreSQL 实例中所有可用的数据库模式。 |
list_objects |
列出指定模式中的数据库对象(表、视图、序列、扩展)。 |
get_object_details |
提供有关特定数据库对象的信息,例如,表的列、约束和索引。 |
execute_sql |
在数据库上执行 SQL 语句,在以限制模式连接时具有只读限制。 |
explain_query |
获取 SQL 查询的执行计划,描述 PostgreSQL 将如何处理它并公开查询计划器的成本模型。可以使用假设索引调用以模拟添加索引后的行为。 |
get_top_queries |
使用 pg_stat_statements 数据报告基于总执行时间的最慢 SQL 查询。 |
analyze_workload_indexes |
分析数据库工作负载以识别资源密集型查询,然后为它们推荐最佳索引。 |
analyze_query_indexes |
分析特定 SQL 查询列表(最多 10 个)并为它们推荐最佳索引。 |
analyze_db_health |
执行全面的健康检查,包括:缓冲区缓存命中率、连接健康状况、约束验证、索引健康状况(重复/未使用/无效)、序列限制和 vacuum 健康状况。 |
相关项目
Postgres MCP 服务器
- Query MCP。一个用于 Supabase Postgres 的 MCP 服务器,具有三层安全架构和 Supabase 管理 API 支持。
- PG-MCP。一个用于 PostgreSQL 的 MCP 服务器,具有灵活的连接选项、explain plans、扩展上下文等等。
- 参考 PostgreSQL MCP 服务器。一个简单的 MCP 服务器实现,将模式信息公开为 MCP 资源并执行只读查询。
- Supabase Postgres MCP 服务器。此 MCP 服务器提供 Supabase 管理功能,并由 Supabase 社区积极维护。
- Nile MCP 服务器。一个 MCP 服务器,提供对 Nile 的多租户 Postgres 服务的管理 API 的访问。
- Neon MCP 服务器。一个 MCP 服务器,提供对 Neon 的无服务器 Postgres 服务的管理 API 的访问。
- Wren MCP 服务器。为 Postgres 和其他数据库提供支持商业智能的语义引擎。
DBA 工具(包括商业产品)
- Aiven Database Optimizer。一种提供整体数据库工作负载分析、查询优化和其他性能改进的工具。
- dba.ai。一个 AI 驱动的数据库管理助手,与 GitHub 集成以解决代码问题。
- pgAnalyze。一个全面的监控和分析平台,用于识别性能瓶颈、优化查询和实时警报。
- Postgres.ai。一种交互式聊天体验,结合了广泛的 Postgres 知识库和 GPT-4。
- Xata Agent。一个开源 AI 代理,可自动监控数据库健康状况、诊断问题,并使用 LLM 驱动的推理和剧本提供建议。
Postgres 实用程序
- Dexter。一种用于在 PostgreSQL 上生成和测试假设索引的工具。
- PgHero。一个用于 Postgres 的性能仪表板,带有建议。 Postgres Pro 包含来自 PgHero 的健康检查。
- PgTune。用于调整 Postgres 配置的启发式方法。
常见问题解答
Postgres Pro 与其他 Postgres MCP 服务器有何不同? 许多 MCP 服务器允许 AI 代理针对 Postgres 数据库运行查询。 Postgres Pro 也可以做到这一点,但还添加了用于了解和提高 Postgres 数据库性能的工具。 例如,它实现了 Microsoft SQL Server 数据库调优顾问的随时算法 的一个版本,这是一种用于自动索引调优的现代工业级算法。
当 LLM 可以推理、生成 SQL 等时,为什么需要 MCP 工具? LLM 对于涉及歧义、推理或自然语言的任务非常宝贵。 但是,与过程代码相比,它们可能速度慢、成本高、不确定,有时会产生不可靠的结果。 在数据库调优的情况下,我们有经过几十年发展、经验证有效的成熟算法。 Postgres Pro 让您可以通过将 LLM 与经典优化算法和其他过程工具配对来结合两者的优点。
您如何测试 Postgres Pro? 测试对于确保 Postgres Pro 的可靠性和准确性至关重要。 我们正在构建一套 AI 生成的对抗性工作负载,旨在挑战 Postgres Pro 并确保它在各种场景下都能正常运行。
支持哪些 Postgres 版本? 我们的测试目前侧重于 Postgres 15、16 和 17。 我们计划支持 Postgres 13 到 17 版本。
谁创建了这个项目? 此项目由 Crystal DBA 创建和维护。
路线图
待定
您和您的需求是我们构建的关键驱动力。 通过打开 issue 或 pull request 告诉我们您希望看到什么。 您也可以在 Discord 上联系我们。
技术说明
本节包括影响 Postgres Pro 设计的高级概述技术考虑因素。
索引调优
开发人员知道,缺少索引是导致数据库性能问题的最常见原因之一。 索引提供访问方法,允许 Postgres 快速定位执行查询所需的数据。 当表很小时,索引几乎没有区别,但随着数据大小的增长,表扫描和索引查找之间的算法复杂性差异变得显着(通常为 O(n) vs O(log n),如果涉及多个表的连接,则可能更多)。
在 Postgres Pro 中生成建议索引的过程分为几个阶段:
-
识别需要调优的 SQL 查询。 如果您知道某个特定的 SQL 查询存在问题,您可以提供它。 Postgres Pro 还可以分析工作负载以识别索引调优目标。 为此,它依赖于
pg_stat_statements
扩展,该扩展记录每个查询的运行时和资源消耗。如果查询是顶级资源消耗者(无论是按每次执行还是按聚合),则它是索引调优的候选者。 目前,我们使用执行时间作为累积资源消耗的代理,但查看特定资源(例如,访问的块数或从磁盘读取的块数)也可能是有意义的。
analyze_query_workload
工具侧重于慢查询,使用每次执行的平均时间以及执行计数和平均执行时间的阈值。 代理还可以调用get_top_queries
,该查询接受平均时间与总执行时间的参数,然后将这些查询传递给analyze_query_indexes
以获取索引建议。复杂的索引调优系统使用“工作负载压缩”来生成代表性的查询子集,该子集反映了整个工作负载的特征,从而减少了下游算法的问题。 Postgres Pro 通过规范化查询来执行有限形式的工作负载压缩,以便从同一模板生成的查询显示为一个。 它平等地权衡每个查询,这是一种在索引带来的好处很大时有效的简化。
-
生成候选索引 一旦我们有了我们想要通过索引改进的 SQL 查询列表,我们就生成一个我们可能想要添加的索引列表。 为此,我们解析 SQL 并识别过滤器、连接、分组或排序中使用的任何列。
要生成所有可能的索引,我们需要考虑这些列的组合,因为 Postgres 支持 多列索引。 在当前的实现中,我们仅包含每个可能的多列索引的一个排列,该排列是随机选择的。 我们进行这种简化是为了减少搜索空间,因为排列通常具有等效的性能。 但是,我们希望在这方面有所改进。
-
搜索最佳索引配置。 我们的目标是找到最佳平衡性能优势与存储和维护这些索引的成本的索引组合。 我们使用
hypopg
扩展提供的“假设分析”功能来估计性能改进。 这模拟了在添加索引后 Postgres 查询优化器将如何执行查询,并根据实际的 Postgres 成本模型报告更改。一个挑战是,生成查询计划通常需要了解查询中使用的特定参数值。 查询规范化(减少考虑的查询所必需的)会删除参数常量。 通过绑定变量提供的参数值同样无法供我们使用。
为了解决这个问题,我们生成可以作为参数提供的实际常量,方法是从表统计信息中进行采样。 在版本 16 中,Postgres 添加了 通用 explain plan 功能,但它有一些限制,例如围绕
LIKE
子句,我们的实现没有这些限制。搜索策略至关重要,因为评估所有可能的索引组合仅在简单情况下可行。 这是大多数索引方法与众不同的地方。 采用 Microsoft 随时算法的方法,我们采用贪婪搜索策略,即找到最佳的单索引解决方案,然后找到添加到该解决方案的最佳索引以生成双索引解决方案。 当时间预算耗尽或当一轮探索未能产生高于 10% 的最小改进阈值的任何收益时,我们的搜索将终止。
-
成本效益分析。 当面临两种索引替代方案时,一种产生更好的性能,另一种需要更多的空间,我们如何决定选择哪一种? 传统上,索引顾问会要求提供存储预算,并根据该存储预算优化性能。 我们也会采用存储预算,但在整个优化过程中执行成本效益分析。
我们将此问题定义为选择 帕累托前沿 上的一个点的问题——对于该点,改进一个质量指标必然会恶化另一个质量指标。 在理想的世界中,我们可能希望以货币形式评估存储成本和提高性能的好处。 但是,有一种更简单、更实用的方法:以相对术语查看变化。 大多数人都会同意,即使存储成本是 2 倍,100 倍的性能提升也是值得的。 在我们的实现中,我们使用可配置的参数来设置此阈值。 默认情况下,我们要求性能改进的 log(以 10 为底)的变化是空间成本的 log 差异的 2 倍。 这相当于允许最多 10 倍的空间增加以获得 100 倍的性能提升。
我们的实现与 Microsoft SQL Server 中发现的 随时算法 最为密切相关。 与 Postgres 的自动索引工具 Dexter 相比,我们搜索更大的空间并使用不同的启发式方法。 这使我们能够以更长的运行时间为代价生成更好的解决方案。
我们还显示了每轮搜索中完成的工作,包括添加每个索引前后查询计划的比较。 这为 LLM 提供了额外的上下文,它可以在响应索引建议时使用。
数据库健康状况
数据库健康检查可以在导致关键问题之前识别调优机会和维护需求。 在本版本中,Postgres Pro 直接从 PgHero 调整数据库健康检查。 我们正在努力完全验证这些检查,并可能在将来扩展它们。
- 索引健康状况。查找未使用的索引、重复的索引和膨胀的索引。膨胀的索引会低效地使用数据库页面。 Postgres autovacuum 清理指向死元组的索引条目,并将这些条目标记为可重用。但是,它不会压缩索引页面,最终,索引页面可能包含很少的活动元组引用。
- 缓冲区缓存命中率。衡量从缓冲区缓存而不是磁盘提供的数据库读取的比例。 必须调查低缓冲区缓存命中率,因为它通常不是成本最优的,并且会导致应用程序性能下降。
- 连接健康状况。检查与数据库的连接数并报告其利用率。 最大的风险是连接耗尽,但大量空闲或阻塞的连接也可能表明存在问题。
- Vacuum 健康状况。Vacuum 非常重要,原因有很多。 一个关键原因是防止事务 ID 回绕,这可能导致数据库停止接受写入。 Postgres 多版本并发控制 (MVCC) 机制要求每个事务都有唯一的事务 ID。 但是,由于 Postgres 使用 32 位有符号整数作为事务 ID,因此它需要在最多 20 亿个事务后重用事务 ID。 为此,它“冻结”历史事务的事务 ID,将它们全部设置为指示遥远过去的特殊值。 当记录首次进入磁盘时,它们会被写入一系列事务 ID 的可见性。 在重用这些事务 ID 之前,Postgres 必须更新任何磁盘上的记录,将它们“冻结”以删除对要重用的事务 ID 的引用。 此检查查找需要 vacuum 以防止事务 ID 回绕的表。
- 复制健康状况。通过监控主副本和副本之间的延迟、验证复制状态以及跟踪复制槽的使用情况来检查复制健康状况。
- 约束健康状况。在正常操作期间,Postgres 会拒绝任何会导致约束冲突的事务。 但是,在加载数据后或在恢复场景中可能会出现无效的约束。此检查查找任何无效的约束。
- 序列健康状况。查找有超出其最大值风险的序列。
Postgres 客户端库
Postgres Pro 使用 psycopg3 通过异步 I/O 连接到 Postgres。 在底层,psycopg3 使用 libpq 库连接到 Postgres,从而可以访问完整的 Postgres 功能集和 Postgres 社区完全支持的底层实现。
一些其他基于 Python 的 MCP 服务器使用 asyncpg,这可以通过消除 libpq
依赖项来简化安装。
Asyncpg 也可能比 psycopg3 更快,但我们尚未自行验证这一点。
较旧的基准测试 报告了更大的性能差距,这表明较新的 psycopg3 在成熟时缩小了差距。
在平衡这些考虑因素后,我们选择了 psycopg3
而不是 asyncpg
。
我们仍然对将来修改此决定持开放态度。
连接配置
与 参考 PostgreSQL MCP 服务器 一样,Postgres Pro 在启动时获取 Postgres 连接信息。 这对于始终连接到同一数据库的用户来说很方便,但在用户切换数据库时可能会很麻烦。
PG-MCP 采用的另一种方法是在使用时通过 MCP 工具调用提供连接详细信息。 这对于切换数据库的用户来说更方便,并且允许单个 MCP 服务器同时支持多个最终用户。
必须有一种比这两种方法更好的方法。 两者都存在安全漏洞——很少有 MCP 客户端安全地存储 MCP 服务器配置(Goose 是一个例外),并且通过 MCP 工具提供的凭据会通过 LLM 传递并存储在聊天历史记录中。 两者在某些情况下也存在可用性问题。
模式信息
模式信息工具的目的是为调用 AI 代理提供生成正确且高性能 SQL 所需的信息。 例如,假设用户问:“去年有多少航班从旧金山起飞并在巴黎降落?” AI 代理需要找到存储航班的表、存储始发地和目的地的列,以及可能在机场代码和机场位置之间映射的表。
当 LLM 通常能够生成 SQL 以直接从 Postgres 检索此信息时,为什么还要提供模式信息工具?
我们使用 Claude 的经验表明,调用 LLM 非常擅长通过查询 Postgres 系统目录 和 信息模式(ANSI 标准化的数据库元数据视图)来生成 SQL 以探索 Postgres 模式。 但是,我们不知道其他 LLM 是否也能如此可靠和胜任地做到这一点。
使用 MCP 资源 而不是 MCP 工具 提供模式信息是否更好?
参考 PostgreSQL MCP 服务器 使用资源而不是工具来公开模式信息。 导航资源类似于导航文件系统,因此这种方法在许多方面都很自然。 但是,在 MCP 客户端生态系统中,资源支持不如工具支持广泛(请参阅 示例客户端)。 此外,虽然 MCP 标准规定 AI 代理或最终用户都可以访问资源,但某些客户端仅支持人类导航资源树。
受保护的 SQL 执行
AI 扩大了保护数据库免受各种威胁(从简单错误到恶意行为者的复杂攻击)的长期挑战。 无论威胁是意外的还是恶意的,都适用类似的安全框架,其目标分为三类:机密性、完整性和可用性。 便利性和安全性之间熟悉的紧张关系也很明显和突出。
Postgres Pro 的受保护 SQL 执行模式侧重于完整性。 在 MCP 的上下文中,我们最关心的是 LLM 生成的 SQL 造成损害——例如,意外的数据修改或删除,或其他可能规避组织变更管理流程的更改。
提供完整性的最简单方法是确保针对数据库执行的所有 SQL 都是只读的。 一种方法是创建具有只读访问权限的数据库用户。 虽然这是一种好方法,但许多人发现这在实践中很麻烦。 Postgres 没有提供将连接或会话置于只读模式的方法,因此 Postgres Pro 使用更复杂的方法来确保在读写连接之上执行只读 SQL。
Postgres 提供了一种只读事务模式,可防止数据和模式修改。 与 参考 PostgreSQL MCP 服务器 一样,我们使用只读事务来提供受保护的 SQL 执行。
为了使此机制健壮,我们需要确保 SQL 不会以某种方式规避只读事务模式,例如通过发出 COMMIT
或 ROLLBACK
语句,然后开始新的事务。
例如,LLM 可以通过发出 ROLLBACK
语句,然后开始新的事务来规避只读事务模式。
例如:
ROLLBACK; DROP TABLE users;
为了防止出现这种情况,我们在执行之前使用 pglast 库解析 SQL。
我们拒绝任何包含 commit
或 rollback
语句的 SQL。
有帮助的是,流行的 Postgres 存储过程语言(包括 PL/pgSQL 和 PL/Python)不允许使用 COMMIT
或 ROLLBACK
语句。
如果您的数据库上启用了不安全的存储过程语言,则我们的只读保护可能会被规避。
目前,Postgres Pro 为数据库提供两个级别的保护,一个位于便利性/安全性范围的两个极端。
- “无限制”提供最大的灵活性。 它适用于速度和灵活性至关重要的开发环境,并且无需保护有价值或敏感的数据。
- “限制”在灵活性和安全性之间提供平衡。 它适用于数据库暴露给不受信任的用户的生产环境,并且保护有价值或敏感的数据非常重要。
无限制模式与 Cursor 的自动运行模式 的方法一致,在这种模式下,AI 代理在有限的人工监督或批准下运行。 我们预计自动运行将部署在错误后果较低的开发环境中,在这些环境中,数据库不包含有价值或敏感的数据,并且可以在需要时从备份中重新创建或恢复。
我们将限制模式设计为保守的,即使可能不方便,也要在安全方面犯错。 限制模式仅限于只读操作,并且我们限制查询执行时间以防止长时间运行的查询影响系统性能。 我们将来可能会添加措施以确保限制模式可以安全地用于生产数据库。
Postgres Pro 开发
以下说明适用于想要开发 Postgres Pro 的开发人员,或喜欢从源代码安装 Postgres Pro 的用户。
本地开发设置
-
安装 uv:
curl -sSL https://astral.sh/uv/install.sh | sh
-
克隆存储库:
git clone https://github.com/crystaldba/postgres-mcp.git cd postgres-mcp
-
安装依赖项:
uv pip install -e . uv sync
-
运行服务器:
uv run postgres-mcp "postgres://user:password@localhost:5432/dbname"
推荐服务器
Crypto Price & Market Analysis MCP Server
一个模型上下文协议 (MCP) 服务器,它使用 CoinCap API 提供全面的加密货币分析。该服务器通过一个易于使用的界面提供实时价格数据、市场分析和历史趋势。 (Alternative, slightly more formal and technical translation): 一个模型上下文协议 (MCP) 服务器,利用 CoinCap API 提供全面的加密货币分析服务。该服务器通过用户友好的界面,提供实时价格数据、市场分析以及历史趋势数据。
MCP PubMed Search
用于搜索 PubMed 的服务器(PubMed 是一个免费的在线数据库,用户可以在其中搜索生物医学和生命科学文献)。 我是在 MCP 发布当天创建的,但当时正在度假。 我看到有人在您的数据库中发布了类似的服务器,但还是决定发布我的服务器。
mixpanel
连接到您的 Mixpanel 数据。 从 Mixpanel 分析查询事件、留存和漏斗数据。

Sequential Thinking MCP Server
这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。

Nefino MCP Server
为大型语言模型提供访问德国可再生能源项目新闻和信息的能力,允许按地点、主题(太阳能、风能、氢能)和日期范围进行筛选。
Vectorize
将 MCP 服务器向量化以实现高级检索、私有深度研究、Anything-to-Markdown 文件提取和文本分块。
Mathematica Documentation MCP server
一个服务器,通过 FastMCP 提供对 Mathematica 文档的访问,使用户能够从 Wolfram Mathematica 检索函数文档和列出软件包符号。
kb-mcp-server
一个 MCP 服务器,旨在实现便携性、本地化、简易性和便利性,以支持对 txtai “all in one” 嵌入数据库进行基于语义/图的检索。任何 tar.gz 格式的 txtai 嵌入数据库都可以被加载。
Research MCP Server
这个服务器用作 MCP 服务器,与 Notion 交互以检索和创建调查数据,并与 Claude Desktop Client 集成以进行和审查调查。

Cryo MCP Server
一个API服务器,实现了模型补全协议(MCP),用于Cryo区块链数据提取,允许用户通过任何兼容MCP的客户端查询以太坊区块链数据。