在近期的实习中,我负责在后端小组中另一位同学的项目基础上做相关的完善,这次的任务主要是利用 MCP ,让开发的AI Agent能够实现 全网搜索内容 的功能。

关于MCP:

想要详细了解可以参考这篇博客MCP 终极指南,下面在这个基础上对其进行一些梳理总结。


什么是MCP

MCP,全称Model Context Protocol(模型上下文协议),是一种开放的AI模型与外部工具/服务交互的标准协议。它的核心目的是让AI模型能够在对话过程中,安全、标准化地调用外部工具、API或服务,从而实现“工具增强型智能体”。 

可以将 MCP 想象成 AI 应用的 USB 接口。就像 USB 为设备连接各种外设和配件提供了标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化的方法。

下面引用别人的一张图片做形象的展示:


工作流程

    官方的MCP架构图


架构图的理解

主要分为以下部分:

  • MCP 主机(MCP Hosts):运行的AI模型的环境,负责理解用户请求,并决定是否需要调用外部工具

  • MCP 客户端(MCP Clients):MCP 主机中的一个组件,负责根据模型的指令,向 MCP 服务器发起工具调用请求

  • MCP 服务器(MCP Servers):实际承载和管理各种工具/服务的服务器,接收MCP客户端的请求,执行相应操作,并返回结果

  • 本地资源(Local Resources):MCP 主机本地可直接访问的工具或数据资源

  • 远程资源(Remote Resources):需要通过网络访问的外部服务或API

具体工作流程分析
  • 用户请求:用户通过前端向AI Agent(MCP 主机)发起请求

  • 模型分析:MCP 主机上的大模型分析用户意图,判断是否需要调用某个工具

  • MCP 客户端发起请求
    MCP 客户端根据模型的指令,构造MCP协议请求,发送给MCP服务器。

    • 如果工具是本地资源,MCP客户端可以直接调用本地服务。
    • 如果工具是远程资源,MCP客户端通过网络将请求发送到远程MCP服务器。
  • MCP 服务器处理请求:MCP服务器收到请求后,调用相应的工具/服务(可能是本地资源,也可能是远程资源),获取结果。

  • 结果返回:MCP服务器将处理结果通过MCP协议返回给MCP客户端。

  • 模型生成回复:MCP主机上的大模型根据工具返回的结果,生成自然语言回复,返回给用户


MCP的作用

  • 标准化:为大模型和外部工具之间的通信提供统一的接口和数据格式
  • 安全性:通过协议约束,防止模型随意调用敏感或危险的外部服务
  • 可扩展性:开发者可以很方便地为AI Agent添加新的工具或服务

简单来说,MCP的出现,是为了用统一、标准化、模块化的方式,把大模型和各种外部工具服务解耦,让开发者专注于上层智能体的业务创新,而不用反复造轮子、关心底层细节


项目实践

 简要讲了一下MCP的概念,现在演示一下如何在LangChain4j上为我们的AI项目添加MCP服务

获取服务

使用该MCP服务进行联网功能,具体实现可以看这个网页,需要去智谱官网配置该服务的API

智谱联网搜索 · MCPhttps://www.modelscope.cn/mcp/servers/ZhipuAI/Zhipu-Web-Search

配置文件

LangChain4j封装好了支持MCP的API, 首先需要在配置文件pom.xml中引入依赖,

<!-- https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-mcp -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-mcp</artifactId>
    <version>1.1.0-beta7</version>
</dependency>

连接MCP服务

这里需要按照官方文档的要求,初始化和 MCP 服务的通讯、

创建Spring Boot配置类配置并创建一个MCP工具提供者(McpToolProvider),用于在后端的LangChain4j框架下能够通过MCP协议,和远程的大模型工具服务进行通信,特别是以SSE(Server-Sent Events,流式推送)方式

@Configuration
publicclass McpConfig {

    @Value("${bigmodel.api-key}")
    private String apiKey;

    @Bean
    public McpToolProvider mcpToolProvider() {
        // 和 MCP 服务通讯
        McpTransport transport = new HttpMcpTransport.Builder()
                .sseUrl("https://open.bigmodel.cn/api/mcp/web_search/sse?Authorization=" + apiKey)
                .logRequests(true) // 开启日志,查看更多信息
                .logResponses(true)
                .build();


        // 创建 MCP 客户端
        McpClient mcpClient = new DefaultMcpClient.Builder()
                .key("yupiMcpClient")
                .transport(transport)
                .build();


        // 从 MCP 客户端获取工具
        McpToolProvider toolProvider = McpToolProvider.builder()
                .mcpClients(mcpClient)
                .build();
        return toolProvider;
    }
}

在这个项目原先的 AI Service 类中应用 MCP 工具。

具体来说用LangChain4j的智能体编排的API,把功能集成到同一个AI Agent服务里,原先该AI Service类已经集成了对话记忆组件,RAG等功能。

现在把前面注册好的的McpToolProvider类注入到mcpToolProvider,使得AI Agent可以通过MCP协议调用远程AI服务/工具

@Resource
private McpToolProvider mcpToolProvider;//依赖注入


Ai408HelperService ai408HelperService = AiServices.builder(Ai408HelperService.class)
        .chatModel(qwenChatModel)
        .chatMemory(chatMemory)
        .contentRetriever(contentRetriever) 
        .toolProvider(mcpToolProvider) // 将先前的MCP 工具调用
        .build();

单元测试

  @Test
    void chatWithMCP() {
        String result = ai408HelperService.chat("推荐一下最新的操作系统课程");
        System.out.println(result);
    }

可以看到ai搜索了网页

返回结果如下:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