掘金 人工智能 前天 17:21
Java开发MCP服务器
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

预训练大语言模型受限于其知识库的静态性,难以应对实时性要求高的场景。MCP(Model Context Protocol)协议的出现,为大语言模型与外部系统集成提供了解决方案。通过开发MCP服务器,大模型不仅能获取互联网最新数据,还能访问企业内部的保密信息。本文以一个“天气MCP服务器”为例,详细介绍了MCP服务器的开发流程,包括环境搭建、Tool的开发与注册,以及MCP客户端的本地调试和部署到大模型服务平台(如阿里云百炼)的实践。这使得AI应用能够调用外部工具,极大地扩展了大模型的应用范围和能力。

💡 **MCP协议打破大模型信息壁垒**:预训练大语言模型知识库停留在训练时点,无法获取实时数据,导致在天气、新闻等场景下表现不佳。MCP(Model Context Protocol)协议的诞生,解决了AI应用与外部系统集成的问题,使大模型能够访问互联网公开的最新数据,甚至企业内部的保密数据,从而克服了知识时效性限制。

🛠️ **MCP服务器开发流程详解**:MCP服务器的核心在于“Tool”的开发,Tool是供大模型调用的功能模块,本质上是一个带有详细描述的Java方法。通过Spring AI的封装,如引入`spring-ai-bom`和`spring-ai-starter-mcp-server-webmvc`依赖,以及使用`@Tool`注解描述方法及其参数,可以方便地将业务逻辑转化为大模型可调用的工具。Tool对象通过`ToolCallbackProvider`注册到Spring上下文,进而被MCP服务器使用。

🌐 **MCP客户端本地调试与部署**:在将MCP服务器部署到大模型平台前,可使用`spring-ai-starter-mcp-client-webflux`依赖开发MCP客户端进行本地调试。通过`McpSyncClient`与服务器通信,可以初始化连接、列举服务器支持的Tools,并发起Tool调用以验证功能。调试完成后,MCP服务器可部署至阿里云百炼等大模型服务平台,通过HTTP方式注册,使AI应用在与用户对话时,能够智能判断并调用相应的外部工具,获取实时或私有数据,并由大模型进行整合回答。

🚀 **赋能AI应用,提升交互体验**:通过将MCP服务器部署并集成到大模型服务平台,AI应用能够调用外部工具,极大地增强了其解决实际问题的能力。当用户询问天气等实时性问题时,大模型能够自动识别并调用天气Tool,获取准确信息后,再将结果反馈给用户,实现更智能、更流畅的交互体验,显著提升了AI应用的实用性和用户满意度。

前言

预训练的大语言模型虽然强大,但是知识库停留在训练的那一刻,无法获取实时的数据,导致大模型在某些场景下表现的很不好。

例如,你询问大模型关于实时天气、实时新闻的看法,大模型要么无法回答,要么胡乱编造结果,这显然不是我们想看到的结果。

好在,MCP 协议的诞生,打通了 AI 应用和外部系统的集成问题,大模型不仅可以获取互联网上公开的最新数据,甚至可以访问企业内部系统的保密数据,只要你开发好相应的MCP服务器即可。

本文通过一个“天气MCP服务器”为例。

MCP服务器开发

MCP 是 Model Context Protocol 的缩写,中文译为“模型上下文协议”。

协议即标准,有了标准,厂商就可以根据标准开发并封装成依赖包,减少重复开发的成本。官方提供了各语言的开发包,以 Java 为例,仓库地址:github.com/modelcontex…

在 Spring 项目中,为了更好的集成 MCP,Spring 做了进一步的封装。

首先,引入spring-ai-bom

<dependencyManagement>    <dependencies>        <dependency>            <groupId>org.springframework.ai</groupId>            <artifactId>spring-ai-bom</artifactId>            <version>${spring-ai.version}</version>            <type>pom</type>            <scope>import</scope>        </dependency>    </dependencies></dependencyManagement>

如果通过webmvc的方式集成,就引入spring-ai-starter-mcp-server-webmvc

<dependencies>    <dependency>        <groupId>org.springframework.ai</groupId>        <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>    </dependency></dependencies>

到这里,环境就搭建好了。

MCP 服务器,最核心的是 Tool 的开发。Tool 是供 MCP 客户端调用的工具,由大模型负责推理该调用哪个 Tool。在代码层面,Tool 就是一个普通的 Java 方法,额外要做的,就是对这个方法加以描述,让大模型能理解,这个方法是干什么用的,需要哪些参数。

