From 347b6d973941100c050f482b3c0f7524e3bc326f Mon Sep 17 00:00:00 2001 From: nico Date: Sun, 22 Jun 2025 14:22:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(tools):=20=E6=B7=BB=E5=8A=A0=20GetAnyS?= =?UTF-8?q?lice=20=E5=92=8C=20RequireAnySlice=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GetAnySlice 方法用于获取 []any 类型的参数,如果不存在则返回默认值 - RequireAnySlice 方法用于获取 []any 类型的参数,如果不存在或类型不匹配则返回错误 - 这两个方法扩展了 CallToolRequest 的功能,使其能够更方便地处理 any 类型的切片参数 --- mcp/tools.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/mcp/tools.go b/mcp/tools.go index 3e3931b0..45aa2389 100644 --- a/mcp/tools.go +++ b/mcp/tools.go @@ -233,6 +233,32 @@ func (r CallToolRequest) RequireBool(key string) (bool, error) { return false, fmt.Errorf("required argument %q not found", key) } +// GetAnySlice returns a []any slice argument by key, or the default value if not found +func (r CallToolRequest) GetAnySlice(key string, defaultValue []any) []any { + args := r.GetArguments() + if val, ok := args[key]; ok { + switch v := val.(type) { + case []any: + return v + } + } + return defaultValue +} + +// RequireAnySlice returns a []any slice argument by key, or an error if not found or not convertible to []any slice +func (r CallToolRequest) RequireAnySlice(key string) ([]any, error) { + args := r.GetArguments() + if val, ok := args[key]; ok { + switch v := val.(type) { + case []any: + return v, nil + default: + return nil, fmt.Errorf("argument %q is not an any slice", key) + } + } + return nil, fmt.Errorf("required argument %q not found", key) +} + // GetStringSlice returns a string slice argument by key, or the default value if not found func (r CallToolRequest) GetStringSlice(key string, defaultValue []string) []string { args := r.GetArguments() From 27c4c3fbbfd8a5150b103f4e240aed66ea60b5a8 Mon Sep 17 00:00:00 2001 From: nico Date: Sun, 22 Jun 2025 14:24:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?test(mcp):=20=E6=B7=BB=E5=8A=A0=20GetAnySli?= =?UTF-8?q?ce=20=E5=92=8C=20RequireAnySlice=20=E6=96=B9=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 tools_test.go 文件中添加了 GetAnySlice 和 RequireAnySlice 方法的测试用例 - 测试了不同数据类型切片的获取,包括字符串、整数、浮点数和布尔值- 验证了方法在存在和不存在的键上的行为 --- mcp/tools_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mcp/tools_test.go b/mcp/tools_test.go index 0cd71230..eb6ba896 100644 --- a/mcp/tools_test.go +++ b/mcp/tools_test.go @@ -394,6 +394,19 @@ func TestCallToolRequestHelperFunctions(t *testing.T) { _, err = req.RequireBool("missing_val") assert.Error(t, err) + // Test GetAnySlice + assert.Equal(t, []any{"one", "two", "three"}, req.GetAnySlice("string_slice_val", nil)) + assert.Equal(t, []any{1, 2, 3}, req.GetAnySlice("int_slice_val", nil)) + assert.Equal(t, []any{1.1, 2.2, 3.3}, req.GetAnySlice("float_slice_val", nil)) + + // Test RequireAnySlice + as, err := req.RequireAnySlice("string_slice_val") + assert.NoError(t, err) + assert.Equal(t, []any{"one", "two", "three"}, as) + _, err = req.RequireAnySlice("missing_val") + assert.Error(t, err) + assert.Equal(t, []any{true, false, true}, req.GetAnySlice("bool_slice_val", nil)) + // Test GetStringSlice assert.Equal(t, []string{"one", "two", "three"}, req.GetStringSlice("string_slice_val", nil)) assert.Equal(t, []string{"default"}, req.GetStringSlice("missing_val", []string{"default"}))