正文
API来的方便。
而调用MCP的过程,使用框架的提效会更明显
,直接给chatClient注入工具即可,不用我们去手动写functionCall的组装,以及获取到结果后再去调用对应服务。
1.服务端为
SSE方式提供
a.设置配置文件
spring.ai.mcp.client.name=ai-demo
spring.ai.mcp.client.type=SYNC
spring.ai.mcp.client.toolcallback.enabled=true
spring.ai.mcp.client.request-timeout=30000
spring.ai.mcp.client.enabled=true
spring.ai.mcp.client.sse.connections.server1.url=https://mcp-09724909-442f-4b85.api-inference.modelscope.cn
b.给
chatModel注入工具
运行结果:
此时可以发现,我们的c
hatModel不再是一个原生的LLM接口,已经可以根据用户意图来自主调用我们的MCP工具。
当然我们也可以看出,利用
Spring-AI做MCP调用是非常简单,只需配置好LLM的调用接口和MCP工具地址即可。
作为Demo此时没有任何问题,但如果作为工程实现,比如我们要去做一个助理平台,这时候其实每个助理所绑定的MCP工具是动态的,而非像上述这样在应用启动时初始化好的Bean,这种场景也是可以实现的,
Spring-AI也支持在调用过程中动态封装工具,这些工具可以是MCP,也可以是程序中的Bean,或者是某些HTTP、RCP接口等。
2.服务端为stdio方式提供
a.配置Properties
Stdio和
SSE配置的区别是将调用方式由显示的服务地址换成npm、java、python等脚本命令直接执行的远程包或本地包。
这里采用本地配置文件的方式去配置Stdio,即spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json。
spring.ai.mcp.client.name=ai-demo
spring.ai.mcp.client.toolcallback.enabled=true
spring.ai.mcp.client.request-timeout=30000
spring.ai.mcp.client.enabled=true
spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json
b.配置config.json
这里注入了两个比较经典的MCP服务,百度地图和新闻热点服务:
{
"mcpServers": {
"baidu-map": {
"command": "npx",
"args": [
"-y",
"@baidumap/mcp-server-baidu-map"
],
"env": {
"BAIDU_MAP_API_KEY": "Qr0GV6v4krVPlIJkupyPpi63d1zXh0Ko"
}
},
"mcp-server-hotnews": {
"command": "npx",
"args": [
"-y",
"@wopal/mcp-server-hotnews"
]
}
}
}
c.给chatModel注入工具
@Configuration
publicclassChatClientConfig {
@Autowired
private ToolCallbackProvider tools;
@Autowired
OpenAiChatModel chatModel;
@Bean
public CommandLineRunner predefinedQuestions(
ConfigurableApplicationContext context) {
return args -> {
var chatClient = ChatClient.builder(chatModel).defaultTools(tools.getToolCallbacks())
.build();
String userInput = "帮我查找今天的知乎热帖";
System.out.println("\n>>> QUESTION: " + userInput);
System.out.println("\n>>> ASSISTANT: " + chatClient.prompt().user(userInput).call