← 返回公开榜单
po

crystaldba/postgres-mcp

Postgres MCP Pro provides configurable read/write access and performance analysis for you and your AI agents.

本周新增
1,676 星
近 3 周倍数
—
距上次推送
289 天
距上次发布
540 天
许可证
MIT

星标增长

每根柱子是这个周期记录下来的 star 增长:优先取逐个 stargazer 到达时间分桶的到达数,还没被 stargazer 扫描覆盖的仓库改用该周期的 star 净增;两个写者都没记录的周期画成虚线空档,而不是当成 0。柱高按各自窗口的峰值归一,两张图不共用坐标轴。指向任意一根柱子, tooltip 里是该周期的九项指标:当前值与周期内的净增。

指向或点击一根柱子,看当天的九项指标。

12/1712/301/111/242/62/193/33/16

2026 年 3 月 16 日 新增 1,676 个星标

窗口内最高的一天是 2026 年 3 月 16 日,新增 1676 个星标。

证据时间轴

这个项目还没有记录到异动、发布或许可证变化。

README
该仓库存储的文档,若已生成中文翻译则一并显示
Postgres MCP Pro Logo

License: MIT PyPI - Version Discord Twitter Follow Contributors

一个带有索引调优、执行计划分析、健康检查和安全SQL执行的Postgres MCP服务器。

概述

Postgres MCP Pro 是一个开源的模型上下文协议 (MCP) 服务器,旨在支持您和您的AI代理在整个开发过程中——从初始编码、测试和部署,到生产调优和维护。

Postgres MCP Pro 不仅仅是包装一个数据库连接。

功能包括:

  • 🔍 数据库健康 - 分析索引健康、连接利用率、缓冲区缓存、清理健康、序列限制、复制延迟等。
  • ⚡ 索引调优 - 使用工业级算法探索数千种可能的索引,以找到最适合您工作负载的最佳解决方案。
  • 📈 查询计划 - 通过查看EXPLAIN计划并模拟假设索引的影响来验证和优化性能。
  • 🧠 模式智能 - 基于对数据库模式的详细理解生成上下文感知SQL。
  • 🛡️ 安全SQL执行 - 可配置的访问控制,包括对只读模式和安全的SQL解析的支持,使其既可用于开发也可用于生产。

Postgres MCP Pro 支持标准输入/输出 (stdio) 和服务器发送事件 (SSE) 传输,以适应不同的环境。

有关我们构建Postgres MCP Pro的更多背景信息,请参阅我们的发布博客文章。

演示

从无法使用到闪电般快速

  • 挑战:我们使用AI助手生成了一个电影应用,但SQLAlchemy ORM代码运行得非常慢。
  • 解决方案:使用Cursor和Postgres MCP Pro,我们在几分钟内解决了性能问题。

我们做了什么:

  • 🚀 修复了性能问题 - 包括ORM查询、索引和缓存
  • 🛠️ 修复了一个损坏的页面 - 通过提示代理探索数据、修复查询并添加相关内容。
  • 🧠 改善了热门电影 - 通过探索数据并修复ORM查询以显示更多相关结果。

查看下面的视频或阅读逐步操作。

https://github.com/user-attachments/assets/24e05745-65e9-4998-b877-a368f1eadc13

快速入门

前置条件

在开始之前,请确保您拥有:

  1. 数据库的访问凭证。
  2. Docker 或 Python 3.12 或更高版本。

访问凭证

您可以通过使用 psql 或 GUI 工具(例如 pgAdmin)来确认您的访问凭证是有效的。

Docker 或 Python

使用 Docker 或 Python 的选择取决于您。 我们通常推荐 Docker,因为Python用户可能会遇到更多特定于环境的问题。 但是,对于大多数熟悉的方法来说,使用哪种方法都是有意义的。

然而,使用哪种方法都是有意义的。 我们通常推荐 Docker,因为Python用户可能会遇到更多特定于环境的问题。 但是,对于大多数熟悉的方法来说,使用哪种方法都是有意义的。

安装

选择以下方法之一来安装 Postgres MCP Pro:

