for _, toolCall := range resp.Choices[0].Message.ToolCalls {
if toolCall.Function.Name == "weather" {
log.Println("调用了天气工具")
log.Printf("参数是:%s", toolCall.Function.Arguments)
var args map[string]interface{}
if err := json.Unmarshal([]byte(toolCall.Function.Arguments), &args); err != nil {
log.Printf("解析 Arguments 失败: %v", err)
continue
}
location, ok := args["location"].(string)
if !ok {
log.Println("location 字段不存在或不是字符串类型")
continue
}
log.Printf("0")
transport := transport.NewStdio("./mcp_server", nil, "")
mcpClient := client.NewClient(transport)
log.Printf("1")
ctx,cancel := context.WithTimeout(context.Background(),100*time.Second)
defer cancel()
if err := mcpClient.Start(ctx); err != nil {
log.Fatalf("MCP 客户端启动失败: %v", err)
}
defer mcpClient.Close()
log.Printf("2")
initReq := mcp.InitializeRequest{
Params: mcp.InitializeParams{
// Capabilities: mcp.ClientCapabilities{},
ProtocolVersion: mcp.LATEST_PROTOCOL_VERSION,
ClientInfo: mcp.Implementation{
Name: "weather",
Version: "1.0.0",
},
},
}
log.Printf("3.5")
initResult, err := mcpClient.Initialize(ctx, initReq);
if err != nil {
log.Fatalf("MCP 初始化失败: %v", err)
}
fmt.Printf("初始化成功,服务器信息: %s %s\n", initResult.ServerInfo.Name, initResult.ServerInfo.Version)
log.Printf("3")
weatherReq := mcp.CallToolRequest{
Request: mcp.Request{Method: "tools/call"},
Params: mcp.CallToolParams{
Name: "weather",
Arguments: map[string]interface{}{
"location": location,
},
},
}
log.Printf("4")
result, err := mcpClient.CallTool(ctx, weatherReq)
if err != nil {
log.Fatalf("调用天气工具失败: %v", err)
}
log.Printf("天气查询结果: %+v", result)
}
}

如上,我在为我的LLM添加MCP Server 中Tool的调用,因此初始化为一个客户端。但是在执行 initResult, err := mcpClient.Initialize(ctx, initReq); 这行代码的时候,会卡住,通过终端打印也可以看出来,我设置的上下文过期时间为100秒,感觉已经可以排除网络问题了,所以原因到底在哪。transport的mcp_server是我自己写的,在终端可以正常运行,并返回信息,如图(已经统一了服务端与客户端的版本号)

补充服务端实现
服务端
看见回答说要对客户端初始化请求做响应,但是我用的是mark3labs/mcp-go的库,是这个库没有封装初始化响应吗,有没有知道的,还是说我需要创建一个会话管理?
s := server.NewMCPServer(
"weather",
"1.0.0",
server.WithToolCapabilities(true),
server.WithRecovery(),
)
weather.RegisterWeatherTool(s)
fmt.Printf("0")
if err := server.ServeStdio(s); err != nil {
fmt.Printf("server start error: %v\n", err)
}
fmt.Printf("1")