dbc-mcp-server

DBC-MCP-Server 是一个基于 Spring Boot 的数据库连接管理和查询服务,集成了 Model Context Protocol (MCP) 功能,提供了强大的数据库元数据查询和管理能力。该项目主要用于支持 AI 应用与数据库的交互,使 AI 能够理解和操作数据库结构。

GitHub Stars

2

User Rating

Not Rated

Forks

0

Issues

0

Views

3

Favorites

0

README
DBC-MCP-Server
项目简介

DBC-MCP-Server 是一个基于 Spring Boot 的数据库连接管理和查询服务,集成了 Model Context Protocol (MCP) 功能,提供了强大的数据库元数据查询和管理能力。该项目主要用于支持 AI 应用与数据库的交互,使 AI 能够理解和操作数据库结构。

主要功能
  1. 多数据源动态管理

    • 支持 MySQL、SQLite、SQL Server、PostgreSQL 等多种数据库
    • 动态切换数据源,实现跨库查询
    • 基于 Druid 连接池的高效数据库连接管理
  2. 数据库元数据查询

    • 表结构查询:获取表名、字段信息、注释等
    • 索引信息查询:获取表的索引结构
    • 外键关系查询:获取表间的关联关系
    • 存储引擎查询:获取表的存储引擎信息
  3. AI 模型交互能力

    • 集成 Spring AI 和 Model Context Protocol (MCP)
    • 提供 AI 工具函数,支持 AI 模型对数据库结构的理解和操作
    • 内置角色提示词服务,支持代码生成等场景
  4. SQL 执行能力

    • 支持执行自定义 SQL 查询
    • 支持获取表行数统计
技术栈
  • 核心框架:Spring Boot 3.4.4
  • ORM 框架:MyBatis 3.0.4
  • 数据库连接池:Druid 1.2.4
  • AI 集成:Spring AI 1.0.0-M6, MCP 0.8.1
  • Web 框架:Spring WebFlux
  • 数据库支持:MySQL, SQLite, SQL Server, PostgreSQL
  • 其他工具:Lombok, FastJSON2
快速开始
环境要求
  • JDK 17 或更高版本
  • Maven 3.6 或更高版本
  • 支持的数据库(MySQL/SQLite/SQL Server/PostgreSQL)
配置说明

application.properties 中配置数据源信息:

# 数据库连接配置示例
spring.datasource.jys.dbUrl=127.0.0.1
spring.datasource.jys.dbUser=root
spring.datasource.jys.dbPassword=root
spring.datasource.jys.dbName=jys
spring.datasource.jys.dbType=mysql
spring.datasource.jys.db-nick-name=jys
spring.datasource.jys.db-driver=com.mysql.cj.jdbc.Driver
构建与运行
# 克隆项目
git clone https://github.com/yourusername/dbc-mcp-server.git
cd dbc-mcp-server

# 使用 Maven 构建项目
./mvnw clean package

# 运行项目
java -jar target/dbc-mcp-server-0.0.1.jar
API 工具函数

项目提供了多个 AI 工具函数,用于查询数据库元数据:

  1. getTableNameAndComment:获取数据库所有表名和注释
  2. getTableColumnDetail:获取表字段详细信息
  3. getTableForeignKeys:获取表外键关系
  4. getTableIndexes:获取表索引信息
  5. getTableRowCount:获取表行数
  6. getDatabaseEngine:获取表存储引擎
  7. executeSql:执行自定义 SQL 查询
数据源支持

项目支持多数据源动态切换,目前内置支持以下数据源:

  • jys:元宇宙教研室数据库
  • studyinfo:学习空间数据库
  • springai:Spring AI 测试数据库
应用场景
  1. AI 辅助数据库开发:AI 可以通过该服务了解数据库结构,协助开发人员进行数据库操作
  2. 自动化代码生成:基于数据库结构自动生成前后端代码
  3. 数据库结构分析:快速分析和理解复杂数据库的表结构和关系
  4. 跨库数据查询:支持在多个数据源间进行数据查询和比较
cursor配置MCP

启动项目 项目必须启动,默认端口8081可以修改成其他端口,但是端口必须跟mcp的port对应上

  1. 新增MCP
{
  "mcpServers": {
    "dbc-mcp-server": {
      "url": "http://localhost:8081/sse"
    }
  }
}

1.png 2. 测试连接

2.png 3. 测试效果

3.png 4.png 5.png

使用dbc-mcp-server大模型提示词

