图片
MCP 作为一个开放标准,正在快速发展。未来会有越来越多的 AI 应用和工具支持它,就像 USB 接口一样普及。建议大家持续关注,尽早掌握这一连接万物的“AI 接口”。

MCP(Model Context Protocol,模型上下文协议) 是一种开放标准,旨在彻底改变 AI 与外部系统的交互方式。

如果说大模型是大脑,那么 MCP 就是它的神经末梢。它为 AI 提供了与外部工具、资源和服务交互的标准化方式,让 AI 能够访问最新数据、执行复杂操作,并与现有系统无缝集成。

你可以把 MCP 想象成 AI 应用的“USB 接口”。

就像 USB 为电脑连接鼠标、键盘、打印机提供了统一标准一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化的方法。

看下面这张图,一目了然:

图片图片

简单来说,通过 MCP 协议,你的 AI 应用可以轻松“插拔”别人提供的服务来实现更多功能,比如查询地理位置、操作数据库、部署网站,甚至是支付等等,而不需要为每个服务单独开发适配器。

在之前的文章中,我分享了如何利用 LangChain4j 通过自定义工具实现博客园文章搜索。今天,我们更进一步,利用 MCP 实现全网搜索内容,这也是 MCP 最典型的应用场景之一。

寻找 MCP 服务

首先,我们需要在 MCP 服务市场找到一个 Web Search 服务。

这里推荐 智谱的 Web Search 服务,因为它提供了 SSE(Server-Sent Events)在线调用服务。这意味着我们不需要自己在本地安装和启动繁琐的环境,直接通过网络调用即可,非常方便。

图片图片

当然,使用第三方服务通常需要 API Key。你需要先去 平台官方获取 API Key,稍后在代码中会用到:

图片图片

引入依赖与配置

比较遗憾的是,目前 LangChain4j 官方文档对 MCP 的支持描述还不够完善,甚至没有明确提到需要引入哪个依赖包。

经过一番探索,我从开源仓库中找到了对应的依赖。请在你的 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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

接着,在 application.yaml 配置文件中新增 API Key 的配置:

bigmodel:
  api-key: <Your Api Key>
  • 1.
  • 2.

编写 MCP 配置类

接下来是核心部分。我们需要新建一个配置类 mcp.McpConfig,初始化与 MCP 服务的通讯,并创建 McpToolProvider 的 Bean。

代码如下:

/**
 * @author BNTang
 */
@Configuration
public class McpConfig {

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

    @Bean
    public McpToolProvider mcpToolProvider() {
        // 1. 配置与 MCP 服务的通讯方式 (SSE)
        McpTransport transport = new HttpMcpTransport.Builder()
                .sseUrl("https://open.bigmodel.cn/api/mcp/web_search/sse?Authorizatinotallow=" + apiKey)
                // 开启日志,方便调试查看交互细节
                .logRequests(true)
                .logResponses(true)
                .build();
        
        // 2. 创建 MCP 客户端
        McpClient mcpClient = new DefaultMcpClient.Builder()
                .key("neoMcpClient")
                .transport(transport)
                .build();
        
        // 3. 从 MCP 客户端获取工具提供者
        return McpToolProvider.builder()
                .mcpClients(mcpClient)
                .build();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

注意: 上面演示的是通过 SSE (HTTP) 的方式调用在线 MCP 服务。

如果你是通过 npx 或 uvx 在本地启动 MCP 服务,则需要使用 StdioMcpTransport 来建立通讯,配置方式略有不同:

McpTransport transport = new StdioMcpTransport.Builder()
    .command(List.of("/usr/bin/npm", "exec", "@modelcontextprotocol/server-everything@0.6.2"))
    .logEvents(true) 
    .build();
  • 1.
  • 2.
  • 3.
  • 4.

在 AI Service 中集成

有了 McpToolProvider,我们就可以把它注入到 AI Service 中了。

@Resource
private McpToolProvider mcpToolProvider;

@Bean
public AiCodeHelperService aiCodeHelperService() {
    // 设置聊天记忆,最多保留最近 10 条消息
    ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);

    // 构建 AI Service
    return AiServices.builder(AiCodeHelperService.class)
            .chatModel(qwenChatModel)
            .chatMemory(chatMemory)
            // RAG 检索增强生成
            .contentRetriever(contentRetriever)
            // 注册本地自定义工具
            .tools(new CnblogsArticleTool())
            // 注册 MCP 工具集
            .toolProvider(mcpToolProvider)
            .build();
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

图片图片

至此,集成工作全部完成。

效果验证

让我们编写一个单元测试来验证效果:

@Test
void chatWithMcp() {
    String result = aiCodeHelperService.chat("帮我搜索一下,2025 年最新的 AI 发展趋势有哪些?");
    System.out.println(result);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

执行测试,观察控制台日志。我们可以清晰地看到 AI 自动调用了 MCP 提供的搜索工具:

图片图片

最终,AI 成功从网上检索到了最新内容,并整理成了答案返回给我们:

图片图片

目前,LangChain4j 文档中关于 MCP 的部分还比较空白,希望本文的实战代码能帮你少走弯路。

虽然目前不建议用 Java 去开发 MCP 服务端(生态尚在完善中),但利用 Java 消费现有的 MCP 服务已经非常顺畅。

MCP 作为一个开放标准,正在快速发展。未来会有越来越多的 AI 应用和工具支持它,就像 USB 接口一样普及。建议大家持续关注,尽早掌握这一连接万物的“AI 接口”。

文章来自:51CTO

Loading

作者 yinhua

发表回复