PostgreSQL MCP 服务器

支持OAuth认证的PostgreSQL MCP服务器,提供标准化接口使AI代理能够安全地与PostgreSQL数据库交互,具备多用户认证和云部署能力。

  • by gldc
  • Python
  • 本地部署
  • 15 星标
  • 更新于
在 GitHub 查看 gldc/mcp-postgres

使用说明

带有OAuth的PostgreSQL MCP服务器

PostgreSQL MCP服务器实现 OAuth身份验证 支持使用 模型上下文协议(MCP) Python SDK。该服务器使AI代理能够通过标准化的接口与PostgreSQL数据库进行交互,具有安全的多用户身份验证和云部署功能。

✨ 新功能

  • 🔐 OAuth身份验证:确保与Google OAuth 2.0的安全集成
  • 👥 多用户:每个用户都有自己的数据库连接
  • ☁️ 铁路准备就绪:针对铁路云部署进行了优化
  • 🛡️ 安全生产:会话管理、安全控制和健康监控

特性

核心数据库操作

  • 列出具有高级过滤和分页功能的数据库模式
  • 列出模式匹配的架构中的表
  • 描述表结构和约束
  • 发现表关系(显式外键+隐含关系)
  • 使用安全控制执行SQL查询
  • 带有JSON/markdown输出的类型化工具
  • 可选表资源和指导提示

身份验证和安全

  • 谷歌OAuth 2.0:安全的用户身份验证
  • 会话管理:基于令牌的过期会话
  • 用户隔离:每个用户的数据库连接都是单独的
  • 只读模式:可选查询限制
  • 查询超时:防止查询失控
  • 健康监测:内置健康检查和指标

部署选项

  • 本地开发:直接数据库连接
  • OAuth模式:通过个人数据库连接进行多用户身份验证
  • 铁路云:使用托管PostgreSQL进行一键式云部署
  • 码头工人:容器化部署

🚀 快速开始

选项1:传统模式(直接连接)

# Run with direct database connection (original behavior)
export POSTGRES_CONNECTION_STRING="postgresql://user:pass@host:5432/db"
python postgres_server.py

# Or pass connection string as argument
python postgres_server.py --conn "postgresql://user:pass@host:5432/db"

选项2:OAuth模式(多用户)

# Set up OAuth credentials (see OAUTH_SETUP.md for details)
export GOOGLE_CLIENT_ID="your_client_id.apps.googleusercontent.com"
export GOOGLE_CLIENT_SECRET="your_client_secret"
export SECRET_KEY="your_32_character_secret_key"

# Run in OAuth mode
python postgres_server.py --oauth-only --transport streamable-http --port 8000

选项3:铁路云部署

# One-click deployment to Railway (see RAILWAY_DEPLOYMENT.md)
# 1. Push code to GitHub
# 2. Connect Railway to your repository
# 3. Create TWO services from this repo (same project):
#    - Service A (MCP server): default settings (SERVICE_ROLE defaults to mcp)
#    - Service B (OAuth companion): set SERVICE_ROLE=oauth; optionally set Environment=oauth
# 4. Add PostgreSQL to the project (Railway sets DATABASE_URL)
# 5. Set GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET / SECRET_KEY at project level
# 6. Deploy (railway.toml uses unified launcher: `python start.py`)

📚 文档

安装

通过Smithery安装

通过以下方式自动安装PostgreSQL MCP Server for Claude Desktop 史密瑟里:

npx -y @smithery/cli install @gldc/mcp-postgres --client claude

手动安装

  1. 克隆此存储库:
git clone <repository-url>
cd mcp-postgres
  1. 创建并激活虚拟环境(推荐):
python -m venv .venv
source .venv/bin/activate  # On Windows, use: .venv\Scripts\activate
  1. 安装依赖项:
pip install -r requirements.txt

用法

