如何配置Spring AI MCP工具,让LLM主动请求缺失必填参数?
问题描述
使用Spring AI 1.1.0-M3搭建MCP服务器,对外提供搜索内部联系人的工具,工具代码简化如下:
public class myTool { @McpTool( name = "searchContacts", description = "Search contacts by first name, last name, email, and phone." ) public List<Contact> execute(ContctDTO request) throws Exception { log.info("Executing search contacts with args: {}", request); return List.of(ContattoDTO.builder() .name("name") .surname("surname") .email("email@example.com") .phone("1234567890") .build()); } } public class ContactDTO { @NotBlank private String name; @NotBlank private String surname; @NotBlank private String email; @NotBlank private String phone; }
当前遇到的问题:在OpenAI Playground或MCPJAM中,LLM调用该工具时,若用户请求缺少部分参数,工具会自动用空字符串填充,而非询问用户补充缺失值。需求是让LLM在调用工具前,提示用户提供所有未填写的必填参数。
解决方案
1. 启用参数引导(Elicitation)的核心配置
Spring AI MCP的参数引导功能依赖工具元数据与LLM的工具调用能力,需完成以下配置:
- 强化DTO的参数约束标记:虽然使用了
@NotBlank注解,仍需补充Spring AI的@Parameter注解明确参数的必填性与描述,确保MCP服务器能将这些约束传递给LLM:public class ContactDTO { @NotBlank @Parameter(description = "联系人的名字(必填)", required = true) private String name; @NotBlank @Parameter(description = "联系人的姓氏(必填)", required = true) private String surname; @NotBlank @Parameter(description = "联系人的邮箱(必填)", required = true) private String email; @NotBlank @Parameter(description = "联系人的电话(必填)", required = true) private String phone; // 补充Getter和Setter方法 } - 更新工具注解描述:在
@McpTool的description中明确标注每个参数为必填,帮助LLM理解约束:@McpTool( name = "searchContacts", description = "根据必填的名字、姓氏、邮箱、电话搜索联系人" )
2. 配置MCP服务器的工具调用策略
在Spring AI MCP服务器的配置类中,创建ToolCallingConfig Bean并启用参数引导:
@Configuration public class McpConfig { @Bean public ToolCallingConfig toolCallingConfig() { return ToolCallingConfig.builder() .enableElicitation(true) // 启用参数引导 .build(); } }
该配置会让MCP服务器在生成工具调用请求前检查必填参数,若发现缺失则触发LLM向用户索要补充信息。
3. 无需单独构建MCP客户端
不需要额外构建MCP客户端,只要确保OpenAI Playground或MCPJAM正确连接到你的MCP服务器,工具的元数据(包括必填参数信息)会自动传递给LLM。LLM会依据这些约束判断是否需要向用户询问缺失的参数。
4. 代码修正建议
修正工具类中的拼写错误(ContctDTO → ContactDTO,ContattoDTO → ContactDTO),确保代码可正常运行:
public class MyTool { @McpTool( name = "searchContacts", description = "根据必填的名字、姓氏、邮箱、电话搜索联系人" ) public List<ContactDTO> execute(ContactDTO request) throws Exception { log.info("Executing search contacts with args: {}", request); return List.of(ContactDTO.builder() .name("name") .surname("surname") .email("email@example.com") .phone("1234567890") .build()); } }
内容的提问来源于stack exchange,提问作者gs fs
相关产品推荐
相关产品推荐

