@@ -78,3 +78,93 @@ func TestNewServerToolWithContextHandler_ValidArguments_Succeeds(t *testing.T) {
7878 require .True (t , ok )
7979 assert .Equal (t , "success: octocat/hello-world" , textContent .Text )
8080}
81+
82+ func TestNewServerToolWithContextHandler_EmptyArguments_TreatedAsEmptyObject (t * testing.T ) {
83+ tool := NewServerToolWithContextHandler (
84+ mcp.Tool {Name : "zero_arg_tool" },
85+ testToolsetMetadata ("test" ),
86+ func (_ context.Context , _ * mcp.CallToolRequest , args map [string ]any ) (* mcp.CallToolResult , any , error ) {
87+ if len (args ) != 0 {
88+ return & mcp.CallToolResult {
89+ Content : []mcp.Content {
90+ & mcp.TextContent {Text : "expected empty arguments" },
91+ },
92+ IsError : true ,
93+ }, nil , nil
94+ }
95+ return & mcp.CallToolResult {
96+ Content : []mcp.Content {
97+ & mcp.TextContent {Text : "ok" },
98+ },
99+ }, args , nil
100+ },
101+ )
102+
103+ handler := tool .HandlerFunc (nil )
104+
105+ tests := []struct {
106+ name string
107+ arguments json.RawMessage
108+ }{
109+ {name : "nil arguments" , arguments : nil },
110+ {name : "empty byte slice" , arguments : json.RawMessage {}},
111+ {name : "explicit empty object" , arguments : json .RawMessage (`{}` )},
112+ }
113+
114+ for _ , tt := range tests {
115+ t .Run (tt .name , func (t * testing.T ) {
116+ result , err := handler (context .Background (), & mcp.CallToolRequest {
117+ Params : & mcp.CallToolParamsRaw {
118+ Name : "zero_arg_tool" ,
119+ Arguments : tt .arguments ,
120+ },
121+ })
122+
123+ require .NoError (t , err )
124+ require .NotNil (t , result )
125+ assert .False (t , result .IsError )
126+ })
127+ }
128+ }
129+
130+ func TestNewServerToolWithContextHandler_EmptyArguments_TypedEmptyStruct (t * testing.T ) {
131+ type emptyArgs struct {}
132+
133+ tool := NewServerToolWithContextHandler (
134+ mcp.Tool {Name : "typed_zero_arg_tool" },
135+ testToolsetMetadata ("test" ),
136+ func (_ context.Context , _ * mcp.CallToolRequest , args emptyArgs ) (* mcp.CallToolResult , any , error ) {
137+ return & mcp.CallToolResult {
138+ Content : []mcp.Content {
139+ & mcp.TextContent {Text : "ok" },
140+ },
141+ }, args , nil
142+ },
143+ )
144+
145+ handler := tool .HandlerFunc (nil )
146+
147+ tests := []struct {
148+ name string
149+ arguments json.RawMessage
150+ }{
151+ {name : "nil arguments" , arguments : nil },
152+ {name : "empty byte slice" , arguments : json.RawMessage {}},
153+ {name : "explicit empty object" , arguments : json .RawMessage (`{}` )},
154+ }
155+
156+ for _ , tt := range tests {
157+ t .Run (tt .name , func (t * testing.T ) {
158+ result , err := handler (context .Background (), & mcp.CallToolRequest {
159+ Params : & mcp.CallToolParamsRaw {
160+ Name : "typed_zero_arg_tool" ,
161+ Arguments : tt .arguments ,
162+ },
163+ })
164+
165+ require .NoError (t , err )
166+ require .NotNil (t , result )
167+ assert .False (t , result .IsError )
168+ })
169+ }
170+ }
0 commit comments