@@ -288,3 +288,34 @@ func TestEchoHandler_WithoutMetadata(t *testing.T) {
288288 assert .NotNil (t , response )
289289 assert .Equal (t , "test123" , response .Output )
290290}
291+
292+ func TestEchoHandler_WithMetadata_ValidationError (t * testing.T ) {
293+ // Create request with metadata but invalid input
294+ requestMeta := mcp.Meta {
295+ "progressToken" : "error-token" ,
296+ "requestId" : "error-req-123" ,
297+ }
298+ req := & mcp.CallToolRequest {
299+ Params : & mcp.CallToolParamsRaw {
300+ Meta : requestMeta ,
301+ },
302+ }
303+ params := EchoRequest {Input : "invalid@input!" } // Contains special characters
304+
305+ // Call handler
306+ result , response , err := echoHandler (context .Background (), req , params )
307+
308+ // Verify response
309+ assert .NoError (t , err )
310+ assert .NotNil (t , result )
311+ assert .True (t , result .IsError , "Expected IsError to be true for invalid input" )
312+ assert .NotEmpty (t , result .Content , "Expected error message in Content" )
313+
314+ // Verify metadata is still echoed back even in error case
315+ assert .NotNil (t , result .Meta , "Metadata should be echoed back even on validation error" )
316+ assert .Equal (t , requestMeta ["progressToken" ], result .Meta ["progressToken" ])
317+ assert .Equal (t , requestMeta ["requestId" ], result .Meta ["requestId" ])
318+
319+ // Verify response is empty for error case
320+ assert .Empty (t , response .Output )
321+ }
0 commit comments