选项 1:使用 Docker

拉取 Postgres MCP Pro MCP 服务器 Docker 镜像。 此镜像包含所有必要的依赖项,提供了一种可靠的方法,在各种环境中运行 Postgres MCP Pro。

docker pull crystaldba/postgres-mcp

选项 2:使用 Python

如果您安装了 pipx,您可以使用以下命令安装 Postgres MCP Pro:

pipx install postgres-mcp

否则,使用 uv 安装 Postgres MCP Pro:

uv pip install postgres-mcp

如果您需要安装 uv,请参阅 uv 安装说明。

配置您的 AI 助手

我们提供了完整的说明,用于将 Postgres MCP Pro 与 Claude Desktop 配置。 许多 MCP 客户端具有类似的配置文件,您可以调整这些步骤以适用于您选择的其他客户端。

Claude Desktop 配置

您需要编辑 Claude Desktop 配置文件以添加 Postgres MCP 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 MCP 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 MCP Pro 支持多种 访问模式,以让您控制 AI 代理可以对数据库执行的操作:

  • 无限制模式:允许完全的读写访问以修改数据和模式。它适用于开发环境。
  • 限制模式:将操作限制为只读事务,并对资源利用率施加约束(目前仅限于执行时间)。它适用于生产环境。

要使用限制模式,请在上面的配置示例中用 --access-mode=restricted 替换 --access-mode=unrestricted。

其他 MCP 客户端

许多 MCP 客户端具有与 Claude Desktop 类似的配置文件,您可以调整上面的示例以适用于您选择的其他客户端。

  • 如果您使用 Cursor,您可以使用 Command Palette 导航到 Cursor Settings,然后打开 MCP 标签页以访问配置文件。
  • 如果您使用 Windsurf,您可以使用 Command Palette 导航到 Open Windsurf Settings Page 以访问配置文件。
  • 如果您使用 Goose,请运行 goose configure,然后选择 Add Extension。

SSE 传输

Postgres MCP Pro 支持 SSE 传输,这允许多个 MCP 客户端共享一个服务器,可能是远程服务器。 要使用 SSE 传输,您需要使用 --transport=sse 选项启动服务器。

例如,使用 Docker 运行:

docker run -p 8000:8000 \
  -e DATABASE_URI=postgresql://username:password@localhost:5432/dbname \
  crystaldba/postgres-mcp --access-mode=unrestricted --transport=sse

然后更新您的 MCP 客户端配置以调用 MCP 服务器。 例如,在 Cursor 的 mcp.json 或 Cline 的 cline_mcp_settings.json 中,您可以放入:

{
    "mcpServers": {
        "postgres": {
            "type": "sse",
            "url": "http://localhost:8000/sse"
        }
    }
}

对于 Windsurf,mcp_config.json 中的格式略有不同:

{
    "mcpServers": {
        "postgres": {
            "type": "sse",
            "serverUrl": "http://localhost:8000/sse"
        }
    }
}

Postgres 扩展安装(可选)

要启用索引调优和全面的性能分析,您需要在您的数据库上加载 pg_statements 和 hypopg 扩展。

  • pg_statements 扩展允许 Postgres MCP Pro 分析查询执行统计信息。 例如,这允许它了解哪些查询运行缓慢或消耗大量资源。
  • hypopg 扩展允许 Postgres MCP 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 一起提供。

使用示例

获取数据库健康概述

询问:

检查我的数据库健康状况并识别任何问题。

分析慢查询

询问:

我的数据库中哪些查询最慢?我该如何加快它们的速度?

获取加速建议

询问:

我的 App 运行缓慢。我该如何让它更快?

生成索引建议

询问:

分析我的数据库工作负载并建议索引以提高性能。

优化特定查询

询问:

帮助我优化此查询:SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id WHERE orders.created_at > '2023-01-01';

MCP 服务器 API

MCP 标准 定义了各种类型的端点:工具、资源、提示和其他。

