endpoint-aiops-mcp
This server provides governed AI-ops for managed-endpoint fleets: inventory, health, login-storm analysis, drift/patch compliance, and reversible remediation, all with audit logging and undo tracking.
Fleet overview: one-shot health triage (online/offline, stale, version spread).
Inventory: list endpoints, get details by ID, compute per-endpoint health scores (0-100).
Session analysis: list login/boot sessions; detect login storms and rank slowest contributors.
Drift & patch compliance: report drift from baseline, patch-level distribution, and SLA compliance checks.
Remediation writes: assign config profiles (reversible) and request endpoint reboots (audited, no undo).
Undo management: list recorded undo tokens and apply them (with dry-run preview).
Governance: every tool logs audit rows, risk tiers, and reversible writes capture before-state.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@endpoint-aiops-mcpCheck for patch drift in the fleet"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Endpoint AIops
Disclaimer: Community-maintained open-source project. Not affiliated with, endorsed by, or sponsored by any endpoint-management vendor. Product and trademark names belong to their owners. MIT licensed.
Governed AI-ops for managed-endpoint fleets — thin clients, VDI endpoints,
and other centrally-managed devices — with a built-in governance harness:
unified audit log, token/runaway budget guard, undo-token recording, and
descriptive risk tiers. Vendor-neutral: it talks to an
endpoint-management server's REST API (Bearer auth) through a configurable
dialect — see Dialects. Self-contained: no
dependencies beyond httpx and the MCP SDK. The test suite is mock-based; the
endpoint-management REST paths have not yet been exercised against a live
management server — see docs/VERIFICATION.md.
What it does
Two signature analyses, plus the guarded reads and writes around them:
Login-storm analysis — during a "everyone logs in at 9am" incident, detect the storm (bursts of concurrent logins in a sliding window) and rank the endpoints/users dragging login and boot times. Every flag is reported with its number, not a black-box verdict.
Patch / config drift — find endpoints that have drifted from the fleet (outdated patch level, stray agent version, divergent OS build or config profile). With no declared baseline it derives one by fleet majority, so it works before a gold image exists.
Related MCP server: aiops-mcp
What works
CLI (
endpoint-aiops ...):init,overview,endpoint list/get/assign-profile/reboot,session list/storm,drift report/patch,secret set/list/rm/migrate/rotate-password,doctor,mcp.MCP server (
endpoint-aiops mcporendpoint-aiops-mcp): 13 tools (10 read, 3 write), every one wrapped with the bundled@governed_toolharness.Encrypted credentials: the management-server API key lives in an encrypted store
~/.endpoint-aiops/secrets.enc(Fernet + scrypt) — never plaintext on disk. Unlock with a master password fromENDPOINT_AIOPS_MASTER_PASSWORD(MCP/CI) or an interactive prompt (CLI).Reversibility:
endpoint_assign_profile(highrisk) captures the prior profile and records an inverse "reassign the prior profile" undo descriptor.endpoint_reboot(mediumrisk) captures the prior online state for the audit record but declares no undo (a reboot has no safe inverse).Safety: state-changing CLI ops (
endpoint assign-profile,endpoint reboot) require double confirmation and support--dry-run.
Capability matrix (13 MCP tools)
Category | Tools | Count | R/W |
Overview |
| 1 | read |
Inventory |
| 3 | read |
Sessions |
| 2 | read |
Drift |
| 3 | read |
Remediation |
| 1 | write (high) |
| 1 | write (medium) | |
Undo |
| 1 | read |
| 1 | write (medium) |
The analysis tools (login_storm_analysis, drift_report, patch_status,
patch_compliance, endpoint_health_score) accept injected records for
pure/offline analysis; endpoint_health_score and patch_compliance are
injected-only, the others also pull live from a configured target.
What this tool does, and does not, decide
It delivers managed-endpoint operations — reads and writes — accurately and efficiently, and records every one of them. It does not decide whether a write is allowed to happen. That is the agent's judgement, or the permission of the account you connect it with: give it a management-console account or API token scoped to a read-only role and the writes fail at the server — the place that actually owns the permission.
So there is no read-only switch, no policy file, no approval gate to configure.
The one thing the tool guarantees is that nothing is silent: every call, over
MCP and over the CLI alike, lands an audit row in ~/.endpoint-aiops/audit.db,
and reversible writes still capture their before-state and record an inverse
where one exists.
Each tool declares a
risk_level, kept in agreement with its[READ]/[WRITE]documentation tag by a test, and carried into the audit row as a descriptive tier — so a reviewer can see at a glance that a row was a high-risk write. It is a label, not a gate.
Running a smaller / local model? See agent-guardrails.md — it lists the guardrails this tool now enforces for you (so you don't spend prompt budget restating them) and gives a ready-made system prompt for what's left.
Payload conventions
Absent is not empty. A field the management server did not report comes back as
null, never as""— the key is always present, so a missing patch level cannot be mistaken for a blank one.Capped lists announce themselves. Any list a
limitcan cut short is a truncation envelope:{"items": [...], "returned": N, "limit": L, "truncated": bool}, withtruncatedmeasured rather than inferred. Companion totals (driftedCount,behindCount,nonCompliantCount,stormCount, the healthsummary) are always the full, uncapped figures.
Quick start
As a Claude Code plugin
One install gives an agent both the skill and the MCP server:
/plugin marketplace add AIops-tools/marketplace
/plugin install endpoint-aiops@aiops-toolsThe MCP server is fetched with uv and pinned to the
package version this plugin declares, so an audit row can be traced back to the
code that wrote it. Credentials are still configured with endpoint-aiops init — see below.
As an OpenClaw plugin
The same bundle is published on ClawHub, where one install delivers the skill and its MCP server together:
openclaw plugins install clawhub:@zw008/endpoint-aiops
openclaw skills info endpoint-aiops # expect: Visible to model: yesRestart the OpenClaw gateway afterwards so it loads the plugin. The MCP server is
fetched with uv, pinned to this exact release, so
uvx has to be on PATH — without it the skill still installs but reports
Visible to model: no. Credentials are configured exactly as below.
As a CLI or standalone MCP server
uv tool install endpoint-aiops # or: pipx install endpoint-aiops
endpoint-aiops init # wizard: add a target + store its API key (encrypted)
endpoint-aiops doctor # verify config, secrets, connectivity
endpoint-aiops overview # one-shot fleet health
endpoint-aiops session storm # detect a login storm + slow contributors
endpoint-aiops drift report # endpoints drifted from the fleet baselineRun as an MCP server (stdio):
export ENDPOINT_AIOPS_MASTER_PASSWORD=... # unlock secrets non-interactively
endpoint-aiops-mcpWhere that password then lives: an exported variable is readable by every process this shell starts and is recorded by shell history. On a shared or long-lived host, prefer the interactive prompt, or inject it from a secret manager for the life of the one command that needs it.
Governance
Every operation — MCP and CLI — passes through the bundled @governed_tool
harness. It records; it does not authorize (see above).
Audit — every call (params, result, status, duration, risk tier, and any operator-supplied approver/rationale) is logged to
~/.endpoint-aiops/audit.db(relocatable viaENDPOINT_AIOPS_HOME). The CLI writes the same row the MCP path does — there is no unaudited entry point.Runaway guard — a safety backstop, not an authorization gate: the same call hammered in a tight loop trips a circuit breaker so a stuck agent can't burn unbounded calls/time. Disable with
ENDPOINT_RUNAWAY_MAX=0; optional hard ceilings viaENDPOINT_MAX_TOOL_CALLS/ENDPOINT_MAX_TOOL_SECONDS.Undo recording — reversible writes record an inverse descriptor built from the fetched before-state.
Risk tier — a descriptive label on the audit row derived from
risk_level; it gates nothing.
Scope
This is the IT-endpoint member of the AIops-tools family (governed AI-ops
with audit + budget + undo + risk tiers). For OT / industrial edge
(Modbus, OPC-UA, PROFINET, …) see the separate industrial-aiops line.
Dialects — which server are you actually pointing at?
A dialect is the management server's API shape: resource paths, response
field names, the transport defaults (port + API base path), and how to
authenticate. Set it per target in config.yaml; endpoint-aiops init asks
for it and prints which one it configured.
Dialect | Transport | Auth | Status |
|
| static Bearer API key | Neutral placeholder — not a real vendor API. Useful only once you describe your server's paths in a |
|
| HTTP Basic login → | Documented-but-unverified dialect for IGEL UMS (IMI). This is not a claim that IGEL is supported — see Status. |
targets:
- name: ums1
host: ums.example.local
dialect: igel-ums # IMI paths, port 8443, /umsapi/v3, Basic-login auth
username: ums-admin # UMS account; the password lives in secrets.enc
scheme: https # or 'http' for a reverse-proxied server
verify_ssl: false # self-signed lab UMS onlyThe generic default is not an IGEL configuration and never was: IGEL
serves IMI at /umsapi/v3 on 8443, so a target left on the generic shape 404s
on its first probe. That mismatch is why the preset exists.
Where a server genuinely has no such resource, the dialect says so rather than
guessing a URL — IMI exposes no login/boot session resource, so session_list
and login_storm_analysis on an igel-ums target return a teaching error
naming the absent resource instead of calling an invented path.
A dialect selects the auth scheme too, not just paths — IMI rejects the
static Bearer token the generic dialect sends, so it logs in with HTTP Basic at
POST /umsapi/v3/login and carries the returned JSESSIONID cookie (once per
connection, then cached). Because the scheme comes from the dialect, a
credentials failure and a wrong-dialect failure are reported differently: a
401 names the scheme presented and, when the server sends a WWW-Authenticate
challenge, the scheme it actually wants — so a dialect mismatch does not send
you off rotating a perfectly good key.
⚠️ Note for IGEL specifically: a UMS account with too few permissions receives
empty lists rather than a 403. endpoint-aiops doctor authenticates as a
step separate from its reachability probe and warns when a successful login
returns no endpoints, because "no devices" and "not allowed to see the devices"
are otherwise indistinguishable.
Status
The test suite is mock-based. No dialect in this package has been exercised against a real management server, so this package does not claim support for any specific product — including IGEL.
genericis a placeholder shape, not a vendor API.igel-umsis a documented-but-unverified dialect. Its paths and field aliases are modelled from IGEL's published IMI documentation; its auth scheme is documented in the IMI manual and matches what three independent real-world IMI clients do. Neither has been run against an appliance by this project — IGEL UMS has no free edition, so it cannot be verified on the maintainer's hardware.
Both are recorded as UNKNOWN-pending-live in
docs/VERIFICATION.md, which ranks what a live run is
most likely to find wrong and defines the checklist it must cover. If you have a
UMS and run that checklist, the results are very welcome as an issue. Missing a
capability or a server dialect? Open an issue or PR — contributions welcome.
Available Tools
13 toolsdrift_reportARead-only
[READ] Report endpoints drifted from a per-field baseline (patch/agent/OS/profile).
Answers "which endpoints have drifted from the fleet?" With no baseline it derives one by fleet majority (the most common value per field is treated as intended), so it works before any gold image is declared. Pass 'endpoints' for pure analysis, or a target to pull live inventory.
Args: baseline: Field→intended-value map; omit to derive the fleet majority. fields: Inventory fields to check (default agentVersion, patchLevel, osBuild, profileId). endpoints: Injected inventory rows; skips live collection. target: Endpoint-management target name from config; omit for the default. limit: Max drifted endpoints to return (default 200).
Returns dict: {totalEndpoints, baselineSource, baseline, fieldsChecked, driftedCount, compliantCount, driftByField, driftedEndpoints:{items[], returned, limit, truncated}}. driftedCount is the full count; when driftedEndpoints.truncated is true, re-run with a higher limit.
Example: drift_report(endpoints=[{"hostname":"tc01","patchLevel":"2026-06"}, {"hostname":"tc02","patchLevel":"2026-05"}]).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| fields | No | ||
| target | No | ||
| baseline | No | ||
| endpoints | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description goes well beyond that: it explains the fleet-majority baseline derivation algorithm, that it functions without a declared gold image, that injected endpoints skip live collection, and that truncated results require re-running with a higher limit. This is exactly the behavioral context the annotation cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the [READ] tag and the one-line purpose, then moves to usage, args, return shape, and a concrete example. Given the absence of schema descriptions and an output schema, every block earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% parameter coverage, the description compensates fully by documenting the return dict fields (baselineSource, driftedCount vs driftedEndpoints.items, truncation) and the truncation recovery path, so an agent has everything needed to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: all five parameters (baseline, fields, endpoints, target, limit) are explained with their semantics and defaults, including what omitting baseline triggers and that endpoints is an injection bypass of live collection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — reporting endpoints whose fields have drifted from a baseline — and narrows the concept with '(patch/agent/OS/profile)'. An agent can distinguish this drift analysis from patch_status or patch_compliance, though no sibling is named explicitly, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: it answers 'which endpoints have drifted from the fleet?' and explains that passing 'endpoints' yields pure analysis while a 'target' pulls live inventory, and that it works before any gold image exists. It does not, however, state when to prefer this over patch_compliance or endpoint_health_score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endpoint_assign_profileADestructive
[WRITE][risk=high] Assign a config profile to an endpoint (reversible).
Captures the prior profile before switching, so the harness records an undo (reassign the prior profile) and a faithful audit trail. Pass dry_run=True to preview: it resolves the same path and reads the same before-state as the real call, so it reports the profile that would actually be replaced and refuses on the same grounds the write would.
Args: endpoint_id: Endpoint id as returned by endpoint_list. profile_id: Config profile to assign. dry_run: If True, preview without assigning. target: Endpoint-management target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No | ||
| profile_id | Yes | ||
| endpoint_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, idempotentHint=false, destructiveHint=true; the description adds substantial extra context the annotations cannot carry: it discloses that the prior profile is captured before switching, that an undo record and audit trail are produced, and exactly how dry_run differs from the real call. This is well beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The write/risk tag and the one-line purpose are front-loaded, the behavior paragraph follows, and the Args block closes it. Every sentence earns its place and none restates schema or annotation content verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-risk write tool with no output schema, the description supplies the missing pieces an agent needs: reversibility, the automatic undo/audit behavior, and precise dry-run semantics. Nothing required to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it documents all four parameters, including the useful cross-reference that endpoint_id comes from endpoint_list and that target may be omitted for the default. The explanations are brief (e.g. profile_id is just 'Config profile to assign'), leaving a little room for richer semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Assign a config profile to an endpoint') and immediately qualifies the operation with [WRITE][risk=high] and '(reversible)'. An agent can distinguish this mutation from read siblings like endpoint_get or endpoint_list without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete guidance on the preview path (dry_run=True resolves the same path, reads the same before-state, refuses on the same grounds) and explains the undo relationship, which frames when to use this versus just writing. It does not, however, name an explicit alternative tool or state when NOT to use this call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endpoint_getARead-only
[READ] One managed endpoint by id, normalised to the stable shape.
Args: endpoint_id: Endpoint id (or uuid/mac) as returned by endpoint_list. target: Endpoint-management target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| endpoint_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this is a safe read, and '[READ]' merely repeats it. The description does add genuine context with 'normalised to the stable shape' (a return-shape promise in the absence of an output schema) and the target-default behavior, but says nothing about not-found errors or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by a compact args block; every element is functional. The redundant '[READ]' tag is the only waste, since the annotation already conveys read-only status.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read with no output schema, the description covers the call mechanics and hints at the response shape. It stops short of describing failure modes, target resolution errors, or what 'stable shape' concretely contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it largely does: endpoint_id accepts 'id (or uuid/mac)' and target is an endpoint-management target name from config with a documented default of omit-for-default. Only minor gaps remain, such as id format examples or validation behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One managed endpoint by id') plus the output guarantee ('normalised to the stable shape'), which is more than a restatement of the name. It references endpoint_list as the id source, giving implicit sibling separation, but never explicitly contrasts itself with that list tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through 'endpoint_id ... as returned by endpoint_list', which tells the agent to obtain ids from the sibling list tool first. There is no explicit when-not-to-use guidance or handling for a missing/invalid endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endpoint_health_scoreARead-only
[READ] Composite per-endpoint health score (0-100), worst endpoints first.
Answers "which endpoints are worst?" by folding the fleet signals into one ranked view: it deducts points for each risk signal (offline, stale, patch-behind, agent-behind) and cites every deduction in the endpoint's 'reasons'. Pure analysis over injected inventory rows (the shape from endpoint_list) — no live connection is used. With no baseline, the patch and agent baselines are derived by fleet majority, so it works before a gold image is declared.
Args: endpoints: Injected inventory rows (id, hostname, online, lastSeenHours, agentVersion, patchLevel) to score. Required — no live pull. stale_hours: An endpoint whose lastSeenHours >= this is 'stale' (default 24). baseline: Intended {'agentVersion', 'patchLevel'}; omit to derive the fleet majority. limit: Max worst-first endpoints to return (default 50).
Returns dict: {endpointsEvaluated, baseline:{agentVersion, patchLevel, source}, summary:{healthy, degraded, critical}, worst:{items:[{endpoint, score, band, reasons[]} ...worst-first], returned, limit, truncated}, note}. The summary always counts the whole fleet; when worst.truncated is true, re-run with a higher limit to see further down the ranking.
Example: endpoint_health_score(endpoints=[ {"hostname":"tc01","online":True,"agentVersion":"12.6","patchLevel":"2026-06"}, {"hostname":"tc02","online":False,"agentVersion":"12.5","patchLevel":"2026-05"}]).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| baseline | No | ||
| endpoints | Yes | ||
| stale_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description adds substantial behavioral context beyond that — the deduction model and cited 'reasons', the fact that no live pull occurs, the fleet-majority baseline derivation when no baseline is supplied, and the truncation/re-run semantics. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then progressively deeper detail in Args/Returns/Example blocks. The length is justified by zero schema coverage and no output schema — each section supplies information the structured fields lack. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully documents the return dict shape (endpointsEvaluated, baseline, summary bands, worst.items, truncated, note) and explains the truncation workflow. Combined with the example, an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it enumerates the expected endpoint row fields (id, hostname, online, lastSeenHours, agentVersion, patchLevel), defines stale_hours semantics and default, explains baseline omission behavior, and defines limit's worst-first truncation. All four parameters are meaningfully specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+output shape: 'Composite per-endpoint health score (0-100), worst endpoints first.' This is clearly distinguishable from siblings like patch_status, drift_report, and overview, which cover narrower or different scopes. An agent knows exactly what it gets back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case ('which endpoints are worst?') and states a critical usage constraint: it is pure analysis over injected inventory rows shaped like endpoint_list output, with no live connection. It doesn't explicitly name an alternative sibling (e.g., overview vs drift_report) for adjacent questions, which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endpoint_listARead-only
[READ] List all managed endpoints (id, hostname, OS, agent/patch, online).
Args: target: Endpoint-management target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the '[READ]' tag merely restates it. The description adds no behavioral detail beyond the annotation — nothing about scope, pagination, or filtering for what could be a long list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and returned fields, followed by a compact Args line. No filler sentences; every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the returned fields, and the single optional parameter is explained. It stops short of covering list size/pagination behavior, but for a simple read-list tool it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (the schema gives only 'string', default null), so the description carries the full burden and delivers: it explains target is an endpoint-management target name from config and that omitting it uses the default. That is meaningful guidance the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all managed endpoints') and enumerates the returned fields, which implicitly separates it from single-endpoint siblings like endpoint_get and endpoint_health_score. No sibling is named explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '[READ] List' framing and the target parameter note imply the listing use case, but there is no explicit when-to-use, when-not-to-use, or routing to alternatives such as endpoint_get or overview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
endpoint_rebootADestructive
[WRITE][risk=medium] Request an endpoint reboot (no safe inverse).
Records the endpoint's prior online state for the audit trail; a reboot cannot be undone, so no undo descriptor is offered. Pass dry_run=True to preview — for an operation with no inverse, knowing whether the endpoint is even online (and how long since it was last seen) before committing is the whole value of asking first.
Args: endpoint_id: Endpoint id as returned by endpoint_list. dry_run: If True, preview without rebooting. target: Endpoint-management target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No | ||
| endpoint_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely new context: prior online state is recorded for the audit trail, the action cannot be undone so no undo descriptor exists, and dry_run provides a preview path. It stops short of stating permission/auth requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The [WRITE][risk=medium] tag is front-loaded and the key constraint ('no safe inverse') appears in the first sentence. The dry_run rationale sentence is somewhat padded ('the whole value of asking first'), but the Args block is tight and earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description would ideally mention the return shape of a dry_run preview (does it report online state and last-seen duration?), but it does cover safety, reversibility, param semantics, and preview behavior adequately for a destructive single-action tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden, and it documents all three parameters: endpoint_id (with provenance 'as returned by endpoint_list'), dry_run (preview semantics), and target (config target name, omit for default). This is a solid compensation for the empty schema, though target's description is terse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Request an endpoint reboot' — and immediately scopes it ('no safe inverse'). It does not explicitly contrast itself with any sibling that performs a similar action, though its reference to endpoint_list for id provenance ties it into the toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description frames when to use dry_run=True ('knowing whether the endpoint is even online before committing'), which is useful implied usage. However, it never states when to reach for endpoint_reboot versus other endpoint-management siblings such as endpoint_assign_profile, so alternative-based guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
login_storm_analysisARead-only
[READ] Detect login storms + rank the slowest login/boot contributors.
Answers "is this a morning login storm, and which endpoints/users are dragging login and boot times?" Groups logins into storm episodes (>= min_concurrent within a window_s sliding window) and flags sessions slower than the thresholds — every flag is reported with its number, not a verdict. Pass 'sessions' for pure analysis, or a target to pull live via session_list.
Args: since_hours: Live look-back window when sessions is omitted (default 24). window_s: Sliding window that defines "concurrent" logins (default 300). min_concurrent: Logins within a window that constitute a storm (default 10). slow_login_ms: Login duration (ms) flagged as slow (default 30000). slow_boot_ms: Boot duration (ms) flagged as slow (default 90000). sessions: Injected session records — {endpoint, user, login_ms, boot_ms, timestamp (ISO-8601), result}; skips live collection. target: Endpoint-management target name from config; omit for the default. limit: Max rows in each returned list (default 25).
Returns dict: {totalSessions, sessionsReceived, inputTruncated, stormCount, storms:{items:[{start, end, count, peakConcurrent, spanS, distinctUsers, distinctEndpoints, avgLoginMs}], returned, limit, truncated}, slowLoginCount, slowestByLogin:{items[], ...}, slowestByBoot:{items[], ...}, failedLogins, thresholds}. Each list is a truncation envelope — when its 'truncated' is true, re-run with a higher limit; stormCount is the full episode count.
Example: login_storm_analysis(sessions=[{"endpoint":"tc01","user":"a", "login_ms":42000,"timestamp":"2026-07-12T08:00:00Z"}, ...]).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No | ||
| sessions | No | ||
| window_s | No | ||
| since_hours | No | ||
| slow_boot_ms | No | ||
| slow_login_ms | No | ||
| min_concurrent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation: it discloses that every flag carries a number rather than a verdict, that each returned list is a truncation envelope, that re-running with a higher limit is the remedy, and that stormCount is the full episode count. This is unusually rich behavioral context for a read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the question answered, then structured Args/Returns/Example sections where nearly every line carries information. It is long, but the length is justified by the 8 params and the missing output schema; a slightly tighter Returns section would be the only trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 8 undocumented params, the description supplies the full return envelope (stormCount, storms items shape, truncation flags, thresholds) and an example call, leaving nothing an agent needs to invoke or interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage across 8 parameters, the description fully compensates: each arg is documented with its meaning, default, and semantics (e.g. window_s defines 'concurrent', min_concurrent defines a storm, sinced_hours applies only when sessions is omitted). The single biggest schema gap is closed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resources: 'Detect login storms + rank the slowest login/boot contributors,' and frames the exact question it answers. This clearly distinguishes it from siblings like session_list or overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two operating modes ('Pass sessions for pure analysis, or a target to pull live via session_list'), routing the agent between injected-data analysis and live collection. It stops short of explicit when-not/alternative guidance for cases like simple session lookup, so it does not reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overviewARead-only
[READ] One-shot fleet health: online/offline, stale endpoints, version spread.
Call this first to triage a managed-endpoint fleet before drilling into a specific endpoint, login storm, or drift report.
Args: target: Endpoint-management target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so safety is covered. The description adds the '[READ]' tag and the 'one-shot' behavioral note (single call returns a fleet summary), but it says nothing about cost, pagination, or data freshness — it is adequate rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and a bracketed mode tag, then scope, then usage, then args. No sentence is redundant and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one optional param, no output schema, and only a readOnly annotation, the description supplies purpose, triage role, and parameter meaning — enough to invoke correctly. Missing only minor details like whether output is paginated or refreshable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single optional parameter with 0% schema description coverage, so the description must explain 'target'. It does: 'Endpoint-management target name from config; omit for the default', covering meaning and default behavior. It does not clarify accepted target formats, but the core semantics are conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'One-shot fleet health: online/offline, stale endpoints, version spread.' It names exactly the aspects reported, so the agent knows the scope is an aggregate fleet snapshot rather than a per-endpoint call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this first to triage a managed-endpoint fleet before drilling into a specific endpoint, login storm, or drift report' — which names the alternatives (endpoint_get, login_storm_analysis, drift_report) and the sequencing rule. That is precisely the when/when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_complianceARead-only
[READ] Patch-compliance SLA measure: % of the fleet on the target patch level.
Reframes patch_status (the patch-level distribution) as an SLA/compliance verdict: what fraction of the fleet is on the target level, whether that meets the SLA, and which endpoints are non-compliant. Compliance is an exact string match on patchLevel — a transparent check, not a version-semantics parser. Injected-only: pass 'endpoints' (inventory rows); no live collection.
Args: endpoints: Injected inventory rows to evaluate (e.g. from endpoint_list). target_patch: Desired patch level; omit to use the fleet-majority level. sla_pct: Compliance SLA threshold percent; default 95.0. limit: Max non-compliant endpoints to return (default 200).
Returns dict: {endpointsEvaluated, targetPatch, targetSource, slaTargetPct, complianceRatePct, compliantCount, verdict, nonCompliantCount, nonCompliant:{items[], returned, limit, truncated}, note}. The rate is always computed over the whole fleet, never over the capped list.
Example: patch_compliance(endpoints=[{"hostname":"tc01","patchLevel":"2026-06"}, {"hostname":"tc02","patchLevel":"2026-05"}], target_patch="2026-06").
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| sla_pct | No | ||
| endpoints | Yes | ||
| target_patch | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already covering safety, the description adds substantial behavior: injected-only operation requiring caller-supplied inventory, exact string-match semantics on patchLevel ('not a version-semantics parser'), and the truncation invariant that the rate is always over the whole fleet, never the capped list. These are non-obvious traits no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verdict and the distinguishing contrast first, then Args, Returns, and an Example. Every section is useful, though enumerating the full return dict key list is somewhat list-y and could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by documenting the return dict keys and the semantics of the rate computation, plus a concrete example. For a 4-param, no-output-schema tool this is fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full load, and it does: endpoints (injected inventory rows, e.g. from endpoint_list), target_patch (omit to use fleet-majority), sla_pct (default 95.0), and limit (suggested default 200). Each parameter gains meaning beyond its bare title/default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Patch-compliance SLA measure: % of the fleet on the target patch level') and explicitly distinguishes itself from its sibling by naming patch_status and explaining the reframing. An agent can tell it apart from patch_status without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly routes the agent: it explains this is a compliance-verdict view of patch_status and that the operation is injected-only ('pass endpoints ... no live collection'), pointing to endpoint_list as the source. It gives strong context but stops short of an explicit when-not-to-use rule (e.g. when to prefer raw patch_status).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_statusARead-only
[READ] Patch-level distribution + which endpoints are behind the target level.
Args: target_patch: Desired patch level; omit to use the fleet-majority level. endpoints: Injected inventory rows; skips live collection. target: Endpoint-management target name from config; omit for the default. limit: Max behind-endpoints to return (default 200).
Returns dict: {totalEndpoints, targetPatch, targetSource, distribution, behindCount, behind:{items[], returned, limit, truncated}}. behindCount is the full count; when behind.truncated is true, re-run with a higher limit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No | ||
| endpoints | No | ||
| target_patch | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the [READ] tag reinforces it. Beyond that, the description discloses real behavioral detail: passing endpoints injects inventory rows and skips live collection, and behind.truncated signals the result was capped and should be re-run with a higher limit. This is substantive context that annotations alone would not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose line is front-loaded and the Args/Returns block is scannable and free of filler. It is slightly verbose for a four-parameter read tool, but each line carries distinct information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly documents the return shape: keys, the distinction between behindCount and the returned items, and the truncation contract. The main gap is that it never states how this differs from patch_compliance or drift_report, leaving sibling selection to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema provides only titles and defaults. The description compensates fully: it explains target_patch's fallback to the fleet-majority level, endpoints' injected-inventory behavior, target's config-driven default, and limit's default of 200. Every parameter gains meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource: patch-level distribution plus identification of endpoints behind a target level. That is far more than a restatement of the name. It does not, however, distinguish itself from the sibling patch_compliance or drift_report, which an agent could plausibly confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the arg semantics: omit target_patch to fall back to the fleet-majority level, and omit target to use the configured default. But there is no explicit when-to-use-this-vs-patch_compliance guidance, no exclusions, and no mention of prerequisites such as credentials or config availability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_listARead-only
[READ] Recent login/boot sessions (endpoint, user, login_ms, boot_ms, result).
Args: since_hours: Look-back window in hours (1..720, default 24). target: Endpoint-management target name from config; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| since_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true plus the '[READ]' tag make the safety profile explicit, so the description isn't carrying that burden. It adds value by listing the returned record fields, but says nothing about result ordering, pagination, volume limits, or what 'result' encodes, and the 1..720 hour cap is the only real constraint surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the [READ] marker and resource, then a compact Args block covering both parameters. No filler sentences; every line carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description compensates by enumerating returned fields and documenting both args. It is nearly complete, though it omits ordering/pagination behavior and any note on whether the default target requires configured credentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% (the schema only carries titles and defaults), so the description must compensate and largely does: since_hours is documented with its range and default (1..720, default 24), and target is explained as an endpoint-management target name from config with the omit-for-default behavior. Only minor gaps remain, e.g., what a named target actually scopes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('[READ] Recent login/boot sessions') and enumerates the returned fields (endpoint, user, login_ms, boot_ms, result), so the agent knows exactly what comes back. It distinguishes itself functionally from login_storm_analysis and endpoint_list by being a raw session feed, but it does not explicitly route against those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Recent login/boot sessions' plus a since_hours look-back window suggests a time-bounded recent-activity query, but there is no explicit when-to-use, when-not-to-use, or named alternative (e.g., login_storm_analysis for aggregated anomaly detection). The target arg's 'omit for the default' note gives minor contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_applyADestructive
[WRITE][risk=medium] Apply a recorded undo by dispatching its inverse tool.
The inverse runs through its own governed tool, so its real risk tier is recorded there. Pass dry_run=True to preview the inverse call without executing it. A token can only be applied once.
Args:
undo_id: The undoId from undo_list (or an _undo_id in a write result).
dry_run: If True, preview the inverse tool + params without running it.
target: Passed through to the inverse tool when it accepts a target.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | ||
| dry_run | No | ||
| undo_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=false; the description adds real value on top by explaining that the actual risk tier lives with the dispatched inverse tool, that dry_run previews without executing, and that the token is single-use. It does not describe what the inverse dispatch returns or what failure looks like, so it is not maximally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The [WRITE][risk=medium] tag and the core behavior/constraint sentences are front-loaded and efficient, and the Args block is compact. The Args list partially restates schema parameter names, but each entry adds meaning, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent, destructive, three-parameter mutation with no output schema, the description supplies the missing context an agent needs: the risk marker, the once-only token rule, the preview path, and parameter sourcing. Only the result shape of the dispatched inverse call is left unspecified, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely meets it: undo_id is traced to its source (undo_list or `_undo_id` in a write result), dry_run is defined as a preview flag, and target is explained as pass-through to the inverse tool. The pass-through semantics of `target` (when it is rejected or ignored) remain somewhat vague.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Apply a recorded undo') and explains the mechanism (dispatching its inverse tool), which separates it cleanly from the sibling undo_list that only lists tokens. An agent can immediately tell what this does that its siblings do not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the context of use (apply a token obtained from undo_list or an `_undo_id` in a write result) and offers dry_run=True as the preview path, plus the constraint that a token can be applied only once. There is no explicit when-not-to-use or named alternative beyond undo_list, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undo_listARead-only
[READ] List recorded, not-yet-applied undo tokens (most recent first).
Each entry names the original tool, the inverse tool that undo_apply
would run, and a human note. Use the undoId with undo_apply.
Each entry carries effectVerified. False means the original write
lost its response, so the change it reverses is PROBABLE, not confirmed —
check the live state before applying, and do not report the result as a
restore of a state that may never have been reached.
Args: limit: Max rows to return (1..500, default 50). target: Unused (undo state is host-local); accepted for CLI uniformity.
Returns dict: {undos[], returned, limit, truncated}. One extra row is fetched, so 'truncated' is measured rather than guessed from the returned count happening to equal the limit; re-run with a higher limit when true.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| target | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the [READ] marker is consistent with that. Beyond annotations, it discloses the critical effectVerified semantic — false means the reversed change is PROBABLE, not confirmed — plus the 'one extra row fetched' truncation mechanism. This is exactly the behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the [READ] tag and purpose, then Args/Returns sections. Nearly every sentence earns its place, though the effectVerified and truncation paragraphs are dense and could be marginally tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description specifies the return shape ({undos[], returned, limit, truncated}) and explains truncated semantics. Combined with the parameter and behavioral notes, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and does so: limit is documented with range (1..500) and default (50), and target is explicitly disclosed as unused/CLI-uniformity-only. No parameter is left ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List recorded, not-yet-applied undo tokens') plus ordering ('most recent first'), which immediately distinguishes it from the sibling undo_apply that consumes the tokens. An agent can tell what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use the undoId with undo_apply,' naming the sibling that performs the action. It also gives a conditional: when effectVerified is false, check live state before applying. This is explicit when-to-use and how-to-proceed guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.10.3- Changed
drift_report1 field changed- added
Input schema / properties / limitAdded value: +{ + "default": 200, + "title": "Limit", + "type": "integer" +}
- Changed
endpoint_assign_profile1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "title": "Dry Run", + "type": "boolean" +}
- Changed
endpoint_health_score1 field changed- added
Input schema / properties / limitAdded value: +{ + "default": 50, + "title": "Limit", + "type": "integer" +}
- Changed
endpoint_reboot1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "title": "Dry Run", + "type": "boolean" +}
- Changed
login_storm_analysis1 field changed- added
Input schema / properties / limitAdded value: +{ + "default": 25, + "title": "Limit", + "type": "integer" +}
- Changed
patch_compliance1 field changed- added
Input schema / properties / limitAdded value: +{ + "default": 200, + "title": "Limit", + "type": "integer" +}
- Changed
patch_status1 field changed- added
Input schema / properties / limitAdded value: +{ + "default": 200, + "title": "Limit", + "type": "integer" +}
2 tool updates
v0.3.0- Added
undo_apply - Added
undo_list
2 tool updates
v0.2.0- Added
endpoint_health_score - Added
patch_compliance
9 tool updates
v0.1.0- First observed
drift_report - First observed
endpoint_assign_profile - First observed
endpoint_get - First observed
endpoint_list - First observed
endpoint_reboot - First observed
login_storm_analysis - First observed
overview - First observed
patch_status - First observed
session_list
TDQS
Scored across 13 tools
Most tools are distinct, but there is meaningful overlap in the fleet-analysis cluster: patch_compliance is explicitly a reframe of patch_status, drift_report and endpoint_health_score both fold the same baseline-derived signals, and overview overlaps with the list/health tools. The descriptions do a good job explaining the boundaries and relationships, which keeps agents from misselecting, but several tools answer very similar 'how is the fleet doing' questions.
Naming is consistently snake_case and resource-prefixed (endpoint_*, patch_*, session_*, undo_*, drift_report), giving a readable, predictable pattern. Minor deviations exist where action verbs and noun descriptors are mixed (endpoint_health_score, login_storm_analysis) and the bare 'overview' breaks the prefix convention, but overall it is coherent.
13 tools is well within the ideal range and each earns its place across triage, analysis, write, and undo categories. The surface is neither thin nor bloated for a fleet-management/aiops server.
The set covers read/analysis (inventory, drift, patch, health, sessions), write actions (assign profile, reboot), and a governed undo lifecycle, which is solid lifecycle coverage. Gaps remain: no profile inventory/listing tool, and no direct patch-remediation action despite heavy patch analysis, but agents can work around these.
Maintenance
Related MCP Connectors
Autonomous and governed SRE & MLOps control plane for AI agent platforms.
Enterprise AI Control Plane: governance, guardrails, spend tracking, compliance & smart routing.
Runtime AI governance: decision gates, human approval, hash-chained audit, compliance mapping.
Deterministic IT asset registry operated by AI agents over MCP. Agents propose, humans approve.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceAI Governance and SecOps platform for remote servers1-
- AlicenseAqualityBmaintenanceA self-contained, security-first, EU-sovereign unified AI-operations MCP server that fuses a live bitemporal fleet model, a drift engine, and a tiered audited actuator into one control plane.5Apache 2.0
- AlicenseAqualityAmaintenanceGoverned AI-ops for Ceph, providing root-cause health analysis and guarded destructive operations via a built-in governance harness with risk tiers, audit, and undo recording.37MIT
- AlicenseAqualityAmaintenanceGoverned network controller-layer operations (Cisco Meraki, plus Catalyst Center / Arista CVP / UniFi) — uplink loss/latency RCA, fleet health scoring, and config-template drift, with unbypassable audit logging (MCP + CLI), budget/runaway guards, and rollback.37MIT