欢迎来到我的二次元小站~

MCP协议解析与同类协议比对、应用场景及代码案例

MCP(模型上下文协议)是Anthropic于2024年底推出的开放协议,核心是标准化大语言模型(LLM)与外部数据源、工具的交互,堪称AI领域的“USB-C接口”。本文从协议详解、与同类协议比对、典型应用场景三方面展开,并补充Java代码案例实现MCP客户端与服务器的标准化通信。

一、MCP协议详解

1. 核心架构

采用客户端-服务器架构,包含主机、客户端、服务器三个核心组件:

  • 主机:运行LLM的应用(如Claude Desktop);
  • 客户端:负责与服务器建立连接,管理会话并路由消息;
  • 服务器:提供资源访问、工具调用能力的独立服务。

同时定义了资源、工具、提示、采样四类交互原语,分别对应URI标识的数据、可执行的动作、预设提示模板和服务器主动请求模型推理的机制。

2. 关键特性

  • 即插即用集成:拥有丰富的预置服务器库,开发者能在5分钟内为Claude Desktop添加文件管理、数据库查询等功能,一次开发的模块可对接多种服务;
  • 企业级安全:采用零信任架构,所有AI操作都需主机应用授权,搭配细粒度权限控制和完整审计日志,还通过加密通信、沙箱化执行等机制保障数据安全;
  • 高性能传输:基于轻量级JSON-RPC协议,支持标准输入输出、HTTP、WebSocket等多种传输方式,结合异步处理、连接池和智能缓存,可在高并发场景下保持稳定。

3. 工作流程

  1. AI应用作为客户端发送标准化请求;
  2. MCP服务器解析请求后,调用对应的资源或工具完成操作,并返回结构化数据;
  3. AI模型整合结果生成响应,同时保持上下文连贯性,支撑多轮任务推进。

二、MCP与同类协议的比对

当前AI领域与MCP功能相近的主流协议有ANP(智能体网络协议)和A2A(智能体对智能体协议),三者核心差异如下:

特性 MCP ANP A2A
设计核心 以模型为中心,聚焦LLM与外部资源、工具的交互 以分布式智能体为中心,主打智能体间去中心化协作 以跨平台智能体为中心,解决不同来源智能体的互操作问题
核心目标 打破数据孤岛,简化AI与外部系统的集成流程 成为智能体互联网的“HTTP”,构建开放的智能体协作网络 打破生态孤岛,支持不同框架、厂商的AI Agent协同执行复杂任务
典型架构 客户端-服务器架构,依赖服务器提供外部能力 去中心化P2P架构,基于W3C DID标准实现身份管理 基于HTTP、SSE和JSON-RPC构建,含能力发现、任务管理等模块
适用场景 本地数据处理、开发工具集成、企业内部系统对接 物联网协同、分布式AI训练、去中心化应用开发 跨企业多Agent协作、长时复杂任务分工、多模态智能体交互
局限性 客户端-服务器架构在断开连接时限制通信,难支持大规模去中心化协作 P2P架构和DID认证下,隐私与权限控制难度较大 依赖多方厂商适配,生态适配成本高,小型开发者接入门槛高

三、MCP典型应用场景

1. 开发辅助领域

在IDE等编程工具中,开发者可通过自然语言借助MCP查询数据库、调用代码仓库和部署工具。比如Cursor等智能编程工具,能通过MCP调用代码仓库完成代码检索,还能联动测试工具自动执行代码测试;在LangChain等框架中,MCP可管理多个Agent的上下文,助力多Agent协同完成代码开发相关任务。

2. 企业自动化领域

企业可通过MCP连接ERP、CRM等内部系统,搭建智能客服、自动化办公流程等应用。例如销售团队的AI助手,能借助MCP实时查询客户订单状态,快速生成个性化回复,还可联动邮件系统发送业务确认函;在电商场景中,MCP能让AI自动监控库存数据,当库存异常时触发补货流程。

3. 个性化与本地服务领域

普通用户可通过MCP将AI助手与个人设备的本地文件、日历等资源连接,打造个性化工作流。比如AI助手可通过MCP分析本地文档内容,再调用文本生成工具撰写总结报告;也能在规划行程时,联动日历工具确认时间,对接购票接口完成预订操作。

四、MCP协议Java代码案例(客户端+模拟服务器)

以下案例基于MCP核心规范(JSON-RPC 2.0通信、客户端-服务器架构),实现本地文件读取的MCP客户端,并配套模拟MCP文件服务器,适配Java 8+环境。

1. 环境准备

添加Maven依赖(pom.xml):

<!-- JSON解析 -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
<!-- HTTP通信 -->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>
<!-- Spring Boot(模拟服务器用) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.2.0</version>
</dependency>
<!-- 日志(可选) -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>2.0.9</version>
</dependency>

2. MCP客户端实现(文件读取)

import com.google.gson.Gson;
import okhttp3.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * MCP客户端示例:调用MCP文件服务器读取本地文件内容
 * 适配MCP协议的JSON-RPC 2.0通信规范
 */
public class MCPFileClient {
    // MCP服务器地址(对接模拟服务器)
    private static final String MCP_SERVER_URL = "http://localhost:8080/mcp/v1";
    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient();
    private static final Gson GSON = new Gson();

    // MCP请求体封装(JSON-RPC 2.0标准)
    static class MCPRequest {
        private String jsonrpc = "2.0";
        private String id; // 请求唯一标识
        private String method; // MCP方法名(如file/read)
        private Map<String, Object> params; // 请求参数

        public MCPRequest(String method, Map<String, Object> params) {
            this.id = UUID.randomUUID().toString();
            this.method = method;
            this.params = params;
        }

