MCP Servers

June 25, 2026 · View on GitHub

title: MCP Servers description: External MCP server health and traffic - latency by transport, OAuth state across servers, lifecycle events, transport mix, server status timeline.

MCP Servers

MCP Servers dashboard - sections labelled SERVERS - VOLUME & QUALITY and OAUTH STATE; six KPI cards on the volume row (MCP servers, Servers up, MCP tool calls, Distinct tools, p95 latency, Error rate), four KPI cards in the OAuth row (OAuth authorized, OAuth awaiting, OAuth errored/offline, OAuth expiring <5 min), and the MCP calls / minute stacked-by-transport chart

MCP Servers - Servers up 1 / 1 and OAuth authorized 1 reflect the built-in spring-ai-playground-built-in-mcp server registered over streamable-http. Tool-call volume bars surface as soon as an external MCP catalog entry is activated and the agent reaches a tool through it.

Purpose - external MCP server health and traffic. Latency by transport, OAuth state across servers, lifecycle events.

When to look here

  • "Is one MCP server slow?" - Latency p50 / p95 / p99 stacked by transport; Top servers identifies which one carries the most traffic.
  • "Did an OAuth token expire silently?" - OAuth expiring <5 min KPI + the OAuth status grid below.
  • "Is the agent reaching a server that crashed?" - Servers up vs MCP servers KPI gap (e.g. 3 / 5 is two servers down).
  • "Which transport family dominates?" - Transport mix donut (stdio / streamable-http / sse).
  • "Did the lifecycle behave abnormally?" - Lifecycle events by transport class chart (initialize / shutdown / etc.).

Span filter

spring.ai.tool spans where mcp.method.name is present.

Each such span is enriched by McpToolObservationFilter with risk and composition dimensions lifted from the call's MDC context: saip.tool.origin (internal_js / wrapped_external), saip.composition.id / .name, saip.tool.exposed_alias, saip.mcp.server (the upstream server name), the three risk levels saip.risk.final / .server / .publish, and saip.risk.floor_trigger when a floor rule tripped. So a tool re-exposed through composition is traceable back to its upstream server and its computed risk - not just its exposed alias.

Controls

All dashboards share the Observability global settings - time window, refresh interval, custom range. MCP Servers has no tab-specific controls beyond those.

KPI cards - Volume & Quality (six)

CardShowsSource
MCP serversNumber of registered external MCP serversMcpClientService.registeredServers().size()
Servers upNumber with last connection state OKLive ping / connection state
MCP tool callsCount of all externally-routed tool callsSpans with mcp.method.name non-null
Distinct toolsUnique tool names called externallyset(spring.ai.tool.definition.name) filtered
p95 latency95th-percentile external tool durationSpan duration distribution
Error ratePercentage of external calls with status=ERRORSpan status

KPI cards - OAuth State (four)

CardShowsSource
OAuth authorizedCount of OAuth-protected servers currently in authorized stateMcpServerInfo.oauthStatus
OAuth awaitingCount awaiting authorization (user-driven OAuth dance not yet completed)OAuth state machine
OAuth errored / offlineCount where OAuth flow has errored or the server is unreachableOAuth state machine + ping
OAuth expiring < 5 minToken-refresh urgency - these will fail soon if not refreshedToken expiry timestamp

Charts (seven)

ChartTypeReading
MCP calls / minuteLine per transport, stackedDrop to zero on one transport → that transport class lost connectivity
Latency p50 / p95 / p99Multi-line, ms (one per transport)stdio is consistently faster (no network); HTTP variants show round-trip cost
Top serversHorizontal bar, by call countIdentifies the server carrying the most traffic
Top MCP toolsHorizontal bar, by call countSame question scoped to specific tool names across servers
Transport mixDonut (stdio / streamable-http / sse)Sanity check against expected routing
Server statusStacked bar over time (OK / Error / Awaiting)Spot a server flipping in/out of healthy state
Lifecycle events by transport classBarUnusual shutdown cluster → server crash loop

Tables

OAuth status grid - Server · Transport · Status · ... - sorted by Status; expiring tokens highlighted. Click a row to navigate to the MCP Server connection page where you can re-authorize.

Cross-references