当前位置: 首页 > news >正文

SpringBoot实现MCP

前言

之前的文章都是各种使用MCP,自从有了MCP我们立马感受到大模型真的可以帮我们干活了,实际上当我们想把企业内部的业务向AI方向转型的话主要就是实现MCP,另外加上多Agent在流程上的控制和自有的知识库这就可以满足企业80%的需求了,剩下的20%是大企业中不断提升大模型的智能化水平和优化算法算力等基础设施。这次我们自己体验一下MCP技术,也是作为Java程序员在大模型等技术中找到自己的饭碗。

官网配置

SpringBoot中已经有了MCP的启动器,AI技术很火,
官网地址:
https://docs.spring.io/spring-ai/reference/api/mcp/mcp-overview.html
找到MCP部分

我们先把骨架部分配置起来
https://start.spring.io/

客户端和服务端都选上,主要还是MCP部分,当然JDBC,WEB也一起选上,方便测试

项目准备好了点击下载就行,然后导入IDEA。

一点学习提示

注意啦,写代码这种事情光看是不会懂的,甚至很多概念都是云里雾里,我相信很多小伙伴一直对MCP是啥都不大了解,不是没资料反而是网上抄概念的文章太多,这种感觉就是文字都认得就是不知道啥玩意。其实我也是跑通了几个小代码之后才清楚一些的。
其他不废话,SpringMCP的代码就是直接按照官网的例子先抄一抄,然后跑通,接下来自己改吧改吧定制一个自己的项目就行,大部分的技术都是这个套路。上链接
https://github.com/spring-projects/spring-ai-examples/tree/main

下面还是自己整点例子,不然显得纯COPY了。我们的目标是把前面文章中提到的mysql操作的工具给简单实现一遍。

定义服务

这个是一个标准的SpringBoot的项目,按照约定第一优先的原则,我定义了如下结构:


首先定义了一个服务类,内容如下
@Service
public class JdbcQueryService {@Tool(description = "找出人群中最帅的人")public String shuaige(){return "敏叔最帅";}
}

接下来我们需要把服务暴露成MCP的规范类


@Configuration
public class McpConfig {@BeanToolCallbackProvider jdbcQueryTools(JdbcQueryService jdbcQueryService) {return MethodToolCallbackProvider.builder().toolObjects(jdbcQueryService).build();}
}

接下来追加配置文件

spring.application.name=mcp
spring.ai.mcp.server.name=jdbc-mcp-server
spring.ai.mcp.server.stdio=false

最后就是启动类


@SpringBootApplication
public class McpApplication {public static void main(String[] args) {SpringApplication.run(McpApplication.class, args);}}

配置服务

打包

切换到我们的项目下面,把代码进行打包

cd mcp
./mvnw clean install -DskipTests
cd target && ls -al
--得到jar包
mcp-0.0.1-SNAPSHOT.jar

定义mcp规范文件

稍微解读一下,这个是表示mcp服务中通过jar命令的方式启动我们的服务类,其实就是一个java程序启动的过程,里面需要配置我们本机的jar包路径。


{"mcpServers": {"jdbc-mcp-server": {"command": "java","args": ["-Dspring.ai.mcp.server.stdio=true","-Dspring.main.web-application-type=none","-Dlogging.pattern.console=","-jar","/Users/zhuxuemin/Downloads/mcp/target/mcp-0.0.1-SNAPSHOT.jar"]}}
}

注册MCP

在trae中找到mcp服务,点击手动添加

把JSON复制进去,确认即可

注意要服务打勾才算,如果有问题会出现红色警示

跑起来

我们先看下没有我们MCP的效果
问:找出人群中最帅的人


可以看到,大模型无法回答我的问题,还好没有直接回答彭于晏,不然后面的事情有点不好推进啦。
“抱歉,我无法判断人群中谁最帅”

接下来,让智能体起用我们的MCP,需要勾选

再次问上面的问题,看情况


可以看到,大模型懂事的调用了我们提供的帅哥服务,而且给出的回答也让人非常满意!!