身份验证流(OAuth模式)

  1. 以OAuth模式启动服务器:

    python postgres_server.py --oauth-only --transport streamable-http --port 8000
    
  2. 获取身份验证信息 (通过像Claude这样的MCP客户端):

    User: "Show me information about the database server"
    Claude: [Calls auth_info tool, provides Google OAuth login URL]
    
  3. 完整的OAuth流程:

    • 访问提供的登录URL
    • 使用Google进行身份验证
    • 接收会话令牌
  4. 配置数据库连接:

    • 浏览器:访问 http://localhost:8000/connection (使用您的会话cookie)
    • API
      curl -X POST http://localhost:8000/connection/set \
        -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
        -H "Content-Type: application/json" \
        -d '{"connection_string": "postgresql://user:pass@host:port/db"}'
      
  5. 使用数据库工具 -现在,所有操作都适用于经过身份验证的连接

直接模式(传统)

# Without a connection string (server starts, DB‑backed tools will return a friendly error)
python postgres_server.py

# Or set the connection string via environment variable:
export POSTGRES_CONNECTION_STRING="postgresql://username:password@host:port/database"
python postgres_server.py

# Or pass it using the --conn flag:
python postgres_server.py --conn "postgresql://username:password@host:port/database"

# Optional: Run over HTTP transports
# Streamable HTTP (recommended for streaming tool outputs)
python postgres_server.py --transport streamable-http --host 0.0.0.0 --port 8000

# SSE transport (server-sent events) mounted at /sse and /messages/
python postgres_server.py --transport sse --host 0.0.0.0 --port 8000 --mount /mcp

可用工具

核心数据库工具

  • query:对数据库执行SQL查询
  • list_schemas:列出所有可用架构
  • list_tables:列出特定架构中的所有表
  • describe_table:获取有关表结构的详细信息
  • get_foreign_keys:获取表的外键关系
  • find_relationships:发现表的显式和隐式关系
  • db_identity:显示当前db/user/host/port、search_path和版本

身份验证工具(OAuth模式)

  • auth_info:获取身份验证状态和登录说明
  • server_info:服务器配置和功能

打字工具(首选)

  • run_query(input):使用键入的输入执行(sql, parameters, row_limit, format: 'markdown'|'json')
  • run_query_json(input):执行并返回JSON可序列化行
  • list_schemas_json(input):列出带有筛选器的架构(include_system, include_temp, require_usage, row_limit)
  • list_schemas_json_page(input):带过滤器的分页列表 name_like 模式
  • list_tables_json(input):使用过滤器(名称模式、区分大小写、table_types、row_limit)列出模式中的表
  • list_tables_json_page(input):带过滤器的分页表列表

工具使用示例

// run_query (markdown)
{
  "sql": "SELECT * FROM information_schema.tables WHERE table_schema = %s",
  "parameters": ["public"],
  "row_limit": 50,
  "format": "markdown"
}

// run_query_json
{
  "sql": "SELECT now() as ts",
  "row_limit": 1
}

// List schemas with filters
{
  "include_system": false,
  "include_temp": false,
  "require_usage": true,
  "row_limit": 10000
}

// Paginated list with pattern filter
{
  "include_system": false,
  "include_temp": false,
  "require_usage": true,
  "page_size": 200,
  "cursor": null,
  "name_like": "sales_*",
  "case_sensitive": false
}

资源和提示

资源(如果客户支持):

  • table://{schema}/{table} 用于读取表行。备用工具可用:
    • list_table_resources(schema) → table://... URI
    • read_table_resource(schema, table, row_limit) → 行JSON

提示(在支持时注册;也作为工具公开):

  • write_safe_select / prompt_write_safe_select_tool
  • explain_plan_tips / prompt_explain_plan_tips_tool

配置

Claude桌面配置

传统模式

{
  "mcpServers": {
    "postgres": {
      "command": "/path/to/.venv/bin/python",
      "args": ["/path/to/postgres_server.py"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://username:password@host:5432/database?ssl=true"
      }
    }
  }
}

OAuth模式(本地开发)

{
  "mcpServers": {
    "postgres-oauth": {
      "command": "/path/to/.venv/bin/python",
      "args": [
        "/path/to/postgres_server.py",
        "--oauth-only",
        "--transport", "streamable-http",
        "--port", "8000"
      ],
      "env": {
        "GOOGLE_CLIENT_ID": "your_client_id.apps.googleusercontent.com",
        "GOOGLE_CLIENT_SECRET": "your_client_secret",
        "SECRET_KEY": "your_32_character_secret_key"
      }
    }
  }
}

