Skip to content

Commit 8009b0d

Browse files
committed
Use middleware instead of hooks for tool calls
1 parent fa6e2be commit 8009b0d

File tree

4 files changed

+59
-181
lines changed

4 files changed

+59
-181
lines changed

contrib/mark3labs/mcp-go/example_test.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
package mcpgo_test
77

88
import (
9-
mcpgo "github.com/DataDog/dd-trace-go/contrib/mark3labs/mcp-go/v2"
9+
mcpgotrace "github.com/DataDog/dd-trace-go/contrib/mark3labs/mcp-go/v2"
1010
"github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"
1111
"github.com/mark3labs/mcp-go/server"
1212
)
@@ -15,16 +15,11 @@ func Example() {
1515
tracer.Start()
1616
defer tracer.Stop()
1717

18-
// Create Datadog hooks
19-
ddHooks := mcpgo.NewHooks()
20-
defer ddHooks.Stop()
21-
22-
// Create server hooks and add Datadog tracing
23-
hooks := &server.Hooks{}
24-
ddHooks.AddHooks(hooks)
18+
// Create Datadog middleware
19+
mcpgotrace.NewToolHandlerMiddleware()
2520

2621
// Use hooks with your MCP server
2722
srv := server.NewMCPServer("my-server", "1.0.0",
28-
server.WithHooks(hooks))
23+
server.WithToolHandlerMiddleware(mcpgotrace.NewToolHandlerMiddleware()))
2924
_ = srv
3025
}

contrib/mark3labs/mcp-go/hooks.go

Lines changed: 0 additions & 105 deletions
This file was deleted.

contrib/mark3labs/mcp-go/mcpgo.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Unless explicitly stated otherwise all files in this repository are licensed
2+
// under the Apache License Version 2.0.
3+
// This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
// Copyright 2016 Datadog, Inc.
5+
6+
package mcpgo // import "github.com/DataDog/dd-trace-go/contrib/mark3labs/mcp-go/v2"
7+
8+
import (
9+
"context"
10+
"encoding/json"
11+
12+
"github.com/DataDog/dd-trace-go/v2/instrumentation"
13+
"github.com/DataDog/dd-trace-go/v2/llmobs"
14+
15+
"github.com/mark3labs/mcp-go/mcp"
16+
"github.com/mark3labs/mcp-go/server"
17+
)
18+
19+
var instr *instrumentation.Instrumentation
20+
21+
func init() {
22+
instr = instrumentation.Load(instrumentation.PackageMark3LabsMcpGo)
23+
}
24+
25+
func NewToolHandlerMiddleware() server.ToolHandlerMiddleware {
26+
return func(next server.ToolHandlerFunc) server.ToolHandlerFunc {
27+
return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
28+
toolSpan, ctx := llmobs.StartToolSpan(ctx, request.Params.Name)
29+
30+
result, err := next(ctx, request)
31+
32+
inputJSON, _ := json.Marshal(request)
33+
var outputText string
34+
if result != nil {
35+
resultJSON, _ := json.Marshal(result)
36+
outputText = string(resultJSON)
37+
}
38+
39+
toolSpan.AnnotateTextIO(string(inputJSON), outputText)
40+
41+
if err != nil {
42+
toolSpan.Finish(llmobs.WithError(err))
43+
} else {
44+
toolSpan.Finish()
45+
}
46+
47+
return result, err
48+
}
49+
}
50+
}

contrib/mark3labs/mcp-go/hooks_test.go renamed to contrib/mark3labs/mcp-go/mcpgo_test.go

Lines changed: 5 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -21,76 +21,20 @@ import (
2121
"github.com/stretchr/testify/require"
2222
)
2323

24-
func TestNewHooks(t *testing.T) {
24+
func TestNewToolHandlerMiddleware(t *testing.T) {
2525
mt := mocktracer.Start()
2626
defer mt.Stop()
2727

28-
hooks := NewHooks()
29-
assert.NotNil(t, hooks)
30-
assert.NotNil(t, hooks.toolCache)
31-
32-
hooks.Stop()
33-
}
34-
35-
func TestAddHooks(t *testing.T) {
36-
mt := mocktracer.Start()
37-
defer mt.Stop()
38-
39-
ddHooks := NewHooks()
40-
defer ddHooks.Stop()
41-
42-
serverHooks := &server.Hooks{}
43-
ddHooks.AddHooks(serverHooks)
44-
45-
assert.Len(t, serverHooks.OnBeforeCallTool, 1)
46-
assert.Len(t, serverHooks.OnAfterCallTool, 1)
47-
assert.Len(t, serverHooks.OnError, 1)
48-
}
49-
50-
// Integration Tests
51-
52-
func TestIntegrationSessionInitialize(t *testing.T) {
53-
tt := testTracer(t)
54-
defer tt.Stop()
55-
56-
ddHooks := NewHooks()
57-
defer ddHooks.Stop()
58-
59-
hooks := &server.Hooks{}
60-
ddHooks.AddHooks(hooks)
61-
62-
srv := server.NewMCPServer("test-server", "1.0.0",
63-
server.WithHooks(hooks))
64-
65-
ctx := context.Background()
66-
initRequest := `{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0.0"}}}`
67-
68-
response := srv.HandleMessage(ctx, []byte(initRequest))
69-
assert.NotNil(t, response)
70-
71-
responseBytes, err := json.Marshal(response)
72-
require.NoError(t, err)
73-
74-
var resp map[string]interface{}
75-
err = json.Unmarshal(responseBytes, &resp)
76-
require.NoError(t, err)
77-
assert.Equal(t, "2.0", resp["jsonrpc"])
78-
assert.Equal(t, float64(1), resp["id"])
79-
assert.NotNil(t, resp["result"])
28+
middleware := NewToolHandlerMiddleware()
29+
assert.NotNil(t, middleware)
8030
}
8131

8232
func TestIntegrationToolCallSuccess(t *testing.T) {
8333
tt := testTracer(t)
8434
defer tt.Stop()
8535

86-
ddHooks := NewHooks()
87-
defer ddHooks.Stop()
88-
89-
hooks := &server.Hooks{}
90-
ddHooks.AddHooks(hooks)
91-
9236
srv := server.NewMCPServer("test-server", "1.0.0",
93-
server.WithHooks(hooks))
37+
server.WithToolHandlerMiddleware(NewToolHandlerMiddleware()))
9438

9539
calcTool := mcp.NewTool("calculator",
9640
mcp.WithDescription("A simple calculator"))
@@ -167,14 +111,8 @@ func TestIntegrationToolCallError(t *testing.T) {
167111
tt := testTracer(t)
168112
defer tt.Stop()
169113

170-
ddHooks := NewHooks()
171-
defer ddHooks.Stop()
172-
173-
hooks := &server.Hooks{}
174-
ddHooks.AddHooks(hooks)
175-
176114
srv := server.NewMCPServer("test-server", "1.0.0",
177-
server.WithHooks(hooks))
115+
server.WithToolHandlerMiddleware(NewToolHandlerMiddleware()))
178116

179117
errorTool := mcp.NewTool("error_tool",
180118
mcp.WithDescription("A tool that always errors"))

0 commit comments

Comments
 (0)