Dify 連接本地 SpringAI MCP server
連接 MCP server 的方式大致有兩種,一種是基于 stdio,一種是基于 sse,如果對于穩定和性能好的方案的話,sse 要比 stdio 好的多,所以本文采用的是基于 sse 和 Spring AI 部署本地 MCP server,并通過 Dify 連接本地 MCP Server。
如何使用 SpringAI 搭建一個本地 MCP server
依賴:
<dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>3.5.3</version></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
配置文件
spring:application:name:mcp-server-demoai:mcp:server:name: webflux-mcp-server # 這里是外部訪問 mcp server 的服務器名稱version: 1.0.0type: ASYNCsse-message-endpoint: /mcp/messagesserver:port: 8080
Service 模塊
可以根據具體的業務操作邏輯進行編寫
@Service
public class CheckStudentService {@Tool(description = "根據傳入同學的姓名查看這位同學在班級內的職務")public String checkStudentPosition(String studentName) {Map<String, String> mockData = Map.of("小明","班長","小紅","學習委員","小帥","衛生委員");return mockData.getOrDefault(studentName, "普通同學,沒有職務!");}@Tool(description = "根據同學姓名查看這位同學的成績得分")public String checkStudentScore(String studentName) {Map<String, Integer> mockData = Map.of("小明",88,"小紅",99,"小帥",63);if (null == mockData.get(studentName)){return "暫無這位同學的成績!";}return String.valueOf(mockData.get(studentName));}}
將實現好的 Service 模塊暴露出去
這一步就是把實現好的 Service 注冊到方法回調列表中,再通過 sse 獲取工具集合的時候可以訪問到暴露出去的工具。
SpringAI 的實現方式是將對應的 Service 封裝為 ToolBackProvider 后,并把這個對象放入 IoC 中,SprigAI 會自動對其進行打包處理。
@Configuration
public class McpServiceConfig {@Beanpublic ToolCallbackProvider checkStudentTools(CheckStudentService studentService) {return MethodToolCallbackProvider.builder().toolObjects(studentService).build();}}
MCP 服務器Demo 配置完畢,直接啟動
觀察日志,可以看到,SpringAI 把我們自定義的兩個工具注冊到方法回調集里面了。
Dify 連接本地 MCP Server
首先本地下載這兩個插件,這是用于搭建智能體的工具
搭建智能體工作流,配置 Agent 策略工具,注意這里一定要使用智能體策略工具中的 ReAct 工具,使用 FunctionCalling 會報錯。
配置 MCP sse 工具,這里的 json 配置如下,還記得在上面 MCP server 中的配置文件嗎,這里的 server 名字就是上面 yaml 文件中配置的。這里還要注意一個問題,如果是使用 Docker 部署的 Dify,可能由于 Docker 的配置問題,無法訪問宿主機的 localhost,需要把 127.0.0.1
換成host.docker.internal
。
{"webflux-mcp-server": {"url": "http://host.docker.internal:8080/sse"}
}
在服務器配置中把這個 json 的配置,再寫一遍。
Dify 聊天測試~
如果對你有幫助,麻煩點個贊~~