使用说明
带有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`)
📚 文档
- OAUTH_SETUP.md -完整的OAuth设置指南
- 铁路_部署.md -铁路云部署指南
安装
通过Smithery安装
通过以下方式自动安装PostgreSQL MCP Server for Claude Desktop 史密瑟里:
npx -y @smithery/cli install @gldc/mcp-postgres --client claude
手动安装
- 克隆此存储库:
git clone <repository-url>
cd mcp-postgres
- 创建并激活虚拟环境(推荐):
python -m venv .venv
source .venv/bin/activate # On Windows, use: .venv\Scripts\activate
- 安装依赖项:
pip install -r requirements.txt
用法
身份验证流(OAuth模式)
-
以OAuth模式启动服务器:
python postgres_server.py --oauth-only --transport streamable-http --port 8000 -
获取身份验证信息 (通过像Claude这样的MCP客户端):
User: "Show me information about the database server" Claude: [Calls auth_info tool, provides Google OAuth login URL] -
完整的OAuth流程:
- 访问提供的登录URL
- 使用Google进行身份验证
- 接收会话令牌
-
配置数据库连接:
- 浏览器:访问
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"}'
- 浏览器:访问
-
使用数据库工具 -现在,所有操作都适用于经过身份验证的连接
直接模式(传统)
# 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://...URIread_table_resource(schema, table, row_limit)→ 行JSON
提示(在支持时注册;也作为工具公开):
write_safe_select/prompt_write_safe_select_toolexplain_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授权URLGET /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模式
- 备份当前设置:保存现有配置文件
- 设置OAuth:关注 OAUTH_SETUP.md 指南
- 更新服务器:替换为启用OAuth的版本
- 本地测试:验证OAuth流是否正常工作
- 部署:使用铁路或自定义部署
- 更新客户端:使用新的服务器URL配置Claude Desktop
向后兼容性
- 传统模式仍然适用
--conn参数 - 现有MCP客户端保持兼容
- 保留所有原始工具和功能
贡献
欢迎投稿!请随时提交拉取请求。
开发设置
- 创建一个
.venv并安装运行时deps:pip install -r requirements.txt - (可选)安装测试台:
pip install -r dev-requirements.txt - 设置用于测试的OAuth凭据(请参阅 OAUTH_SETUP.md)
- 运行测试:
pytest -q
开发与测试
- 本地测试:测试传统模式和OAuth模式
- 集成测试:使用实际的PostgreSQL数据库进行测试
- OAuth测试:测试完整的身份验证流程
- 铁路测试:测试云部署
故障排除
常见问题
OAuth未配置:
- 验证
GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET已设置 - 检查谷歌云控制台OAuth设置
需要认证:
- 通过以下方式完成OAuth流程
/auth/login端点 - 验证请求中是否包含会话令牌
数据库连接错误:
- 验证连接字符串格式
- 独立测试数据库连接
- 检查防火墙和网络访问
铁路部署问题:
- 检查环境变量是否设置正确
- 验证OAuth重定向URI是否与铁路域匹配
- 监控铁路仪表板中的部署日志
有关详细的故障排除,请参阅 OAUTH_SETUP.md 和 铁路_部署.md.
相关项目
- MCP规范
- MCP Python SDK
- MCP服务器
- 铁路 -云部署平台
- 谷歌OAuth 2.0 -身份验证提供者
许可证
MIT许可证
版权所有(c)2025 gldc
特此免费向任何获得副本的人授予许可 本软件和相关文档文件(“软件”),以处理 在软件中不受限制,包括但不限于权利 使用、复制、修改、合并、发布、分发、再许可和/或销售 软件的副本,并允许软件的接收者 根据以下条件提供:
上述版权声明和本许可声明应包含在所有 软件的副本或实质性部分。
软件按“原样”提供,不提供任何形式的明示或明示担保 隐含的,包括但不限于适销性保证, 适用于特定目的且不造成伤害。在任何情况下 作者或版权持有人对任何索赔、损害赔偿或其他 因以下原因产生的责任,无论是在合同、侵权或其他诉讼中, 出于或与软件、使用或其他交易有关 软件。
