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的项目,按照约定第一优先的原则,我定义了如下结构:

java 复制代码
首先定义了一个服务类,内容如下
@Service
public class JdbcQueryService {

    @Tool(description = "找出人群中最帅的人")
    public String shuaige(){
        return "敏叔最帅";
    }
}

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

java 复制代码
@Configuration
public class McpConfig {

    @Bean
    ToolCallbackProvider jdbcQueryTools(JdbcQueryService jdbcQueryService) {
        return MethodToolCallbackProvider
                .builder()
                .toolObjects(jdbcQueryService)
                .build();
    }
}

接下来追加配置文件

JAVA 复制代码
spring.application.name=mcp
spring.ai.mcp.server.name=jdbc-mcp-server
spring.ai.mcp.server.stdio=false

最后就是启动类

java 复制代码
@SpringBootApplication
public class McpApplication {

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

}

配置服务

打包

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

bash 复制代码
cd mcp
./mvnw clean install -DskipTests
cd target && ls -al
--得到jar包
mcp-0.0.1-SNAPSHOT.jar

定义mcp规范文件

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

json 复制代码
{
  "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的配置,还是以前的库

java 复制代码
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可以直接通过元数据访问库的信息,所以实现起来就是一个查询元数据表的过程。

java 复制代码
@Service
public class JdbcQueryService {

    @Autowired
    private 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对认识是有新的维度上的认知的,另外来说大模型的技术是不断发展的,而且学习成本也很低,在现有的工作内容做点扩展就行。最后,这份小代码不复杂,需要源码的话直接留言找我要就行。

相关推荐
Hellyc1 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen1 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge1 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
Livingbody2 小时前
基于【ERNIE-4.5-VL-28B-A3B】模型的图片内容分析系统
后端
百锦再2 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂2 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
你的人类朋友3 小时前
🍃Kubernetes(k8s)核心概念一览
前端·后端·自动化运维
有没有没有重复的名字3 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
张先shen4 小时前
Elasticsearch RESTful API入门:基础搜索与查询DSL
大数据·spring boot·elasticsearch·搜索引擎·全文检索·restful
追逐时光者4 小时前
面试第一步,先准备一份简洁、优雅的简历模板!
后端·面试