PostgreSQL SSH MCP服务器

一个跨平台的PostgreSQL MCP服务器,支持SSH隧道连接,适用于AI工具查询和检查数据库。

  • by SecretX33
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 SecretX33/postgres-ssh-mcp

使用说明

postgres ssh-mcp

支持SSH隧道的PostgreSQL跨平台MCP服务器。适用于macOS、Linux和Windows。

概述

postgres-ssh-mcp 公开了允许AI工具查询和内省PostgreSQL数据库的MCP工具。它支持三种连接模式:

连接模式

模式 激活时 连接方式
直接的 未设置SSH变量 直接连接到Postgres(无隧道)
SSH配置 SSH_HOST 已设置 读取 ~/.ssh/config 对于给定的别名;使用其 HostName, User, IdentityFile等等。
显式SSH SSH_HOSTNAME + SSH_USER 已设置 使用环境变量中的值打开SSH隧道

使用AI工具

任何MCP兼容工具

Claude Desktop、Cursor和Windsurf等工具使用JSON配置文件。在下面添加条目 mcpServers:

{
  "mcpServers": {
    "postgres-ssh-mcp": {
      "command": "npx",
      "args": ["-y", "postgres-ssh-mcp"],
      "env": {
        "DB_HOST": "localhost",
        "DB_NAME": "mydb",
        "DB_USER": "dbuser",
        "DB_PASSWORD": "dbpassword",
        
        // If you have an SSH config alias:
        "SSH_HOST": "my-bastion",
        
        // Or if you need explicit SSH:
        "SSH_HOSTNAME": "127.0.0.1",
        "SSH_USER": "mybastionuser",
        "SSH_IDENTITY_FILE": "~/.ssh/mybastionkey", // optional if you use the default key path
        "SSH_KEY_PASSPHRASE": "mypassphrase", // optional, if your private key is encrypted
        "SSH_PORT": "1234", // defaults to 22
      }
    }
  }
}

对于SSH隧道连接,添加 SSH_HOST (SSH配置别名)或 SSH_HOSTNAME + SSH_USER (显式凭据)到 env 块。

克劳德代码

使用 claude mcp add 注册服务器。所有环境变量必须通过传递 --env 旗帜。

claude mcp add --transport stdio postgres-ssh-mcp \
  --env DB_HOST=localhost \
  --env DB_NAME=mydb \
  --env DB_USER=dbuser \
  --env DB_PASSWORD=dbpassword \
  -- npx -y postgres-ssh-mcp

提示: 您可以包括 --scope project 将服务器仅添加到当前项目中。

工具

工具 说明
run_query 执行SQL查询(默认情况下为只读;请参阅 DB_READ_ONLY).支持参数化查询 $1, $2, ... 占位符
explain_query 获取SQL查询的执行计划。支持所有PostgreSQL EXPLAIN选项(分析、缓冲、定时等)和输出格式(文本、JSON、YAML、XML)
list_schemas 列出数据库中的所有架构
list_tables 列出架构中的表(默认值: public)
describe_table 显示表的列、类型和可空性
get_connection_status 显示连接池统计信息、数据库版本、大小和服务器配置

深度防御查询安全

这是设置的关键功能 postgres-ssh-mcp 除了其他PostgreSQL MCP服务器之外。它是唯一一个通过安全机制的组合来实施多层保护以防止意外数据修改的系统。

  1. AST级SQL验证 使用 pgsql-parser 和 @pgsql/traverse --将SQL解析为抽象语法树并遍历它以检测突变(包括CTE中的隐藏突变), SELECT INTO以及锁定条款。仅 SELECT 和 EXPLAIN 允许发表声明。
  2. 危险功能denylist --阻止250多个PostgreSQL函数,即使在只读事务中也会产生副作用,包括 pg_sleep, nextval, pg_notify、文件I/O功能、咨询锁和复制控制。
  3. 只读事务包装 --所有查询都在内部执行 BEGIN TRANSACTION READ ONLY 自动 ROLLBACK.
  4. 单一声明执行 --多语句查询在执行前被拒绝。

注: 不建议禁用这些安全机制,但是,您可以通过设置 DB_READ_ONLY=false,它授予AI工具对数据库的完全写入权限。

环境变量

这些都是可用于配置此MCP服务器的环境变量。

必需

变量 描述
DB_HOST Postgres主机或RDS端点
DB_NAME 数据库名称
DB_USER 数据库用户
DB_PASSWORD 数据库密码

可选的

变量 默认值 描述
ALLOWED_TOOLS (全部) 以逗号分隔的要注册的工具列表。未设置时,所有工具都可用。案件敏感。例子: run_query,describe_table
DB_PORT 5432 Postgres港口
DB_READ_ONLY true 设置为 false 允许写查询(run_query 仅)
DB_SSL false 设置为 true 为数据库连接启用TLS
DB_SSL_CA -- 用于SSL验证的自定义CA证书文件(PEM)的路径
DB_SSL_REJECT_UNAUTHORIZED true 设置为 false 跳过SSL证书验证(不安全)
DB_MAX_ROWS 1000 每个查询返回的最大行数。在只读模式下使用基于光标的获取
DB_CONNECTION_POOL_SIZE 5 池中的最大连接数
DB_CONNECTION_TIMEOUT_MS 10000 等待来自池的连接的毫秒数
DB_QUERY_TIMEOUT_MS 15000 强制取消查询前的毫秒
DB_POOL_DRAIN_TIMEOUT_MS 5000 在重新连接期间等待旧池排空的毫秒数(0表示从不等待)
SSH_HOST -- SSH配置别名(读取 ~/.ssh/config)
SSH_HOSTNAME -- Bastion主机名或IP
SSH_USER -- SSH登录用户
SSH_PORT 22 SSH端口
SSH_STRICT_HOST_KEY_CHECKING true 启用或禁用严格主机检查
SSH_IDENTITY_FILE -- 绝对路径或 ~/... 到私钥文件
SSH_KEY_PASSPHRASE -- 加密私钥的密码
SSH_PASSWORD -- SSH密码(基于密钥的身份验证的替代方案)
SSH_KEEPALIVE_INTERVAL_MS disabled SSH保活探测之间的毫秒数(如果设置:最小1000)
SSH_KEEPALIVE_COUNT_MAX 3 在断开连接之前,最多可进行未应答的保活探测
SSH_TRUST_ON_FIRST_USE true 在首次连接时自动接受并保存未知的SSH主机密钥
SSH_KNOWN_HOSTS_PATH -- 自定义known_hosts文件的路径(默认值: ~/.ssh/known_hosts)
SSH_MAX_RECONNECT_ATTEMPTS 5 SSH重新连接的最大尝试次数(-1表示无限制,0表示禁用)

发展

复制示例env文件并填写您的值:

git clone https://github.com/SecretX33/postgres-ssh-mcp.git
cd postgres-ssh-mcp
npm install
npm run build

编译后的服务器被写入 dist/index.js.

复制示例env文件并填写您的值:

cp .env.example .env
# edit .env

然后以监视模式运行(自动加载 .env):

npm run dev

许可证

麻省理工学院