什么是MCP?

MCP(Model Context Protocol,模型上下文协议)是一种开源标准,用于将AI应用程序连接到外部系统,目的是为AI与外部系统交流提供一个标准化的方法,使相关的工具开发统一标准,方便开发和应用。下面是官方文档的解释。

MCP (Model Context Protocol) is an open-source standard for connecting AI applications to external systems.Using MCP, AI applications like Claude or ChatGPT can connect to data sources (e.g. local files, databases), tools (e.g. search engines, calculators) and workflows (e.g. specialized prompts)—enabling them to access key information and perform tasks.Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect electronic devices, MCP provides a standardized way to connect AI applications to external systems.

官方把MCP形象地比喻成了USB接口,它为外部系统接入AI提供了一个统一的接口,使AI更加开放,增强AI的能力。

通过MCP协议,AI可以轻松接入别人提供的服务来实现更多的功能,例如查询数据库、获取地理信息等。

为什么要统一规范标准?

如果没有统一的协议规范,这些上下文信息可能会 “碎片化”:比如不同工具返回的结果格式不统一,模型无法直接复用;历史对话与当前任务的关联逻辑混乱,导致模型 “忘事” 或 “答非所问”。
MCP 的核心价值,就是通过标准化的 “上下文交互规则”,让模型、用户、外部系统(工具、数据库、其他模型)之间能 “高效对齐上下文”,降低协作成本,提升 AI 任务的准确性和连贯性。

MCP的架构

模型上下文协议包括以下项目:

  • MCP 规范(Specification):定义客户端与服务器的实现要求。
  • MCP SDKs:多编程语言的 SDK,落地 MCP 协议供开发者使用。
  • MCP 开发工具(Development Tools):如 MCP Inspector,用于开发 MCP 客户端与服务器。
  • MCP 参考服务器实现(Reference Server Implementations):提供服务器的参考示例。

MCP由两层组成:

  • 数据层:定义基于 JSON-RPC 的客户端-服务器通信协议,包括生命周期管理,以及核心原语,如工具、资源、提示和通知。
  • 传输层:定义实现客户端和服务器之间数据交换的通信机制和渠道,包括传输特定的连接建立、消息框架和授权。

从概念上讲,数据层是内层,而传输层是外层。

MCP Java SDK主要分为三层架构:

  • 客户端层/服务器层
  • 会话层
  • 传输层

接下来将对MCP Java SDK的三层结构进行介绍

客户端层/服务器层

二者通过McpSession进行通信管理

客户端

客户端负责和服务器建立连接并通信,它能自动匹配服务器的协议版本,确定可用功能。

它还可以使用各种工具、资源管理和提示词系统与服务器进行交互。

客户端提供了两种传输方式:

  • stdio:适用于本地
  • SSE:适用远程调用

服务端

用来为客户端提供工具、资源和功能支持

它负责处理客户端的请求,还能记录日志、发送通知,并且同时和多个客户端进行连接

和客户端一样支持两种数据传输方式

服务器能力(Primitives):向客户端提供 3 类核心上下文能力 ——

  • 工具(Tools):可执行函数(如文件操作、API 调用),支持 “列出(/list)”“调用(/call)”。
  • 资源(Resources):上下文数据源(如文件内容、数据库记录),支持 “列出(/list)”“获取(/get)”。
  • 提示(Prompts):可复用交互模板(如系统提示、少样本示例),支持 “列出(/list)”“获取(/get)”。

客户端能力(Primitives):向服务器提供 3 类交互能力 ——

  • 采样(Sampling):服务器请求主机的 LLM 生成内容。
  • 引导(Elicitation):服务器向用户请求额外信息。
  • 日志(Logging):服务器向客户端发送日志,用于调试与监控。

Java中使用MCP

1. 引入依赖

<dependency>
    <groupId>org.springframework.experimental</groupId>
    <artifactId>spring-ai-mcp</artifactId>
    <version>1.0.0</version>
</dependency>
<repositories>
  <repository>
    <id>spring-milestones</id>
    <name>Spring Milestones</name>
    <url>https://repo.spring.io/libs-milestone-local</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>

2. 创建McpClient

创建一个 McpClient 来注册 MCP Brave 服务和 ChatClient,从而让 LLM 调用它们

var stdioParams = ServerParameters.builder("npx")
        .args("-y", "@modelcontextprotocol/server-brave-search")
        .addEnvVar("BRAVE_API_KEY", System.getenv("BRAVE_API_KEY"))
        .build();//通过npx命令启动一个独立的进程,定 Brave API 密钥

var mcpClient = McpClient.using(new StdioClientTransport(stdioParams)).sync();//创建一个基于 stdio 的传输层,与 MCP server 进行通信

var init = mcpClient.initialize();//初始化与 MCP 服务器的连接。

var chatClient = chatClientBuilder
        .defaultFunctions(mcpClient.listTools(null)
                .tools()
                .stream()
                .map(tool -> new McpFunctionCallback(mcpClient, tool))
                .toArray(McpFunctionCallback[]::new))
        .build();

String response = chatClient
        .prompt("Does Spring AI supports the Model Context Protocol? Please provide some references.")
        .call().content();

要使用 McpClient,需要将McpClient注入到 Spring AI 的ChatClient中,从而让 LLM 调用 MCP server。在 Spring AI 中,可以通过 Function Callbacks 的方式将 MCP 工具转换为 Spring AI 的 Function,从而让 LLM 调用。

最后,通过ChatClient与 LLM 进行交互,并使用McpClient与 MCP server 进行通信,获取最终的返回结果。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