Postgres MCP Pro 通过 MCP 工具 提供功能。 我们选择这种方法是因为 MCP 客户端生态系统 对 MCP 工具的支持非常广泛。 这与其他 Postgres MCP 服务器的做法形成对比,包括 参考 Postgres MCP 服务器,它们使用 MCP 资源 来暴露模式信息。

Postgres MCP 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执行全面的健康检查,包括:缓冲区缓存命中率、连接健康、约束验证、索引健康(重复/未使用/无效)、序列限制和清理健康。

相关项目

Postgres MCP 服务器

  • Query MCP. 一个用于 Supabase Postgres 的 MCP 服务器,具有三层安全架构和 Supabase 管理API支持。
  • PG-MCP. 一个用于 PostgreSQL 的 MCP 服务器,具有灵活的连接选项、执行计划、扩展上下文等。
  • 参考 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 MCP Pro 结合了 PgHero 的健康检查。
  • PgTune. 用于调整 Postgres 配置的启发式方法。

常见问题解答

Postgres MCP Pro 与其他 Postgres MCP 服务器有什么不同? 有许多 MCP 服务器允许 AI 代理对 Postgres 数据库运行查询。 Postgres MCP Pro 也这样做,但它还添加了理解和改进 Postgres 数据库性能的工具。 例如,它实现了 Microsoft SQL Server 的数据库调优顾问的 Anytime 算法,这是一种现代的工业级算法,用于自动索引调优。

Postgres MCP Pro其他 Postgres MCP 服务器
✅ 可确定的数据库健康检查❌ 不可重复的 LLM 生成的健康查询
✅ 原则性的索引搜索策略❌ 生成式 AI 对索引改进的猜测
✅ 工作负载分析以找到主要问题❌ 不一致的问题分析
✅ 模拟性能改进❌ 尝试它看看是否有效

Postgres MCP Pro 通过添加确定性工具和经典优化算法来补充生成式 AI 这种组合既可靠又灵活。

为什么需要 MCP 工具,当 LLM 可以推理、生成 SQL 等时? LLM 对于涉及歧义、推理或自然语言的任务非常有价值。 然而,与过程代码相比,它们可能很慢、成本高昂、非确定性,有时会产生不可靠的结果。 在数据库调优的情况下,我们拥有经过几十年发展起来的成熟算法,它们被证明是有效的。 Postgres MCP Pro 允许您结合两者的最佳之处,将 LLM 与经典优化算法和其他过程工具配对。

如何测试 Postgres MCP Pro? 测试对于确保 Postgres MCP Pro 可靠和准确至关重要。 我们正在构建一套 AI 生成的对抗性工作负载,旨在挑战 Postgres MCP Pro 并确保它在各种场景下都能表现良好。

支持哪些 Postgres 版本? 我们目前的测试重点放在 Postgres 15、16 和 17 上。 我们计划支持 Postgres 版本 13 通过 17。

谁创建了这个项目? 该项目由 Crystal DBA 创建和维护。

路线图

TBD

您和您的需求是我们构建的关键驱动力。 通过打开一个 问题 或一个 拉取请求 来告诉我们您想看到什么。 您还可以在 Discord 上联系我们。

技术说明

本节包括影响 Postgres MCP Pro 设计的高级技术考虑因素概述。

索引调优

开发人员知道缺少索引是导致数据库性能问题最常见的原因之一。 索引提供了访问方法,允许 Postgres 快速定位执行查询所需的数据库。 当表较小时,索引几乎没有区别,但随着数据量的增长,表扫描和索引查找之间的算法复杂度差异变得显著(通常 O(n) vs O(log n),如果涉及多个表的连接,可能更多)。

在 Postgres MCP Pro 中生成建议索引的过程包括几个阶段:

  1. 识别需要调优的 SQL 查询。 如果您知道您在特定 SQL 查询上遇到问题,您可以提供它。 Postgres MCP Pro 还可以分析工作负载以识别索引调优目标。 为此,它依赖于 pg_stat_statements 扩展,该扩展记录每个查询的运行时和资源消耗。

    如果查询是资源消耗的候选者,无论是基于每次执行还是汇总,则将其视为索引调优候选者。 目前,我们使用执行时间作为累积资源消耗的代理,但查看特定资源(例如,访问的块数或从磁盘读取的块数)也可能是有意义的。 analyze_query_workload 工具专注于慢查询,使用每次执行的均值时间,并设置执行次数和平均执行时间的阈值。 代理还可以调用 get_top_queries,它接受一个用于均值与总执行时间的参数,然后将这些查询 analyze_query_indexes 传递给它们以获取索引建议。

