当前位置: 首页 > 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.xdnf.cn/news/1092889.html

相关文章:

  • Java SE--继承
  • 基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(4)集成Allure报表
  • 机器视觉之工业相机讲解
  • 鸿蒙商城开发:ZKmall开源商城系统特性适配与性能优化
  • 【PyTorch】PyTorch中torch.nn模块的全连接层
  • vscode 防止linux索引爆红
  • Java+AI精准广告革命:实时推送系统实战指南
  • JVM 调优
  • 打破传统,开启 AR 智慧课堂​
  • 矩阵之方阵与行列式的关系
  • 最新全开源礼品代发系统源码/电商快递代发/一件代发系统
  • 【每日算法】专题六_模拟
  • 【libm】 16 IEEE 754-2019 maximum 函数实现(fmaximum_num.rs)
  • linux正向配置dns解析
  • 100个GEO基因表达芯片或转录组数据处理025.GSE248467
  • AI智能体记忆架构的革命:LangGraph中的分层记忆系统实现
  • JAVA观察者模式demo【设计模式系列】
  • 基于YOLOv11的CF-YOLO,如何突破无人机小目标检测?
  • 【WEB】Polar靶场 21-25题 详细笔记
  • Prometheus+Grafana+node_exporter监控linux服务器资源的方案
  • 分库分表之实战-sharding-JDBC绑定表配置实战
  • CTFHub————Web[信息泄露(目录遍历、PHPINFO)]
  • 1.4 洛谷入门一题单全解
  • Explain关键字
  • Markdown 语法规则
  • 什么是 AMR 格式?简鹿音频转换器轻松批量转换 AMR 为 MP3
  • PHP语法高级篇(一):日期时间处理和包含文件
  • LLaMA 学习笔记
  • 装配式建筑4.0:当房子像汽车一样被“智造”
  • 数据结构——深度优先搜索与广度优先搜索的实现