PostgreSQL只读MCP服务器

一个提供安全PostgreSQL工具的只读模型上下文协议服务器,强制执行只读会话和严格的SQL验证,防止LLMs执行写入操作。

  • by code-by-muhammad
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 muham-2002/postgresql-read-mcp

使用说明

PG_READ_MCP - PostgreSQL 只读 MCP 服务器

只读模型上下文协议服务器,提供安全的PostgreSQL工具。强制实施只读会话和严格的SQL验证,以防止大型语言模型(LLMs)执行写操作。

🚀 分步指南

先决条件

  • Python 3.12及以上版本
  • Git(注:Git是一个分布式版本控制系统,用于跟踪对文件的修改)

步骤0:复制模板

点击页面右上角的“使用此模板”按钮,复制这个GitHub模板。

步骤1:创建虚拟环境

在 Cursor、Windsur 或 VS Code 中:

  1. 打开命令面板:
    • 在Mac上: Cmd + Shift + P
    • 在Windows上: Ctrl + Shift + P
  2. 输入并选择: Python:选择解释器
  3. 点击: + 创建虚拟环境
  4. 选择: Venv(注:这可能是“Venv”一词的直接翻译,若“Venv”有特定含义或上下文,请根据实际情况调整翻译) 作为环境类型

在终端中:

python -m venv venv
source venv/bin/activate

工具

暴露的工具(所有读取DSN的) PG_DEFAULT_URL 在 .env):

  • PgListSchemasTool()列出非系统模式(或架构)
  • PgListTablesTool(target_schema)列出模式中的表
  • PgDescribeTableTool(target_schema, table)描述列
  • PgRunReadQueryTool(sql, max_rows=5000, timeout_ms=10000)执行已验证的 SELECT/CTE(公用表表达式)

安全:

  • 会议/会话: SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, statement_timeout, idle_in_transaction_session_timeout
  • 验证器:阻止 UPDATE/DELETE/INSERT/DDL/实用程序/锁/COPY 操作以及数据修改的 CTE(公用表表达式);允许在 SELECT 中使用常规函数

第二步:环境

创建 .env 与;带有;随同

PG_DEFAULT_URL=postgresql://user:pass@host:port/db
# optional
PG_DEFAULT_SCHEMA=public
PG_DEFAULT_TABLE=
PG_TEST_SQL=SELECT 1 AS one

2.1 仅通过与AI聊天即可创建自定义工具

在聊天中提示你的AI集成开发环境(IDE)为你创建工具。 确保包含 ./.cursor/rules/workflow.mdc 在上下文中。(默认仅在 Cursor 中包含)。

例如:

Please create a tool that fetches the transcripts from a YouTube video. @workflow.mdc

回答澄清问题,并不断迭代,直到工具创建完成并按预期运行。

确保将任何所需的环境变量添加到(配置中) ./.env 文件。

2.2 在本地运行

python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
PYTHONPATH=. python server/start_mcp.py --tools-dir ./tools
# or include subdirs/multiple endpoints per README below if desired

将其他预构建的开源 Stdio MCP 服务器添加到 mcp.json 与 Cursor 和其他客户端一样,文件(也支持)。