如下所示,方法weatherQuery就是一个 Tool,通过@Tool注解对方法加以描述,让 Spring 知道有这么个 Tool。为了简单,这里数据是随机生成的。

@Servicepublic class WeatherService {    @Tool(name = "weather_query", description = "根据商品关键字搜索商品,返回一个商品列表")    public String weatherQuery(@ToolParam(description = "位置", required = true) String location) {        // 天气、温度 随机生成        int temperature = ThreadLocalRandom.current().nextInt(10, 40);        String[] weathers = {"晴", "多云", "阴", "小雨", "中雨", "大雨", "雨夹雪", "大雪"};        String weatherText = weathers[ThreadLocalRandom.current().nextInt(weathers.length)];        return "location=%s,temperature=%d°C,weatherText=%s".formatted(location, temperature, weatherText);    }}

最后,将包含 Tool 的对象封装到 ToolCallbackProvider,注册到 Spring 上下文容器,再由 Spring 注册到 MCP 服务器。

@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }    @Bean    public ToolCallbackProvider toolCallbackProvider(WeatherService weatherService) {        return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();    }}

启动 Spring 应用,访问http://127.0.0.1:8080/sse能打开新的会话,表示MCP服务正常。

MCP 服务器默认由两个端点:

如果像修改端点,可以通过如下配置:

spring:  ai:    mcp:      server:        enabled: true        type: sync        sse-endpoint: /sse        sse-message-endpoint: /mcp/message

MCP客户端测试

MCP 服务器开发好以后,可以对外发布,然后添加到大模型服务平台,供AI应用调用。

当然,我们也可以先通过 MCP 客户端本地调试下,确保没问题,再发布。

开发 MCP 客户端,需要先引入依赖

<dependency>    <groupId>org.springframework.ai</groupId>    <artifactId>spring-ai-starter-mcp-client-webflux</artifactId></dependency>

然后,构建 McpSyncClient 和服务器建立连接,并通信。

如下所示,先初始化,再列举服务器支持的 Tools。

public static void main(String[] args) {    McpClientTransport transport = new HttpClientSseClientTransport("http://127.0.0.1:8080/sse");    McpSyncClient client = McpClient.sync(transport)            .requestTimeout(Duration.ofSeconds(10))            .capabilities(McpSchema.ClientCapabilities.builder().roots(false).build())            .build();    // 初始化    McpSchema.InitializeResult initialize = client.initialize();    // 列举服务器支持的Tools    McpSchema.ListToolsResult tools = client.listTools();    for (McpSchema.Tool tool : tools.tools()) {        System.err.println(tool);    }    client.closeGracefully();}

正常情况下应该有下图所示的输出

客户端发起 Tool 调用,代码示例:

McpSchema.CallToolRequest callToolRequest = new McpSchema.CallToolRequest("weather_query", Map.of("location", "杭州"));McpSchema.CallToolResult callToolResult = client.callTool(callToolRequest);System.err.println(callToolResult.content());

正常应该得到结果

[TextContent[audience=null, priority=null, text="location=杭州,temperature=38°C,weatherText=中雨"]]

部署到大模型服务平台

自己写 MCP 客户端去调用 MCP 服务器是没有意义的,MCP 服务器对外部署后,可以注册到大模型服务平台,供所有AI应用调用,增强AI应用的能力。

这里以阿里云的百炼为例,官网地址:bailian.console.aliyun.com

注册账号后,在“MCP管理”页面创建MCP服务,如下图所示:

依次填写MCP服务的名称、描述、和服务配置。因为MCP服务器我们已经开发部署完了,所以这里选http的安装方式,填写MCP服务器地址即可。

平台会创建MCP客户端和MCP服务器通信,列举服务器支持的所有工具。

可以在页面上,直接对工具发起调用,进行调试。

MCP 服务调试完成,就可以直接添加到智能体,在用户和大模型对话时,大模型会智能判断何时调用哪个工具。

例如,我们问天气相关的问题,大模型就会判断该调用天气工具了,然后MCP客户端就会发起工具调用,然后再把天气结果喂给大模型,由大模型推理回答。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MCP协议 大语言模型 AI集成 外部工具 Spring AI 实时数据
相关文章