Tool - MCP

基本介绍

Model Context Protocol(MCP)是 Anthropic 推出的供模型访问的资源的标准化开放协议,Eino 提供了相关封装,使用这些封装可以直接访问已有 MCP Server 上的资源。

本节介绍 MCPTool 的封装,封装实现了 Eino InvokableTool 接口(Eino: ToolsNode 使用说明)。

其他封装参见:

ChatTemplate - MCP

使用方式

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