@@ -226,11 +226,9 @@ func (m *HTTPMiddleware) addMCPAttributes(ctx context.Context, span trace.Span,
226
226
// Add method-specific attributes
227
227
m .addMethodSpecificAttributes (span , parsedMCP )
228
228
229
- // Extract server name from URL or headers
229
+ // Extract server name from the request, defaulting to the middleware's configured server name
230
230
serverName := m .extractServerName (r )
231
- if serverName != "" {
232
- span .SetAttributes (attribute .String ("mcp.server.name" , serverName ))
233
- }
231
+ span .SetAttributes (attribute .String ("mcp.server.name" , serverName ))
234
232
235
233
// Determine backend transport type
236
234
// Note: ToolHive always serves SSE to clients, but backends can be stdio or sse
@@ -276,29 +274,21 @@ func (m *HTTPMiddleware) addMethodSpecificAttributes(span trace.Span, parsedMCP
276
274
}
277
275
}
278
276
279
- // extractServerName attempts to extract the server name from the request.
280
- func (* HTTPMiddleware ) extractServerName (r * http.Request ) string {
281
- // Try to get server name from custom headers (if set by proxy)
277
+ // extractServerName extracts the MCP server name from the HTTP request using multiple fallback strategies.
278
+ // It first checks for the X-MCP-Server-Name header, then extracts from URL path segments
279
+ // (skipping common prefixes like "sse", "messages", "api", "v1"), and finally falls back
280
+ // to the middleware's configured server name.
281
+ func (m * HTTPMiddleware ) extractServerName (r * http.Request ) string {
282
282
if serverName := r .Header .Get ("X-MCP-Server-Name" ); serverName != "" {
283
283
return serverName
284
284
}
285
-
286
- // Try to extract from path segments (skip common prefixes)
287
285
pathParts := strings .Split (strings .Trim (r .URL .Path , "/" ), "/" )
288
286
for _ , part := range pathParts {
289
287
if part != "" && part != "sse" && part != "messages" && part != "api" && part != "v1" {
290
288
return part
291
289
}
292
290
}
293
-
294
- // Try to get from query parameters (for session-based routing)
295
- if sessionID := r .URL .Query ().Get ("session_id" ); sessionID != "" {
296
- // In a real implementation, this could map session IDs to server names
297
- // For now, return a placeholder
298
- return "session-based"
299
- }
300
-
301
- return "unknown"
291
+ return m .serverName
302
292
}
303
293
304
294
// extractBackendTransport determines the backend transport type.
0 commit comments