当前位置: 首页 > 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.dtcms.com/a/271708.html

相关文章:

  • 【Linux网络编程】Socket - TCP
  • 【通识】NodeJS基础
  • LLaMA 学习笔记
  • Java 多态详解:从原理到实战,深入理解面向对象编程的核心特性
  • C#基础篇(09)结构体(struct)与类(class)的详细区别
  • Vue响应式原理三:响应式依赖收集-类
  • 大模型的下半场:从工具到智能体的产业变革与2025突围之路
  • AI大模型:(二)4.2 文生图训练实践-真人写实生成
  • 8.2 文档预处理模块(二)
  • 学习笔记(31):matplotlib绘制简单图表-直方图
  • UNet改进(19):基于残差注意力模块Residual Attention的高效分割网络设计
  • 编译安装的Mysql5.7报“Couldn‘t find MySQL server (mysqld_safe)“的原因 笔记250709
  • 主流大模型Agent框架 AutoGPT详解
  • 软件互联网产品发版检查清单
  • WIndows 编程辅助技能:格式工厂的使用
  • Dify教程更改文件上传数量限制和大小限制
  • JVM 调优
  • 双指针-15.三数之和-力扣(LeetCode)
  • AI技术如何重塑你的工作与行业?——实战案例解析与效率提升路径
  • gdb调试工具
  • Lingo软件学习(一)好学爱学
  • DPDK graph图节点处理框架:模块化数据流计算的设计与实现
  • dify配置邮箱,密码重置以及邮箱邀请加入
  • 【Java】【字节面试】字符串中 出现次数最多的字符和 对应次数
  • HTML应用指南:利用GET请求获取全国山姆门店位置信息
  • 跨服务sqlplus连接oracle数据库
  • 如何卸载本机的node.js
  • 源码角度解析 --- HashMap 的 get 和 put 流程
  • 前端使用fetch-event-source实现AI对话
  • AI Agent:我的第一个Agent项目