Skip to content

Testing

Tests run the application with coretest, and connect an MCP client to the *mcp.Server with mcpservertest.Connect, through in-memory transports, without network:

func TestGreet(t *testing.T) {
t.Parallel()
var (
server *mcp.Server
spans *tracetest.InMemoryExporter
logs *logtest.InMemoryExporter
)
coretest.Start(t, core.New(mcpserver.Module, mcpserver.AsCapability(NewGreetTool)), fx.Populate(&server, &spans, &logs))
session := mcpservertest.Connect(t, server)
result, err := session.CallTool(t.Context(), &mcp.CallToolParams{
Name: "greet",
Arguments: map[string]any{"name": "oryn"},
})
require.NoError(t, err)
assert.False(t, result.IsError)
spantest.HasSpan(t, spans,
spantest.WithName("tools/call greet"),
spantest.WithAttributeValue(mcpserver.GenAIToolNameKey.String("greet")),
)
logtest.HasRecord(t, logs, logtest.WithBody("mcp request"), logtest.WithAttributeValue("target", "greet"))
}

The request goes through the whole server: instrumentation, logs, recovery and handler. The sessions are closed when the test ends.

Over the network

To test the streamable HTTP transport, set mcpserver.address to 127.0.0.1:0 and add mcpserver.Serve(): once started, the *mcpserver.HTTPServer Addr is the listening address.

var server *mcpserver.HTTPServer
coretest.Start(t, app,
config.AsOptions(config.WithValues(map[string]any{"mcpserver.address": "127.0.0.1:0"})),
mcpserver.Serve(),
fx.Populate(&server),
)
client := mcp.NewClient(&mcp.Implementation{Name: "test", Version: "test"}, nil)
session, err := client.Connect(t.Context(), &mcp.StreamableClientTransport{Endpoint: "http://" + server.Addr + "/mcp"}, nil)