原创 新一 2025-05-07 18:31 上海
组合多个 MCP Server 的工作流可以自主完成非常复杂的任务,关键是这协议统一了连接标准,有大量现成的 MCP Server 可以即插即用,大幅降低建设成本。
定义 Tools这里我们定义一个发送飞书消息的工具类:<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
这里 Spring 会自动把@Tools 注解的方法按照 MCP 标准暴露出来,大模型会根据其中的描述来决策是否可以调用此方法。启动类import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;
import com.lark.oapi.Client;
import com.lark.oapi.core.cache.LocalCache;
import com.lark.oapi.core.enums.AppType;
import com.lark.oapi.service.im.v1.enums.MsgTypeEnum;
import com.lark.oapi.service.im.v1.enums.ReceiveIdTypeEnum;
import com.lark.oapi.service.im.v1.model.CreateMessageReq;
import com.lark.oapi.service.im.v1.model.CreateMessageReqBody;
import com.lark.oapi.service.im.v1.model.CreateMessageResp;
import java.util.concurrent.TimeUnit;
/**
* @author xinyi
*/
public class LarkService {
private final Client larkClient = feishuClient();
public Client feishuClient() {
return Client.newBuilder(System.getenv("larkAppId"),
System.getenv("larkAppSecret")).appType(AppType.SELF_BUILT) // 设置app类型,默认为自建
.tokenCache(LocalCache.getInstance()) // 设置token缓存,默认为内存缓存
.requestTimeout(10, TimeUnit.SECONDS) // 设置httpclient 超时时间,默认永不超时
.logReqAtDebug(false)
.build();
}
public String sendLarkCardMessage( String receiveEmail,
String cardContent) throws Exception {
CreateMessageReq req = CreateMessageReq.newBuilder().receiveIdType(ReceiveIdTypeEnum.EMAIL.getValue())
.createMessageReqBody(CreateMessageReqBody.newBuilder()
.receiveId(receiveEmail)
.msgType(MsgTypeEnum.MSG_TYPE_INTERACTIVE.getValue())
.content(cardContent)
.build())
.build();
CreateMessageResp resp = larkClient.im().message().create(req);
return resp.getMsg();
}
}
打包到这里一个简单的 MCP Server 就已经开发完成了,下面只需要执行 mvn clean package 打成可执行 jar 包就能配置到 Cline 中了。配置MCP Server回到 VSCode 的 Cline 插件,点击第二个图标,然后点击下面的 Configure MCP Servers,然后开始编辑右侧的配置文件:这里的配置文件是 MCP 标准化的,下面基于我们这个 MCP Server 介绍下几个核心配置的含义:import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
public ToolCallbackProvider weatherTools(LarkService larkService) {
return MethodToolCallbackProvider.builder().toolObjects(larkService).build();
}
}
mcpServers:JSON 配置跟 Keylark:MCP Server 唯一标识&名称command:启动 MCP Server 的命令(如 Java 就是 java -jar,Node 一般是 npx,Python 一般是 uvx)args:执行命令后面的自定义参数env:环境变量,用于配置一些可配置参数,比如密钥、外部 URL 等这里配置好了后,如果右上角的点变成了绿色说明 MCP Server 加载成功,而且在下面还可以看到 MCP Server 提供的所有 Tools,以及每个 Tool 的参数跟描述。开始体验点击右上角的+号开始聊天:给我发一条下午好的飞书卡片消息,附带一下今日的热点新闻。可以看到 Cline 调用了大模型开始思考,并且根据 MCP Server 提供的 Tools 开始选择发送消息接口并执行。而且如果第一次尝试失败,还会自动纠错,最后成功调用了我们 MCP Server 提供的 Tools,发送了一条消息给我。进阶体验上面的例子我们只用到了一个 Tools,我们可以尝试组合多个 Tools&多个 MCP Server 来实现更复杂的任务,比如我们现在再开发一个可以操作 ES 的 MCP Server,然后打包后配置到 Cline 中。"mcpServers": {
"lark": {
"disabled": false,
"timeout": 60,
"command": "/Users/admin/Documents/jdk-17.jdk/Contents/Home/bin/java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-Dlogging.pattern.console=",
"-jar",
"/Users/admin/Documents/git/open-source/spring-ai-mcp-server-demo/target/spring-ai-mcp-server-demo-1.0-SNAPSHOT.jar"
],
"env": {
"larkAppId": "xxx",
"larkAppSecret": "xxx"
},
"autoApprove": [
"sendLarkCardMessage"
],
"transportType": "stdio"
},
配置好后,在对话中发送:分析一下 es 集群目前的索引分布,重点分析一下哪些索引的分片设置不合理,最终整理后飞书发给我。然后会根据请求 ES 返回的结果,再次吐给模型进行分析。最终整理后通过飞书发送一份简单报告。联想一下想象一下,如果组合一下飞书文档、浏览器操作、文件系统、发布系统对接等 MCP Server,一句话就可以让大模型从自动连接浏览器,打开飞书文档,分析需求,分析视觉稿,然后自己写代码,对比视觉稿,你就喝杯咖啡,静静的看着它工作。顺带推荐一下常用的 MCP Client 以及一些现成的 MCP Server。MCP Client List:通用ES查询工具,参数示例:
path: 请求路径
method: HTTP请求方法 GET 或 POST
queryJson: 具体请求体
""")
public String searchByQuery(
String path,
String method,
String queryJson) {
String url = String.format("%s/%s", System.getEnv("esBaseUrl"), path);
HttpEntity<String> request = buildEsRequest(queryJson);
ResponseEntity<String> response = restTemplate.exchange(
url, HttpMethod.valueOf(method), request, String.class);
return response.getBody();
}
MCP Server List:
- https://github.com/modelcontextprotocol/servers
https://github.com/punkpeye/awesome-mcp-servers/blob/main/README-zh.md
如有任何疑问,或想要了解更多技术资讯,请添加小助手微信: