最近爆火的MCP究竟有多大魅力?MCP開發初體驗
一、前言
MCP 全稱 Model Context Protocol,是由 Anthropic 公司在 2024 年 11 月推出一個開放協議,主要用于標準化應用程序向大語言模型提供上下文的方式。可以將 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 為設備連接各種外設和配件提供了標準化方式一樣,MCP 為 AI 模型連接不同的數據源和工具提供了標準化方式。
近期 MCP 的熱度持續上升,網上也是噴涌出大量相關文章,相信在不遠的將來 MCP 將成為每個開發者必備的技能之一,非常值得投入時間學習一下。下面會通過簡單的實踐來帶大家理解一下 MCP 的工作原理,以及展望下 MCP 在未來可能的一些應用場景。
二、MCP 基礎架構
基礎架構
在開始實踐之前,還是簡單介紹一下 MCP 的基本架構和一些基礎組件:
圖片
- MCP Host:需要通過MCP訪問數據的程序,例如 Claude Desktop、Cursor、Cline等桌面工具。主要職責:接受&返回你的提問、跟模型交互、內置了 MCP Client,與服務器保持一對一連接的協議客戶端。
- MCP Server:輕量級程序,每個程序都通過標準化的模型上下文協議 (MCP) 提供特定功能。主要職責:能力暴露(操作本地文件&瀏覽器,訪問數據庫,訪問遠程服務)。
- 本地數據源:MCP 服務器可以安全訪問的數據庫、本地文件、瀏覽器等。
- 遠程服務:MCP 服務器可以通過互聯網(例如通過 API)連接到的外部系統。
工作流程
從用戶提問,到最終完成任務的完整流程可參考下圖:
圖片
百聞不如一見,百見不如一練。下面我們手把手開發一個 MCP Server,并且通過 Cline 來使用它,實踐過程中會容易幫助我們去理解 MCP。
三、MCP Server 開發&實踐
準備MCP Client
這里我用的是 Cline,是 VSCode 中的一個插件,直接在 VSCode 插件市場中搜索安裝即可,其實這里的 Cline 在 MCP 的概念中是 MCP Host,只是 Host 里面內置了 MCP Client(負責跟模型&MCP Server 交互)。
其實更推薦使用 Claude,但是 Claude注冊流程相對復雜一點,對網絡環境要求也更高。
圖片
安裝好后,第一步就是需要配置大模型,這里我選擇的是 DeepSeek。
需要自行購買 API Key(https://platform.deepseek.com/api_keys)
圖片
然后就可以開始配置 MCP server 了,點擊右上角的第二個圖標。
圖片
這里可以使用開源的 MCP Server,也可以使用自己開發的 MCP Server,下面我們嘗試自己動手開發一個簡單的 MCP Server。
開發MCP Server
想要開發一個 MCP Server,并不需要關心協議本身的一些細節,因為官方推出了各種語言的 SDK(https://modelcontextprotocol.io/sdk/java/mcp-server),通過 SDK 可以快速搭建一個 MCP Server,并且主流語言都針對 MCP 推出了自己的框架,Java 也不例外,這里我們選擇使用 Spring 框架來搭建一個 MCP Server(https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html)。
引入依賴
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
定義 Tools
這里我們定義一個發送飛書消息的工具類:
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
*/
@Service
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();
}
@Tool(description = "用飛書給用戶發消息")
public String sendLarkCardMessage(@ToolParam(description = "接收人郵箱") String receiveEmail,
@ToolParam(description = "飛書卡片內容(參考飛書文檔要求的結構體)") 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();
}
}
這里 Spring 會自動把@Tools 注解的方法按照 MCP 標準暴露出來,大模型會根據其中的描述來決策是否可以調用此方法。
啟動類
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;
@SpringBootApplication
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider weatherTools(LarkService larkService) {
return MethodToolCallbackProvider.builder().toolObjects(larkService).build();
}
}
打包
到這里一個簡單的 MCP Server 就已經開發完成了,下面只需要執行 mvn clean package 打成可執行 jar 包就能配置到 Cline 中了。
圖片
配置MCP Server
回到 VSCode 的 Cline 插件,點擊第二個圖標,然后點擊下面的 Configure MCP Servers,然后開始編輯右側的配置文件:
圖片
這里的配置文件是 MCP 標準化的,下面基于我們這個 MCP Server 介紹下幾個核心配置的含義:
"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.cnotallow=",
"-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"
},
- mcpServers:JSON 配置跟 Key
- lark: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 中。
@Tool(description = """
通用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();
}
配置好后,在對話中發送:分析一下 es 集群目前的索引分布,重點分析一下哪些索引的分片設置不合理,最終整理后飛書發給我。
圖片
然后會根據請求 ES 返回的結果,再次吐給模型進行分析。
圖片
最終整理后通過飛書發送一份簡單報告。
圖片
聯想一下
想象一下,如果組合一下飛書文檔、瀏覽器操作、文件系統、發布系統對接等 MCP Server,一句話就可以讓大模型從自動連接瀏覽器,打開飛書文檔,分析需求,分析視覺稿,然后自己寫代碼,對比視覺稿,你就喝杯咖啡,靜靜的看著它工作。
順帶推薦一下常用的 MCP Client 以及一些現成的 MCP Server。
- MCP Client List:
https://modelcontextprotocol.io/clients
- MCP Server List:
https://github.com/modelcontextprotocol/servers
https://github.com/punkpeye/awesome-mcp-servers/blob/main/README-zh.md
四、總結
相信大家通過上面的實踐后,對 MCP 有了一個基本的認識,組合多個 MCP Server 的工作流可以自主完成非常復雜的任務,關鍵是這協議統一了連接標準,有大量現成的 MCP Server 可以即插即用,大幅降低建設成本。總之 MCP 協議的持續落地,讓 AI 不再只是聊天工具,而是工業智能革命的萬能操作平臺,在未來潛力無限,想象無限,值得每一位開發者去學習并掌握它!