PostgreSQL只读MCP服务器

一个提供安全只读访问PostgreSQL数据库的模型上下文协议(MCP)服务器,支持模式检查、数据预览、自定义查询执行、关系发现和数据库统计等功能。

  • by beydemirfurkan
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 beydemirfurkan/postgres-readonly-mcp

使用说明

PostgreSQL只读MCP服务器

一种模型上下文协议(MCP)服务器,提供对一个配置的PostgreSQL数据库的安全、只读访问。

服务器公开模式检查、数据预览、自定义 SELECT 查询执行、关系发现、数据库统计、安全连接元数据和 connection_info 提示MCP客户端,如Claude Desktop。

特性

  • 每个MCP服务器实例有一个数据库
  • 严格的PostgreSQL只读验证(SELECT 仅)
  • 具有可选功能的模式感知工具 schema 输入,默认为 public
  • 服务器端行限制和查询超时保护
  • 数据预览,可选列选择,基本 where 过滤和文本截断
  • 外键关系发现
  • 按行和大小显示最大表的数据库统计信息
  • 安全 db_info 从不暴露密码的输出
  • connection_info 带有连接上下文和使用指南的MCP提示

安装

直接使用 npx 在MCP客户端配置中:

npx -y postgres-readonly-mcp

或全局安装:

npm install -g postgres-readonly-mcp
postgres-readonly-mcp

仅适用于本地开发:

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

Claude桌面配置

推荐 npx 设置:

{
  "mcpServers": {
    "postgres-readonly": {
      "command": "npx",
      "args": ["-y", "postgres-readonly-mcp"],
      "env": {
        "POSTGRES_HOST": "127.0.0.1",
        "POSTGRES_PORT": "5432",
        "POSTGRES_USER": "postgres",
        "POSTGRES_PASSWORD": "your_password",
        "POSTGRES_DATABASE": "your_database",
        "POSTGRES_SSL": "true",
        "POSTGRES_SSL_REJECT_UNAUTHORIZED": "true"
      }
    }
  }
}

连接字符串设置:

{
  "mcpServers": {
    "postgres-readonly": {
      "command": "npx",
      "args": ["-y", "postgres-readonly-mcp"],
      "env": {
        "DATABASE_URL": "postgresql://USER:PASSWORD@HOST:5432/DB_NAME",
        "POSTGRES_SSL": "true"
      }
    }
  }
}

编辑配置后重新启动Claude Desktop。

多个数据库

一个服务器实例映射到一个PostgreSQL数据库。要公开多个数据库,请添加多个具有不同名称和环境变量的MCP服务器条目:

{
  "mcpServers": {
    "postgres-crm": {
      "command": "npx",
      "args": ["-y", "postgres-readonly-mcp"],
      "env": {
        "DATABASE_URL": "postgresql://USER:PASSWORD@HOST:5432/crm"
      }
    },
    "postgres-analytics": {
      "command": "npx",
      "args": ["-y", "postgres-readonly-mcp"],
      "env": {
        "DATABASE_URL": "postgresql://USER:PASSWORD@HOST:5432/analytics"
      }
    }
  }
}

环境变量

  • POSTGRES_HOST:PostgreSQL主机,默认 localhost
  • POSTGRES_PORT:PostgreSQL端口,默认值 5432
  • POSTGRES_USER:PostgreSQL用户,默认值 postgres
  • POSTGRES_PASSWORD:PostgreSQL密码,默认为空
  • POSTGRES_DATABASE:PostgreSQL数据库名称,默认值 postgres
  • POSTGRES_SSL:启用TLS,默认 true
  • POSTGRES_SSL_REJECT_UNAUTHORIZED:默认情况下,拒绝未经授权的TLS证书 true
  • POSTGRES_QUERY_TIMEOUT_MS:查询超时(毫秒),最小值 1000,默认值 30000
  • DATABASE_URL:PostgreSQL连接URL回退
  • POSTGRES_URL:PostgreSQL连接URL别名

明确的 POSTGRES_* 当两者都存在时,主机字段会覆盖URL值。

如果您的密码包含特殊字符(/, @, :),URL将其编码为连接字符串。

工具

db_info

返回已配置数据库的安全连接元数据。

输入:

{}

list_tables

列出架构中的表/视图。

输入:

{ "schema": "public" }

describe_table

描述列、主键、外键和索引。

输入:

{
  "schema": "public",
  "table": "users"
}

preview_data

通过可选的列选择和基本筛选预览表中的行。

输入:

{
  "schema": "public",
  "table": "users",
  "columns": ["id", "email", "created_at"],
  "where": "created_at >= '2026-01-01'",
  "limit": 10
}

run_query

运行自定义只读SQL查询。

输入:

{
  "query": "SELECT id, email FROM \"public\".\"users\" ORDER BY id DESC",
  "limit": 100
}

show_relations

显示表的外键关系。

输入:

{
  "schema": "public",
  "table": "orders"
}

db_stats

返回数据库大小、表计数、行估计值, largestByRows,以及 largestBySize.

输入:

{}

提示

connection_info

提供安全的PostgreSQL连接上下文和只读使用指南。密码从不包括在内。

安全模型

  • 仅 SELECT 允许发表声明
  • 一个请求中的多个SQL语句被阻止
  • DML、DDL、授予/撤销、维护和管理关键字被阻止
  • PostgreSQL的风险函数,如 pg_sleep, dblink,并且文件读取助手被阻止
  • 即使查询请求更多行,服务器端的结果也会受到限制
  • 对连接/运行时错误进行清理,以避免凭据泄漏

限制

  • preview_data 违约: 10,最大值: 100
  • run_query 违约: 1000,最大值: 5000
  • 查询超时: 30000ms 默认情况下
  • 长文本截断: 200 字符

发展

npm install
npm run build
npm run dev
npm test

许可证

麻省理工学院