复杂的索引调优系统使用“工作负载压缩”来生成一个代表工作负载整体特征的查询子集,从而减少下游算法的问题。 Postgres MCP Pro 通过将查询标准化来实现有限形式的工作负载压缩,以便从相同模板生成的查询显示为一个。 它平等地权衡每个查询,这是一个简化,当索引的好处很大时,这个简化是有效的。

  1. 生成候选索引 一旦我们有了我们想要通过索引改进的 SQL 查询列表,我们就生成一个我们可能想要添加的索引列表。 为此,我们解析 SQL 并识别任何用于过滤器、连接、分组或排序的列。

为了生成所有可能的索引,我们需要考虑这些列的组合,因为 Postgres 支持多列索引。 在当前的实现中,我们只包含每个可能的 多列索引的一个排列,该排列是随机选择的。 我们做出这种简化是为了减少搜索空间,因为排列通常具有等效的性能。 但是,我们希望在这方面有所改进。

  1. 搜索最佳索引配置。 我们的目的是找到索引的最佳组合,在性能收益和存储和维护这些索引的成本之间取得最佳平衡。 我们使用 hypopg 扩展提供的“假设”功能来估计性能改进。 这模拟添加索引后 Postgres 查询优化器将如何执行查询,并根据实际的 Postgres 成本模型报告更改。

一个挑战是生成查询计划通常需要知道查询中使用的特定参数值。 查询规范化,这是减少考虑中的查询所必需的,它去除了参数常量。 通过绑定变量提供的参数值同样不可用。

为了解决这个问题,我们通过从表统计信息中采样来生成逼真的常量,我们可以将其作为参数提供给 hypopg。

在版本 16 中,Postgres 添加了 通用解释计划功能,但它存在限制,例如 LIKE 子句周围,我们的实现没有这些限制。

搜索策略至关重要,因为评估所有可能的索引组合只有在简单情况下才可行。 这是区分各种索引方法的主要区别。 我们采用了 Microsoft 的 Anytime 算法的做法,采用贪婪搜索策略,即找到最佳单索引解决方案,然后找到添加到该解决方案的最佳索引以生成双索引解决方案。 当时间预算用尽或一轮探索未能产生高于 10% 最小改进阈值的收益时,搜索将终止。

  1. 成本效益分析。 当面临两个索引替代方案时,一个产生更好的性能,另一个需要更多的空间,我们该如何选择? 传统上,索引顾问会要求提供存储预算,并针对该存储预算优化性能。 我们也在整个优化过程中进行成本效益分析。

我们将其表述为选择沿着 Pareto 前沿—改进一个质量指标必然导致另一个质量指标的选择集。 在理想的世界里,我们可能希望以货币术语评估存储成本和改进性能的收益。 然而,有更简单和更实际的方法:查看相对变化。 大多数人都会同意,100 倍的性能改进值得付出代价,即使存储成本增加 2 倍。 在我们的实现中,我们使用可配置参数来设置此阈值。 默认情况下,我们要求性能改进的对数(以 10 为底)的变化是空间成本差异的对数(以 10 为底)的 2 倍。 这相当于允许空间成本最多增加 10 倍以换取 100 倍的性能改进。

我们的实现与 Microsoft SQL Server 中的 Anytime 算法 最接近。 与 Dexter(一个用于 Postgres 的自动索引工具)相比,我们搜索更大的空间并使用不同的启发式算法。 这使得我们能够生成更好的解决方案,代价是运行时间更长。

我们还显示了每次搜索中完成的工作,包括在添加每个索引前后比较查询计划。 这为 LLM 提供了额外的上下文,它可以在响应索引建议时使用。

实验性:LLM 索引调优

