Postgres只读查询服务器

一个简单的MCP服务器,用于执行对Postgres数据库的只读SQL查询并返回JSON结果。

  • by bonol
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 bonol/postgres-connect

使用说明

Postgres MCP服务器(只读)

此仓库提供了一个简单的MCP服务器,该服务器对以下对象执行只读SQL查询 Postgres数据库并返回JSON结果。写入查询被阻止。

需求

  • Python 3.10+(或您的本地版本)
  • 依赖关系: mcp, psycopg2, loguru

设置

创建并激活一个venv,然后安装依赖项 uv:

uv venv
source .venv/bin/activate
uv pip install mcp psycopg2 loguru

配置

服务器读取标准的Postgres环境变量:

  • PGHOST
  • PGDATABASE
  • PGUSER
  • PGPASSWORD
  • PGPORT

如果未设置,则恢复为中定义的默认值 postgres-connect.py.

跑

source .venv/bin/activate
python postgres-connect.py

测试(STDIO烟雾测试)

这将服务器作为子进程运行、执行MCP初始化握手, 列出工具和调用 query_data_read 和 select 1 as ok.

source .venv/bin/activate
python scripts/stdio_smoketest.py

如果初始化因协议版本不匹配而失败,则脚本将重试 服务器支持的协议版本并打印出来。

工具

MCP服务器公开了这些工具:

  • query_data_read(sql_query: str)
  • get_table_schema(table_name: str, schema_name: str | None = None)
  • get_table_indexes(table_name: str, schema_name: str | None = None)
  • get_table_functions(table_name: str, schema_name: str | None = None)

例子

获取表列和约束:

{"tool": "get_table_schema", "args": {"table_name": "users", "schema_name": "public"}}

获取索引定义:

{"tool": "get_table_indexes", "args": {"table_name": "users", "schema_name": "public"}}

获取触发器链接函数:

{"tool": "get_table_functions", "args": {"table_name": "users", "schema_name": "public"}}

局限性

  • 只有一个声明 SELECT 或 WITH 允许查询。
  • 带有分号的查询将被拒绝。
  • 写入操作被阻止。

备注

这是故意最小化的。稍后将添加其他工具和功能。