上难度

接下来上难度啦,我们一开始是要模拟那个mysql服务的,光叫人喊帅哥肯定不够的。再次强调的是这个是一个标准的SpringBoot的服务,里面的内容完全是Spring的标准的,所以这样一来可以无缝对接我们过去的技术栈。
我们到配置文件里面补充一下mysql的配置,还是以前的库

spring.data.jdbc.dialect=mysql
spring.datasource.url=jdbc:mysql://198.19.249.220:3306/blog_publisher?useSSL=false&serverTimezone=UTC
spring.datasource.username=test
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

接下来引入JdbcTemplate,把我们的服务完善起来,完整代码如下,只是追加了两个查询数据库的类,因为mysql可以直接通过元数据访问库的信息,所以实现起来就是一个查询元数据表的过程。


@Service
public class JdbcQueryService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Tool(description = "查询数据库中所有的表")public List<Map<String, Object>> queryAllTables(){String sql = "SELECT TABLE_NAME , TABLE_COMMENT FROM information_schema.tables WHERE TABLE_SCHEMA = DATABASE()";return jdbcTemplate.queryForList(sql);}@Tool(description = "查询数据库中的表的数据")public List<Map<String, Object>> queryTable(@ToolParam(description = "表名") String tableName){String sql = "SELECT * FROM " + tableName;return jdbcTemplate.queryForList(sql);}@Tool(description = "找出人群中最帅的人")public String shuaige(){return "敏叔最帅";}
}

重新发布

重新打包,部署,记得重启mcp
重启之后是可以看到服务注册信息的

再次提问:

因为jdbc里面是配置的blog_publisher库信息,所以返回了库里面全部表的信息,符合预期。

后记

其实我没有太强调MCP的概念,相信跑通了之后对MCP对认识是有新的维度上的认知的,另外来说大模型的技术是不断发展的,而且学习成本也很低,在现有的工作内容做点扩展就行。最后,这份小代码不复杂,需要源码的话直接留言找我要就行。

http://www.lryc.cn/news/583606.html

相关文章:

  • Git版本控制完全指南:从入门到实战(简单版)
  • 【LeetCode207.课程表】以及变式
  • Flutter基础(前端教程⑨-图片)
  • 「macOS 系统字体收集器 (C++17 实现)」
  • JavaScript对象的深度拷贝
  • 全球发展币GDEV:从中国出发,走向全球的数字发展合作蓝图
  • 【RK3568+PG2L50H开发板实验例程】FPGA部分 | DDR3 读写实验例程
  • 【学习笔记】OkHttp源码架构解析:从设计模式到核心实现
  • 【Java】【力扣】【字节高频】3.无重复字符的最长字串
  • 便捷的电脑自动关机辅助工具
  • Deepseek搭建智能体个人知识库
  • yolo8实现目标检测
  • 操作系统核心技术剖析:从Android驱动模型到鸿蒙微内核的国产化实践
  • Day 56
  • EPLAN 电气制图(六):结构盒与设备管理器核心概念(基础知识选看)
  • Linux操作系统之进程间通信:管道概念
  • EF提高性能(查询禁用追踪)(关闭延迟加载)
  • 神经网络初步学习3——数据与损失
  • 如何选择时序数据库:关键因素与实用指南
  • HCIP(综合实验)
  • 备受期待的 MMORPG 游戏《侍魂R》移动端现已上线 Sui
  • 【教程】基于GNN的药物相互作用网络中的链接预测
  • 200nl2sql
  • 安全管理协议(SMP):配对流程、密钥生成与防中间人攻击——蓝牙面试核心考点精解
  • python 在运行时没有加载修改后的版本
  • 自动驾驶决策与规划
  • 华为动态路由配置
  • 【Linux | 网络】socket编程 - 使用UDP实现服务端向客户端提供简单的服务
  • 分库分表之实战-sharding-JDBC水平分库+分表后:查询与删除操作实战
  • Android Notification 通过增加addAction 跳转回Service重新执行逻辑