Postgres MCP Pro 包括一个基于 Optimization by LLM 的实验性索引调优功能。 而不是使用启发式方法探索可能的索引配置,我们将数据库模式和查询计划提供给 LLM,并要求它提出索引配置。 然后,我们使用 hypopg 来预测使用建议索引的性能,然后将这些结果反馈给 LLM 以生成新的建议集。 我们重复此过程,直到多轮迭代不再产生进一步改进。

LLM 索引优化在索引搜索空间很大或需要考虑具有许多列的索引时具有优势。 像传统的基于搜索的方法一样,它依赖于 hypopg 性能预测的准确性。

为了执行 LLM 索引优化,您必须通过设置 OPENAI_API_KEY 环境变量提供 OpenAI API 密钥。

数据库健康

数据库健康检查在问题导致关键问题之前识别调优机会和维护需求。 在当前版本中,Postgres MCP Pro 直接采用了 PgHero 的数据库健康检查。 我们正在努力完全验证这些检查,并在未来可能扩展它们。

  • 索引健康。 查找未使用的索引、重复的索引以及膨胀的索引。膨胀的索引会低效地使用数据库页面。 Postgres 自动清理指向已死元组的索引条目,并将条目标记为可重用。但是,它不会压缩索引页面,最终索引页面可能包含很少的活元组引用。
  • 缓冲区缓存命中率。 衡量数据库读取中有多少比例是从缓冲区缓存而不是磁盘提供的。 缓冲区缓存命中率低必须进行调查,因为它通常不是成本最优的,并且会导致应用程序性能下降。
  • 连接健康。 检查连接到数据库的连接数并报告其利用率。 最大的风险是运行 out of 连接,但大量空闲或阻塞的连接也可能表示存在问题。
  • 清理健康。 清理对于许多原因都很重要。 一个关键原因是防止事务 ID 回绕,这可能导致数据库停止接受写入。 Postgres 多版本并发控制 (MVCC) 机制需要每个事务都有一个唯一的事务 ID。 然而,由于 Postgres 使用 32 位有符号整数来表示事务 ID,它需要在最多 20 亿个事务后重用事务 ID。 为此,它“冻结”了历史事务的事务 ID,将它们全部设置为一个指示遥远过去的特殊值。 当记录第一次写入磁盘时,它们是针对一系列事务 ID 可见的。 在重用这些事务 ID 之前,Postgres 必须更新任何磁盘记录,“冻结”它们以删除对要重用的事务 ID 的引用。 这个检查查找需要清理的表,以防止事务 ID 回绕。
  • 复制健康。 通过监控主副本之间的复制延迟、验证复制状态并跟踪复制槽的使用情况来检查复制健康。
  • 约束健康。 在正常操作中,Postgres 会拒绝任何会导致约束冲突的事务。 然而,无效的约束可能在加载数据或恢复场景后发生。此检查查找任何无效的约束。
  • 序列健康。 查找有风险超出其最大值的序列。

Postgres 客户端库

Postgres MCP Pro 使用 psycopg3 使用异步 I/O 连接到 Postgres。 在底层,psycopg3 使用 libpq 库连接到 Postgres,提供对 Postgres 全部功能的访问,并由 Postgres 社区完全支持。

其他基于 Python 的 MCP 服务器使用 asyncpg,它可以通过消除 libpq 依赖来简化安装。 Asyncpg 也可能比 psycopg3 更快,但我们没有亲自验证这一点。 旧基准 报告了更大的性能差距,表明 psycopg3 随着其成熟已经缩小了差距。

权衡这些考虑后,我们选择了 psycopg3 而不是 asyncpg。 我们仍然保持开放态度,将来可能会修改此决定。

连接配置

与 参考 PostgreSQL MCP 服务器 一样,Postgres MCP Pro 在启动时接受 Postgres 连接信息。 这对于始终连接到相同数据库的用户很方便,但在用户切换数据库时可能会很麻烦。

另一种方法,PG-MCP 采取的方法是提供连接详细信息,在使用时通过 MCP 工具调用。 这对于切换数据库的用户更方便,并允许单个 MCP 服务器同时支持多个最终用户。

