PostgreSQL数据库访问服务

一个为AI助手如Claude提供PostgreSQL数据库访问的Model Context Protocol (MCP)服务器,支持查询、更新和管理数据库。

  • by bherrmann7
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 bherrmann7/postgres-mcp-server

使用说明

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,包含可用数据库名称和弹性设置数组

安全注意事项

  1. 凭据存储:将数据库凭据存储在 ~/.postgres-mcp-server-creds.json 具有受限权限
  2. SQL注入:此服务器直接执行SQL-确保AI助手或用户了解SQL注入风险
  3. 数据库权限:使用具有最低权限的数据库帐户
  4. 网络安全:使用SSL/TLS进行远程数据库连接(添加 SslMode=Require 连接字符串)
  5. 访问控制:仅授予受信任的人工智能助手和用户访问权限

测试

运行附带的测试:

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

贡献

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

  1. 克隆该仓库
  2. 创建要素分支(git checkout -b feature/amazing-feature)
  3. 提交您的更改(git commit -m 'Add amazing feature')
  4. 推到分支(git push origin feature/amazing-feature)
  5. 打开拉取请求

许可证

此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。

资源

作者

鲍勃·赫尔曼- @ 宝马7

致谢

  • 使用 模型上下文协议 .NET SDK
  • 受人工智能辅助开发中对强大数据库访问需求的启发