Tool - MCP
基本介绍
Model Context Protocol(MCP)是 Anthropic 推出的供模型访问的资源的标准化开放协议,Eino 提供了相关封装,使用这些封装可以直接访问已有 MCP Server 上的资源。
本节介绍 MCPTool 的封装,封装实现了 Eino InvokableTool 接口(Eino: ToolsNode 使用说明)。
其他封装参见:
使用方式
QuickStart
首先创建 mcp client,Eino 利用了开源 sdk mark3labs/mcp-go:
import "github.com/mark3labs/mcp-go/client"
// stdio client
cli, err := client.NewStdioMCPClient(myCommand, myEnvs, myArgs...)
// sse client
cli, err := client.NewSSEMCPClient(myBaseURL)
// sse client needs to manually start asynchronous communication
// while stdio does not require it.
err = cli.Start(ctx)
考虑到 client 的复用,封装假设 client 已经完成和 Server 的 Initialize,用户需要自行完成 client 初始化:
import "github.com/mark3labs/mcp-go/mcp"
initRequest := mcp.InitializeRequest{}
initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
initRequest.Params.ClientInfo = mcp.Implementation{
Name: "example-client",
Version: "1.0.0",
}
_, err = cli.Initialize(ctx, initRequest)
之后使用 Client 创建 Eino Tool:
import "github.com/cloudwego/eino-ext/components/tool/mcp"
tools, err := mcp.GetTools(ctx, &mcp.Config{Cli: cli})
tool 可以直接调用:
for i, mcpTool := range mcpTools {
fmt.Println(i, ":")
info, err := mcpTool.Info(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Println("Name:", info.Name)
fmt.Println("Desc:", info.Desc)
fmt.Println()
}
也可以在任意 Eino Agent 中使用,以 ReAct Agent 为例:
import (
"github.com/cloudwego/eino/flow/agent/react"
"github.com/cloudwego/eino-ext/components/tool/mcp"
)
llm, err := /*create a chat model*/
tools, err := mcp.GetTools(ctx, &mcp.Config{Cli: cli})
agent, err := react.NewAgent(ctx, &react.AgentConfig{
Model: llm,
ToolsConfig: compose.ToolsNodeConfig{Tools: tools},
})
按 Name 指定 Tool
GetTools 支持使用 Name 筛选 Server 提供的 Tools,避免调用预期外的 Tools:
import "github.com/cloudwego/eino-ext/components/tool/mcp"
tools, err := mcp.GetTools(ctx, &mcp.Config{
Cli: cli,
ToolNameList: []string{"name"},
})
更多信息
实践例子可以参考:https://github.com/cloudwego/eino-ext/blob/main/components/tool/mcp/examples/mcp.go
最后修改
March 13, 2025
: doc(Eino): update eino install guide title to h2 (#1278) (8143376)