必须有一种比这两种方法更好的方法。 这两种方法都有安全漏洞——很少有 MCP 客户端安全地存储 MCP 服务器配置(唯一的例外是 Goose),并且通过 MCP 工具提供的凭证会通过 LLM 传递并存储在聊天历史记录中。 这两种方法在有些场景下也存在可用性问题。

模式信息

模式信息工具的目的是向调用中的 AI 代理提供它生成正确且性能良好的 SQL 所需的信息。 例如,假设用户询问,“过去一年从旧金山起飞并降落在巴黎的航班有多少?” AI 代理需要找到存储航班的表、存储起运地和目的地的列,也许还需要一个表来映射机场代码和机场位置。

为什么在 LLM 通常能够直接从 Postgres 生成 SQL 来检索此信息的情况下提供模式信息工具? 我们的经验表明,调用中的 LLM 非常擅长生成 SQL 来探索 Postgres 模式,通过查询 Postgres 系统目录 和 信息模式 (一个 ANSI 标准化的数据库元数据视图) 来生成 SQL。 然而,我们不知道其他 LLM 是否像这样可靠且能力强。

是否最好使用 MCP 资源而不是 MCP 工具来提供模式信息? 参考 PostgreSQL MCP 服务器 使用资源来暴露模式信息,而不是工具。 导航资源类似于导航文件系统,因此这种方法在许多情况下是自然的。 然而,资源支持不如工具支持广泛(请参阅 示例客户端)。 此外,虽然 MCP 标准说明资源可以被 AI 代理或最终用户人类访问,但一些客户端只支持人类导航资源树。

受保护的 SQL 执行

AI 放大了长期以来保护数据库免受一系列威胁的挑战,这些威胁从简单的错误到恶意行为者的复杂攻击都有。 无论威胁是偶然的还是恶意的,一个类似的安全框架都适用,其目标分为三个类别:机密性、完整性和可用性。 熟悉的便利性与安全性之间的紧张关系也很明显,并且非常突出。

Postgres MCP Pro 的受保护 SQL 执行模式专注于完整性。 在 MCP 的上下文中,我们最担心 LLM 生成的 SQL 导致损坏—for例如,意外的数据修改或删除,或其他可能绕过组织变更管理过程的变化。

最简单的方法是确保针对数据库执行的所有 SQL 都是只读的。 一种方法是为数据库创建一个具有只读访问权限的用户。 虽然这是一个很好的方法,但在实践中很多人觉得这很麻烦。 Postgres 没有提供将连接或会话置于只读模式的方法,因此 Postgres MCP Pro 使用一种更复杂的方法来确保在读写连接上执行只读 SQL。

Postgres MCP 提供了只读事务模式,可以防止数据和模式修改。 像 参考 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 MCP Pro 为数据库提供了两个级别的保护,一个位于便利性/安全性的两个极端。

  • 无限制模式:允许完全的读写访问以修改数据和模式。它适用于开发环境,在开发环境中速度和灵活性至关重要,并且不需要保护有价值或敏感数据。
  • 限制模式:将操作限制为只读事务,并对资源利用率施加约束(目前仅限于执行时间)。它适用于生产环境,数据库暴露给不受信任的用户,并且重要的是保护有价值或敏感数据。

无限制模式与 Cursor 的自动运行模式一致,其中 AI 代理的操作具有有限的监督或批准。 我们预计自动运行将部署在开发环境中,在开发环境中错误的后果较低,数据库不包含有价值或敏感数据,并且在需要时可以从备份中重新创建或恢复。

我们设计了限制模式,即使它可能不方便,也倾向于安全。 限制模式仅限于只读操作,并且我们限制了查询执行时间,以防止长时间运行的查询影响系统性能。 我们可能会在未来添加措施,以确保限制模式可以安全地用于生产数据库。

页面上的每个数字都来自记录下来的 stargazer 到达时间,没有评分公式,也没有 AI 判定。 任何结论都可以用 /api/v1/repos/{id}/stats 里的原始增量自己重算。