Java 实现 MCP Server 以及常用 MCP 服务分享

MCP 前段时间在 AI 领域 引发了 广泛关注,特别是在 各大海内外技术社区 中,大家热烈讨论,热度非常高,本文将带领大家使用 java 语言实现一个 mcp,揭开 mcp 这神秘的面纱,本文最后也推荐给大家一些常用的 MCP 服务,开箱即用 0 成本,希望对大家有一定的帮助。

概念

MCPModel Context Protocol,即模型上下文协议)是由 AnthropicClaude 的母公司)于 2024年11月 开源发布的一项 全新技术

MCP 是为了解决大模型虽然强大,但是有时候无法获取实时信息以及访问特定工具!而 MCP 是一种让AI能够"伸出手"使用外部工具和服务的协议,让AI变得更加强大和实用。

想象一下,你正在和AI助手聊天,突然想让它帮你搜索最新的新闻,或者查看你的文件,甚至操作数据库——有了MCP,这些都成为可能!

简单来说,MCP 是一个 AI 大模型的标准化工具箱

大模型可以通过这些工具与 外界互动获取信息,并 完成具体任务

在日常工作和学习中,我们经常需要与 浏览器文件数据库代码仓库 等外部工具进行交互。

MCP的工作原理

  1. 服务器(Server):提供特定功能的工具,比如网页搜索、文件访问等
  2. 客户端(Client):在AI应用中与服务器保持连接
  3. 传输(Transport):客户端和服务器之间的通信方式
  4. 主机(Host):启动连接的应用程序,如Cherry Studio或Claude Desktop、Cline、Cursor、WindSurf

Java 实现 MCP Server 以及常用 MCP 服务分享

Java 实现 MCP Server 以及常用 MCP 服务分享

上图图说明了MCP协议就像是现在日常使用的USB协议,让AI和外部工具之间可以方便地传输数据和指令。

Java 实现 MCP Server 以及常用 MCP 服务分享

Java 实现 MCP Server 以及常用 MCP 服务分享

大白话,其实 MCP 就是对以前的 FunctionCall 进行标准化,早期大模型支持 FunctionCall 都是自家按照自己的路线走,导致不能用,自己家有自己家的标准,导致对接多家 FunctionCall 模型麻烦,Claude 发布了 MCP 协议,类似于 jdbc 标准,大家都按照统一的协议进行传输,大家一起开发 MCP 服务供大家使用,也不用对这个概念过于神秘化。

Java实现一个 MCP Server

官方 mcp 文档可参考:https://modelcontextprotocol.io/quickstart/server

在 AI 方面用 python 语言实现更优雅,作为 javaer 还是打算用 java 实现,感兴趣的朋友可以参考官方文档也提供不同语言的 SDK 快速集成。

博主使用 Spring AI 简易实现,学会儿了可以举一反三,官方文档很多示例,可以多看多练。

前提条件

1、 JDK17/21、Spring Boot 3.4.x+、Spring AI 1.0.0-M6+

2、支持 MCP 的客户端,我这里使用 Cherry Studio

3、一个支持 FunctionCall 的大模型,可以是 ollama 自建或者 云 API(推荐硅基流动)。

4、一双勤劳的双手

项目搭建

直接使用 spring脚手架搭建,注意 springboot 版本一定要大于 3.4x,不然不支持 Spring AI,新项目就直接无脑上 JDK17+SpringBoot3 吧。

pom 引入如下核心依赖:

代码语言:javascript

代码运行次数:12

运行

### Java 实现 MCP Client 调用高德 MCP Server 示例代码与文档 MCP(Model Context Protocol)是一种开放协议,用于标准化应用程序向大型语言模型(LLM)提供上下文的方式。在 Java实现 MCP 客户端调用高德 MCP Server 的过程涉及配置 HTTP 请求、解析 JSON 响应以及处理 SSE(Server-Sent Events)连接[^3]。 以下是基于 JavaMCP 客户端调用高德 MCP Server 的示例代码: #### 1. 引入依赖库 首先需要引入必要的依赖库来处理 HTTP 请求和 JSON 数据。可以使用 Maven 或 Gradle 来管理依赖。 **Maven 依赖:** ```xml <dependencies> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> </dependency> </dependencies> ``` #### 2. 配置高德 MCP Server API Key 在调用高德 MCP Server 之前,需要申请一个有效的 `AMAP_MAPS_API_KEY`。可以通过高德开放平台申请并获取该密钥[^2]。 #### 3. Java 实现 MCP Client 示例代码 以下是一个完整的 Java 示例代码,展示如何通过 HTTP 请求调用高德 MCP Server 查询天气信息。 ```java import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class MCPClientExample { private static final String API_KEY = "your_amap_api_key"; // 替换为你的高德地图 API 密钥 private static final String WEATHER_URL = "https://mcp.amap.com/v1/weather/query"; public static void main(String[] args) { try (CloseableHttpClient httpClient = HttpClients.createDefault()) { // 构建请求 URL String url = String.format("%s?city=北京&key=%s", WEATHER_URL, API_KEY); HttpGet request = new HttpGet(url); // 发送请求 HttpResponse response = httpClient.execute(request); // 解析响应 if (response.getStatusLine().getStatusCode() == 200) { String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println("天气查询结果: " + responseBody); } else { System.err.println("请求失败,状态码: " + response.getStatusLine().getStatusCode()); } } catch (Exception e) { e.printStackTrace(); } } } ``` #### 4. 处理 SSE 连接 如果需要与高德 MCP Server 建立 SSE 连接以实时接收数据,可以参考以下代码片段: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MCPSSEClient { private static final String API_KEY = "your_amap_api_key"; // 替换为你的高德地图 API 密钥 private static final String SSE_URL = "https://mcp.amap.com/v1/sse/connect"; public static void main(String[] args) { try { // 构建请求 URL String url = String.format("%s?key=%s", SSE_URL, API_KEY); HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("GET"); // 读取 SSE 流 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println("收到 SSE 消息: " + line); } reader.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` #### 5. 注意事项 - 确保已正确申请并配置 `AMAP_MAPS_API_KEY`[^2]。 - 如果需要处理复杂的数据结构,建议使用 Jackson 或 Gson 库解析 JSON 响应[^3]。 - 对于 SSE 连接,需确保网络环境支持 WebSocket 或长连接[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

感叹号星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值