Skip to content

Commit 0448984

Browse files
hl540lianghui
and
lianghui
authored
feat:Added the parameter parsing mode to parse any to the specified type (#148)
* feat:Added the parameter parsing mode to parse any to the specified type * docs:AAdd GoDoc comments to exported functions. --------- Co-authored-by: lianghui <[email protected]>
1 parent dd3210c commit 0448984

File tree

4 files changed

+184
-0
lines changed

4 files changed

+184
-0
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.23
44

55
require (
66
github.com/google/uuid v1.6.0
7+
github.com/spf13/cast v1.7.1
78
github.com/stretchr/testify v1.9.0
89
github.com/yosida95/uritemplate/v3 v3.0.2
910
)

go.sum

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
4+
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
5+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
6+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
37
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
48
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
9+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
10+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
11+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
12+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
513
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
614
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
15+
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
16+
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
17+
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
18+
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
719
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
820
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
921
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=

mcp/tools_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mcp
22

33
import (
44
"encoding/json"
5+
"fmt"
56
"testing"
67

78
"github.com/stretchr/testify/assert"
@@ -240,3 +241,70 @@ func TestToolWithObjectAndArray(t *testing.T) {
240241
assert.True(t, ok)
241242
assert.Contains(t, required, "books")
242243
}
244+
245+
func TestParseToolCallToolRequest(t *testing.T) {
246+
request := CallToolRequest{}
247+
request.Params.Name = "test-tool"
248+
request.Params.Arguments = map[string]interface{}{
249+
"bool_value": "true",
250+
"int64_value": "123456789",
251+
"int32_value": "123456789",
252+
"int16_value": "123456789",
253+
"int8_value": "123456789",
254+
"int_value": "123456789",
255+
"uint_value": "123456789",
256+
"uint64_value": "123456789",
257+
"uint32_value": "123456789",
258+
"uint16_value": "123456789",
259+
"uint8_value": "123456789",
260+
"float32_value": "3.14",
261+
"float64_value": "3.1415926",
262+
"string_value": "hello",
263+
}
264+
param1 := ParseBoolean(request, "bool_value", false)
265+
assert.Equal(t, fmt.Sprintf("%T", param1), "bool")
266+
267+
param2 := ParseInt64(request, "int64_value", 1)
268+
assert.Equal(t, fmt.Sprintf("%T", param2), "int64")
269+
270+
param3 := ParseInt32(request, "int32_value", 1)
271+
assert.Equal(t, fmt.Sprintf("%T", param3), "int32")
272+
273+
param4 := ParseInt16(request, "int16_value", 1)
274+
assert.Equal(t, fmt.Sprintf("%T", param4), "int16")
275+
276+
param5 := ParseInt8(request, "int8_value", 1)
277+
assert.Equal(t, fmt.Sprintf("%T", param5), "int8")
278+
279+
param6 := ParseInt(request, "int_value", 1)
280+
assert.Equal(t, fmt.Sprintf("%T", param6), "int")
281+
282+
param7 := ParseUInt(request, "uint_value", 1)
283+
assert.Equal(t, fmt.Sprintf("%T", param7), "uint")
284+
285+
param8 := ParseUInt64(request, "uint64_value", 1)
286+
assert.Equal(t, fmt.Sprintf("%T", param8), "uint64")
287+
288+
param9 := ParseUInt32(request, "uint32_value", 1)
289+
assert.Equal(t, fmt.Sprintf("%T", param9), "uint32")
290+
291+
param10 := ParseUInt16(request, "uint16_value", 1)
292+
assert.Equal(t, fmt.Sprintf("%T", param10), "uint16")
293+
294+
param11 := ParseUInt8(request, "uint8_value", 1)
295+
assert.Equal(t, fmt.Sprintf("%T", param11), "uint8")
296+
297+
param12 := ParseFloat32(request, "float32_value", 1.0)
298+
assert.Equal(t, fmt.Sprintf("%T", param12), "float32")
299+
300+
param13 := ParseFloat64(request, "float64_value", 1.0)
301+
assert.Equal(t, fmt.Sprintf("%T", param13), "float64")
302+
303+
param14 := ParseString(request, "string_value", "")
304+
assert.Equal(t, fmt.Sprintf("%T", param14), "string")
305+
306+
param15 := ParseInt64(request, "string_value", 1)
307+
assert.Equal(t, fmt.Sprintf("%T", param15), "int64")
308+
t.Logf("param15 type: %T,value:%v", param15, param15)
309+
310+
}

mcp/utils.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package mcp
33
import (
44
"encoding/json"
55
"fmt"
6+
"github.com/spf13/cast"
67
)
78

89
// ClientRequest types
@@ -612,3 +613,105 @@ func ParseReadResourceResult(rawMessage *json.RawMessage) (*ReadResourceResult,
612613

613614
return &result, nil
614615
}
616+
617+
func ParseArgument(request CallToolRequest, key string, defaultVal any) any {
618+
if _, ok := request.Params.Arguments[key]; !ok {
619+
return defaultVal
620+
} else {
621+
return request.Params.Arguments[key]
622+
}
623+
}
624+
625+
// ParseBoolean extracts and converts a boolean parameter from a CallToolRequest.
626+
// If the key is not found in the Arguments map, the defaultValue is returned.
627+
// The function uses cast.ToBool for conversion which handles various string representations
628+
// such as "true", "yes", "1", etc.
629+
func ParseBoolean(request CallToolRequest, key string, defaultValue bool) bool {
630+
v := ParseArgument(request, key, defaultValue)
631+
return cast.ToBool(v)
632+
}
633+
634+
// ParseInt64 extracts and converts an int64 parameter from a CallToolRequest.
635+
// If the key is not found in the Arguments map, the defaultValue is returned.
636+
func ParseInt64(request CallToolRequest, key string, defaultValue int64) int64 {
637+
v := ParseArgument(request, key, defaultValue)
638+
return cast.ToInt64(v)
639+
}
640+
641+
// ParseInt32 extracts and converts an int32 parameter from a CallToolRequest.
642+
func ParseInt32(request CallToolRequest, key string, defaultValue int32) int32 {
643+
v := ParseArgument(request, key, defaultValue)
644+
return cast.ToInt32(v)
645+
}
646+
647+
// ParseInt16 extracts and converts an int16 parameter from a CallToolRequest.
648+
func ParseInt16(request CallToolRequest, key string, defaultValue int16) int16 {
649+
v := ParseArgument(request, key, defaultValue)
650+
return cast.ToInt16(v)
651+
}
652+
653+
// ParseInt8 extracts and converts an int8 parameter from a CallToolRequest.
654+
func ParseInt8(request CallToolRequest, key string, defaultValue int8) int8 {
655+
v := ParseArgument(request, key, defaultValue)
656+
return cast.ToInt8(v)
657+
}
658+
659+
// ParseInt extracts and converts an int parameter from a CallToolRequest.
660+
func ParseInt(request CallToolRequest, key string, defaultValue int) int {
661+
v := ParseArgument(request, key, defaultValue)
662+
return cast.ToInt(v)
663+
}
664+
665+
// ParseUInt extracts and converts an uint parameter from a CallToolRequest.
666+
func ParseUInt(request CallToolRequest, key string, defaultValue uint) uint {
667+
v := ParseArgument(request, key, defaultValue)
668+
return cast.ToUint(v)
669+
}
670+
671+
// ParseUInt64 extracts and converts an uint64 parameter from a CallToolRequest.
672+
func ParseUInt64(request CallToolRequest, key string, defaultValue uint64) uint64 {
673+
v := ParseArgument(request, key, defaultValue)
674+
return cast.ToUint64(v)
675+
}
676+
677+
// ParseUInt32 extracts and converts an uint32 parameter from a CallToolRequest.
678+
func ParseUInt32(request CallToolRequest, key string, defaultValue uint32) uint32 {
679+
v := ParseArgument(request, key, defaultValue)
680+
return cast.ToUint32(v)
681+
}
682+
683+
// ParseUInt16 extracts and converts an uint16 parameter from a CallToolRequest.
684+
func ParseUInt16(request CallToolRequest, key string, defaultValue uint16) uint16 {
685+
v := ParseArgument(request, key, defaultValue)
686+
return cast.ToUint16(v)
687+
}
688+
689+
// ParseUInt8 extracts and converts an uint8 parameter from a CallToolRequest.
690+
func ParseUInt8(request CallToolRequest, key string, defaultValue uint8) uint8 {
691+
v := ParseArgument(request, key, defaultValue)
692+
return cast.ToUint8(v)
693+
}
694+
695+
// ParseFloat32 extracts and converts a float32 parameter from a CallToolRequest.
696+
func ParseFloat32(request CallToolRequest, key string, defaultValue float32) float32 {
697+
v := ParseArgument(request, key, defaultValue)
698+
return cast.ToFloat32(v)
699+
}
700+
701+
// ParseFloat64 extracts and converts a float64 parameter from a CallToolRequest.
702+
func ParseFloat64(request CallToolRequest, key string, defaultValue float64) float64 {
703+
v := ParseArgument(request, key, defaultValue)
704+
return cast.ToFloat64(v)
705+
}
706+
707+
// ParseString extracts and converts a string parameter from a CallToolRequest.
708+
func ParseString(request CallToolRequest, key string, defaultValue string) string {
709+
v := ParseArgument(request, key, defaultValue)
710+
return cast.ToString(v)
711+
}
712+
713+
// ParseStringMap extracts and converts a string map parameter from a CallToolRequest.
714+
func ParseStringMap(request CallToolRequest, key string, defaultValue map[string]any) map[string]any {
715+
v := ParseArgument(request, key, defaultValue)
716+
return cast.ToStringMap(v)
717+
}

0 commit comments

Comments
 (0)