From 1a03d62b34741ee3281a4b3188bdb8f9cd08c6e2 Mon Sep 17 00:00:00 2001 From: Jonathan Amsterdam Date: Fri, 22 Aug 2025 07:54:01 -0400 Subject: [PATCH 1/2] mcp: example middleware wrapping ToolHandler Add to the middleware example to show how to wrap a ToolHandler. This middleware is very close to, but not the same as, wrapping a ToolHandler directly. The only difference is that the middleware wraps Server.callTool, which looks up the tool by name in the server's list and then calls the handler. That lookup (plus other intervening middleware, of course) is all that distinguishes this way of wrapping from a more direct wrapping. --- mcp/example_middleware_test.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mcp/example_middleware_test.go b/mcp/example_middleware_test.go index 10dda0fa..9a21b5de 100644 --- a/mcp/example_middleware_test.go +++ b/mcp/example_middleware_test.go @@ -40,13 +40,16 @@ func Example_loggingMiddleware() { "session_id", req.GetSession().ID(), "has_params", req.GetParams() != nil, ) + // Log more for tool calls. + if ctr, ok := req.(*mcp.CallToolRequest); ok { + logger.Info("Calling tool", + "name", ctr.Params.Name, + "args", ctr.Params.Arguments) + } start := time.Now() - result, err := next(ctx, method, req) - duration := time.Since(start) - if err != nil { logger.Error("MCP method failed", "method", method, @@ -62,7 +65,6 @@ func Example_loggingMiddleware() { "has_result", result != nil, ) } - return result, err } } From 64073eae7e522bdfe8722f0fe1649cc3da783513 Mon Sep 17 00:00:00 2001 From: Jonathan Amsterdam Date: Fri, 22 Aug 2025 09:18:36 -0400 Subject: [PATCH 2/2] fix test --- mcp/example_middleware_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/mcp/example_middleware_test.go b/mcp/example_middleware_test.go index 9a21b5de..b6b8e52d 100644 --- a/mcp/example_middleware_test.go +++ b/mcp/example_middleware_test.go @@ -136,6 +136,7 @@ func Example_loggingMiddleware() { // time=2025-01-01T00:00:00Z level=INFO msg="MCP method started" method=notifications/initialized session_id="" has_params=true // time=2025-01-01T00:00:00Z level=INFO msg="MCP method completed" method=notifications/initialized session_id="" duration_ms=0 has_result=false // time=2025-01-01T00:00:00Z level=INFO msg="MCP method started" method=tools/call session_id="" has_params=true + // time=2025-01-01T00:00:00Z level=INFO msg="Calling tool" name=greet args="{\"name\":\"World\"}" // time=2025-01-01T00:00:00Z level=INFO msg="MCP method completed" method=tools/call session_id="" duration_ms=0 has_result=true // Tool result: Hello, World! }