PostgreSQL协议服务器

一个基于Spring Boot和Spring AI构建的PostgreSQL模型上下文协议(MCP)服务器,提供对PostgreSQL数据库的动态只读访问。

  • by luanvuhlu
  • Java
  • 本地部署
  • 更新于
在 GitHub 查看 luanvuhlu/mcp-server-postgres

使用说明

MCP服务器PostgreSQL

使用Spring Boot和Spring AI构建的PostgreSQL模型上下文协议(MCP)服务器。该服务器通过动态连接提供对PostgreSQL数据库的只读访问。

✅ 项目状态

完成:MCP服务器功能齐全,具有以下功能:

  • ✅ Spring Boot 3.4.1+Spring AI 1.0.0+Java 21
  • ✅ 动态PostgreSQL连接(无硬编码凭据)
  • ✅ 只读查询验证和安全性
  • ✅ 带有测试容器的完整测试套件
  • ✅ Docker使用示例数据编写设置
  • ✅ 生产就绪的Dockerfile
  • ✅ 全面的文件

特性

  • 动态数据库连接:使用运行时参数连接到任何PostgreSQL数据库
  • 只读操作:通过只允许SELECT查询来确保数据库安全
  • MCP工具:
    • list_schemas:列出数据库中的所有架构
    • list_tables:列出特定架构中的所有表
    • select:使用可选条件和顺序从表中选择行
    • execute_query:执行只读SQL查询
  • 采用现代堆栈构建:Spring Boot 3.4.1、Spring AI 1.0.0、Java 21

快速开始

先决条件

  • Java 21
  • Maven 3.9+
  • Docker和Docker Compose(用于测试)

运行服务器

  1. 克隆并构建项目:

    git clone https://github.com/luanvuhlu/mcp-server-postgres.git
    cd mcp-server-postgres
    mvn clean compile
    
  2. 开始测试PostgreSQL数据库:

    docker-compose up -d
    
  3. 运行MCP服务器:

    mvn spring-boot:run
    

MCP服务器将启动并准备通过模型上下文协议接受连接。

使用样本数据进行测试

Docker Compose设置包括一个带有示例数据的PostgreSQL实例:

  • 主机:本地主机
  • 端口: 5432
  • 数据库:postgres
  • 用户名:postgres
  • 密码:你的名字

自动创建示例模式和表:

  • public 模式:用户、产品
  • sales 模式:订单,订单项
  • inventory 架构:股票

与MCP客户端一起使用

此服务器可以与任何兼容MCP的客户端一起使用。以下是一些示例:

克劳德桌面

将以下内容添加到您的Claude Desktop配置文件中:

{
  "mcpServers": {
    "postgres": {
      "command": "java",
      "args": ["-jar", "target/mcp-server-postgres-1.0.0-SNAPSHOT.jar"]
    }
  }
}

其他MCP客户端

服务器实现了标准的MCP协议,可以通过运行以下命令与任何兼容的客户端一起使用:

java -jar target/mcp-server-postgres-1.0.0-SNAPSHOT.jar

MCP工具使用

列出架构

列出PostgreSQL数据库中的所有模式:

{
  "name": "list_schemas",
  "arguments": {
    "host": "localhost",
    "database": "postgres", 
    "username": "postgres",
    "password": "your_name"
  }
}

列表表格

列出特定架构中的所有表:

{
  "name": "list_tables",
  "arguments": {
    "host": "localhost",
    "database": "postgres",
    "username": "postgres", 
    "password": "your_name",
    "schema": "public"
  }
}

选择

使用可选条件和顺序从表中选择行:

{
  "name": "select",
  "arguments": {
    "host": "localhost",
    "database": "postgres",
    "username": "postgres", 
    "password": "your_name",
    "table": "users",
    "schema": "public",
    "conditions": "id > 1",
    "orderBy": "username ASC",
    "limit": 10
  }
}

执行查询

执行只读SQL查询:

{
  "name": "execute_query",
  "arguments": {
    "host": "localhost",
    "database": "postgres",
    "username": "postgres",
    "password": "your_name", 
    "query": "SELECT * FROM users LIMIT 10"
  }
}

安全

  • 只读的:只允许使用SELECT、WITH、SHOW、EXPLAIN、DESCRIBE查询
  • 动态连接:没有硬编码的数据库凭据
  • 输入验证:查询在执行前经过验证
  • 错误处理:正确的错误消息,不暴露敏感信息

配置

应用程序属性

在中配置MCP服务器 src/main/resources/application.yml:

spring:
  ai:
    mcp:
      server:
        enabled: true
        port: 3000

数据库连接

所有数据库连接都是动态的,并根据请求提供。未配置默认数据库连接。

MCP服务器协议

此服务器实现了模型上下文协议(MCP)规范,并通过stdio或TCP上的JSON-RPC进行通信。服务器注册了以下可由MCP兼容客户端调用的工具。

发展

项目结构

src/main/java/com/luanvv/mcp/
├── McpServerPostgresApplication.java    # Main application
├── config/
│   └── McpServerConfig.java            # MCP configuration
├── model/
│   └── DatabaseConnection.java         # Connection model
├── service/
│   └── PostgresService.java           # Database operations
└── tools/
    ├── ListSchemaTool.java            # List schemas tool
    ├── ListTablesTool.java           # List tables tool
    ├── SelectTool.java               # Select queries tool
    └── ExecuteQueryTool.java         # Execute query tool

建筑

# Compile
mvn clean compile

# Run tests
mvn test

# Package
mvn clean package

# Run
mvn spring-boot:run

码头工人

使用Docker构建和运行:

# Build image
docker build -t mcp-server-postgres .

# Run container
docker run -p 3000:3000 mcp-server-postgres

贡献

  1. 分叉存储库
  2. 创建要素分支
  3. 进行更改
  4. 添加测试
  5. 提交拉取请求

许可证

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

支持

有关问题和疑问,请使用GitHub问题跟踪器。