From 9b77bd1fd20c65216a68a33280c46ed0fa368dd2 Mon Sep 17 00:00:00 2001 From: "lilong.129" Date: Fri, 16 May 2025 14:06:01 +0800 Subject: [PATCH] feat: add GetEinoTool --- internal/version/VERSION | 2 +- pkg/mcphost/dump.go | 32 ++++++++++++++++++++++++++++++++ pkg/mcphost/dump_test.go | 19 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/internal/version/VERSION b/internal/version/VERSION index 5995293b..58f20fd4 100644 --- a/internal/version/VERSION +++ b/internal/version/VERSION @@ -1 +1 @@ -v5.0.0-beta-2505161337 +v5.0.0-beta-2505161406 diff --git a/pkg/mcphost/dump.go b/pkg/mcphost/dump.go index 02b4ada7..97266ec9 100644 --- a/pkg/mcphost/dump.go +++ b/pkg/mcphost/dump.go @@ -9,6 +9,8 @@ import ( "time" "github.com/bytedance/sonic" + mcpp "github.com/cloudwego/eino-ext/components/tool/mcp" + "github.com/cloudwego/eino/components/tool" "github.com/rs/zerolog/log" ) @@ -183,3 +185,33 @@ func (h *MCPHost) ExportToolsToJSON(ctx context.Context, dumpPath string) error log.Info().Str("path", dumpPath).Msg("Tools records exported successfully") return nil } + +// GetEinoTool returns an eino tool from the MCP server +func (h *MCPHost) GetEinoTool(ctx context.Context, serverName, toolName string) (tool.BaseTool, error) { + h.mu.RLock() + defer h.mu.RUnlock() + + // filter MCP server by serverName + conn, exists := h.connections[serverName] + if !exists { + return nil, fmt.Errorf("no connection found for server %s", serverName) + } + + if conn.Config.IsDisabled() { + return nil, fmt.Errorf("server %s is disabled", serverName) + } + + // get tools from MCP server and convert to eino tools + tools, err := mcpp.GetTools(ctx, &mcpp.Config{ + Cli: conn.Client, + ToolNameList: []string{toolName}, + }) + if err != nil || len(tools) == 0 { + log.Error().Err(err). + Str("server", serverName).Str("tool", toolName). + Msg("get MCP tool failed") + return nil, err + } + + return tools[0], nil +} diff --git a/pkg/mcphost/dump_test.go b/pkg/mcphost/dump_test.go index 7c181e0b..b8b36d15 100644 --- a/pkg/mcphost/dump_test.go +++ b/pkg/mcphost/dump_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + "github.com/cloudwego/eino/components/tool" "github.com/mark3labs/mcp-go/mcp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -239,3 +240,21 @@ func TestConvertToolsToRecords(t *testing.T) { }) } } + +func TestCallEinoTool(t *testing.T) { + hub, err := NewMCPHost("./testdata/test.mcp.json") + require.NoError(t, err) + + ctx := context.Background() + err = hub.InitServers(ctx) + require.NoError(t, err) + + einoTool, err := hub.GetEinoTool(ctx, "weather", "get_alerts") + require.NoError(t, err) + t.Logf("Tool: %v", einoTool) + + tool := einoTool.(tool.InvokableTool) + result, err := tool.InvokableRun(ctx, `{"state": "CA"}`) + require.NoError(t, err) + t.Logf("Result: %v", result) +}