使用说明
PostgreSQL MCP服务器
一个模型上下文协议(MCP)服务器,为Claude等AI助手提供PostgreSQL数据库访问。该服务器使AI代理能够通过标准化的接口查询、更新和管理PostgreSQL数据库。
特性
- 执行SELECT查询 -查询PostgreSQL数据库并返回JSON格式的结果
- 执行非查询语句 -运行INSERT、UPDATE、DELETE、CREATE和其他DDL/DML语句
- 连接测试 -验证数据库连接并获取服务器信息
- 多数据库支持 -在多个PostgreSQL数据库之间进行配置和切换
- 内置弹性 -针对瞬态错误的指数回退自动重试逻辑
- 连接池 -通过可配置的池设置优化连接管理
- 健康检查 -操作前自动连接验证
- TCP保持活动 -主动检测断开的连接
安装
先决条件
- .NET 9.0 SDK
- PostgreSQL数据库(本地或远程)
- Claude Desktop或其他MCP兼容客户端
从源代码构建
git clone https://github.com/bherrmann7/postgres-mcp-server.git
cd postgres-mcp-server
dotnet build
配置
1.创建凭据文件
在以下位置创建文件 ~/.postgres-mcp-server-creds.json 使用您的数据库连接字符串:
{
"ConnectionStrings": {
"myapp": "Host=localhost;Port=5432;Database=myapp;Username=postgres;Password=yourpassword",
"production": "Host=prod.example.com;Port=5432;Database=proddb;Username=produser;Password=prodpass",
"test": "Host=localhost;Port=5432;Database=testdb;Username=testuser;Password=testpass"
}
}
安全说明:此文件包含敏感凭据。确保它具有适当的文件权限:
chmod 600 ~/.postgres-mcp-server-creds.json
2.配置MCP客户端
将服务器添加到MCP客户端配置中。对于Claude Desktop,请编辑:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 视窗:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"postgres": {
"command": "dotnet",
"args": [
"run",
"--project",
"/absolute/path/to/postgres-mcp-server"
]
}
}
}
或者,如果您已经构建了可执行文件:
{
"mcpServers": {
"postgres": {
"command": "/absolute/path/to/postgres-mcp-server/bin/Debug/net9.0/PostgresMcpServer"
}
}
}
用法
配置后,AI助手可以使用这些工具:
列出可用数据库
List the available PostgreSQL databases
测试连接
Test connection to the 'myapp' database
执行查询
Run this query on the 'myapp' database:
SELECT * FROM users WHERE status = 'active' LIMIT 10
执行非查询
Update the 'myapp' database:
UPDATE users SET last_login = NOW() WHERE user_id = 123
弹性特征
此服务器包括全面的弹性改进:
- 自动重试 -对于指数回退的瞬态错误,最多可重试3次
- 连接池 -每个数据库维护1-20个连接
- 超时配置 -30s连接超时,120s命令超时
- TCP保持活动 -每隔30秒检测一次连接中断
- 健康验证 -每次手术前进行快速健康检查
- 预处理语句 -自动准备常用查询
看 弹性.md 有关弹性特征和配置的详细信息。
API工具
execute_query
执行SELECT查询并以JSON格式返回结果。
参数:
sql(string,必填)-要执行的SQL SELECT查询database(字符串,必填)-配置中的数据库名称
退货: 带有成功状态、行数和数据数组的JSON
execute_non_query
执行INSERT、UPDATE、DELETE、CREATE或其他非查询SQL语句。
参数:
sql(string,必填)-要执行的SQL语句database(字符串,必填)-配置中的数据库名称
退货: JSON,成功状态和行受影响
test_connection
测试数据库连接并返回服务器信息。
参数:
database(字符串,必填)-要测试的数据库名称
退货: JSON,包含连接详细信息、服务器版本和配置
list_available_databases
列出所有已配置的数据库名称。
退货: JSON,包含可用数据库名称和弹性设置数组
安全注意事项
- 凭据存储:将数据库凭据存储在
~/.postgres-mcp-server-creds.json具有受限权限 - SQL注入:此服务器直接执行SQL-确保AI助手或用户了解SQL注入风险
- 数据库权限:使用具有最低权限的数据库帐户
- 网络安全:使用SSL/TLS进行远程数据库连接(添加
SslMode=Require连接字符串) - 访问控制:仅授予受信任的人工智能助手和用户访问权限
测试
运行附带的测试:
dotnet test
测试套件包括:
- 服务器初始化测试
- 连接池测试
- 重试逻辑测试
- 与已配置数据库的集成测试
故障排除
连接错误
- 验证PostgreSQL是否正在运行且可访问
- 检查连接字符串格式和凭据
- 确保防火墙允许连接到PostgreSQL端口(默认5432)
- 查看stderr输出中的日志
“找不到数据库的连接字符串”
- 检查一下
~/.postgres-mcp-server-creds.json存在 - 验证数据库名称是否与ConnectionStrings中的键匹配
- 使用
list_available_databases查看已配置的数据库
查询超时
- 命令的默认超时为120秒
- 使用索引优化慢速查询
- 考虑增加
CommandTimeoutSeconds在PostgresDatabaseTools.cs
链接数太多
- 默认池大小为每个数据库20个连接
- 检查连接是否泄漏(确保正确处理)
- 增加
MaxPoolSize如果需要高并发性
发展
项目结构
postgres-mcp-server/
├── Program.cs # MCP server entry point
├── PostgresDatabaseTools.cs # Database tool implementations
├── ServerIntegrationTests.cs # Integration tests
├── ResilienceTests.cs # Resilience feature tests
├── appsettings.json # Logging configuration
├── RESILIENCE.md # Resilience documentation
└── CHANGES_SUMMARY.md # Change history
建立和运行
# Build
dotnet build
# Run
dotnet run
# Run tests
dotnet test
# Publish self-contained executable (Linux)
dotnet publish -c Release -r linux-x64 --self-contained
# Publish self-contained executable (macOS)
dotnet publish -c Release -r osx-arm64 --self-contained
# Publish self-contained executable (Windows)
dotnet publish -c Release -r win-x64 --self-contained
贡献
欢迎投稿!请随时提交问题或拉取请求。
- 克隆该仓库
- 创建要素分支(
git checkout -b feature/amazing-feature) - 提交您的更改(
git commit -m 'Add amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
资源
- 模型上下文协议 -MCP规范和文件
- Npgsql -的PostgreSQL数据提供程序。网
- PostgreSQL文档 -PostgreSQL官方文档
作者
鲍勃·赫尔曼- @ 宝马7
致谢
- 使用 模型上下文协议 .NET SDK
- 受人工智能辅助开发中对强大数据库访问需求的启发
