MCP:基于Mcp Java SDK 开发一个 Mcp Client

# Model Context Protocol (MCP)是什么?带你深入MCP核心内容! 文章介绍了 MCP 协议的核心概念,有些内容可能还是有点晦涩难懂,后续文章将通过实现一些实际的案例,深入理解并清楚其使用的场景和效果。

MCP Client 理解为可以支持 MCP 协议的客户端,本文重点在于如何使用 SDK 开发一个 MCP Client。我们直入主题,直接看 Java SDK 源码以及如何开发一个 MCP Client。

MCP 支持的语言

MCP 官方支持四种语言的 SDK, Python、TypeScript、Java、Kotlin,并有其对应实现的SDK;

根据自己的语言选型,选择不同的语言的 SDK进行开发,通过查看 SDK 文档,Python SDK 和 TypeScript SDK 文档比较详细,示例比较多,其次是 Kotlin SDK,最差的就是关于 Java SDK 的示例代码。基本上都是硬蹭 Spring AI MCP 相关内容。

本文对 Java SDK 源码进行分析,并直接使用Java SDK 以及 Spring AI MCP client Staters 分别实现示例代码。

Java MCP SDK 依赖

截止 2025-03-07 最新版本的 SDK 版本为 0.7.0,具体版本大家可以在 - modelcontextprotocol/java-sdk 找到。我们基于 0.7.0 版本进行分析。

<dependencies>

  <dependency>
    <groupId>io.modelcontextprotocol.sdk</groupId>
    <artifactId>mcp</artifactId>
  </dependency>

</dependencies>


<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.modelcontextprotocol.sdk</groupId>
      <artifactId>mcp-bom</artifactId>
      <version>0.7.0</version> 
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

MCP Client SDK 源码

McpClient 接口的作用

MCP Client 支持的能力;

  • 工具的发现 与 调用
  • 资源的访问 与 管理
  • 提示词模版的处理
  • 通过变更订阅实时处理工具、资源以及提示词模板的变化
  • 自定义 sampling 策略
  • 根据日志级别进行结构化日志记录

源码:

public interface McpClient {
    // 通过 ClientMcpTransport 创建一个同步client。
    static SyncSpec sync(ClientMcpTransport transport) {
       return new SyncSpec(transport);
    }
    // 创建一异步client
    static AsyncSpec async(ClientMcpTransport transport) {
       return new AsyncSpec(transport);
    }

    /**
     * 同步客户端规范,使用建造者模式,提供流式 API 设置自定义配置,主要配置如下;
     *  1. 客户端与服务器之间的传输层
     *  2. 请求超时时间
     *  3. 客户端功能协商
     *  4. 客户端版本实现跟踪
     *  5. 资源访问限制
     *  6. 工具、资源、提示词变更处理
     */
    class SyncSpec {
        // 里面细节不在分析,主要完成以上 6个方面内容
        
        public McpSyncClient build() {
            McpClientFeatures.Sync syncFeatures = new McpClientFeatures.Sync(this.clientInfo, this.capabilities,
                  this.roots, this.toolsChangeConsumers, this.resourcesChangeConsumers, this.promptsChangeConsumers,
                  this.loggingConsumers, this.samplingHandler);

            McpClientFeatures.Async asyncFeatures = McpClientFeatures.Async.fromSync(syncFeatures);

            return new McpSyncClient(new McpAsyncClient(transport, this.requestTimeout, asyncFeatures));
        }

    }

    /**
     * 异步客户端规范,同 同步客户端
     */
    class AsyncSpec {

    }
}
  • McpSyncClient( 同步 Mcp Client )

    其底层本质上使用的还是 McpAsyncClient。我们重点分析一下 McpAsyncClient。

  • McpAsyncClient( 异步 Mcp Client )

    McpAsyncClient 核心依赖于 DefaultMcpSession 类,该类主要负责管理客户端和服务器之间双向JSON-RPC通信。

实现基础 Mcp Client

package com.ivy.mcp;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.McpSyncClient;
import io.modelcontextprotocol.client.transport.ServerParameters;
import io.modelcontextprotocol.client.transport.StdioClientTransport;
import io.modelcontextprotocol.spec.McpSchema;

import java.time.Duration;
import java.util.Map;

public class McpClientJavaSdkExamples {
    public static void main(String[] args) {
        StdioClientTransport transport = new StdioClientTransport(
                ServerParameters.builder("npx")
                        .args("-y",
                                "@modelcontextprotocol/server-filesystem",
                                "/Users/fangjie33/ai/claude-mcp-examples")
                        .build(),
                new ObjectMapper()
        );
        try (McpSyncClient client = McpClient.sync(transport)
                .clientInfo(
                        new McpSchema.Implementation("my-client", "1.0.0")
                )
                .capabilities(
                        McpSchema.ClientCapabilities.builder().roots(true).sampling().build()
                )
                .requestTimeout(Duration.ofSeconds(60))
                .build()) {
            McpSchema.InitializeResult initialize = client.initialize();
            System.out.println("client initialized: " + initialize);


            tools(client); // 打印 MCP 工具列表

            createDirectory(client); // 创建目录
            createFile(client); // 创建文件

        }
    }

    public static void tools (McpSyncClient client) {
        McpSchema.ListToolsResult listToolsResult = client.listTools();
        listToolsResult.tools().forEach(System.out::println);
    }

