Deer‑Flow 2.0 + Go‑MCP‑Server(add加法工具)保姆级完整教程

Deer‑Flow 2.0 + Go‑MCP‑Server(add加法工具)保姆级完整教程

适配智谱GLM‑5.3 Coding‑Plan套餐、Mac‑Arm64环境,解决initialize握手超时、MCP加载失败、模型不调用自定义工具全套问题

一、整体原理说明

MCP(Model Context Protocol)标准交互流程(顺序不可颠倒)

  1. Gateway拉起你的Go‑MCP子进程
  2. Gateway发送 initialize 握手请求 → Go程序必须返回响应,否则网关60秒超时放弃加载
  3. 握手成功后,网关发送 tools/list 获取工具清单
  4. 会话中LLM触发 tools/call 调用add工具

如果Go代码缺少initialize应答分支,终端管道测试能返回结果只是绕过握手,属于伪成功。

二、第一步:编写&修复Go‑MCP‑Server源码(main.go)

go 复制代码
package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
)

type JSONRPCRequest struct {
	JSONRPC string          `json:"jsonrpc"`
	ID      *interface{}   `json:"id"`
	Method  string          `json:"method"`
	Params  json.RawMessage `json:"params,omitempty"`
}

type JSONRPCResponse struct {
	JSONRPC string      `json:"jsonrpc"`
	ID      interface{} `json:"id"`
	Result  interface{} `json:"result,omitempty"`
	Error   interface{} `json:"error,omitempty"`
}

func sendResp(resp JSONRPCResponse) {
	data, _ := json.Marshal(resp)
	fmt.Println(string(data))
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		line := scanner.Text()
		var req JSONRPCRequest
		_ = json.Unmarshal([]byte(line), &req)
		reqId := req.ID

		switch req.Method {
		// ========== MCP握手 必写 ==========
		case "initialize":
			var params struct {
				ProtocolVersion string `json:"protocolVersion"`
			}
			_ = json.Unmarshal(req.Params, &params)
			if params.ProtocolVersion == "" {
				params.ProtocolVersion = "2024-11-05"
			}
			sendResp(JSONRPCResponse{
				JSONRPC: "2.0",
				ID:      reqId,
				Result: map[string]interface{}{
					"protocolVersion": params.ProtocolVersion,
					"capabilities": map[string]interface{}{
						"tools": map[string]interface{}{},
					},
					"serverInfo": map[string]interface{}{
						"name":    "go-mcp-add-tool",
						"version": "0.1.0",
					},
				},
			})

		// 列出工具
		case "tools/list":
			sendResp(JSONRPCResponse{
				JSONRPC: "2.0",
				ID:      reqId,
				Result: map[string]interface{}{
					"tools": []map[string]interface{}{
						{
							"name":        "add",
							"description": "两个数字相加",
							"inputSchema": map[string]interface{}{
								"type": "object",
								"properties": map[string]interface{}{
									"a": map[string]interface{}{"type": "number", "description": "数字1"},
									"b": map[string]interface{}{"type": "number", "description": "数字2"},
								},
								"required": []string{"a", "b"},
							},
						},
					},
				},
			})

		// 执行工具调用
		case "tools/call":
			var call struct {
				Name      string                 `json:"name"`
				Arguments map[string]float64     `json:"arguments"`
			}
			_ = json.Unmarshal(req.Params, &call)
			res := call.Arguments["a"] + call.Arguments["b"]
			sendResp(JSONRPCResponse{
				JSONRPC: "2.0",
				ID:      reqId,
				Result: map[string]interface{}{
					"content": []map[string]interface{}{
						{"type": "text", "text": fmt.Sprintf("%f", res)},
					},
				},
			})
		}
	}
}

三、第二步:编译二进制文件

bash 复制代码
#进入你的项目目录
cd /Users/kenny/projects/tools/go-mcp-demo
#编译
go build -o go-mcp-server .
#赋予执行权限
chmod +x go-mcp-server

四、第三步:本地全链路握手自测(验证MCP程序合规)

