微信扫码
添加专属顾问
我要投稿
探索Java在MCP协议中的新应用,深入了解如何从零构建Java MCP Client。 核心内容: 1. MCP协议及其在Java生态中的新发展 2. 工具调用机制的详细解释与MCP的应用 3. 完整的Java MCP Client构建过程及代码示例
MCP协议最近风头正盛,之前MCP整个社区的例子都是Python和TypeScript居多,而最近MCP官方发布了一条消息:
我们很高兴地宣布,由 Spring AI 在 VMware Tanzu 开发的 Java SDK 现在成为 MCP 的官方 Java SDK。这使我们支持的语言列表不断增长,其中包括我们现有的 Kotlin SDK。Spring AI 团队将作为模型上下文协议组织的一个组成部分来维护 SDK。我们非常高兴欢迎他们加入 MCP 社区!
MCP协议已经提供了Java语言的SDK,并且是Java生态位中著名的Spring团队提供的支持。
我通过官方提供的SDK实现了一个简易的Java MCP Client,跟大家分享下如何在Java中对接各种MCP服务。
如果还不了解MCP协议,前面《Claude、Cline都在用的MCP协议,正在掀起AI工具新革命 》的文章中做了相应的介绍。在使用MCP之前,先了解一下工具调用这个机制,OpenAI的请求API中存在一个参数tools,用于让LLM进行工具调用。
工具调用(也称为函数调用)提供对外部工具让LLM进行调用。LLM不直接调用工具,但是它会建议调用哪个工具,怎么入参。然后用户单独调用工具,并将结果反馈给LLM。最后LLM将结合工具调用的结果再回答用户问题。
具体的解释可以参见OpenAI的解释: https://platform.openai.com/docs/guides/function-calling
这张图很好地解释了tools calling的机制,MCP的tools其实就是利用了这个tools calling的机制。
这个部分我分享一下用Java实现MCP Client的思路。
如何安装可以参考之前的文章《Claude、Cline都在用的MCP协议,正在掀起AI工具新革命》
/**
* 创建一个Fetch MCP Client
*
* @return
*/
publicstatic McpSyncClient createFetchMcpClient() {
// 声明MCP Server的参数
ServerParametersparams= ServerParameters
.builder("node")
.args("/Users/whthomas/Documents/Cline/MCP/fetch-mcp/dist/index.js")
.build();
// 声明MCP Server的传输方式
ClientMcpTransporttransport=newStdioClientTransport(params);
// 创建一个MCP Client
McpSyncClientclient= McpClient
.sync(transport)
.requestTimeout(Duration.ofSeconds(10))
// 设置MCP Client的基本信息
.clientInfo(newMcpSchema.Implementation("Fetch", "1.0.0"))
.capabilities(McpSchema.ClientCapabilities.builder().roots(true).sampling().build())
.build();
// 初始化MCP Server
client.initialize();
return client;
}public static List<ChatCompletionTool> prepareChatCompletionTools(McpSyncClient mcpClient) {
// 列出对应的MCP Server上全部的tools
McpSchema.ListToolsResulttools= mcpClient.listTools();
// 将其转换成OpenAI Client上的Tools参数
return tools
.tools()
.stream()
.map(tool -> {
return ChatCompletionTool
.builder()
.function(FunctionDefinition.builder()
.name(tool.name())
.description(tool.description())
.parameters(prepareFunctionParameters(tool))
.build()
)
.build();
})
.toList();
}
/**
* 将工具的入参定义进行转换
*/
privatestatic FunctionParameters prepareFunctionParameters(Tool tool) {
try {
ObjectMapperobjectMapper=newObjectMapper();
StringjsonString= objectMapper.writeValueAsString(tool.inputSchema());
JsonNodejsonNode= objectMapper.readTree(jsonString);
FunctionParameters.BuilderparamsBuilder= FunctionParameters.builder();
jsonNode.fields().forEachRemaining(entry -> {
JsonValuevalue= JsonValue.fromJsonNode(entry.getValue());
paramsBuilder.putAdditionalProperty(entry.getKey(), value);
});
return paramsBuilder.build();
} catch (JsonProcessingException e) {
thrownewRuntimeException(e);
}
} public voidchatWithMcpServer(String userMessage, String chatModel) {
List<ChatCompletionTool> chatCompletionTools = McpToolExample.prepareChatCompletionTools(mcpClient);
// 构建ChatCompletionCreateParams对象,设置用户消息、模型、工具等参数
ChatCompletionCreateParamsparams= ChatCompletionCreateParams.builder()
.addUserMessage(userMessage)
.model(chatModel)
.tools(chatCompletionTools)
.build();
// 调用OpenAI的Chat API
openAIClient
.chat()
.completions()
.create(params)
.thenAccept(completion -> completion
.choices()
.stream()
.map(ChatCompletion.Choice::message)
.flatMap(message -> {
message.content().ifPresent(System.out::println);
return message.toolCalls().stream().flatMap(Collection::stream);
})
.forEach(toolCall -> System.out.println(callFunction(toolCall.function())))
)
.join();
}
/**
* 通过MCP Client 调用MCP Server上的方法
*
* @param function LLM思考得到的期望被调用的函数信息(包括函数对应的参数)
* @return
*/
private String callFunction(ChatCompletionMessageToolCall.Function function) {
try {
Map<String, Object> toolParams = objectMapper.readValue(function.arguments(), HashMap.class);
McpSchema.CallToolResultresult= mcpClient.callTool(newMcpSchema.CallToolRequest(function.name(), toolParams));
// 将执行的结果返回
return result.content().stream().map(Object::toString).collect(Collectors.joining());
} catch (Exception ex) {
return ex.getMessage();
}
}注意:
这几天尝试用Java来编写一个MCP的Client有几个观察:
MCP这个生态目前主流还是以Python和TS为主,但随着企业端的需求逐渐增长(Java应用在企业侧的占比还是非常高的),我认为Java应用在MCP的生态位还是会逐渐变得重要,在生态构建的初期,市场上还是充满了各种竞争的机会。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-02-04
从“回答者”进化为“研究员”:全面解析 Deep Research
2026-02-04
刚刚,Xcode 史诗级更新:原生集成 Claude Agent SDK,苹果开发直接起飞!
2026-02-04
国产 Cowork 它来了!MCP、Skills和Expert Agents都支持,全部免费体验!
2026-02-04
混元研究博客上线姚顺雨团队最新成果:从 Context 探索语言模型的范式转变
2026-02-04
通俗讲解大模型短期记忆 vs 长期记忆
2026-02-04
谁动了我的电脑?谁应该抱怨?
2026-02-03
从 CLI 到桌面:Codex 把 coding agent 变成“任务指挥台”
2026-02-03
谷歌重大更新:国内手动开启 Gemini AI 侧边栏与 Auto Browse 自动浏览全攻略
2026-01-24
2026-01-10
2025-11-19
2025-11-13
2026-01-26
2026-01-01
2025-12-09
2025-11-12
2026-01-09
2025-12-21
2026-02-04
2026-02-03
2026-02-03
2026-02-02
2026-02-02
2026-02-02
2026-01-31
2026-01-30