超實(shí)用!Dify快速接入本地MCP服務(wù)
Dify 可以通過插件實(shí)現(xiàn) MCP 服務(wù)調(diào)用,而被調(diào)用的 MCP 服務(wù)基本可以分為以下兩類:
- 通用 MCP 服務(wù)(非本地 MCP 服務(wù))。
- 本地 MCP 服務(wù)。
本地 MCP 服務(wù)指的是本地通過 Java 或其他語言實(shí)現(xiàn)的 MCP 服務(wù)器端。
當(dāng)你會用 Dify 調(diào)用本地 MCP 服務(wù),也就意味著你會使用 Dify 調(diào)用通用 MCP 服務(wù)了,因為實(shí)現(xiàn)步驟和原理基本都是一樣。
一、什么是MCP?
MCP 是 Model Context Protocol,模型上下文協(xié)議,它是由 Anthropic(Claude 大模型母公司)提出的開放協(xié)議,用于大模型連接外部“數(shù)據(jù)源”的一種協(xié)議。
它可以通俗的理解為 Java 界的 Spring Cloud Openfeign,只不過 Openfeign 是用于微服務(wù)通訊的,而 MCP 用于大模型通訊的,但它們都是為了通訊獲取某項數(shù)據(jù)的一種機(jī)制,如下圖所示:
圖片
二、為什么需要MCP?
MCP 存在的意義是它解決了大模型時代最關(guān)鍵的三個問題:數(shù)據(jù)孤島、開發(fā)低效和生態(tài)碎片化等問題。
1.打破數(shù)據(jù)孤島,讓AI“連接萬物”
大模型本身無法直接訪問實(shí)時數(shù)據(jù)或本地資源(如數(shù)據(jù)庫、文件系統(tǒng)),傳統(tǒng)方式需要手動復(fù)制粘貼或定制接口。MCP 通過標(biāo)準(zhǔn)化協(xié)議,讓大模型像“插USB”一樣直接調(diào)用外部工具和數(shù)據(jù)源,例如:
- 查天氣時自動調(diào)用氣象 API,無需手動輸入數(shù)據(jù)。
- 分析企業(yè)數(shù)據(jù)時直接連接內(nèi)部數(shù)據(jù)庫,避免信息割裂。
2.降低開發(fā)成本,一次適配所有場景
在之前每個大模型(如 DeepSeek、ChatGPT)需要為每個工具單獨(dú)開發(fā)接口(Function Calling),導(dǎo)致重復(fù)勞動,MCP 通過統(tǒng)一協(xié)議:
- 開發(fā)者只需寫一次 MCP 服務(wù)端,所有兼容 MCP 的模型都能調(diào)用。
- 用戶無需關(guān)心技術(shù)細(xì)節(jié),大模型可直接操作本地文件、設(shè)計軟件等。
3.提升安全性與互操作性
- 安全性:MCP 內(nèi)置權(quán)限控制和加密機(jī)制,比直接開放數(shù)據(jù)庫更安全。
- 生態(tài)統(tǒng)一:類似 USB 接口,MCP 讓不同廠商的工具能“即插即用”,避免生態(tài)分裂。
4.推動AIAgent的進(jìn)化
MCP 讓大模型從“被動應(yīng)答”變?yōu)椤爸鲃诱{(diào)用工具”,例如:
- 自動抓取網(wǎng)頁新聞補(bǔ)充實(shí)時知識。
- 打開 Idea 編寫一個“Hello World”的代碼。
MCP 的誕生,相當(dāng)于為AI世界建立了“通用語言”,讓模型、數(shù)據(jù)和工具能高效協(xié)作,最終釋放大模型的全部潛力。
三、MCP組成和執(zhí)行流程
MCP 架構(gòu)分為以下 3 部分:
- 客戶端:大模型應(yīng)用(如 DeepSeek、ChatGPT)發(fā)起 MCP 協(xié)議請求。
- 服務(wù)器端:服務(wù)器端響應(yīng)客戶端的請求,并查詢自己的業(yè)務(wù)實(shí)現(xiàn)請求處理和結(jié)果返回。
運(yùn)行流程:
- 用戶提問 LLM。
- LLM 查詢 MCP 服務(wù)列表。
- 找到需要調(diào)用 MCP 服務(wù),調(diào)用 MCP 服務(wù)器端。
- MCP 服務(wù)器接收到指令。
- 調(diào)用對應(yīng)工具(如數(shù)據(jù)庫)執(zhí)行。
- 返回結(jié)果給 LLM。
四、編寫本地MCP服務(wù)
接下來,我們使用 Spring AI 來實(shí)現(xiàn)本地 MCP 服務(wù)器端,它的主要實(shí)現(xiàn)步驟如下:
- 添加 MCP Server 依賴。
- 設(shè)置 MCP 配置信息。
- 編寫 MCP Server 服務(wù)代碼。
- 將 MCP Server 進(jìn)行暴露設(shè)置。
關(guān)鍵實(shí)現(xiàn)代碼如下。
4.1 添加 MCP Server 依賴
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<name>Central Portal Snapshots</name>
<id>central-portal-snapshots</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
MCP Server 依賴有三種類型:
- 標(biāo)準(zhǔn)輸入/輸出 (STDIO):spring-ai-starter-mcp-server
- Spring MVC****(服務(wù)器發(fā)送的事件):spring-ai-starter-mcp-server-webmvc
- Spring WebFlux(響應(yīng)式 SSE):spring-ai-starter-mcp-server-webflux
4.2 設(shè)置 MCP 配置信息
MCP Server 包含以下配置信息:
配置項 | 描述 | 默認(rèn)值 |
enabled | 啟用/禁用 MCP 服務(wù)器 | TRUE |
stdio | 啟用/禁用 stdio 傳輸 | FALSE |
name | 用于標(biāo)識的服務(wù)器名稱 | mcp-server |
version | 服務(wù)器版本 | 1.0.0 |
type | 服務(wù)器類型 (SYNC/ASYNC) | SYNC |
resource-change-notification | 啟用資源更改通知 | TRUE |
prompt-change-notification | 啟用提示更改通知 | TRUE |
tool-change-notification | 啟用工具更改通知 | TRUE |
tool-response-mime-type | (可選)每個工具名稱的響應(yīng) MIME 類型。例如,將 mime 類型與工具名稱相關(guān)聯(lián)spring.ai.mcp.server.tool-response-mime-type.generateImage=image/pngimage/pnggenerateImage() | - |
sse-message-endpoint | Web 傳輸?shù)?SSE 終端節(jié)點(diǎn)路徑 | /mcp/message |
其中 MCP Server 又分為以下兩種類型。
服務(wù)器類型
- 同步服務(wù)器:默認(rèn)服務(wù)器類型,它專為應(yīng)用程序中的簡單請求-響應(yīng)模式而設(shè)計。要啟用此服務(wù)器類型,請在您的配置中設(shè)置。 激活后,它會自動處理同步工具規(guī)格的配置,spring.ai.mcp.server.type=SYNC。
- 異步服務(wù)器:異步服務(wù)器實(shí)現(xiàn)使用非阻塞作并針對非阻塞作進(jìn)行了優(yōu)化。要啟用此服務(wù)器類型,請使用配置您的應(yīng)用程序。此服務(wù)器類型會自動設(shè)置具有內(nèi)置 Project Reactor 支持的異步工具規(guī)范,spring.ai.mcp.server.type=ASYNC。
4.3 編寫MCPServer服務(wù)代碼
編寫天氣預(yù)報查詢偽代碼:
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
publicclass WeatherService {
@Tool(description = "根據(jù)城市名稱獲取天氣預(yù)報")
public String getWeatherByCity(String city) {
Map<String, String> mockData = Map.of(
"西安", "晴天",
"北京", "小雨",
"上海", "大雨"
);
return mockData.getOrDefault(city, "抱歉:未查詢到對應(yīng)城市!");
}
}
4.4 將服務(wù)暴露出去
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
這樣 MCP Server 就編寫完成了。
5.Dify調(diào)用本地MCP
Dify 調(diào)用 MCP 主要步驟如下:
- 安裝 MCP 插件。
- 配置 MCP 服務(wù) HTTP 地址。
- 配置 Agent 相關(guān)信息。
- 運(yùn)行測試。
具體配置如下。
5.1 安裝 MCP 插件
安裝 Agent 策略(支持 MCP 工具)如下圖所示:
圖片
“
MCP SSE 選裝,非必須,可以為后續(xù) Agent 提供 MCP 工具列表,方便 LLM 正確理解和調(diào)用工具。
5.2 配置 MCP 服務(wù)地址
Dify 只支持 HTTP 協(xié)議的 MCP 服務(wù)調(diào)用,它的配置格式如下:
{
"server_name1": {
"transport": "sse",
"url": "http://127.0.0.1:8000/sse",
"headers": {},
"timeout": 50,
"sse_read_timeout": 50
},
"server_name2": {
"transport": "sse",
"url": "http://127.0.0.1:8001/sse"
},
"server_name3": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8002/mcp",
"headers": {},
"timeout": 50
},
"server_name4": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8003/mcp"
}
}
支持配置多個 MCP 服務(wù),或者是以下 JSON 格式也支持:
{
"mcpServers": {
"server_name1": {
"transport": "sse",
"url": "http://127.0.0.1:8000/sse",
"headers": {},
"timeout": 50,
"sse_read_timeout": 50
},
"server_name2": {
"transport": "sse",
"url": "http://127.0.0.1:8001/sse"
},
"server_name3": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8002/mcp",
"headers": {},
"timeout": 50
},
"server_name4": {
"transport": "streamable_http",
"url": "http://127.0.0.1:8003/mcp"
}
}
}
5.3 配置 Agent
Agent 需要配置的項目比較多,首先是 Agent 策略:
圖片
圖片
然后是 LLM,選擇合適的大模型即可,之后配置 MCP 工具和 HTTP 地址,如下圖所示:
圖片
之后配置指令和查詢問題:
圖片
5.4 測試 MCP 調(diào)用
我們創(chuàng)建的是一個 ChatFlow,執(zhí)行效果如下:
圖片
執(zhí)行符合預(yù)期。
小結(jié)
Dify 調(diào)用 MCP 服務(wù)主要依靠的是 HTTP 地址和 MCP 協(xié)議,對于用戶來說他面向的是大模型,對于程序來說是大模型調(diào)用了 MCP 服務(wù),所以大模型端也就是 MCP 的客戶端。我們會調(diào)用本地 MCP 服務(wù)了,那么問題來了,如何調(diào)用通用的 MCP 服務(wù)呢?