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 中的工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值