    public static void createDirectory(McpSyncClient client) {
        McpSchema.CallToolRequest callToolRequest = new McpSchema.CallToolRequest(
                "create_directory",
                Map.of("path", "mcp")
        );
        McpSchema.CallToolResult callToolResult = client.callTool(callToolRequest);
        System.out.println(callToolResult.content());
    }

    public static void createFile(McpSyncClient client) {
        McpSchema.CallToolRequest callToolRequest = new McpSchema.CallToolRequest(
                "write_file",
                Map.of("path", "mcp/test.txt", "content", "hello world")
        );
        McpSchema.CallToolResult callToolResult = client.callTool(callToolRequest);
        System.out.println(callToolResult.content());
    }
}

源码:github.com/Fj-ivy/clau…

Spring AI chat with Mcp Client

通过与大模型集成,通过自然语言完成本地文件管理能力

参考:Spring AI 支持 Mcp协议了,通过Mcp集成本地文件管理

源码:github.com/Fj-ivy/clau…

MCP 客户端

MCP 已经存在大量客户端或者编辑器,比如 Claude Desktop App,AI 代码开发工具 Cursor 等,大家可以直接下载使用,后续也会选择一些比较热门的编辑器进行演示使用。

 客户端ResourcesPromptsToolsSamplingRoots说明
Claude Desktop App完全支持 MCP 所有特性
5ire支持工具。
BeeAI Framework支持代理工作流中的工具。
Cline支持工具和资源。
Continue完全支持 MCP 所有特性
Cursor支持工具。
Emacs Mcp支持 Emacs 中的工具。
Firebase Genkit⚠️支持通过工具进行资源列表和查找。
GenAIScript支持工具。
Goose支持工具。
LibreChatSupports tools for Agents
mcp-agent⚠️支持工具、服务器连接管理和代理工作流程。
Roo Code支持工具和资源。
Sourcegraph Cody通过 OpenCTX 支持资源
Superinterface支持工具
TheiaAI/TheiaIDE支持 Theia AI 和 AI 驱动的 Theia IDE 中的 Agent 工具
Windsurf Editor支持带有 AI Flow 的工具以进行协作开发。
ZedPrompts appear as slash commands 提示符显示为斜杠命令
OpenSumi支持 OpenSumi 中的工具

### Spring AI MCP Java SDK 概述 Spring AI MCP 是一种基于 Model Context Protocol (MCP) 的 Java 实现,旨在简化模型上下文协议的应用开发过程。通过该 SDK开发者可以轻松构建支持 MCP 协议的服务端和客户端应用程序[^1]。 #### 核心功能 - **多传输选项**:支持多种通信方式,便于灵活集成到不同的技术栈中。 - **三层架构设计**: - **MCP 客户端**:负责向服务端发送请求并处理响应。 - **MCP 服务器**:提供 API 接口供客户端调用,并管理模型的上下文数据。 - **工具回调接口(ToolCallbackProvider)**:允许扩展自定义行为以适应特定需求[^2]。 --- ### 使用方法 以下是关于如何使用 Spring AI MCP Java SDK 构建服务端和客户端的具体指导: #### 1. 引入 Maven 依赖 在项目的 `pom.xml` 文件中添加以下依赖项来引入 Spring AI MCP SDK: ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp</artifactId> <version>1.0.0-M6</version> </dependency> ``` #### 2. 配置 YML 文件 创建或修改项目中的 `application.yml` 或 `application.properties` 文件,设置必要的参数。例如: ```yaml spring: ai: mcp: server-url: http://localhost:8080/mcp-server client-id: my-client-id secret-key: my-secret-key ``` #### 3. 编写服务端代码 服务端需要实现 ToolCallbackProvider 并将其注册到容器中。示例代码如下: ```java import org.springframework.ai.mcp.ToolCallbackProvider; import org.springframework.stereotype.Component; @Component public class MyToolCallbackProvider implements ToolCallbackProvider { @Override public String handleRequest(String requestPayload) { // 自定义逻辑处理接收到的数据 return "Response from tool callback provider"; } } ``` 同时,在控制器类中暴露 RESTful API 来接收来自客户端的请求: ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/mcp-server") public class McpServerController { private final ToolCallbackProvider toolCallbackProvider; public McpServerController(ToolCallbackProvider toolCallbackProvider) { this.toolCallbackProvider = toolCallbackProvider; } @PostMapping("/process") public String process(@RequestBody String payload) { return toolCallbackProvider.handleRequest(payload); } } ``` #### 4. 编写客户端代码 客户端可以通过简单的 HTTP 请求与服务端交互。下面展示了一个基本的 Controller 示例: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("/mcp-client") public class McpClientController { private final RestTemplate restTemplate; @Value("${spring.ai.mcp.server-url}") private String serverUrl; public McpClientController(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/send-request") public ResponseEntity<String> sendRequest() { String url = serverUrl + "/process"; String requestBody = "{\"key\":\"value\"}"; return restTemplate.postForEntity(url, requestBody, String.class); } } ``` --- ### 总结 Spring AI MCP 提供了一套完整的解决方案,帮助开发者快速搭建基于 MCP 协议的应用程序。无论是作为服务提供商还是消费者角色,都可以借助其强大的功能模块完成复杂的业务场景需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值