Getting Started with MCP(MCP快速入门)
约 1678 字大约 6 分钟
2026-09-15
MCP 快速入门(Getting Started with MCP)
📌 原文地址:https://docs.spring.io/java-ai/reference/guides/getting-started-mcp.html 📌 原文版本:Java AI 2.0.1
Model Context Protocol(MCP,模型上下文协议)是一个标准化的协议,让大语言模型(LLM)应用能够方便地与外部工具、数据源对接。你可以把它想象成 AI 应用的"USB 接口"——只要双方都遵守这个协议,就能即插即用。
本指南将带你了解 Java AI 中 MCP 的核心概念,并通过一个简单示例让你快速上手。
白话解读
MCP 不是框架,而是协议。它的作用是让"会说话的工具"和"会用工具的 AI"之间有共同语言,避免每个 AI 应用都要重复适配每一种工具。
一、MCP 是什么
MCP 定义了三类角色:
| 角色 | 说明 | 形象比喻 |
|---|---|---|
| Host(宿主) | 使用 AI 模型的应用程序,比如你的 IDE、聊天机器人 | 笔记本电脑 |
| Client(客户端) | 嵌入在 Host 里、负责与 Server 通信的组件 | 笔记本上的 USB 驱动 |
| Server(服务器) | 把某个能力(如查天气、读数据库)封装成"工具"的服务 | U 盘 / 鼠标 / 键盘 |
三层结构
一次完整的工具调用流程:AI 在 Host 里思考 → 通过 Client 把请求发给 Server → Server 执行真实动作 → 把结果原路返回给 AI。
MCP 的核心价值:
- 一次开发,多处使用:写一个 MCP Server,能被所有支持 MCP 的 AI 客户端复用
- 能力与模型解耦:换模型不用换工具,换工具不用改模型
- 双向通信:Server 不仅能响应请求,还能主动推送资源、通知等
二、Java AI 的 MCP 支持
Java AI 提供了两个独立的 Starter 来分别支持 MCP 的 Server 端和 Client 端:
| Starter 名称 | 作用 |
|---|---|
spring-ai-starter-mcp-server-webmvc | 基于 Spring MVC(Servlet 阻塞 I/O)的 MCP Server |
spring-ai-starter-mcp-client | MCP Client(与 Anthropic、OpenAI 等模型配合) |
版本说明
除了 webmvc 版本,还有 webflux(响应式)版本,适合高并发场景。本指南以 webmvc 为例,因为入门更直观。
三、第一个 MCP Server:暴露两个工具
下面我们写一个最简单的 MCP Server,它对外暴露两个工具:
getCurrentDateTime:返回服务器当前时间addNumbers:把两个数字相加
3.1 添加依赖
新建一个 Spring Boot 项目,在 pom.xml 中加入:
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>2.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>3.2 实现工具类
package com.example.mcp.server;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.springframework.ai.tool.annotation.McpTool;
import org.springframework.ai.tool.annotation.McpToolParam;
import org.springframework.stereotype.Component;
@Component // 注册为 Spring Bean,MCP 会自动扫描
public class DateTimeService {
/**
* 获取服务器当前时间。
* @McpTool 让 MCP Server 把这个方法暴露为"工具",AI 可以调用。
*/
@McpTool(name = "getCurrentDateTime",
description = "获取服务器当前的日期和时间,格式 yyyy-MM-dd HH:mm:ss")
public String getCurrentDateTime() {
return LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
/**
* 把两个数字相加。
* @McpToolParam 给参数加说明,AI 才知道该传什么。
*/
@McpTool(name = "addNumbers",
description = "把两个数字相加并返回结果")
public int addNumbers(
@McpToolParam(description = "第一个加数") int a,
@McpToolParam(description = "第二个加数") int b) {
return a + b;
}
}注解说明
@McpTool标记一个方法是 MCP 工具,name是工具对外的名字(AI 用它来调用),description是给 AI 看的说明@McpToolParam给方法的参数加描述,AI 会根据描述判断该传什么值- 类上要加
@Component,Java AI 会自动把它的方法注册成 MCP 工具
3.3 配置 application.yml
spring:
ai:
mcp:
server:
name: my-first-mcp-server # 服务名(自己取)
version: 0.0.1启动 Spring Boot 应用后,MCP Server 就开始监听一个端口,等待 MCP Client 连接。
四、第一个 MCP Client:通过 AI 调用工具
下面我们写一个 MCP Client,用 ChatClient 与 Claude 模型对话,让 AI 自动决定是否调用我们刚才暴露的工具。
4.1 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-anthropic</artifactId>
</dependency>
</dependencies>4.2 配置连接 Server
spring:
ai:
mcp:
client:
enabled: true
stdio:
servers:
my-server:
command: java
args:
- "-jar"
- "/path/to/your-server.jar" # 指向刚才那个 Server 的 jar
anthropic:
api-key: ${ANTHROPIC_API_KEY}4.3 编写调用代码
package com.example.mcp.client;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.mcp.client.McpClient;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class McpChatRunner implements CommandLineRunner {
private final ChatClient chatClient;
public McpChatRunner(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@Override
public void run(String... args) {
// 命令行参数第一个作为用户问题
String question = args.length > 0 ? args[0] : "现在几点了?把 123 和 456 加起来";
// 关键:把 MCP 工具列表注入到 ChatClient 的工具箱里
var response = chatClient.prompt(question)
.tools(McpClient.allTools()) // 注入所有 MCP 工具
.call()
.content();
System.out.println("AI 回答:" + response);
}
}运行结果示例:
用户:现在几点了?把 123 和 456 加起来
AI 回答:当前时间是 2026-09-15 10:32:18;123 加 456 等于 579。关键点
.tools(McpClient.allTools()) 这一行让 ChatClient 知道有哪些 MCP 工具可用。AI 会自己判断该调用哪个工具,不需要你写 if-else。
五、MCP 传输方式
Java AI 的 MCP Starter 支持多种传输方式(Server 与 Client 之间的通信协议):
| 传输方式 | 适用场景 | Java AI 实现 |
|---|---|---|
| stdio(标准输入输出) | 本地进程间通信,最常用 | 客户端用命令行启动 Server 进程 |
| HTTP + SSE(Server-Sent Events) | 跨网络、Server 主动推送 | 经典 Web 场景 |
| Streamable HTTP | 新一代流式 HTTP,MCP 规范推荐 | 适合远程服务器 |
选型建议
- 本地调试、单体应用:首选
stdio,最简单 - 远程部署、多端共享:用
Streamable HTTP,未来趋势 - 老项目迁移:从 SSE 平滑过渡
六、学习路径建议
如果你想继续深入,建议按下面的顺序学习:
- 多工具组合:在同一个 Server 里暴露更多工具,看 AI 如何挑选
- 资源(Resources):除了"动作型"工具,再学"数据型"资源(如读文件、查数据库)
- 提示词模板(Prompts):把常用提示词也注册成 MCP 能力
- 采样(Sampling):让 Server 能反过来调用 LLM
七、社区资源
推荐资料
- Anthropic 官方文档:https://modelcontextprotocol.io/ — MCP 协议的官方说明
- Java AI 示例仓库:https://github.com/spring-projects/spring-ai-examples — 大量可运行的示例
- MCP Servers 列表:https://github.com/modelcontextprotocol/servers — 社区贡献的各种现成 Server
八、小结
一句话总结
MCP = 一个让 AI 与工具"对话"的标准协议。Java AI 帮你把工具变成注解、把连接变成配置,让你专注于业务逻辑。
下一步,建议阅读《Dynamic Tool Discovery》了解如何在工具数量很多时优化 token 消耗。