如果你用的是cursor/claudecode/trae等ai ide工具,则不用使用当前大模型提示词,如果使用的是dify等开源的平台,就需要自定义配置当前提示词

  • Role: 数据库应用开发专家和自然语言处理工程师
  • Background: 目前有一个操作MySQL数据库的MCP Server,该服务器具备根据表描述获取数据库表名和根据表名获取表结构的功能。用户希望实现一个自然语言交互功能,通过用户输入的自然语言指令,如“查询用户表张三的数据”,自动调用相关工具完成任务。
  • Profile: 你是一位数据库应用开发专家,同时具备自然语言处理的技能,能够理解用户输入的自然语言指令,并将其转化为数据库操作的具体步骤。你熟悉MySQL数据库的操作,以及如何通过编程接口调用相关工具。
  • Skills: 你具备自然语言解析、数据库查询、API调用、逻辑推理等关键能力,能够将用户的自然语言指令转化为具体的数据库操作流程。
  • Goals: 根据用户输入的自然语言指令,自动调用"getTableNameAndComment","getTableColumnDetail","getTableForeignKeys","getTableIndexes","getTableRowCount","getDatabaseEngine","executeSql"这些工具,最终实现用户期望的数据库操作。
  • Constrains: 该提示词应确保用户输入的自然语言指令能够被准确解析,调用的工具能够正确执行,且整个过程应具备良好的用户体验和错误处理机制。
  • OutputFormat: 以自然语言交互的形式输出,包括用户输入的解析结果、调用工具的中间结果以及最终的数据库查询结果。
  • Workflow:
    1. 解析用户输入的自然语言指令,提取关键信息,如表描述和查询条件。
    2. 调用“getTableNameAndComment”工具,获取数据库中的表信息
    3. 调用“getTableColumnDetail”工具,获取数据库中的表字段
    4. 调用“getTableForeignKeys”工具,获取数据库中表的外键
    5. 调用“getTableIndexes”工具,获取数据库中表的索引
    6. 调用“getTableRowCount”工具,获取指定表的行数
    7. 调用“getDatabaseEngine”工具,获取数据库的引擎
    8. 根据表结构信息和用户输入的查询条件,生成SQL查询语句并调用“executeSql”工具,返回查询结果。
  • Examples:
    • 例子1:用户输入“查询用户表张三的数据”
      1. 解析结果:表描述为“用户表”,查询条件为“张三”。
      2. 调用工具1:根据“用户表”描述获取表名,假设返回表名为“user_table”。
      3. 调用工具2:根据“user_table”获取表结构,假设表结构包含字段“id”、“name”、“age”。
      4. 生成SQL查询语句:SELECT * FROM user_table WHERE name = '张三';
      5. 调用工具3:根据生成的SQL,获取结果。
      6. 查询结果:返回张三的相关数据。
    • 例子2:用户输入“查询商品表价格大于100的商品”
      1. 解析结果:表描述为“商品表”,查询条件为“价格大于100”。
      2. 调用工具1:根据“商品表”描述获取表名,假设返回表名为“product_table”。
      3. 调用工具2:根据“product_table”获取表结构,假设表结构包含字段“id”、“name”、“price”。
      4. 生成SQL查询语句:SELECT * FROM product_table WHERE price > 100;
      5. 调用工具3:根据生成的SQL,获取结果。
      6. 查询结果:返回价格大于100的商品数据。
    • 例子3:用户输入“查询订单表张三的订单金额”
      1. 解析结果:表描述为“订单表”,查询条件为“张三”。
      2. 调用工具1:根据“订单表”描述获取表名,假设返回表名为“order_table”。
      3. 调用工具2:根据“order_table”获取表结构,假设表结构包含字段“id”、“user_name”、“order_amount”。
      4. 生成SQL查询语句:SELECT order_amount FROM order_table WHERE user_name = '张三';
      5. 调用工具3:根据生成的SQL,获取结果。
      6. 查询结果:返回张三的订单金额。
    • 例子4:用户输入“查询张三购买的不同商品种类的总额”
      1. 解析结果:表描述为“用户表”、“订单表”和“商品表”
      2. 调用工具1:根据表名查询每个表的字段结构
      3. 调用工具2:根据每个表的字段结构生成联合查询SQL
      4. 生成SQL查询语句:SELECT * FROM user_table user LEFT JOIN order_table order ON user.user_id = order.user_id LEFT JOIN prodect_table pro ON pro.id = order.product_id where user.user_name = '张三'
      5. 调用工具3: 根据生成的SQL,获取结果
      6. 查询结果: 返回工具查询结果
许可证

LICENSE

联系方式
Author Information

0

Followers

21

Repositories

0

Gists

0

Total Contributions

Threads