铁路云部署

{
  "mcpServers": {
    "postgres-railway": {
      "transport": {
        "type": "http",
        "url": "https://your-app-name.railway.app"
      }
    }
  }
}

环境变量

核心配置

  • POSTGRES_CONNECTION_STRING:直接数据库连接(传统模式)
  • MCP_TRANSPORT: stdio|sse|streamable-http (默认值: stdio)
  • MCP_HOST:HTTP传输主机(默认值: 127.0.0.1)
  • MCP_PORT:HTTP传输端口(默认值: 8000)

OAuth配置

  • GOOGLE_CLIENT_ID:Google OAuth客户端ID(OAuth模式需要)
  • GOOGLE_CLIENT_SECRET:Google OAuth客户端密钥(OAuth模式需要)
  • SECRET_KEY:会话加密密钥(32+个字符,OAuth模式需要)
  • REDIRECT_URI:OAuth重定向URI(为Railway自动配置)

安全与性能

  • POSTGRES_READONLY: true 只允许SELECT/CTE/EXPLAIN/SHOW/VALUES查询
  • POSTGRES_STATEMENT_TIMEOUT_MS:查询超时(毫秒)(例如。, 30000)

铁路部署(自动配置)

  • DATABASE_URL:托管PostgreSQL连接字符串
  • PORT:服务器端口(铁路提供)
  • RAILWAY_PUBLIC_DOMAIN:OAuth重定向的公共域
  • RAILWAY_ENVIRONMENT:部署环境

使用Docker运行

塑造形象:

docker build -t mcp-postgres .

传统模式:

docker run \
  -e POSTGRES_CONNECTION_STRING="postgresql://username:password@host:5432/database" \
  -p 8000:8000 \
  mcp-postgres

OAuth模式:

docker run \
  -e GOOGLE_CLIENT_ID="your_client_id" \
  -e GOOGLE_CLIENT_SECRET="your_client_secret" \
  -e SECRET_KEY="your_32_char_secret" \
  -p 8000:8000 \
  mcp-postgres