        // getter(Gson序列化需)
        public String getJsonrpc() { return jsonrpc; }
        public String getId() { return id; }
        public String getMethod() { return method; }
        public Map<String, Object> getParams() { return params; }
    }

    // MCP响应体封装
    static class MCPResponse<T> {
        private String jsonrpc;
        private String id;
        private T result; // 成功返回结果
        private Map<String, Object> error; // 失败返回错误

        // getter
        public String getJsonrpc() { return jsonrpc; }
        public String getId() { return id; }
        public T getResult() { return result; }
        public Map<String, Object> getError() { return error; }
    }

    /**
     * 调用MCP服务器读取文件内容
     * @param filePath 本地文件路径(如E:\tmp\mcp_demo.txt)
     * @return 文件内容
     */
    public String readFileViaMCP(String filePath) throws IOException {
        // 1. 构建MCP请求参数(符合MCP文件服务器规范)
        Map<String, Object> params = new HashMap<>();
        params.put("path", filePath); // 文件路径
        params.put("encoding", "utf-8"); // 编码格式
        MCPRequest request = new MCPRequest("file/read", params);

        // 2. 封装JSON请求体
        String requestJson = GSON.toJson(request);
        RequestBody requestBody = RequestBody.create(
                MediaType.parse("application/json; charset=utf-8"),
                requestJson
        );

        // 3. 发送HTTP POST请求(MCP协议默认POST)
        Request httpRequest = new Request.Builder()
                .url(MCP_SERVER_URL)
                .post(requestBody)
                .addHeader("MCP-Version", "1.0") // MCP协议版本头
                .addHeader("Authorization", "Bearer your-mcp-server-token-123456") // 授权令牌
                .build();

        // 4. 处理响应
        try (Response response = HTTP_CLIENT.newCall(httpRequest).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("MCP服务器请求失败: " + response);
            }
            String responseJson = response.body().string();
            MCPResponse<Map<String, String>> mcpResponse = GSON.fromJson(responseJson, MCPResponse.class);

            // 5. 解析结果(错误处理)
            if (mcpResponse.getError() != null) {
                throw new RuntimeException("MCP调用失败: " + mcpResponse.getError().get("message"));
            }
            return mcpResponse.getResult().get("content"); // 返回文件内容
        }
    }

    // 测试入口
    public static void main(String[] args) {
        MCPFileClient client = new MCPFileClient();
        try {
            // 调用MCP服务器读取本地文件
            String fileContent = client.readFileViaMCP("E:\\tmp\\mcp_demo.txt");
            System.out.println("MCP读取文件内容:\n" + fileContent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. MCP模拟服务器实现(Spring Boot)

用于本地测试客户端,模拟MCP文件服务器的核心逻辑:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

@SpringBootApplication
@RestController
public class MCPMockFileServer {
    public static void main(String[] args) {
        SpringApplication.run(MCPMockFileServer.class, args);
    }

    @PostMapping("/mcp/v1")
    public Map<String, Object> handleFileRead(
            @RequestBody Map<String, Object> request,
            @RequestHeader("MCP-Version") String mcpVersion) {
        // 模拟MCP响应(遵循JSON-RPC 2.0规范)
        Map<String, Object> response = new HashMap<>();
        response.put("jsonrpc", "2.0");
        response.put("id", request.get("id"));

        try {
            // 解析MCP请求参数
            Map<String, Object> params = (Map<String, Object>) request.get("params");
            String filePath = (String) params.get("path");
            // 读取本地文件内容
            String content = new String(Files.readAllBytes(Paths.get(filePath)));
            Map<String, String> result = new HashMap<>();
            result.put("content", content);
            response.put("result", result);
        } catch (Exception e) {
            // 异常时返回MCP标准错误格式
            Map<String, Object> error = new HashMap<>();
            error.put("code", -1);
            error.put("message", e.getMessage());
            response.put("error", error);
        }
        return response;
    }
}

4. 代码说明与扩展

(1)核心特性体现

  • 协议适配:严格遵循MCP基于JSON-RPC 2.0的通信规范,请求/响应格式完全对齐MCP标准;
  • 安全适配:通过Authorization头传递令牌,符合MCP零信任、细粒度权限的安全设计;
  • 场景适配:对应“本地数据处理”场景,替代传统定制化文件读取接口,体现MCP“标准化集成”的核心优势。

(2)与其他协议的代码层面差异

  • 若适配ANP:需额外引入DID身份认证、P2P通信依赖,代码复杂度大幅提升;
  • 若适配A2A:需兼容多厂商Agent的参数格式,需编写大量适配逻辑;
  • MCP优势:仅需遵循JSON-RPC 2.0标准,参数/响应格式统一,代码复用性高。

(3)扩展方向

  • 异步调用:通过OkHttp的Callback实现非阻塞调用,适配高并发场景;
  • LLM集成:将读取的文件内容传递给Claude/GPT API,实现“MCP读文件 + LLM分析内容”的完整流程;
  • 权限控制:对接MCP服务器的细粒度权限,限制仅读取指定目录的文件。

5. 运行步骤

  1. 启动MCPMockFileServer(Spring Boot应用);
  2. 运行MCPFileClientmain方法,传入本地有效文件路径;
  3. 控制台输出文件内容,验证MCP客户端与服务器的标准化通信。

该案例完整体现了MCP“以模型为中心、标准化集成、轻量级通信”的核心特性,相比传统定制化接口,代码复用性更高,且无需适配不同文件系统的差异(由MCP服务器统一处理)。

posted @ 2025-12-01 16:23  bcgbsh  阅读(0)  评论(0)    收藏  举报