整条命令一次性测试完整交互链路:initialize → tools/list → tools/call

css 复制代码
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"add","arguments":{"a":123,"b":456}}}' \
| ./go-mcp-server

✅预期输出三段JSON应答,无报错即为合格。

五、第四步:Deer‑Flow 2.0配置MCP服务

进入deer‑flow项目根目录

bash 复制代码
cd /Users/kenny/projects/agentdemo/deer-flow

新建/编辑 extensions_config.json(与.env同级)

json 复制代码
{
  "mcpServers": {
    "go-mcp-add-tool": {
      "enabled": true,
      "type": "stdio",
      "command": "/Users/kenny/projects/tools/go-mcp-demo/go-mcp-server",
      "args": [],
      "env": {},
      "tool_name_prefix": false
    }
  }
}

tool_name_prefix":false:关闭网关自动追加前缀,工具名保持 add,不用 go‑mcp‑add‑tool_add

六、第五步:智谱GLM‑5.3 Coding‑Plan模型配置

1、根目录 .env

ini 复制代码
ZHIPU_CODING_KEY=sk-sp-xxxx你的套餐密钥

2、config.yaml模型片段

yaml 复制代码
models:
  - name: glm-5.3
    display_name: GLM‑5.3 (Coding‑Plan)
    use: langchain_openai:ChatOpenAI
    model: glm-5.3
    api_key: $ZHIPU_CODING_KEY
    base_url: https://open.bigmodel.cn/api/coding/paas/v4/
    max_tokens: 8192
    temperature: 0.7
    request_timeout: 120
    max_retries: 2
    supports_vision: false
    supports_thinking: false

七、第六步:完整重启Deer‑Flow加载所有配置

bash 复制代码
make stop
#释放3000端口
lsof -ti :3000 | xargs kill -9
make dev

观察Gateway终端日志,成功标志:

csharp 复制代码
Configured MCP server: go-mcp-add-tool
Successfully loaded 1 tool(s) from MCP servers

不再出现 Skipping MCP server ... timed out 超时警告。

八、第七步:Web界面调用自定义add工具

1.浏览器访问:http://localhost:2026 2.右上角模型切换为:GLM‑5.3 (Coding‑Plan) 3.新建会话!旧会话缓存旧工具列表 4.发送提示词

csharp 复制代码
你拥有add工具,请调用add工具,参数a=123,b=456,完成加法计算。禁止使用bash/python或者口算。

九、常见故障排查清单

  1. 日志出现 Skipping MCP server ... timed out

    • Go代码缺少initialize应答,回到源码补齐握手分支
  2. 模型不用add,跑去调用python/bash沙箱

    • 会话不是新建;提示词约束力弱;工具前缀开关配置错误
  3. LLM provider unavailable

    • Coding‑Plan端点/api/coding/paas/v4/地址错误、密钥sk‑sp无效、余额不足
  4. 终端测试MCP程序正常,Gateway加载失败

    • extensions_config.json存放路径错误,必须放在/Users/kenny/projects/agentdemo/deer-flow/根目录
相关推荐
阿拉斯攀登12 分钟前
SpringCloud微服务MQTT架构:设备消息统一接入、业务分发设计
人工智能
昭昭日月明14 分钟前
LangChain 生态:从链到代理,开发者需要掌握的三大核心
python·langchain·agent
Csvn33 分钟前
第 12 章 并行化 Parallelization
人工智能·aigc·agent
大刚测试开发实战38 分钟前
我在WorkBuddy上打通了TestHub,全程用AI来跑测试!
人工智能
IT_陈寒1 小时前
为什么我的Vue组件总是莫名其妙重渲染?
前端·人工智能·后端
欧特克_Glodon2 小时前
OpenCV计算机视觉开发入门与实践<二十七>:图像分割概述
c++·人工智能·opencv·计算机视觉
lhldsg2 小时前
AI零售系统实战指南:从架构设计到落地部署全解析
java·人工智能·小程序·uni-app·零售
richard_first2 小时前
Transformer与大语言模型:第13章 Decoder
人工智能·机器学习