Unified launcher (optional, same image):
```bash
# MCP
docker run -e SERVICE_ROLE=mcp -p 8000:8000 mcp-postgres python start.py

# OAuth companion
docker run -e SERVICE_ROLE=oauth -e GOOGLE_CLIENT_ID=... -e GOOGLE_CLIENT_SECRET=... -e SECRET_KEY=... -p 8000:8000 mcp-postgres python start.py

HTTP客户端集成

使用Streamable HTTP运行服务器:

python postgres_server.py --transport streamable-http --host 0.0.0.0 --port 8000

健康检查(OAuth服务)

curl http://localhost:8000/health
# Expected response:
{
  "status": "healthy",
  "service": "PostgreSQL MCP OAuth Companion",
  "oauth_enabled": true,
  "environment": "development"
}

OAuth端点(OAuth模式)

  • GET /auth/login -获取Google OAuth授权URL
  • GET /auth/callback -OAuth回调端点
  • GET /auth/status -检查身份验证状态
  • POST /connection/set -设置用户的数据库连接字符串

Python MCP客户端示例

import asyncio
from mcp.client import streamable_http
from mcp.client.session import ClientSession

async def main():
    url = "http://localhost:8000/mcp"
    async with streamable_http.streamablehttp_client(url) as (read, write, _get_session_id):
        session = ClientSession(read, write)
        init = await session.initialize()
        print("protocol:", init.protocolVersion)

        # List tools
        tools = await session.list_tools()
        print("tools:", [t.name for t in tools.tools])

        # Call typed tool: run_query_json
        result = await session.call_tool(
            "run_query_json",
            {"input": {"sql": "SELECT 1 AS n", "row_limit": 1}},
        )
        print("result:", result.content[0].text if result.content else result.structuredContent)

if __name__ == "__main__":
    asyncio.run(main())

安全最佳实践

身份验证和授权

  • OAuth秘密确保Google OAuth凭据的安全,切勿使用git
  • 会话密钥:使用强SECRET_KEY(最少32+个字符)
  • 代币轮换:定期轮换OAuth凭据
  • 用户隔离:每个经过身份验证的用户都有单独的数据库连接

数据库安全性

  • 连接串:使用最小权限数据库连接
  • 只读模式:启用 POSTGRES_READONLY=true 在适当的时候
  • 查询超时:设置 POSTGRES_STATEMENT_TIMEOUT_MS 防止查询失控
  • SSL连接:始终使用SSL进行生产数据库连接

生产部署

  • 环境变量:切勿泄露代码或日志中的秘密
  • 超文本传输安全协议:对所有OAuth流使用HTTPS(Railway会自动提供此功能)
  • 访问控制:实现适当的数据库用户权限
  • 连接池:使用连接池进行更好的资源管理

部署选项

1.地方发展

  • 直接数据库连接
  • 使用本地主机进行OAuth测试
  • 开发环境变量

2.铁路云(推荐)

  • 托管PostgreSQL数据库
  • 自动HTTPS和域管理
  • 环境变量管理
  • 从GitHub自动部署
  • 内置监控和日志记录
  • 成本:大多数用例每月5-20美元

3.定制云部署

  • 任何支持Python应用程序的云提供商
  • 使用Docker进行基于容器的部署
  • 手动OAuth配置
  • 自定义域和SSL设置

迁移指南

从传统模式到OAuth模式

  1. 备份当前设置:保存现有配置文件
  2. 设置OAuth:关注 OAUTH_SETUP.md 指南
  3. 更新服务器:替换为启用OAuth的版本
  4. 本地测试:验证OAuth流是否正常工作
  5. 部署:使用铁路或自定义部署
  6. 更新客户端:使用新的服务器URL配置Claude Desktop

向后兼容性

  • 传统模式仍然适用 --conn 参数
  • 现有MCP客户端保持兼容
  • 保留所有原始工具和功能

贡献

欢迎投稿!请随时提交拉取请求。

开发设置

  1. 创建一个 .venv 并安装运行时deps: pip install -r requirements.txt
  2. (可选)安装测试台: pip install -r dev-requirements.txt
  3. 设置用于测试的OAuth凭据(请参阅 OAUTH_SETUP.md)
  4. 运行测试: pytest -q

开发与测试

  • 本地测试:测试传统模式和OAuth模式
  • 集成测试:使用实际的PostgreSQL数据库进行测试
  • OAuth测试:测试完整的身份验证流程
  • 铁路测试:测试云部署

故障排除

常见问题

OAuth未配置:

  • 验证 GOOGLE_CLIENT_ID 和 GOOGLE_CLIENT_SECRET 已设置
  • 检查谷歌云控制台OAuth设置

需要认证:

  • 通过以下方式完成OAuth流程 /auth/login 端点
  • 验证请求中是否包含会话令牌

数据库连接错误:

  • 验证连接字符串格式
  • 独立测试数据库连接
  • 检查防火墙和网络访问

铁路部署问题:

  • 检查环境变量是否设置正确
  • 验证OAuth重定向URI是否与铁路域匹配
  • 监控铁路仪表板中的部署日志

有关详细的故障排除,请参阅 OAUTH_SETUP.md 和 铁路_部署.md.

相关项目

许可证

MIT许可证

版权所有(c)2025 gldc

特此免费向任何获得副本的人授予许可 本软件和相关文档文件(“软件”),以处理 在软件中不受限制,包括但不限于权利 使用、复制、修改、合并、发布、分发、再许可和/或销售 软件的副本,并允许软件的接收者 根据以下条件提供:

上述版权声明和本许可声明应包含在所有 软件的副本或实质性部分。

软件按“原样”提供,不提供任何形式的明示或明示担保 隐含的,包括但不限于适销性保证, 适用于特定目的且不造成伤害。在任何情况下 作者或版权持有人对任何索赔、损害赔偿或其他 因以下原因产生的责任,无论是在合同、侵权或其他诉讼中, 出于或与软件、使用或其他交易有关 软件。