{
  "mcpServers": {
    "notionapi": {
      "command": "npx",
      "args": [
        "-y",
        "@notionhq/notion-mcp-server"
      ],
      "env": {
        "OPENAPI_MCP_HEADERS": "{\"Authorization\":\"Bearer ntn_****\",\"Notion-Version\":\"2022-06-28\"}"
      }
    }
    # ... add more servers here
}

仅 Stdio 此方法支持服务器。此仓库将自动将其转换为SSE(服务器发送事件) 超级网关.

你可以使用 npx 和 uv 来运行这些服务器。

2.3 快速烟雾测试

运行以下命令来测试MCP服务器,并确保所有服务器都在运行。

python tools/PgListSchemasTool.py
python tools/PgListTablesTool.py
python tools/PgDescribeTableTool.py
python tools/PgRunReadQueryTool.py

对于使用子目录端点进行测试:

python server/start_mcp.py --split-subdirs

你无法将本地服务器连接到Agencii,但可以通过将SSE URL添加到Cursor的“MCP服务器”选项卡中来对其进行测试。

这一步不是必须的。只要你的工具没有问题就行。

多端点MCP服务器

此模板支持从单个Python服务器提供多个工具目录作为独立的端点。

目录结构

按照惯例,我们建议使用“_mcp”后缀来命名MCP实例目录,但也可以使用任何目录名称:

tools/
├── SharedTool1.py         # Shared across all MCP instances
├── SharedTool2.py         # Shared across all MCP instances
├── marketing_mcp/         # Marketing MCP instance
│   ├── MarketingTool1.py
│   └── MarketingTool2.py
└── analytics_mcp/         # Analytics MCP instance
    ├── AnalyticsTool1.py
    └── AnalyticsTool2.py

运行特定的MCP实例

要运行特定的MCP实例,请使用 MCP_TOOLS_DIR 环境变量:

# Run the marketing MCP instance
MCP_TOOLS_DIR="./tools/marketing_mcp" MCP_INSTANCE_NAME="marketing-mcp" python server/start_mcp.py

# Run the analytics MCP instance
MCP_TOOLS_DIR="./tools/analytics_mcp" MCP_INSTANCE_NAME="analytics-mcp" python server/start_mcp.py

这将从指定的目录加载所有工具,并且从父工具目录加载所有工具。

服务器模式

单目录模式(默认):

python server/start_mcp.py

仅在根端点提供来自指定目录的工具 /sse.

组合目录模式(默认):

python server/start_mcp.py --include-subdir

在父目录、子目录以及MCP配置文件中找到的所有工具都将被部署到根端点 /sse。

多端点模式:

python server/start_mcp.py --split-subdirs

每个子目录都有自己的端点:

  • Root工具: /sse
  • 营销工具: /marketing_mcp/sse
  • 分析工具: /analytics_mcp/sse
  • MCP配置工具: /example-mcp-server/sse

配置选项

  • MCP_TOOLS_DIR工具目录的路径(默认:"./tools")
  • MCP_HOST绑定服务器的主机(默认值:“0.0.0.0”)
  • MCP_PORT运行服务器的端口(默认:8080)
  • MCP_INSTANCE_NAME用于日志记录的实例名称(默认:“mcp-server”)
  • MCP_CONFIG_PATHstdio MCP 服务器的 mcp 配置文件路径(可选)
  • MCP_INCLUDE_SUBDIRS在根端点中包含所有子目录工具(默认:false)
  • MCP_SPLIT_SUBDIRS为子目录创建单独的端点(默认:false)

重要提示: 当 MCP_INCLUDE_SUBDIRS=true所有来自子目录的工具都被加载到根目录中 /sse 在基础工具旁边设置一个端点。这样就创建了一个包含所有工具的单一端点。

这些也可以设置为命令行参数(配置路径除外):

python server/start_mcp.py --tools-dir ./tools/marketing --port 8001 --name marketing-mcp

部署到铁路(系统/网络)

  1. 参观 railway.com 翻译成中文是“铁路网”或“铁路.com(网站名,根据具体语境可灵活翻译)”。不过,通常在中文语境中,如果直接提到这个域名,可能会保留原样或稍作解释,比如“铁路相关的网站(railway.com)”。但在这里,为了简洁明了,直接翻译为“铁路网”也是可以接受的.
  2. 创建一个新项目,并选择从GitHub部署。
  3. 连接并选择您在第一步中创建的GitHub仓库。
  4. 设置所需的环境变量(参见.env.example文件)。如果您计划更改应用程序的端口,请确保相应地调整Dockerfile。
  5. 点击部署。

要部署多个MCP实例,请在Railway中创建多个服务,每个服务都具有不同的环境变量。

如果遇到问题,您可以点击最新的部署,然后点击“日志”选项卡来查看铁路系统的日志。

这台服务器使用 Dockerfile 和 railway.json. 设置 PG_DEFAULT_URL 在铁路变量中。集装箱启动 server/start_mcp.py。

步骤5:复制您的铁路部署URL

  1. 进入设置 > 网络连接
  2. 点击“生成域名”
  3. 复制生成的URL。

在单端点模式下(默认):

  • 仅限root工具: https://<railway-domain>/sse

在单端点模式下,与 MCP_INCLUDE_SUBDIRS=true:

  • 所有工具(根目录 + 子目录): https://<railway-domain>/sse

在多端点模式(带有 MCP_SPLIT_SUBDIRS=true):

  • Root工具: https://<railway-domain>/sse
  • 子目录工具: https://<railway-domain>/<subdir-name>/sse

来自(该系列/该品牌等,根据上下文补充具体信息)的其他MCP服务器 mcp.json 文件将在以下位置可访问:

https://<railway-domain>/notionapi/sse
https://<railway-domain>/example-mcp-server/sse

步骤6:将MCP服务器连接到Agencii

  1. 导航至 代理工具页面。
  2. 点击“新建工具”
  3. 选择“MCP”
  4. 输入您的MCP服务器的URL
  5. 点击“同步工具”
  6. 点击“保存”
  7. 将您的工具添加到代理中。

我们建议再次复制此模板,并为每个新项目/客户重复此过程。


祝你建房愉快! 🚀