PostgreSQL只读查询服务

一个基于Model Context Protocol (MCP)的PostgreSQL只读查询服务器,为AI客户端提供安全的数据库查询功能,包括表列表查询、SELECT语句执行和表结构描述。

  • by adropofliquid
  • Kotlin
  • 混合部署
  • 1 星标
  • 更新于
在 GitHub 查看 adropofliquid/postgres-mcp-server

使用说明

PostgreSQL MCP服务器

一种模型上下文协议(MCP)服务器,提供对PostgreSQL数据库的只读访问。该服务器公开了允许AI客户端通过执行SELECT查询、列出表和描述表结构来安全地与PostgreSQL数据库交互的工具。

特性

服务器提供三个主要工具:

  1. 列表表格:列出公共架构中的所有表
  2. 执行SELECT查询:安全执行SELECT查询(只读)
  3. 描述表:显示表结构,包括列、数据类型和约束

先决条件

  • Java 17或更高版本
  • PostgreSQL数据库
  • 8.0级+

配置

数据库配置

设置以下环境变量或更新 src/main/resources/application.yml:

export POSTGRES_URL=jdbc:postgresql://localhost:5432/your_database
export POSTGRES_USERNAME=your_username
export POSTGRES_PASSWORD=your_password

应用程序配置

服务器配置为作为MCP SSE(服务器发送事件)服务器运行。配置位于 application.yml:

spring:
  ai:
    mcp:
      server:
        sse:

建立和运行

构建应用程序

./gradlew build

运行服务器

./gradlew bootRun

或者运行构建的JAR:

java -jar build/libs/postgres-0.0.1-SNAPSHOT.jar

与MCP客户端一起使用

此服务器通过HTTP上的SSE(服务器发送事件)进行通信,并遵循MCP协议规范。任何兼容MCP的客户端都可以通过以下方式连接到它 http://localhost:8080/mcp/sse.

可用工具

1.列表

列出公共架构中的所有表。

用法:“显示数据库中的所有表”

2.执行SelectQuery

安全地执行SELECT查询。为了安全起见,只允许使用SELECT语句。

参数:

  • query:要执行的SELECT SQL查询

用法:“执行查询:SELECT*FROM用户限制10”

安全功能:

  • 只允许SELECT查询
  • 块INSERT、UPDATE、DELETE、DROP、CREATE、ALTER语句
  • 性能输出限制为100行

3. 描述表

描述特定表的结构。

参数:

  • tableName:要描述的表的名称

用法:“描述用户表的结构”

输出包括:

  • 列名和数据类型
  • 可为空的约束
  • 默认值
  • 主键
  • 外键关系

安全

此服务器实施了多种安全措施:

  1. 只读访问:只允许SELECT查询
  2. 查询验证:危险的SQL关键字被阻止
  3. 架构限制:仅访问公共架构
  4. 结果限制:查询结果限制为100行
  5. 输入消毒:通过参数化查询进行SQL注入保护

查询示例

一旦连接到像Claude Desktop这样的MCP客户端,您可以问:

  • “此数据库中有哪些表可用?”
  • “显示用户表的前10行”
  • “描述产品表的结构”
  • “查找上个月的所有订单”

故障排除

连接问题

  1. 验证PostgreSQL是否正在运行
  2. 检查数据库凭据
  3. 确保可以从服务器位置访问数据库
  4. 验证JDBC URL格式

MCP客户端问题

  1. 确保服务器启动时没有错误
  2. 检查SSE传输是否配置正确,端口是否可用
  3. 验证客户端是否可以访问 http://localhost:8080/mcp/sse
  4. 如果从外部客户端连接,请检查防火墙设置

性能注意事项

  • 大型结果集自动限制为100行
  • 复杂的查询可能会超时-考虑添加WHERE子句
  • 为表建立索引以提高查询性能

发展

添加新工具

要添加新工具,请在中创建方法 PostgresToolsService 并为其添加注释 @Tool:

@Tool(description = "Your tool description")
fun yourNewTool(
    @ToolParam(description = "Parameter description") param: String
): String {
    // Implementation
}

贡献

  1. 分叉存储库
  2. 创建要素分支
  3. 实施您的更改 4提交拉取请求

许可证

该项目根据MIT许可证获得许可。