mcp被调用方该做的事(SSE)
定义这个工具让大模型能识别到你这个工具把这个mcp工具注册到mcp服务器暴露它相当于是。
第一步添加依赖:
<!-- Spring AI BOM 管理版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-M5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- MCP Server Starter - 核心依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
</dependency>
第二步:
spring:
ai:
mcp:
server:
enabled: true # 启用 MCP 服务器
name: code-sandbox-mcp # 服务器名称(客户端可见)
version: 1.0.0 # 版本号
第三步:
@Component
public class CodeSandboxTools {
private final CodeSandbox codeSandbox; // 注入已有的沙箱服务
/**
* @Tool 注解:声明这是一个 MCP 工具
* description:AI 模型会看到这个描述来决定何时调用
*/
@Tool(description = "执行 Java 代码并返回运行结果...")
public String executeJavaCode(
@ToolParam(description = "完整的 Java 源代码...") String code,
@ToolParam(description = "输入测试用例...") String inputs) {
// 调用已有的代码沙箱逻辑
ExecuteCodeRequest request = new ExecuteCodeRequest();
request.setCode(code);
request.setInputList(Arrays.asList(inputs.split("\\|\\|\\|")));
ExecuteCodeResponse response = codeSandbox.executeCode(request);
return formatResponse(response);
}
@Tool(description = "仅编译 Java 代码检查语法错误...")
public String compileJavaCode(@ToolParam(description = "完整的 Java 源代码") String code) {
// 编译逻辑...
}
}
定义这个工具让大模型能识别到你这个工具

最后一步:
@Configuration
public class McpServerConfig {
@Bean
public ToolCallbackProvider codeSandboxToolCallbackProvider(CodeSandboxTools tools) {
// 将工具类注册为 MCP 工具提供者
return MethodToolCallbackProvider.builder()
.toolObjects(tools) // 扫描 @Tool 注解的方法
.build();
}
}
把这个mcp工具注册到mcp服务器暴露它相当于是
① @Configuration
告诉 Spring:这个类包含 Bean 定义,启动时要扫描它。
② @Bean + 返回 ToolCallbackProvider
- ToolCallbackProvider 是 Spring AI MCP 的核心接口
- MCP Server 启动时会自动查找所有 ToolCallbackProvider Bean
- 找到后,把它们提供的工具注册到 MCP 服务器
③ 参数注入 CodeSandboxTools tools
- Spring 自动注入你之前定义的 @Component 类
- 这个类里有 @Tool 注解的方法
④ MethodToolCallbackProvider.builder().toolObjects(tools)
这是最关键的一步,它做了以下事情:
CodeSandboxTools 类
│
▼ 反射扫描
┌───────────────────────────────────────────────────────────┐
│ 找到所有 @Tool 注解的方法: │
│ - executeJavaCode(String code, String inputs) │
│ - compileJavaCode(String code) │
└───────────────────────────────────────────────────────────┘
│
▼ 解析注解
┌───────────────────────────────────────────────────────────┐
│ 提取元信息: │
│ - 方法名 → 工具名 │
│ - @Tool(description=...) → 工具描述 │
│ - @ToolParam(description=...) → 参数描述 │
│ - 参数类型 → JSON Schema │
└───────────────────────────────────────────────────────────┘
│
▼ 生成 ToolCallback
┌───────────────────────────────────────────────────────────┐
│ 为每个方法创建一个 ToolCallback 对象: │
│ - 包含工具的完整定义(名称、描述、参数 Schema) │
│ - 包含调用逻辑(收到请求时如何执行方法) │
└───────────────────────────────────────────────────────────┘
更多推荐



所有评论(0)