APM (Application Performance Monitoring) server providing tools for distributed tracing, metrics, diagnostics, and system health analysis via the Model Context Protocol
Strong tool naming (all verb-noun, clear intent) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All 26 tools have explicit names via [McpServerTool(Name=...)] and detailed descriptions guiding LLM selection. Input schemas present with type info (DateTimeOffset, string) and parameter descriptions. However, output schemas are NOT documented, responses are JSON-serialized but structure is opaque to the LLM. No enum constraints on parameters. Error handling returns generic messages ('Failed to retrieve...') without recovery guidance. Missing tool annotations (readOnlyHint, idempotentHint). Composition is excellent: tools chain well (GetTraces → GetTraceSpans → GetTraceSpanTags), and discovery tools (GetTraceFilterFacets, GetAvailableCharts) guide multi-step workflows.
Shows current alert status derived from system health thresholds. Use this to answer 'Are there any alerts?', 'Is anyone being notified?', or 'Should someone be paged?'. This is a summary — for root cause details, follow up with GetDiagnosis.
Lists all pre-configured APM charts (Apdex, latency percentiles, request rates, error rates, distributions). Returns chart IDs, titles, types (sparkline/scalar/gauge/donut/area/flat-bar/table), and PromQL queries. Call this FIRST to discover valid chartId values before using GetRangeData.
Compares system metrics between two time windows (e.g., 'now' vs 'last week', or 'after deployment' vs 'before deployment'). Use this to answer 'How does this compare?', 'What's different?', or 'Is this better or worse?'.
Retrieves a dashboard definition by its secondary ID, including its layout configuration and the charts it contains.
Correlates recent deployments with changes in system health metrics (latency, error rate, throughput). Use this to answer 'Did a deployment cause this?', 'What changed when we deployed?', or 'Is this deployment healthy?'.
Output schemas not documented. Tools return JsonSerializer.Serialize(result) but LLM cannot see what fields/structure to expect. Breaks downstream tool chaining and forces LLM to guess field names.
Error handling returns generic messages ('Failed to retrieve X') without recovery guidance. LLM cannot determine if error is retryable, user-fixable, or fatal. No actionable next steps provided.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Diagnoses current system issues by analyzing recent errors, grouping by root cause, and ranking by severity. Use this AFTER GetSystemHealth shows 'critical' or 'degraded', OR directly for 'What's wrong?', 'What broke?'. Returns issues with stack traces, affected services, and sample trace IDs for drill-down.
Retrieves metadata about the current grid (monitoring environment/workspace). Returns the grid's name, configuration, and properties. Use this only when you need to know which environment the user is viewing. For system health or diagnostics, use GetSystemHealth or GetDiagnosis instead.
Reconstructs a chronological incident timeline showing when each service first errored, spiked in latency, or degraded. Use this to answer 'What happened?', 'Walk me through the incident', or 'When did things start going wrong?'.
Retrieves a single log entry by its ID. Returns full details: timestamp, severity, service name, message, and all attributes.
Returns all available filter facets (service names, log levels, etc.) for narrowing log queries within a time range. Call this BEFORE GetLogs to discover which dimensions you can filter on.
Lists all log entries within a time range. Returns log records with timestamps, severity levels, service names, messages, and attributes. Use this for log browsing and searching across the system.
Detects services under active pressure by comparing current window against a 30-minute baseline. Use this to answer 'Where is the pressure building?', 'What's about to break?', or 'Which services are under load?'. Returns services ranked by composite pressure score with latency spikes, error surges, and traffic spikes identified.
Retrieves time-series data points for a specific chart within a time range. Returns timestamped metric values suitable for trend analysis. You MUST call GetAvailableCharts first to obtain a valid chartId.
Deep-dives into a single service: error rate, latency, top errors, top endpoints, and dependencies. Use this to answer 'Tell me about [service]' or 'How is [service] doing?'.
Gets the service dependency map with per-service health, latency, error rates, and inter-service dependencies. Use this to answer 'Show me the services', 'What services are running?', or understand system topology.
Shows the top 20 slowest endpoints ranked by P99 latency. Use this to answer 'What's slow?', 'Which endpoints are the slowest?', or 'Show me the bottlenecks'.
Gets overall system health status including per-service states, error rates, Apdex score, and top errors. Use this FIRST to answer 'Is everything ok?', 'How is the system?', or check overall status. If status is 'critical' or 'degraded', follow up with GetDiagnosis for root-cause details.
Retrieves a single trace entry (root span) by its OpenTelemetry span ID. Returns full details: service name, operation name, duration, HTTP status code, and all span attributes. Use a spanId obtained from GetTraces results.
Retrieves all error records for a specific distributed trace by its OpenTelemetry trace ID. Returns spans with error status codes, exception events, or failed HTTP responses (4xx/5xx). PREFER GetDiagnosis first for grouped error analysis across all traces. Use this for raw error records of a specific trace (e.g., from a sampleTraceId returned by GetDiagnosis). For full exception details and stack traces, call GetTraceSpanEvents with a spanId taken from the error records.
Returns all available filter facets (service names, HTTP methods, status codes, span kinds, etc.) for narrowing trace queries within a time range. Call this BEFORE GetTraces to discover which dimensions you can filter on.
Retrieves all log entries (structured logs emitted during a trace) for a specific distributed trace by its OpenTelemetry trace ID. Returns log records with timestamps, severity levels, messages, and attributes. Use this to see application logs that occurred during a specific request flow.
Retrieves all events attached to a specific span by its OpenTelemetry span ID. Span events include: exception events (name, message, stack trace), log entries emitted during the span, and custom annotations. Each event has a timestamp, name, and key-value attributes. This is the primary way to find stack traces and exception details for a failing span.
Retrieves all key-value tags (OpenTelemetry span attributes) for a specific span by its span ID. Tags include: HTTP metadata (method, URL, status code, route), database queries (db.statement, db.system), messaging attributes (messaging.system, messaging.destination), error details, and custom application tags. Use a spanId obtained from GetTraceSpans results.
Lists all spans belonging to a distributed trace by its OpenTelemetry trace ID. Shows the full call tree across services: parent-child span relationships, service names, operation names, durations, and status codes. Use this to understand the flow of a request through microservices. To get tags/attributes for a specific span, use GetTraceSpanTags. To get events (logs attached to spans), use GetTraceSpanEvents.
Lists all root trace entries (top-level distributed requests) within a time range. Returns trace IDs, service names, operation names, durations, status codes, and timestamps. PREFER GetSystemHealth or GetDiagnosis first for high-level views. Use this for detailed trace browsing when you need specific traces by time range. To drill into the child spans of a trace, pass the traceId to GetTraceSpans. To see errors in a trace, use GetTraceErrors.
Analyses latency, error rate, and throughput trends by comparing recent performance against a baseline. Use this to answer 'Is latency getting worse?', 'Are error rates trending up?', or 'Is the system degrading?'. Returns per-service trend classification (improving/stable/degrading) with percent-change breakdowns.
No tool annotations (readOnlyHint, idempotentHint, destructiveHint). All tools are read-only but LLM cannot infer this from schema. Annotations enable safer agent planning.
Optional parameters (rangeStart, rangeEnd) lack defaults and constraints. Tools like GetSystemHealth accept optional time ranges but do not document default behavior (15 min ago, now) in schema, only in description text.
No pagination or result limits documented. Tools like GetTraces, GetLogs, GetTraceSpans may return unbounded lists. LLM cannot know when to paginate or how many results to expect.