Deer‑Flow 2.0 + Go‑MCP‑Server(add加法工具)保姆级完整教程
适配智谱GLM‑5.3 Coding‑Plan套餐、Mac‑Arm64环境,解决
initialize握手超时、MCP加载失败、模型不调用自定义工具全套问题
一、整体原理说明
MCP(Model Context Protocol)标准交互流程(顺序不可颠倒)
- Gateway拉起你的Go‑MCP子进程
- Gateway发送
initialize握手请求 → Go程序必须返回响应,否则网关60秒超时放弃加载 - 握手成功后,网关发送
tools/list获取工具清单 - 会话中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, ¶ms)
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或者口算。
九、常见故障排查清单
-
日志出现 Skipping MCP server ... timed out
- Go代码缺少
initialize应答,回到源码补齐握手分支
- Go代码缺少
-
模型不用add,跑去调用python/bash沙箱
- 会话不是新建;提示词约束力弱;工具前缀开关配置错误
-
LLM provider unavailable
- Coding‑Plan端点
/api/coding/paas/v4/地址错误、密钥sk‑sp无效、余额不足
- Coding‑Plan端点
-
终端测试MCP程序正常,Gateway加载失败
- extensions_config.json存放路径错误,必须放在
/Users/kenny/projects/agentdemo/deer-flow/根目录
- extensions_config.json存放路径错误,必须放在