系列文章目录
1.Dify智能体调用本地MCP服务: link
文章目录
1 MCP概念
当前人工智能领域最受关注的技术进展之一当属模型上下文协议(Model Context Protocol,简称MCP)。作为Anthropic公司推出的开放标准协议,MCP正在重塑大型语言模型(LLMs)与外部环境的交互方式。
MCP的核心价值在于其标准化设计理念。该协议为AI系统构建了一个通用接口框架,使得各类数据源和工具能够实现即插即用。类比而言,MCP在AI领域的作用堪比USB-C在电子设备领域的革命性意义——它消除了不同系统间的兼容性障碍。
根据官方技术文档(https://modelcontextprotocol.io/introduction)的定义,MCP主要实现以下功能:
建立统一的上下文提供标准
实现异构系统的互操作性
简化AI模型的集成复杂度
从技术架构来看,MCP的创新性体现在三个方面:
接口标准化:采用通用规范对接各类数据源
协议轻量化:确保交互过程的高效性
扩展灵活性:支持新型服务的快速接入
实际应用中,MCP显著提升了AI系统的功能扩展性。以天气预报服务为例,通过MCP接口,语言模型可以实时获取气象数据,而无需针对特定API进行定制开发。这种标准化接入方式大幅降低了AI应用的开发门槛。
值得注意的是,MCP的兼容性设计使其能够适配多种应用场景。无论是数据库查询、实时数据流还是专业计算服务,都可以通过统一的协议规范实现无缝对接。这种设计哲学与现代模块化软件开发理念高度契合,为AI技术的产业化应用提供了重要基础设施。
2 使用Spring MCP Server搭建本地MCP服务
在Java生态系统中,Spring框架与AI技术的融合正展现出强大的协同效应。Spring AI项目推出的MCP Server Boot Starter组件(详见官方文档:https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html)为开发者提供了开箱即用的解决方案。
Spring AI针对不同应用场景设计了三种通信模式:
标准I/O模式(STDIO)
采用进程内通信机制
通过系统标准输入输出流传输数据
典型应用:本地开发环境调试
MVC服务模式
基于Servlet容器实现
支持服务器推送事件(SSE)协议
优势:与传统Spring MVC项目完美兼容
WebFlux响应式模式
采用非阻塞式I/O模型
支持高并发流式处理
特点:适合云原生微服务架构
技术选型建议:
• 快速原型开发推荐STDIO模式
• 企业级Web应用建议采用MVC方案
• 需要处理万级并发的场景适用WebFlux
实践指南:
开发者可以直接使用Spring官方示例代码库(https://github.com/spring-projects/spring-ai-examples)中的starter-webmvc-server(https://github.com/spring-projects/spring-ai-examples/tree/main/model-context-protocol/weather/starter-webmvc-server)项目作为基础模板。该模板已实现核心功能,只需根据业务需求进行适当定制即可快速构建MCP服务。
特别说明:
WebMVC实现方案在保持良好性能的同时,提供了完善的RESTful接口支持,是大多数传统Java项目的优选方案。其标准化的SSE端点设计使得前端集成变得异常简便。
本次演示的项目需要JDK17,apache-maven-3.9.9,Dify1.4.0(已支持MPC插件)
java -version
java version "17.0.7" 2023-04-18 LTS
Java(TM) SE Runtime Environment (build 17.0.7+8-LTS-224)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.7+8-LTS-224, mixed mode, sharing)
mvn -v
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: C:\zk\package\apache-maven-3.9.9
Java version: 17.0.7, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-17
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
2.1 试行官方案例
运行 McpServerApplication.java
2.2 运行测试文件
运行测试文件 ClientSse.java ,可以看到返回了信息。
2.3 添加简单的自测MCP服务
我们新增一个BIService类,在类上标注@Service注解,然后新增getProjectInfoByCustomerName和getProjectInfoByContractNum方法,模拟从数据库中查询项目信息。
2.3.1关键注解使用指南:@Tool 配置详解
@Tool注解的关键信息如下:
• name:工具的名称。如果未提供,则使用方法名称。AI 模型使用此名称来识别调用该工具的工具。因此,同一个类中不允许有两个同名的工具。对于特定的聊天请求,该名称在模型可用的所有工具中必须是唯一的。
• description:工具的描述,模型可以通过该描述了解何时以及如何调用该工具。如果未提供,则方法名称将用作工具描述。但是,强烈建议提供详细的描述,因为这对于模型理解工具的用途及其使用方法至关重要。如果描述不充分,可能会导致模型在应该使用工具时不使用它,或者错误地使用它。
• returnDirect:工具结果应直接返回给客户端还是传递回模型。有关更多详细信息,请参阅直接返回。
• resultConverter:ToolCallResultConverter用于将工具调用的结果转换为可String object发送回 AI 模型的实现。更多详情,请参阅结果转换。
强烈建议仔细填写description内容。
2.4 在McpServerApplication类中,提供一个ToolCallbackProvider
package org.springframework.ai.mcp.sample.server;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.function.FunctionToolCallback;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableFeignClients(basePackages = "org.springframework.ai.mcp.sample.rest")
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
public record TextInput(String input) {
}
@Bean
public ToolCallback toUpperCase() {
return FunctionToolCallback.builder("toUpperCase", (TextInput input) -> input.input().toUpperCase())
.inputType(TextInput.class)
.description("Put the text to upper case")
.build();
}
//提供一个ToolCallbackProvider
@Bean
public ToolCallbackProvider biTools(BIService biService) {
return MethodToolCallbackProvider.builder().toolObjects(biService).build();
}
}
后端MCP服务完成。
现在贴上完整的BIService的代码,还有一些调用第三方的Feign。
pom.xml 中加入了Feign的依赖现完整贴出来:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--