Summary
apm-health-summary Installation Command Prompt $ npx skills add https://github.com/elastic/example-mcp-app-observability --skill apm-health-summary
elastic/example-mcp-app-observability · Archived
Get a cluster-level rollup of service health from APM telemetry — the "how's my environment right now?" entry point for observability investigations. Use whenever the user asks about HEALTH, STATUS, or general wellbeing of an environment / cluster / namespace ("how's my cluster", "status of the X env", "what's broken", "any issues", "show me the health of …", "give me a status report", "what should I look at", "things feel slow"). This applies regardless of any time qualifier — "show me the hea…
npx skills add elastic/example-mcp-app-observability --skill apm-health-summary
apm-health-summary Installation Command Prompt $ npx skills add https://github.com/elastic/example-mcp-app-observability --skill apm-health-summary
This repository is archived — consider an actively maintained alternative.
Assess the impact of a Kubernetes node going offline — which deployments lose all replicas (ful…
9 installsThe agent's Elastic-access primitive. Four modes: wait for an ML anomaly to fire, poll an ES|QL…
8 installsQuery Elastic ML anomaly detection results to understand what's behaving unusually, why, and ho…
8 installsMap the application topology from APM telemetry — which services call which, over what protocol…
8 installsRelated neighbors and high-traction skills in the same topics — useful to compare before installing.
call-summary Installation Command Prompt $ npx skills add https://github.com/anthropics/knowled…
2.5K installsGo back through the previous year of work and create a Notion doc that groups relevant links in…
1.5K installs会议纪要整理工作流:汇总指定时间范围?
668.7K installs会议纪要整理工作流:汇总指定时间范围?
431.1K installsSummarizes WeChat group chat highlights into a structured digest using the local wx-cli binary …
8.8K installs会议纪要整理工作流:汇总指定时间范围?
3.8K installsOther skills from elastic/example-mcp-app-observability.
npx skills add elastic/example-mcp-app-observability
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Files included with this skill beyond the listing page.
SKILL.md
10,989 B
SUMMARY.md
929 B
This is the first tool to reach for in vague-symptom investigations — "something feels off, where should I look?" It gives you a one-shot rollup: degraded services, top resource consumers, active anomalies, and a data_coverage report showing what backends contributed. From there, you pick the right follow-up tool.
| Signal | Required? | What happens without it |
|---|---|---|
| Elastic APM | Required | Tool returns a warning and suggests ml-anomalies/observe/manage-alerts instead. |
| Kubernetes (kubeletstats) | Optional | pods section is replaced by a note; service health still reported. |
| ML anomaly jobs | Optional | anomalies section is replaced by a note; service health still reported. |
If the user is log-only or metrics-only (no APM), do not call this tool. Suggest ml-anomalies (for ML-backed anomaly detection) or observe / manage-alerts (both universal).
| Tool | Purpose |
|---|---|
apm-health-summary |
The rollup. First call in most investigations. |
ml-anomalies |
Drill into anomalies flagged in the summary. |
apm-service-dependencies |
Map topology around any degraded service. |
k8s-blast-radius |
If the summary implicates a node (pod resource pressure), assess node impact. |
observe |
Post-investigation: observe for stabilization or follow-on anomalies. |
{
"cluster": "prod-us-east",
"namespace": "otel-demo",
"lookback": "1h"
}
cluster: pass whenever the user names a cluster (even partially) — "the oteldemo cluster", "how's prod-us-east doing", "check the staging env". Use the user's literal phrasing; the tool fuzzy-matches it. Omit only when the user clearly wants a cross-cluster view or there's a single cluster in the env.namespace: pass when the user scopes to a K8s namespace. Same fuzzy-match logic as cluster.When the user-supplied cluster or namespace matches multiple candidates (or none), the tool does not run the analysis. It returns a short response with disambiguationneeded set to "cluster", "namespace", or "clusterand_namespace", plus the candidate list:
{
"disambiguation_needed": "cluster",
"cluster_requested": "oteldemo",
"cluster_candidates": ["oteldemo-prod", "oteldemo-staging"],
"cluster_match": "multiple"
}
When you see this, don't re-call the tool with a guessed cluster name. Surface the candidates to the user verbatim, ask which one they meant, then re-call the tool with the exact name they pick. Same flow for namespace_match: "none" (the requested name doesn't exist in recent telemetry) — show candidates and ask.
lookback: default 1h for any unqualified prompt — "what's the status of X", "how is X doing", "check on X", "give me a status report". Don't drop to 15m unless the user explicitly says something time-localized like "right now / this second / this minute". Use the user's time window literally when they give one ("over the past 30 minutes" → 30m; "in the last 6 hours" → 6h; "today" → 24h). The 1h default is intentional — most cluster-state questions need a window wide enough to surface degradation patterns, and 15m hides slow-burning issues.job_filter: optional ML-job prefix, e.g. k8s-. Rarely needed.exclude_entities: optional wildcard to hide known noise, e.g. chaos-*.The tool renders an inline MCP App view — status badge, scope card (cluster › namespace › service/pod counts plus an applications strip), KPI tile rows, anomaly-severity donut + heatmap, top memory pods, service throughput list, and a next-step button row driven by investigation_actions. Use the view for the visual rollup; narrate findings below it.
Inspect data_coverage first — this tells you which signals contributed.
The scope field anchors what the user is looking at — start narration with it when present: "Looking at cluster prod-us-east, namespace payments, 12 services across 42 pods…". When scope.service_groups is populated the view shows clickable application chips users can toggle to filter the page client-side (throughput rows, top pods, anomaly heatmap, donut counts all recompute). Don't suggest re-running the tool when the user wants to narrow to one application — point them at the chips instead. Only re-call with a different cluster / namespace when they're crossing the scope boundary.
Ignore setupnotice if present in the response — it's view-side chrome (welcome banner / skill-gap hint) that the UI handles. Don't echo or summarize it in chat.
Then walk the output top-down:
healthy / degraded / critical): lead with this.alerts field, always emitted): activecount / recoveredcount plus toprules and activesamples. Read these before reaching for manage-alerts — the rollup already shows what fired and why. Only call manage-alerts when the user wants to create/modify rules (not just see what fired). Cross-reference active alerts with degraded services: a pod-memory alert on the same pod that's degrading is a strong signal.slos field, always emitted): authoritative source for "is this cluster meeting its objectives?". configured: false means no SLOs exist — surface the note once and move on. configured: true gives you violatedcount, healthycount, and topviolations[] with each violated SLO's current slivalue, target, and onehourburnrate. Read burn rate hard: > 14.4× means the rolling-window error budget burns out in <2h at the current rate (page-worthy); 6–14× is degrading; < 1× is safe pace. Cross-reference topviolations[].name with degraded_services[] — services that appear in both are the priority drilldowns. Don't suggest creating SLOs if configured: true; do suggest it if configured: false.investigation_actions as clickable prompts (drill into thetop pod, investigate the degraded service, check blast radius). Mention them in chat so the user knows.
Based on what you see, pick the next tool:
apm-service-dependencies first. This is the highest-yield drilldown for a known-degraded service in almost every cluster. The topology map points directly at upstream/downstream root causes (slow gRPC dependency, hung leaf node, fan-out timing). Don't reach for ml-anomalies first — most clusters don't have anomaly jobs configured for arbitrary services, and you'll waste a turn on an empty result.ml-anomalies is a complementary, not primary, drilldown. Use it when (a) the user wants anomaly detail on a known-degraded service AND datacoverage.mlanomalies is true, OR (b) the user is investigating a vague symptom and wants detection. If datacoverage.mlanomalies is false, skip ml-anomalies entirely — there are no jobs to query.ml-anomalies and it returns empty / no-jobs for the entity, fall back to apm-service-dependencies for that same service immediately. Don't leave the user at a dead end.ml-anomalies with matching lookback (this is the "lots of anomalies, what's worst?" path — different from the named-degraded-service path above).k8s-blast-radius with that node name.data_coverage. If K8s is absent, don't suggest k8s-blast-radius. If APM is absent, don'tcall this tool at all.
degraded thresholds. Always scan the details.
or ML signals; just report what you have.
Multi-tool investigations should be sequential and narrated, not parallel and silent. Each tool call renders its own widget in the chat — firing 4-5 in a row after a single "yes" creates a wall of "Waiting…" placeholders that look like the system is broken.
alerts.toprules, don't call manage-alerts. If they ask "what's anomalous?" — answer from anomalies.topentities, don't call ml-anomalies for the same data.