Skip to main content
Glama

Netmon (demo)

Server Details

Public read-only demo of Netmon's network monitoring tools over a recorded snapshot.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
Netmon-Services/netmon-mcpd
GitHub Stars
0
Server Listing
netmon-mcpd

TDQS

A4/5.0

Scored across 36 tools

Disambiguation4/5

Most tools target a distinct resource and action, and descriptions explicitly disambiguate close pairs like arp_lookup vs arp_table and netflow_search vs netflow_raw_search. A few overlaps remain, notably device_find as a pure convenience wrapper for device_list({search:q}) and top_bandwidth overlapping with netflow_search's short-window role.

Naming Consistency3/5

The dominant pattern is snake_case noun_suffix (device_list, syslog_search, alerts_history, capture_get), which is readable and mostly predictable. However, verb-first outliers like get_network_entity_info and search_ip, plus bare verbs like ping and traceroute, break the convention and make the overall style mixed.

Tool Count2/5

At 36 tools, the surface is heavy for an LLM to navigate, exceeding the 25+ threshold. The breadth is real—logs, netflow, SNMP, agents, captures, alerts, and network probes—but several tools are near-duplicates or convenience wrappers that could be consolidated.

Completeness4/5

The monitoring and diagnostics domain is well covered: syslog, eventlog, EVE, netflow, ARP, SNMP, agent processes/services, alerts, captures, and active probes all have dedicated tools. Minor gaps exist—no eventlog facets, no capture creation, no alert lifecycle management—but most are deliberate read-only restrictions rather than omissions.

Available Tools

36 tools
agent_disk_usageA
Read-onlyIdempotent
Inspect

Path-scoped folder-tree disk usage report from a Netmon agent — the 'D: drive is at 95%, what's eating it?' question. Wraps POST /api/getFolderUsageFromPath which RPCs into the agent's GETFOLDERUSAGEPATH command and returns the immediate-children size breakdown for the given path.

Required parameters: device_id (the agent-enrolled device) and path (a Windows path on that device, e.g. "D:\" or "C:\Users"). Backslashes must be escaped in JSON strings — the LLM should pass "D:\" not "D:".

Drill-down pattern: start at the drive root, identify the largest child, recurse with that child as the new path. The agent does not produce a recursive tree in one shot — that's a deliberate latency cap.

Read-only by design. The agent's write paths (DELETEFILE, DELETEFOLDER, EXECUTEPS) are on the permanent deny-list at the top of tool_handler.cpp and not wrapped — even a future operator with the broadest possible PAT must not be able to drive deletions or shell exec from an LLM.

Latency: BLOCKING; the upstream endpoint has a 120s timeout. Large folders may take real wall-clock time.

Permission: devices. Windows-only — depends on agent enrollment (see CLAUDE.md agent enrollment section). Linux/macOS hosts have no agent-side equivalent of GETFOLDERUSAGEPATH.

Example: agent_disk_usage({device_id: 42, path: "D:\Users"})

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesWindows path on the device, e.g. "D:\\" or "C:\\Users". Backslashes must be JSON-escaped.
device_idYesAgent-enrolled device id.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context: BLOCKING latency with a 120s timeout, no recursive tree in one shot, Windows-only operation, devices permission requirement, and a safety note that write paths are on a permanent deny-list. This goes far beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but dense and well-organized: purpose, required parameters, drill-down pattern, safety, latency, permissions, platform constraints, and an example. Every section earns its place and the core purpose is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description supplies the essential return semantics ('immediate-children size breakdown'), a recursion strategy, latency expectations, and platform constraints. It is complete enough for correct invocation, though the exact response fields and units are left implicit rather than stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents device_id and path. The description adds concrete value by clarifying JSON escaping with an explicit counter-example ('pass "D:\\" not "D:\"') and providing a full example call, which reduces the risk of malformed paths.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'disk usage report' that 'returns the immediate-children size breakdown for the given path'. It also anchors the purpose with a concrete question ('D: drive is at 95%, what's eating it?') and clearly distinguishes it from generic agent tools by tying it to GETFOLDERUSAGEPATH.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit drill-down usage pattern: start at the drive root, identify the largest child, and recurse. It also states when not to use it — Linux/macOS hosts have no agent-side equivalent — and emphasizes the deliberate non-recursive latency cap, so an agent knows not to expect a one-shot full tree.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

agent_processesA
Read-onlyIdempotent
Inspect

List running processes on an agent-managed device — live read via the agent tunnel. Wraps POST /api/getDeviceProcesses (permission: devices).

Returns rows as reported by GETPS: (process id, name, parent, memory, etc. — exact shape depends on the agent version).

Common diagnostic patterns: pair with agent_services to answer 'is the SQL Server service running but stuck?'; correlate top memory/cpu processes with eventlog_search criticals.

Read-only by design — the process-kill endpoint (KILLPS) is deliberately NOT exposed via mcpmond. Server-side timeout is 60s; expect 400 if the device is offline or not enrolled.

Example: agent_processes({device_id: 42})

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesDevice id of the agent-enrolled host to query.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses it's a live read, has a 60s server-side timeout, returns 400 for offline/unenrolled devices, and the return shape depends on agent version. This is rich behavioral context that annotations alone don't provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then provides technical details, diagnostic patterns, limitations, and an example. Every sentence adds value with no redundancy; it's efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description covers return format ('rows as reported by GETPS'), error conditions, timeout, and usage examples. It provides everything an agent needs to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter is fully documented in the schema. The description adds a usage example (agent_processes({device_id: 42})) but no new semantic meaning beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists running processes on an agent-managed device, with a specific verb ('List') and resource. It also distinguishes itself by noting the process-kill endpoint is not exposed, and mentions pairing with sibling tools like agent_services, so it's easy to tell apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides diagnostic patterns (pair with agent_services, correlate with eventlog_search) and states a when-not (kill endpoint not exposed). This gives clear guidance on when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

agent_servicesA
Read-onlyIdempotent
Inspect

List Windows services on an agent-managed device — live read via the WMI tunnel. Wraps POST /api/getDeviceServices (permission: devices).

Returns rows of {Name, State, DisplayName} as reported by Win32_Service. Use this to answer 'is service X running on host Y' without trawling event logs. Read-only by design — the service-control endpoints (start/stop/restart) are deliberately NOT exposed via mcpmond.

Latency: server-side timeout is 60s — agents on slow links may approach that. Returns 400 if the device is offline or not agent-enrolled.

Example: agent_services({device_id: 42})

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesDevice id of the agent-enrolled host to query.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, idempotent, safe, but the description adds substantial behavioral context: live WMI read, 60s server timeout, 400 response for offline/unenrolled devices, and the wrapped API endpoint with permission scope. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and each subsequent sentence adds distinct value (endpoint, permission, use case, constraints, latency, errors, example). No filler or restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only endpoint with rich annotationsaced and no output schema, the description covers success shape, expected fields, failure modes, latency expectation, and a concrete call example. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (device_id described in schema) so the baseline applies. The description adds only modest semantic value: it frames device_id as the agent-managed host to query and gives an example call. No enum or conditional behavior to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('List Windows services on an agent-managed device'), a live-read semantics statement, and the wrapped endpoint. It is unambiguous and clearly distinct from siblings like agent_processes or agent_disk_usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to answer is service X running on host Y' gives an explicit when-to-use. 'Service-control endpoints are deliberately NOT exposed' gives a clear when-not-to-use, preventing calls to a tool that can't start/stop services.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

alerts_historyA
Read-onlyIdempotent
Inspect

Authoritative 'what fired and when' stream — wraps the alert_history table (one row per incident, both legacy and modern) and alert_outlet_log (per-dispatch ledger keyed by history_id).

Default mode: lists incidents newest-first. Each row is one incident with opened_at / last_event_at / resolved_at framing the lifecycle, plus aggregated outlet_types[], dispatch_count, and failed_count. status is computed from resolved_at: 'open' if null, 'resolved' otherwise.

Drill-down mode: pass incident_id (the alert_history.id, NOT alert_id) to switch the call to /api/alert-history/{id}/log and return the per-outlet dispatch ledger for that one incident. Use this for 'did the email actually go' / 'what did the webhook payload look like' / 'which outlets failed' follow-ups.

Filters (default mode, all client-side, AND-combined): status (open|resolved|all, default all), severity (int or array — scheme is 1-5, lower=worse), device_id, source (legacy|modern|all), hours (1-168, default 24, applied against last_event_at), search (substring on alert_label/subject).

Important caps: the upstream endpoint returns at most 500 rows ordered by last_event_at DESC. We can't reach older rows than that. meta.upstream_cap reports this so the LLM can warn the user when results may be truncated. severity_label is added server-side so the LLM doesn't memorize the scale.

Pagination is over the post-filter result. Tag-scope is enforced by Laravel — tag-restricted users see only incidents for devices in their slug set.

Permission: alerts. Examples: alerts_history({status: 'open', severity: [1,2], hours: 1}) alerts_history({device_id: 42, hours: 24}) alerts_history({incident_id: 9182}) // dispatch ledger

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed page number (default 1).
hoursNoLookback window applied against last_event_at (default 24).
searchNoCase-insensitive substring on alert_label / subject.
sourceNoFilter by source axis. Default 'all'.
statusNoFilter by lifecycle state. Default 'all'.
end_timeNoISO-8601 UTC; pairs with start_time.
per_pageNoRows per page (default 50, max 200).
severityNoSeverity int or array of ints (1-5, lower=worse).
device_idNoRestrict to one device id.
start_timeNoISO-8601 UTC; pairs with end_time.
incident_idNoIf set, switches to per-incident dispatch-ledger mode (returns alert_outlet_log rows). This is alert_history.id, NOT alert_id.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive hints, but the description adds critical operational context: the upstream 500-row cap, meta.upstream_cap reporting, severity_label added server-side, pagination over post-filter results, and Laravel-enforced tag-scope. This goes beyond annotations and fully discloses the tool's constraints and server-side behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although lengthy, the description is tightly structured into labeled sections (default mode, drill-down, filters, caps, pagination, permissions, examples) with no fluff. Every sentence adds operational value, and the critical constraints are front-loaded before the examples. This is appropriate for a tool with 11 parameters and two distinct modes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return structures, and it does so thoroughly: default mode returns per-incident lifecycle timestamps plus aggregated outlet_types[], dispatch_count, failed_count, and computed status; drill-down returns the per-outlet dispatch ledger. It also covers pagination, caps, and filtering semantics, leaving no critical gap for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description still adds significant semantic value: it explains that incident_id switches to drill-down mode and is alert_history.id not alert_id, that hours applies against last_event_at, that status is computed from resolved_at, and that filters are AND-combined. These details are not present in the schema's per-field descriptions, making the description indispensable for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is an authoritative stream of alert incidents with a default listing mode and a drill-down mode for per-outlet dispatch logs. It names the underlying tables and distinguishes itself from the sibling alerts_list by describing the incident lifecycle and aggregation, so an agent can tell them apart 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use default mode versus drill-down mode (e.g., 'Use this for did the email actually go follow-ups'), lists filters, and notes the upstream 500-row cap so the agent can warn users about truncation. It effectively guides the agent to the right mode and parameter combinations for common questions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

alerts_listA
Read-onlyIdempotent
Inspect

List configured alert definitions across both axes of the rule engine. Modern alerts (table alerts, class-scoped: syslog_log / event_log / eve_log / device_down / storage) and legacy alerts (per-device tracker thresholds, surfaced via the _hell view) are fetched, normalized, merged, filtered, and paginated.

Wraps GET /api/alerts (modern) and POST /api/getAlerts (legacy). Both endpoints return their full catalog; this tool applies the filters and pagination client-side, so the LLM doesn't need to know which axis a filter applies to.

Output rows carry a source discriminator and a synthetic id string (e.g. "modern:42" / "legacy:17") so dedup is unambiguous; the original numeric id is on raw_id. Modern rows carry class, severity, and last-evaluated stats. Legacy rows carry type (tracker kind), device_id, and tracker_name.

Modern rows carry NO throttle / renotify fields, on purpose: since 21.93 no modern class consults them (log-stream classes are one-fire and edge-triggered per event key; device_down and storage are stateful and diff open incidents), so they explain nothing about when a modern alert re-fires. Do not claim a modern alert is flap-damped or on a renotify timer — it isn't. Legacy trackers DO still renotify on a timer, but that config lives on the trigger and is not returned here either.

last_result_count is NOT the same measure across classes. For syslog_log / event_log / eve_log it is the raw match count from the last evaluation BEFORE edge-trigger dedup — a steady nonzero means the pattern keeps matching, NOT that anything was notified (repeat matches of an already-seen occurrence are suppressed). For device_down it is a level: devices currently down and in scope, so nonzero means an outage is open right now. For storage it is likewise a level: volumes currently low (or held open because their reading is unreadable/stale) and in scope. Never sum or compare the two. last_evaluated_at is the last scheduler tick that touched the alert; legacy rows have no equivalent. For what actually fired and was delivered, use alerts_history.

Filters (all optional, AND-combined): scope (modern|legacy|all, default all), class (modern only — silently ignored on legacy rows), severity (int or array), enabled (bool), device_id (legacy only — modern alerts are class-wide), search (case-insensitive substring on label).

Pagination: per_page defaults to 50 (max 200), page is 1-indexed. meta.total is the post-filter count; meta.has_more flags more pages. tag-scoped server-side at the legacy axis (legacy rows for devices outside the user's slug set are filtered by Laravel before this tool sees them).

Permission: alerts. Example: alerts_list({severity: 1, enabled: true, search: "router", per_page: 20})

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed page number (default 1).
classNoModern-only filter on the alert class (silently ignored on legacy rows).
scopeNoWhich axis to query: 'modern' (alerts table), 'legacy' (_hell view), or 'all' (default).
searchNoCase-insensitive substring match on label.
enabledNoRestrict to enabled (true) or disabled (false) alerts.
per_pageNoRows per page (default 50, max 200).
severityNoSeverity int or array of ints. Modern uses 1-5 (lower=worse). Legacy varies by tracker type; passing an int filters both axes.
device_idNoLegacy-only: restrict to a single device id. Ignored on modern rows.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the read-only/idempotent annotations, disclosing client-side filtering/pagination, the source discriminator and synthetic id, the absence of throttle/renotify semantics for modern alerts, and class-dependent meaning of last_result_count and last_evaluated_at. It even warns against incorrect claims such as flap-damping, which is a valuable behavioral guardrail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded: purpose, endpoints, output shape, behavioral caveats, filters, pagination. Given 8 optional parameters, two alert axes, and no output schema, the length is justified; slight redundancy and prose density keep it from a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of explaining return values, and it does: row shape, id/raw_id, discriminator, class-specific fields, meta pagination fields, permission requirement, and a concrete example. An agent has enough context to invoke and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds critical semantics: filters are AND-combined, scope defaults to 'all', class/device_id are silently ignored on the opposite axis, severity meaning differs by axis/class, and pagination is client-side with post-filter meta fields. This transforms parameter definitions into an operational contract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (list alert definitions) and scopes it to both axes of the rule engine, naming all modern classes and the legacy view. It clearly distinguishes this from alerts_history by noting the latter covers what actually fired, preventing confusion with the sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool versus alerts_history ('For what actually fired and was delivered, use alerts_history') and provides an example call. It also clarifies filter scoping (class ignored on legacy, device_id ignored on modern) so an agent can select appropriate filters, though it does not enumerate all alternative tools or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

arp_lookupA
Read-onlyIdempotent
Inspect

Performs an ARP lookup to find the MAC address for a given Local IP address. A suitable network interface is automatically selected. The list of all suitable interfaces found is also returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
target_ipYesThe target Local IP address to look up.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint: false, so the safety profile is covered. The description adds useful behavioral context by revealing that a network interface is automatically selected and that the tool also returns the list of all suitable interfaces found. It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The core action and purpose are front-loaded, and the second sentence adds a relevant behavioral detail without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, annotation-covered tool, the description is mostly adequate, but no output schema exists and the description does not specify the response format or error behavior. It also does not state what happens if no suitable interface is found or if the MAC address cannot be resolved, which an agent would need to handle failures correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% coverage for the single parameter target_ip, and the description's mention of 'Local IP' essentially repeats the schema description. The description adds no new semantic detail beyond what the structured schema already provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: performs an ARP lookup for a Local IP to find its MAC address. It also adds a distinguishing behavior (automatic interface selection) and clearly separates it from broader sibling tools like arp_table by focusing on single-address lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance is provided. It never mentions alternatives such as arp_table or ping, nor does it state conditions like 'use this for a single local IP instead of the full ARP table.' The usage context must be inferred entirely from the name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

arp_tableA
Read-onlyIdempotent
Inspect

Lists hosts observed on the local LAN(s) via the ARP table — the 'what devices have we seen recently?' question. Wraps POST /api/getArpTable, which collapses arptable + _dns into one row per IP with hostname + monitored-device id resolution attached.

Distinct from arp_lookup (single-IP MAC resolution at the current moment): this is the historical view over the last N hours. Use it for 'who's on the LAN today' / 'is there a new device' / 'where did this IP last appear' questions.

Each row: {id, ip, mac, timestamp, hostname, device_id}. device_id is non-null when the IP corresponds to a monitored Netmon device; hostname comes from _dns (PTR + custom overrides). Rows are deduped by IP — only the latest seen entry per IP within the window is returned.

Permission: devices. Tag-scoping is NOT applied here — ARP is subnet-level, not device-level, so it doesn't have a tag anchor. Operators see the whole LAN regardless of tag scope.

Examples: arp_table({}) // last 24h, no filter arp_table({hours: 1, search: "10.0.0"}) arp_table({search: "laptop"})

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback hours (1-168). Default 24.
searchNoSubstring (server-side ILIKE) on ip / mac / hostname. Empty matches all.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses behavioral details not visible in structured data: the tool wraps POST /api/getArpTable, returns a collapsed view of arptable + _dns, deduplicates by IP keeping the latest entry, and has a security-relevant quirk — it ignores subnet-level/tag-level scoping and shows the whole LAN. It also documents permission requirements and scope implications. Beyond this, the annotations already mark it readOnly/idempotent/destructive=False, so the description's disclosure of the collapse, dedup, and tag-scoping behavior goes well beyond what annotations provide. Anthropic's 'beyond annotations' bar is satisfied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with a clear lead sentence, explicit differentiation, a structured row definition, and examples. Everything earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers endpoint wrapper, filtering semantics, output shape, permission implications, and usage patterns. With annotations carrying the read-only profilehb, nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of params. The description adds usage color: hours defaults to 24, search is substring ILIKE across ip/mac/hostname, and the examples show real combinations. Description enriches the schema without repeating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Lists hosts observed on the local LAN(s) via ARP table') and scopes it with 'what devices have we seen recently?' It also introduces the resource (ARP table) and distinguishes it from the sibling `arp_lookup` by contrasting historical vs. current single-IP resolution. The row structure is explicitly listed, and the example usage further anchors the purpose. No ambiguity remains about which tool is which.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly differentiates from sibling `arp_lookup` by naming it and contrasting single-IP MAC resolution with the historical multi-host view. Provides concrete example calls with different filters, making it clear when and how to use the tool. This is a model example of usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

capture_getA
Read-onlyIdempotent
Inspect

Read-only single-capture detail. Wraps GET /api/captures/{id}. If the capture is still active (status=starting|running) the upstream endpoint refreshes status from netmond's IPC before responding, so packets/bytes counters are live.

Returns the same row shape as capture_list rows, plus freshly-refreshed counters when applicable.

Read-only is deliberate. capture_stop / capture_delete / capture_download are NOT wrapped. The chunks endpoint (GET /api/captures/{id}/chunks) is also not wrapped — pcapng bytes are an extcap-shaped payload, not an LLM-shaped one.

Permission: capture. Example: capture_get({id: 17})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCapture id (captures.id).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: the upstream endpoint refreshes status from netmond's IPC for active captures, making counters live, and it returns the same row shape as capture_list. It also explains why the chunks endpoint is excluded. Minor gap: it doesn't describe error behavior or what happens if the capture id doesn't exist, but the added context is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: it opens with the core purpose, then explains the live-refresh behavior, return shape, exclusions, permission, and an example. Every sentence earns its place, and the exclusions are clearly separated from the main behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with rich annotations and a 100% schema-covered parameter, the description is complete. It covers the endpoint, live behavior, return shape, exclusions, permission, and an example. There is no output schema, but the description explicitly states the return shape matches capture_list rows, which is sufficient for an agent to understand the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the only parameter (id) is already described as 'Capture id (captures.id).' The description adds a concrete example (capture_get({id: 17})) and clarifies that the id refers to a capture row, which reinforces the schema. Since the schema fully documents the parameter, the description's added value is modest but sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('read-only single-capture detail'), names the wrapped endpoint (GET /api/captures/{id}), and distinguishes it from capture_list and capture_stop/delete/download. It clearly identifies the resource and scope, making it easy for an agent to know what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it (single-capture detail, live counters for active captures) and what it is NOT for: capture_stop, capture_delete, capture_download, and the chunks endpoint are not wrapped. It also gives a permission note and a concrete example, so an agent has clear selection and invocation guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

capture_listA
Read-onlyIdempotent
Inspect

Read-only listing of packet captures. Wraps GET /api/captures. Operators see their own captures; admin (sa) sees all. The upstream endpoint returns the 200 most-recent rows ordered by id desc.

Use this for 'is there a capture running on device X?' / 'do we have packet evidence for the incident?' / 'what captures finished today?' questions. Pair with capture_get to drill into one row.

Each row carries: id, user_id, device_id, label, status (starting|running|stopped|expired|failed), filter (jsonb), started_at, ended_at, expires_at, packets, bytes, byte_cap.

Filters (client-side, AND-combined): device_id, status, search (substring on label).

Read-only is deliberate: capture creation, stop, delete, and pcapng download endpoints are NOT wrapped. PCAP bytes aren't an LLM-shaped payload anyway.

Permission: capture. Examples: capture_list({}) capture_list({status: 'running'}) capture_list({device_id: 42, status: 'stopped'})

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed page number (default 1).
searchNoCase-insensitive substring on label.
statusNoRestrict by lifecycle state.
per_pageNoRows per page (default 50, max 200).
device_idNoRestrict to one device id.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only is deliberate' and explains why pcapng bytes aren't suitable for LLM output. It adds concrete behavioral details beyond annotations: the upstream returns the 200 most-recent rows ordered by id desc, filters are client-side AND-combined, and it lists exact row fields (id, user_id, device_id, status, etc.). This gives the agent a clear model of what to expect without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized: it front-loads the core purpose and endpoint, then covers usage, row fields, filters, exclusions, and permission, ending with three concise examples. Every sentence earns its place; no filler. The structure makes it easy to scan for the key decision points, and the examples are short and illustrative. It is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description is remarkably complete. It specifies the exact row fields returned, pagination defaults (per_page default 50, max 200), filter semantics, and the ordering behavior. It also mentions the permission requirement and provides usage examples. An agent has everything needed to invoke it correctly and interpret the response, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter already has a description in the input schema. The description adds minor context beyond that: it notes filters are 'client-side, AND-combined' and clarifies search is a substring on label (already in schema). It also demonstrates usage with examples like capture_list({status: 'running'}). These are helpful but not essential given the schema's completeness, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb-resource pair ('Read-only listing of packet captures') and immediately ties it to a concrete endpoint ('Wraps GET /api/captures'). It also distinguishes itself from sibling capture_get by stating it lists while capture_get drills into a single row, and clarifies what it does NOT cover (creation, stop, delete, pcapng download). An agent can confidently select this tool over siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use it via concrete question examples ('is there a capture running on device X?', 'do we have packet evidence?') and pairs it with capture_get for deeper inspection. It also states exclusions ('creation, stop, delete, and pcapng download endpoints are NOT wrapped') and explains why, giving clear when-not guidance. This goes beyond mere context and provides actionable selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

device_findA
Read-onlyIdempotent
Inspect

Find devices matching a substring of label or ip_address. Convenience wrapper for GET /api/devices?search=; equivalent to device_list({search: q}).

Use device_list directly when you need tag/status filters or relation includes. device_find is the one-arg shortcut for "does anything look like X?".

Pagination: per_page defaults to 25 (max 200), page defaults to 1. Permission: devices.

Example: device_find({q: "switch"})

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSubstring to match (case-insensitive) against label or ip_address.
pageNo1-indexed page number (default 1).
per_pageNoRows per page (default 25, max 200).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: it reveals the underlying API endpoint (GET /api/devices?search=<q>), the default pagination values (per_page=25, max 200, page=1), and the required permission ('devices'). This goes beyond the annotations and helps the agent understand side effects and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence definition, a usage-routing sentence, a pagination/permission line, and a concrete example. Every sentence earns its place, and the most important scoping information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only search tool with full schema coverage and safety annotations, the description is nearly complete. It covers the API equivalent, pagination defaults, permission requirement, and an example. The only minor gap is that it doesn't describe the return shape, but since there is no output schema and the tool is a thin wrapper over a list endpoint, this is a small omission rather than a critical one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters (q, page, per_page) with types and defaults. The description adds a little extra meaning by explaining q as a substring match against label or ip_address and by restating pagination defaults, but it doesn't significantly go beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Find devices') and resource ('matching a substring of label or ip_address'), and explicitly distinguishes it from device_list by calling it a convenience wrapper for a one-arg shortcut. This makes the tool's purpose unambiguous and differentiates it from the sibling device_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use device_find ('the one-arg shortcut for does anything look like X?') and when to use device_list instead ('when you need tag/status filters or relation includes'). It also provides a concrete example, leaving no ambiguity about selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

device_getA
Read-onlyIdempotent
Inspect

Fetch one device with its related state: tags, alerts, the ping / oid / interface / port / disk trackers configured on it, its SNMP walk trackers, and a netflow rollup. Wraps GET /api/device/{id} (permission: devices).

Bulk payloads are opt-in, and that is a change from how this tool used to behave. It returned every log row every tracker collected in the window, inline: one 8-hour call on an ordinary host measured ~127 KB — 85 KB of oid log rows across 12 trackers, 35 KB for a single ping tracker's 479 samples — so pulling three hosts to "see the state" could spend 300 KB of context before any reasoning started. By default each tracker now returns its identity and latest value (which is what state questions need) plus log_count, the number of rows sitting in the window.

include_logs:true puts the rows back. Pair it with max_log_rows (default 200 per tracker, newest kept) so one chatty tracker cannot swamp the response; a tracker that got cut carries logs_truncated:true next to the untrimmed log_count. When the question is "is this metric degrading?" rather than "what happened at 14:05?", device_metric_summary answers it from fixed-window stats and ships no rows at all.

include_walk_data:true returns the stored SNMP walk payloads, omitted for the same reason: one configured walk tracker reaches ~72 KB of JSON on its own. Without the flag each walk row keeps id / oid / interval / timestamp plus walk_entries, the payload's top-level entry count.

What stays unbounded: the tracker rows themselves. Both flags govern each tracker's history, never how many trackers come back — a switch with 190 monitored interfaces returns 190 interface rows in summary mode too. interfaces_search pages interface metadata across the fleet if that is the real question.

Window: hours (1-168, default 8) or explicit start_time+end_time (ISO-8601 UTC). It scopes the netflow rollup and log_count as well as the rows themselves, so it still matters with include_logs off. The appliance monitors itself as the device holding ip_address 127.0.0.1 — resolve that one by IP (device_find), never by assuming id 1; the id is whatever the sequence allocated.

Use device_list or device_find to locate an id first.

Examples: device_get({id: 42}) — state only, the cheap default device_get({id: 42, hours: 24, include_logs: true, max_log_rows: 50})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesDevice id. Use device_list or device_find to locate.
hoursNoTime window for log data and the netflow rollup (1-168). Default 8.
end_timeNoISO-8601 UTC; pairs with start_time.
start_timeNoISO-8601 UTC; pairs with end_time (overrides hours).
include_logsNoReturn each tracker's log rows inline. Default false — trackers come back as identity + latest value + log_count, which is enough for state questions and roughly an order of magnitude smaller. Turn it on only when you need the individual samples, and cap it with max_log_rows.
max_log_rowsNoPer-tracker ceiling on returned log rows when include_logs is true (1-2000, default 200). Keeps the newest rows; a trimmed tracker is flagged with logs_truncated:true and still reports the full in-window log_count. Ignored when include_logs is false.
include_walk_dataNoReturn the stored payload of each SNMP walk tracker. Default false — a single walk row can be ~72 KB. Without it each walk keeps id/oid/interval/timestamp and walk_entries (top-level entry count).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/non-destructive behavior, so the description adds value beyond them: it discloses the default compact output, logs_truncated behavior, unbounded tracker count, window scoping, permissions, and the self-monitoring 127.0.0.1 device quirk. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then transparently explains the payload-size tradeoffs and ends with useful examples. It is longer than strictly necessary, with specific byte measurements, but each paragraph addresses a real agent decision and there is no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must carry the burden of explaining response shape and edge cases, and it does: default identity+latest value+log_count, include_logs and include_walk_data behavior, logs_truncated, window influence, unbounded trackers, and the self-monitoring device id. An agent can call this tool correctly without relying on external docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the input schema already describes bounds, defaults, and behavior for parameters. The description adds meaning by explaining why include_logs is off by default, how max_log_rows interacts with log_count, and how hours/pair start_time/end_time scope both log_count and the netflow rollup. This is above the baseline but the schema already does a lot of the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb and resource: 'Fetch one device with its related state' and enumerates the attached data (tags, alerts, trackers, netflow rollup). It also distinguishes the tool from siblings by naming device_metric_summary and interfaces_search as alternatives for specific questions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent to use device_list or device_find first to locate an id, and points to device_metric_summary for degradation questions and interfaces_search for fleet-wide interface metadata. It also gives clear guidance on when to enable include_logs and include_walk_data, with warnings about response sizes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

device_listA
Read-onlyIdempotent
Inspect

List monitored devices. Wraps GET /api/devices (permission: devices); user's tag-scope is enforced server-side.

Filters (all optional, combinable):

  • tag: tag slug, e.g. "snmp-up" or "switches". Slug is the stable lowercase-hyphen form; tag names with spaces won't match.

  • status: "up" or "down" (based on latest ping).

  • search: substring match on label + ip_address (case-insensitive).

Relation flags (all default false — opt in only what you need to keep the response small): tags, alerts, ping, oids, walks, interfaces, ports, disks.

Pagination: per_page defaults to 25 (max 200), page defaults to 1. meta.pagination.has_more tells you whether more pages exist.

Example: device_list({tag: "snmp-up", per_page: 10})

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter by tag slug (stable hyphenated form, e.g. "snmp-up"). Empty returns everything.
oidsNoInclude oids relation on each device row (default false).
pageNo1-indexed page number (default 1).
pingNoInclude ping relation on each device row (default false).
tagsNoInclude tags relation on each device row (default false).
disksNoInclude disks relation on each device row (default false).
portsNoInclude ports relation on each device row (default false).
walksNoInclude walks relation on each device row (default false).
alertsNoInclude alerts relation on each device row (default false).
searchNoSubstring match on label or ip_address (case-insensitive).
statusNoFilter by latest ping status: "up" or "down".
per_pageNoRows per page (default 25, max 200). Start small — call again with page=2 if has_more is true.
interfacesNoInclude interfaces relation on each device row (default false).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds crucial context beyond these: the required permission, server-side tag-scope enforcement, opt-in relation flags to control response size, and pagination with has_more. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: purpose, filters, relation flags, pagination, and an example. It is concise despite covering many parameters, using bullet points to avoid verbosity. The example is illustrative and the whole is easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite 13 optional parameters and no output schema, the description explains every aspect needed for correct invocation: filter options, relation flags, pagination mechanics, and permission requirements. It also hints at response shape via meta.pagination.has_more. For a read-only listing tool, this is comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by explaining tag slugs (stable hyphenated form vs spaces), status based on latest ping, search being case-insensitive substring over label+ip, pagination defaults (25, max 200) and the has_more indicator, plus a concrete usage example. This goes well beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (monitored devices), and adds the HTTP endpoint and permission. It is clearly distinct from sibling tools like device_get (specific device) or device_find (search) by focusing on listing with filters and relations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives detailed usage instructions including optional filters, relation flags, and pagination behavior, but does not explicitly name when to use this tool versus alternatives like device_get or device_find. The context strongly implies listing vs. lookup, but an explicit exclusion would be stronger.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

device_metric_summaryA
Read-onlyIdempotent
Inspect

Day / week / month / all-time summary stats for a single device-tracker, by metric type. Multi-backend: pass metric to pick which upstream endpoint to hit.

metric='latency' → wraps POST /api/latency/stats (icmpingId). Returns: dayAvgLatency, weekAvgLatency, monthAvgLatency, allTimeAvgLatency (ms); dayAvgLoss, weekAvgLoss, monthAvgLoss, allTimeAvgLoss (%); dayPingCount/weekPingCount/etc.; dayUptime/weekUptime/etc. (% successful pings); currentLatency, currentLoss, monitoringDuration (humanized).

metric='disk' → wraps POST /api/disk/stats (diskId). Returns: dayGrowthKB, weekGrowthKB, monthGrowthKB, allTimeGrowthKB (negative = filling); estimatedFillTime (humanized projection from 7-day slope); plus current available/used measurements.

This is a fixed-window summary, not time-buckets. Comparing day vs month tells the LLM 'is this metric degrading?'. For the raw samples underneath it, call device_get({id, hours: N, include_logs: true}) — the log rows are opt-in there because they are the expensive half of that response.

Discovery: target_id is a TRACKER id, never a device id, and device_get is the only tool that hands one out. Both sit nested in its response and both survive its default summary shape — they are tracker identity, not log rows, so no flag is needed to see them: latency → device.ping.icmping_id. ping is a single object, not a list: a device has at most one icmping tracker, and its key is icmping_id, not id. disk → device.disks[].id, one entry per monitored volume (agent-collected or SNMP). Most devices carry none — an empty array means there is no disk tracker to summarize, not that the lookup failed.

Port-stats has no equivalent endpoint upstream and is omitted; if one lands later, add a third metric backend.

Permission: devices. Tag-scoped server-side via Devices::withUserTags() before stats are computed.

Examples: device_metric_summary({metric: 'latency', target_id: 17}) device_metric_summary({metric: 'disk', target_id: 42})

ParametersJSON Schema
NameRequiredDescriptionDefault
metricYesWhich metric backend to query: 'latency' (icmping tracker) or 'disk' (disk_servers tracker).
target_idYesTracker id, NOT a device id. For latency it is device.ping.icmping_id from device_get({id}); for disk it is device.disks[].id from the same response. The numbering spaces are unrelated, so passing a device id silently returns whatever tracker happens to hold that id — or a 404 when none does.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations: it discloses fixed-window vs time-bucket behavior, per-metric return fields, empty-array semantics for disk, tag-scoped permission, and endpoint mapping. Annotations already cover readOnly/idempotent/destructive safety, so the description adds the missing behavioral context rather than contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a precise summary and then well-delineated sections for metric backends, common discovery pitfalls, alternative usage, and permission. It is long, but most sentences carry unique information; a couple of future-looking or expensive-half remarks are extras the agent could do without.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-backend tool with no output schema, this is very complete: it describes the meaning of each return group, the failure semantics of empty arrays, permission scoping, and the correct way to obtain target_id via device_get. No critical call decision is left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema coverage, the description adds valuable semantics: target_id is explicitly 'a TRACKER id, never a device id', it shows where the id lives in device_get’s response, and warns that passing a device id silently returns the wrong tracker or a 404. The metric parameter is fully mapped to distinct upstream endpoints and return shapes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific resource (single device-tracker), a specific operation (summary stats), and the time windows/metric types. It also distinguishes itself from device_get for raw samples and notes the port-stats omission, so an agent can differentiate it from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: use this fixed-window summary to assess degradation, and explicitly redirects to device_get for raw log samples underneath it. It also states what upstream endpoints are covered and that port-stats has no equivalent, which are clear when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eve_getA
Read-onlyIdempotent
Inspect

Fetch a single Suricata EVE event by id, decoded server-side. Wraps GET /api/eve/get/{id} (requires permission: logs). Returns an envelope: summary (signature/category/action/gid:sid:rev/severity/app_proto), endpoints, app_layer (Suricata's http/dns/tls/smb/... objects as labelled fields), flow, payload (printable text + length; the base64 bytes are omitted here), decoded (protocol-aware parse of the payload: HTTP start line/headers/body, DNS sections, TLS negotiation, SMB command detail, or a raw summary), findings (ranked high/medium/low/info: cleartext credentials, injection shapes, weak ciphers, lateral-movement pipes, ...), metadata, and the raw record. Use eve_search to locate ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEvent id (from eve_search results).

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds critical behavioral context: it requires the 'logs' permission, decodes server-side, omits base64 bytes in payload, and provides a detailed response envelope structure. This significantly enhances transparency for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly long but every section contributes: the core action, permission, and the comprehensive response envelope. It is front-loaded with the primary verb and resource, and the detailed field list is justified given the absence of an output schema. The length is appropriate for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 enumerates the return envelope (summary, endpoints, app_layer, flow, payload, decoded, findings, metadata, raw record) and explains key details like payload truncation and decoded protocol parsing. It also specifies the prerequisite of using eve_search for id discovery, making the tool self-sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents the id parameter, including its type and source (from eve_search results). The description reinforces this by mentioning 'by id' and referencing eve_search, but does not add substantial new meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches a single Suricata EVE event by id, decodes it server-side, and wraps a specific REST endpoint. It differentiates from siblings by focusing on single-event retrieval and explicitly mentions using eve_search to locate ids, which is the complementary search tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to use eve_search to locate ids, establishing a clear workflow and an alternative tool. It implies the tool is for retrieving full event details when an id is known, though it does not explicitly enumerate other alternative tools or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flow_summaryA
Read-onlyIdempotent
Inspect

Summarize one host's network conversations: top peers, top ports, and a client-vs-service-side split, each with a residual "other" bucket plus overall totals. Wraps GET /api/aggnetflow/summary (permission: vne). Use this to characterize a host before pulling rows — netflow_search returns the individual conversations once a rollup here points at an interesting peer or port.

Source is the windowed flow view: the raw table's live tail (the last ~15 minutes — cleanup_netflow deletes raw rows as it rolls them up) unioned with the aggregated history (agg_netflow, retained 4 weeks), so one call covers right-now through a month back with no gap at the rollup boundary.

Byte totals are IN-WINDOW estimates, not lifetime totals. The window predicate is OVERLAP — a conversation crossing either edge still matches — but each matching row contributes only its bytes pro-rated to the window (uniform-rate attribution), so the totals approximate window traffic instead of bounding it from above. Still never quote a byte figure as a rate.

Direction is normalized on both arms (the lower port of each conversation becomes dst_port — raw-tail rows are re-oriented the same way on read) and the rollup folds BOTH directions into one row, so sent-vs-received bytes do not exist in this data. The direction split is as_source (host was the client side) vs as_destination (host was the service side), each carrying bidirectional bytes.

conversations counts rows, not distinct conversations — a long-lived conversation contributes one row per 15-minute roll-up tick, plus per-flow rows for its not-yet-rolled-up raw tail.

Window: hours (default 24, max 168) OR start_time+end_time; an explicit window is held to the same 168-hour ceiling server-side — agg_netflow is BRIN-indexed on time now, but a summary still aggregates every overlapping row under a 10s statement timeout. A window too wide comes back as an error asking you to narrow it, not as partial data.

limit is the top-N per rollup (default 20, max 100); what falls outside it is reported in that rollup's other bucket, so totals always reconcile.

Tag-scoped server-side on the conversation ENDPOINTS: for a tag-restricted caller every returned conversation has an in-tag device on one side. The requested host gets no separate membership test, so naming an out-of-scope host is allowed and simply returns the subset of its conversations that touch a device you can already see.

Example: flow_summary({ip: '10.0.0.5', hours: 24, limit: 10})

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesREQUIRED. The host to summarize. Matched on either side of the conversation (src_ip OR dst_ip) — no direction needs to be known or guessed.
hoursNoLookback hours (1-168). Default 24.
limitNoTop-N entries per rollup (1-100). Default 20. The remainder is summarized in each rollup's `other` bucket.
end_timeNoISO-8601 UTC; pairs with start_time.
start_timeNoISO-8601 UTC; pairs with end_time. The span is still capped at 168 hours.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint, etc., but the description goes far beyond them: byte totals are window-approximate, rows vs conversations distinction, direction semantics (as_source/as_destination), server-side 168-hour ceiling, 10-second statement timeout, tag scoping on endpoints only, and error behavior for too-wide windows. This is rich behavioral context not derivable from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section carries necessary behavioral detail: window semantics, direction handling, row counting, tag scoping, and error behavior. It is front-loaded with the core purpose and organized by topic. Slightly longer than strictly minimal, but every sentence adds value for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers return structure, default/max limits, window interactions, timeout behavior, row-count semantics, direction normalization, tag scoping, and example usage. It leaves little for an agent to guess. No output schema exists, so the description's explanation of what each returned section means is essential and well supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds crucial semantics: ip matches on either endpoint, hours vs start_time/end_time with server-side ceiling, limit meaning with `other` bucket reconciliation, and the row-count vs conversation-count meaning of `conversations`. This goes well beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names the exact verb and resource ('Summarize one host's network conversations'), specifies the outputs (top peers, top ports, other buckets), and contrasts with netflow_search ('before pulling rows'). This makes the tool's purpose unambiguous and distinct from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool before pulling rows with netflow_search, and gives concrete usage context: when to use hours vs start_time/end_time, how limit behaves, and which sibling to consult for raw rows. This is direct when-to-use guidance with implicit exclusion of alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_network_entity_infoA
Read-onlyIdempotent
Inspect

Retrieves WHOIS, GeoIP and DNS information for a public IP address or hostname. A hostname is resolved to an IP for the GeoIP lookup (resolved_ip, when resolution succeeds); an IP gets a reverse DNS lookup (hostname, when a PTR exists).

whois comes from whois.iana.org and nowhere else. For an address IANA returns the RIR referral record, so its organisation is the regional registry that administers the block (ARIN, RIPE, APNIC, LACNIC, AFRINIC) — NOT the ISP, hosting company or assignee. For a hostname it is the TLD registry, not the domain owner. Never report either as the operator; a refer or whois field only names the RIR's own whois server, which this tool does not query.

geoip is the geolocation provider's response passed through verbatim, so the key set varies with provider tier and with whether the answer came from cache. Treat every field as optional — including isProxy, asn and asnOrganization, which may simply be absent. The whole geoip key is omitted for addresses that are not globally routable and when the lookup is unavailable.

To judge hosting/datacenter versus residential or small-business ISP, reason from the evidence actually returned:

  • The hostname PTR pattern: a provider-branded label under a hosting or cloud domain reads as datacenter, whereas the address itself embedded in the name under a consumer ISP's domain reads as subscriber. A missing PTR is weak evidence in either direction.

  • geoip.isProxy when present: true points to a VPN, proxy or hosting exit.

  • geoip.asnOrganization (and asn) when present: a cloud, colocation or hosting provider points to a datacenter; an access or eyeball ISP points to residential.

Label that classification as a heuristic and name the evidence you used for it. If no PTR came back and no ASN fields are present, say the evidence is insufficient rather than guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_identifierYesThe IP address or hostname to query.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations. It discloses that `whois` comes from whois.iana.org only, that GeoIP responses are passed through verbatim with variable keys, that the whole `geoip` key may be omitted for non-routable addresses, and that hostname resolution behavior depends on whether resolution succeeds. It also provides detailed guidance on how to interpret PTR records and ASN fields for classification, and explicitly warns against reporting RIRs as operators. This is exceptional behavioral transparency for a read-only lookup tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place. It is front-loaded with the core purpose, then systematically covers WHOIS source, GeoIP variability, and classification heuristics. The structure uses clear paragraph breaks and bullet-like guidance. It is not concise in the sense of being short, but it is efficiently organized and dense with necessary caveats. The length is justified by the complexity of the tool's output interpretation, though a slightly tighter summary of the classification heuristics could have been considered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter, no output schema, and rich behavioral caveats, the description is complete. It covers input semantics, output variability, data sources, interpretation guidance, and failure modes (missing PTR, missing ASN, non-routable addresses). An agent has everything needed to call the tool correctly and interpret the response. The annotations (readOnlyHint, idempotentHint, destructiveHint) already cover the safety profile, so the description's focus on data interpretation is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage for the single parameter `entity_identifier`, which is described as 'The IP address or hostname to query.' The description adds meaningful semantics beyond this: it explains that a hostname is resolved to an IP for GeoIP, and an IP gets a reverse DNS lookup. It also clarifies the input must be a public IP or hostname. The only minor gap is that the description doesn't explicitly state the expected format (e.g., IPv4 vs IPv6), but the schema already covers the basic meaning, so the description adds sufficient value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Retrieves WHOIS, GeoIP and DNS information for a public IP address or hostname.' It clearly distinguishes the tool's scope from siblings like search_ip or arp_lookup by naming the three data types and the input type. The annotation title 'Look Up WHOIS, GeoIP and DNS' reinforces the purpose, and the description adds detail about resolution behavior that makes the tool's function unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool: for WHOIS, GeoIP, and DNS lookups on public IPs or hostnames. It also provides implicit guidance by contrasting with what the tool does NOT do—it does not query the RIR's whois server, and it does not return ISP/operator information. This helps an agent avoid misusing the tool for operator attribution. The sibling list includes related network tools (search_ip, arp_lookup, traceroute), and the description's clarity about scope effectively routes the agent to this tool for the right use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_severity_summaryA
Read-onlyIdempotent
Inspect

Count log events grouped by severity over a time window. One tool, three backends — pass stream to pick which.

stream='syslog' → wraps /api/syslog/sevSum (severity 0-7, syslog scheme) stream='eventlog' → wraps /api/eventlog/sevSum (severity 0-5, Windows scheme) stream='eve' → wraps /api/eve/sevSum (severity 1-3, Suricata scheme)

Use this for triage before pulling rows: 'how many criticals on host X today' returns one tight rollup instead of 1000 sample rows. Every result includes both the numeric key and a label so the LLM doesn't have to memorize three different scales.

Window: hours (1-168, default 24) OR start_time+end_time (ISO-8601 UTC). Optional device_id narrows to one device — for eve, the controller translates this to a src_ip OR dst_ip match automatically (eve_log has no device_id column).

ALL-ZERO IS NOT THE SAME AS CLEAN. A dead feed and a quiet network produce byte-identical answers here, so every response carries meta.stream_health: active — events landed inside your window; the counts mean what they say. stale — your window is empty, but the stream produced up to last_event_at, before it. The feed is alive and the empty window is real. silent — nothing in your window AND nothing in the 168h before it. Never report 'clean' from this state; note names the producer to check first. unknown — freshness could not be established. The zeros prove nothing. stale/silent come from re-asking the same stream over a window that strictly contains yours (one extra call, and only when every bucket is zero). No staleness threshold is guessed: stale means exactly 'the newest event predates the window you asked for', which on a 1-hour window is unremarkable. checked_back_hours and events_before_window say how much history the verdict rests on.

Permission: logs. Tag-scoped server-side.

Example: log_severity_summary({stream: 'syslog', hours: 1, device_id: 42})

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback hours (1-168). Default 24.
streamYesWhich log stream to summarize: 'syslog', 'eventlog', or 'eve'.
end_timeNoISO-8601 UTC; pairs with start_time.
device_idNoRestrict to a single device id (for eve, translated to src_ip/dst_ip server-side).
start_timeNoISO-8601 UTC; pairs with end_time.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/idempotentHint/destructiveHint annotations by spelling out the surprising safety property: all-zero results are not proof the stream is clean. It enumerates the four stream_health states, the extra verification call for stale/silent verdicts, and the permission requirement, giving an agent a robust model of the tool's runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is paragraph-form but extremely well structured: a one-sentence summary, a stream list, a usage guidance note, and a separate stream-health section. Every sentence earns its place; no fluff or repetition. The most critical safety information (ALL-ZERO IS NOT SAME AS CLEAN) is emphasized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given three backends, a window selection, device filtering, and the risk of misleading zero-results, the description covers all branches. It even mentions the permission model ('logs. Tag-scoped server-side') and explains the meaning of meta.stream_health. There is no output schema, but the description says what to expect ('numeric key and label') and how to interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is already 100%, but the tool description adds parameter meaning beyond the schema: it maps the stream enum to the underlying endpoints and severity ranges (0-7, 0-5, 1-3), explains the window alternatives, and clarifies the eve device_id translation. This fills in the semantics the schema alone cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb, resource, and scope: 'Count log events grouped by severity over a time window.' It distinguishes itself from row-returning same-family tools by saying it returns 'one tight rollup instead of 1000 sample rows,' so an agent can tell when to call this vs syslog_search/eve_search/eventlog_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit usage rule: 'Use this for triage before pulling rows.' It also details stream selection, end-time pairing, and the device_id translation for eve. Does not name the exact sibling tools to switch to when rows are needed, but the distinction from 'pulling rows' is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

maintenance_windows_listA
Read-onlyIdempotent
Inspect

Lists maintenance windows — the suppression schedules that gate alert dispatch. Use when a user asks 'why didn't this page me' or 'is this device under maintenance right now' — a quiet alert may be inside a window rather than truly silent.

Two modes:

  • Global catalog (default): wraps GET /api/alerts/maintenance-windows. Returns every window with its schedule fields.

  • Per-legacy-alert: pass alert_id to wrap GET /api/alerts/legacy/{id}/maintenance-windows, returning only the windows attached to that legacy alert handler.

Per CLAUDE.md, modern alerts (class=syslog_log/event_log/eve_log) attach windows through alert_routing_rules, not directly — the per-alert path is legacy-only by route constraint. If you need to inspect modern-alert suppression, look at the routing rule attached to the rule, not the alert.

Each row carries: id, label, recurrence_unit (day|week|month|dawom), schedule_hour, schedule_dow (0=Sun..6=Sat), schedule_day_of_month, schedule_month, duration_minutes, plus a human-readable description (e.g. 'Weekly on Tue at 14:00 UTC for 60 min') so the LLM doesn't reinterpret the cron-style fields.

Note: this tool does NOT compute whether a window is active right now — that depends on the server's local clock and the interpretation of dawom rules. The LLM should use the description + duration to reason about it. If you need a reliable yes/no, ask alertmond directly via its IPC (out of scope for mcpmond).

Permission: alerts. Examples: maintenance_windows_list({}) // global catalog maintenance_windows_list({alert_id: 17}) // legacy alert 17 only

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idNoIf set, switches to per-legacy-alert mode (alert_handlers.id). Modern alerts use routing rules instead.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it does NOT compute whether a window is active right now, it depends on server local clock and dawom interpretation, and it returns a human-readable description field to avoid LLM misinterpretation. It also discloses the legacy-only route constraint for per-alert mode. This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: purpose, two modes, legacy constraint, row fields, limitation note, permission, and examples. Every sentence earns its place, and the most important usage guidance is front-loaded. The examples at the end are concise and illustrative without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with one optional parameter, the description is complete. It covers what the tool returns (schedule fields, human-readable description), how to use it in both modes, its limitations (no active-window computation), and its relationship to modern vs legacy alerts. The output schema is absent, but the description compensates by listing the row fields. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter alert_id is already described in the schema. The description adds meaning by explaining that setting alert_id switches to per-legacy-alert mode and that modern alerts use routing rules instead. This is a meaningful addition beyond the schema, though the schema already covers the basic semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists maintenance windows (suppression schedules that gate alert dispatch) and distinguishes it from sibling tools by explaining its role in alerting. It also explicitly names two modes (global catalog vs per-legacy-alert) and the exact API endpoints they wrap, making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: use when a user asks 'why didn't this page me' or 'is this device under maintenance right now'. It also gives clear exclusions: modern alerts should use routing rules, not this per-alert path, and it explicitly says the tool does NOT compute active windows, directing users to alertmond IPC for reliable yes/no. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

overwatch_summaryA
Read-onlyIdempotent
Inspect

High-level network health snapshot for 'how's the network?' style questions. Wraps GET /api/devices?alerts=1&tags=1 (requires permission: devices) and aggregates in-tool: device count, active alert count (total + by severity when present on the alert row), and the top-N devices by alert count. Drill into specific devices with device_get.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNoHow many 'loudest' devices to return (1-50). Default 10.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and idempotent; the description adds meaningful behavior beyond that: the wrapped endpoint, the required permission ('devices'), and the in-tool aggregation logic including severity breakdown and top-N calculation. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: use case, endpoint + aggregation behavior, and sibling navigation. Every sentence earns its place and the most decision-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter summary tool, the description covers the use case, endpoint, permission requirement, output dimensions, and the key sibling alternative. Even without an output schema, an agent has enough to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value by clarifying that top_n refers to 'top-N devices by alert count,' resolving the otherwise ambiguous 'loudest' terminology in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific purpose ('high-level network health snapshot'), a concrete underlying endpoint, and the exact aggregate outputs (device count, active alert count, top-N devices). It also positions itself against the sibling device_get by presenting the tool as a summary view rather than a drill-down.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly scopes the tool to 'how's the network?' style questions and tells the agent to use device_get for specific-device drill-down. It does not enumerate every alternative like alerts_list or device_list, but the primary routing guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pingA
Read-onlyIdempotent
Inspect

Ping a target host from the Netmon server. Wraps POST /api/getPingInfo/{target} (permission: tools).

The probe runs ON the netmon server, not on the mcpmond host — so reachability reflects what netmon can see, which is what matters for monitoring questions.

Returns {address, latency (avg ms), status (true=reachable), hostname (PTR lookup; falls back to the bare address when the host has no reverse record)}.

A host that does not answer is a normal result, not an error: status is false, latency is null, and two extra fields appear — reason (packet_loss = probes sent, nothing came back; unreachable = the network answered with an ICMP unreachable; unresolved = the name does not resolve) and detail (the ping line that decided it). A down host still gets its hostname resolved. status null means the probe itself failed and reachability is UNKNOWN — never read that as down.

Server fixes count at 4 packets; for longer-running tests use the system tools UI.

Example: ping({target: "8.8.8.8"})

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesIP address or hostname to ping.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations (readOnlyHint, idempotentHint, destructiveHint) by explaining nuanced behaviors: status false is a normal result with distinct reasons (packet_loss, unreachable, unresolved), status null means UNKNOWN and should not be read as down, and hostname resolution persists even when down. It also discloses the fixed packet count. This is exceptionally transparent and adds significant value beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but every sentence earns its place. It is front-loaded with the core purpose, then explains the execution context, return fields, and edge cases in a logical order. The structure is clear and the level of detail is justified by the subtle semantics of the tool. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter and no output schema, the description thoroughly covers all necessary aspects: the underlying API, permission requirement, execution location, return fields and their meanings, special status values, and an example. Nothing an agent needs to call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the target parameter as 'IP address or hostname to ping' with 100% coverage. The description adds an example call but no additional semantic meaning beyond what the schema provides. Per the rubric, baseline 3 is appropriate when the schema carries the burden, and the description does not materially enhance parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Ping a target host from the Netmon server.' It also differentiates itself by clarifying the execution location (netmon server) and the monitoring context, which helps distinguish it from sibling tools like traceroute or snmp_test.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use this tool: for reachability questions from the netmon perspective. It also mentions an alternative for longer tests ('use the system tools UI'), though not a sibling MCP tool. It does not explicitly list exclusions or compare with sibling tools, but the context is sufficient for an agent to decide when this tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

port_mapA
Read-onlyIdempotent
Inspect

Nmap port scan against a single host from the Netmon server. Wraps POST /api/getPortscanInfo (permission: tools).

Server runs nmap -oX - -p <ports> --open <ip> and returns the parsed result. The probe originates from netmon, not from wherever mcpmond runs — so what's reachable here is what netmon can reach.

Single targets only (single IP or hostname). The backing endpoint does not accept CIDR or ranges. If port_range is omitted, scans 1-1024.

Returns the nmap host element as JSON: status, address, and ports[] with state/service/product/version. Latency: scans can take ~30-90s depending on port count and target responsiveness; client timeout is 120s.

Example: port_map({target: "192.168.1.1", port_range: "22,80,443"})

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesSingle IP address or hostname to scan. CIDR/ranges are not supported by the backing endpoint.
port_rangeNoOptional. Ports to scan, e.g. '80', '22,80,443', '1-1024'. Defaults to '1-1024'.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, but the description adds substantial behavioral context: the probe originates from netmon rather than mcpmond, latency is ~30-90s with a 120s client timeout, and the precise return structure (host element with status, address, ports[]). It also mentions the permission requirement ('tools'). This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose in the first sentence, then builds logically: wrapping endpoint, origin, constraints, return format, latency, and an example. Every sentence contributes new information; no filler or repetition. The structure is easy to parse and the example at the end aids comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description fully specifies the return format (nmap host element as JSON with status, address, ports[].state/service/product/version). It also covers latency, timeout, permissions, and the single-target constraint. For an agent to call this tool correctly, nothing essential is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for both parameters, and the schema already documents both fields including the CIDR limitation and default. The description adds value by providing a concrete example, reiterating the default range behavior, and clarifying the exact serialization of port_range. This enhances the schema rather than merely repeating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: 'Nmap port scan against a single host from the Netmon server.' It names the wrapped endpoint (POST /api/getPortscanInfo) and clarifies the scope (single IP/hostname only). This clearly distinguishes it from sibling network tools like ping, traceroute, or arp_lookup without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when to use the tool: for port scanning a single host from Netmon's perspective, and it explicitly states the constraint that CIDR or ranges are not accepted. However, it does not explicitly name alternative tools or conditions when another tool would be preferred, leaving the 'when-not-to-use' guidance implicit rather than direct.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_ipA
Read-onlyIdempotent
Inspect

Find every mention of a specific IP across Netmon's log and telemetry streams: syslog, Windows eventlog, Suricata EVE, aggregated NetFlow, and ARP.

Returns one bucket per stream with {total, samples}. Streams that 4xx (e.g. 403 from tag-scope) show up in skipped so a partial result is still actionable. The syslog/eventlog streams match the IP via an unindexed message substring scan; on a high-volume install they can time out and land in skipped with guidance (narrow hours, or use syslog_search/eventlog_search with a device_id) rather than stalling the call.

Params:

  • ip (required): IPv4 or IPv6 to correlate.

  • hours: lookback window (1-168, default 24).

  • per_stream: sample row cap per stream (1-100, default 10). The total per stream is always the full match count.

  • streams: narrow the fan-out to a subset — any of ['syslog','eventlog','eve','netflow','arp']. Omit for all.

Permission + tag-scope checks run server-side; a tag-restricted user sees only rows for devices in their tag set.

Example (narrow + short window): search_ip({ip: "10.10.1.25", hours: 1, streams: ["syslog"], per_stream: 5})

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesIPv4 or IPv6 address to correlate (e.g. '10.10.1.25').
hoursNoLookback window in hours (1-168). Default 24.
streamsNoSubset of streams to query. Omit to fan out to all. Valid values: 'syslog', 'eventlog', 'eve', 'netflow', 'arp'.
per_streamNoMax sample rows returned per stream (1-100). The `total` field per stream always reflects the full match count even when samples are truncated. Default 10.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/destructive annotations, the description discloses partial-result behavior through `skipped`, explains that syslog/eventlog use unindexed substring scans that may time out, and notes server-side tag-scope permission filtering. This gives the agent a realistic model of failure and partial success without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: the core purpose is front-loaded, the parameter list is compact, and the behavioral caveats are organized logically. Every sentence contributes distinct information, and the example earns its place by showing realistic usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description appropriately explains the return shape ({total, samples}), the `skipped` mechanism, authentication/tag-scope behavior, and the timeout fallback. For a tool with four parameters, five stream types, and no structured return schema, nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all parameters at 100%, but the description adds operational meaning: `per_stream` caps samples while `total` remains complete, `hours` affects timeout risk on unindexed scans, and `streams` controls fan-out. The concrete example also demonstrates how the parameters combine, going well beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'Find every mention of a specific IP across Netmon's log and telemetry streams,' then enumerates the five concrete streams. This distinguishes search_ip from the many single-stream siblings like syslog_search, eve_search, and netflow_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool versus alternatives: if high-volume syslog/eventlog scans time out, it directs users to narrow `hours` or use syslog_search/eventlog_search with a device_id. It also explains how to narrow the fan-out with the `streams` parameter, giving clear selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snmp_testA
Read-onlyIdempotent
Inspect

Probe a device for SNMP reachability using the Netmon snmptest binary. Wraps POST /api/testSnmp (requires permission: write_devices). BLOCKING — can run up to 60 seconds while the server waits for the target to respond. Provide a valid snmpconfig object: for v1/v2 include snmp_version + snmp_community; for v3 include snmp_version=3 plus authuser/authpass/authprot and optionally privpass/privprot and snmp_v3_security. Returns the upstream {status, message} verbatim under data.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYesTarget IPv4 or IPv6 address.
snmpconfigYesSNMP config. v1/v2: { snmp_version: 1|2, snmp_port?: int, snmp_community: string }. v3: { snmp_version: 3, snmp_port?: int, snmp_v3_security?: 'noAuthNoPriv'|'authNoPriv'|'authPriv', authuser, authpass, authprot: 'MD5'|'SHA', privpass, privprot: 'DES'|'AES' }.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, openWorld, idempotent, non-destructive. The description adds context about the blocking behavior (up to 60 seconds) and notes the callback wrapper, which is important for an agent to avoid timeout. It also mentions the permission requirement (write_devices), adding valuable behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, front-loading the core purpose and then providing essential usage details. Every sentence adds value: purpose, endpoint, permissions, blocking behavior, config specifics, and return format. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a nested object parameter and no output schema, the description sufficiently covers all necessary details: config structure for both versions, return type, and blocking behavior. The schema already covers parameter descriptions, so the description completes the picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description does not add much beyond what the schema provides, except for clarifying the return shape and emphasizing the need for valid configuration. This aligns with the baseline of 3 when schema covers everything.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Probe a device for SNMP reachability'), identifies the underlying endpoint, and mentions the wrapper binary. It clearly differentiates from siblings like ping and traceroute by focusing on SNMP reachability.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains when to use (to test SNMP reachability) and provides clear configuration guidance for v1/v2 vs v3. It does not explicitly mention alternatives, but the sibling list includes similar network diagnostics (ping, snmp_walk), and the description is clear enough that an agent can infer when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snmp_walk_lastA
Read-onlyIdempotent
Inspect

Fetch the most recent stored SNMP walk for a device (cached in tools_walks). Wraps GET /api/getLastWalk/{device} (permission: tools). Cheap single-row read.

Always try this first when an SNMP walk is needed. Only fall back to snmp_walk_run if the cached row is missing or the data is too stale for the question (the controller does not stamp a freshness header — judge from the walk's own timestamps if present).

Returns the raw walk row including device_id and the captured OID payload. Empty walk = device has never been walked.

Example: snmp_walk_last({device_id: 42})

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesDevice id to look up the most recent stored walk for.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond that: it says the call is a 'cheap single-row read', states the return type ('raw walk row including device_id and the captured OID payload'), and defines the meaning of an empty result ('device has never been walked'). It also discloses the lack of a freshness timestamp, which is a real operational trap for an agent. These are genuine behavioral features not already in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each earning its place: state the resource, label it cheap, give preferred alternative, describe the return and the empty case, and show an example. No fluff, and the crucial distinction from snmp_walk_run is front-loaded. Formatting is clear and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one parameter, no output schema, and complete safety annotations, the description covers everything a agent needs: what is fetched, where it is stored (tools_walks), the API path, the required permission, how to decide between it and snmp_walk_run, the meaning of an empty result, and the freshness limitation. There is no missing information for a correct call decision.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the only parameter, device_id, is already well-described ('Device id to look up the most recent stored walk for'). The description adds an example call (snmp_walk_last({device_id: 42})) but does not add meaning beyond that. Baseline 3 is appropriate because the schema already carries the semantics and the description adds marginal color.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Fetch the most recent stored SNMP walk for a device'. It names the cache table (tools_walks), the wrapped HTTP endpoint, and the permission required. It explicitly distinguishes itself from the sibling tool snmp_walk_run ('Always try this first', 'Only fall back to snmp_walk_run'), so an agent can immediately tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: always call this first for an SNMP walk, fall back to snmp_walk_run only if the cached row is missing or stale. It even explains how to assess staleness given the controller does not stamp a freshness header. This is a textbook example of when/alternatives guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

snmp_walk_runA
Idempotent
Inspect

Trigger a FRESH SNMP walk against a device. Wraps POST /api/getSNMPWalkInfo/{deviceId} (permission: tools).

SLOW and SIDE-EFFECTING. Server-side this shells out to walktool with a 1200s (20 minute) timeout and writes the result into the tools_walks table. Always try snmp_walk_last first; only call this when the cached walk is missing or known to be stale.

MCP tool timeout is 1200s to match the server-side cap. If the device has many OIDs the call will take real wall-clock time — let it run; do not retry on timeout without first checking snmp_walk_last (the writeback may have completed even if the HTTP response stalled).

Example: snmp_walk_run({device_id: 42})

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesDevice id to walk. Server resolves SNMP credentials from the device row.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the operation is 'SLOW and SIDE-EFFECTING,' details the 1200s timeout, mentions the server-side writeback to the tools_walks table, and warns that the writeback may complete even if the HTTP response stalls. This goes well beyond the annotations (readOnlyHint false, idempotentHint true) by adding concrete behavioral context. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence serves a purpose: it front-loads the core purpose, immediately warns about slowness and side effects, gives usage guidance, explains timeout behavior, and provides an example. It is well-structured and not verbose given the critical warnings it must convey.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and significant behavioral caveats, the description covers all essentials: what it does, when to use it, side effects, timeout, retry policy, and an example. It also clarifies that the result is stored in tools_walks table, so the agent knows to retrieve it via snmp_walk_last. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides a full description for device_id ('Device id to walk. Server resolves SNMP credentials from the device row.'), so the tool description adds little beyond an example call. Since schema coverage is 100%, the baseline is 3; the example is helpful but does not introduce new semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a clear verb+resource: 'Trigger a FRESH SNMP walk against a device.' It also mentions the exact endpoint wrapper (POST /api/getSNMPWalkInfo/{deviceId}) and explicitly differentiates from the sibling snmp_walk_last by saying 'Always try snmp_walk_last first.' This leaves no ambiguity about what the tool does and how it differs from its nearest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use vs. alternative: 'Always try snmp_walk_last first; only call this when the cached walk is missing or known to be stale.' It also gives retry guidance on timeout, telling the agent not to retry without checking snmp_walk_last. This is textbook usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

speedtest_historyA
Read-onlyIdempotent
Inspect

Recent WAN speedtest results — answers 'is the internet healthy?'. Wraps GET /api/getSpeedTestHistory. Returns rows ordered by timestamp desc.

Each row carries the upstream's SpeedtestLog shape — typically {id, timestamp, download_mbps, upload_mbps, latency_ms, jitter_ms, server, ...}, but any new columns added on the Laravel side flow through automatically. The tool doesn't reshape the row contents — just filters by time window and limits the return.

Lower priority than ping/traceroute/netflow for general 'internet slow' investigations, but the right tool when the user specifically asks about WAN throughput trends or recent speedtest runs.

Filters (client-side): hours (1-720, default 168 = 7d), limit (1-100, default 25). The upstream endpoint returns the full history with no server-side cap — narrow with hours rather than fetching unbounded.

Permission: tools. Example: speedtest_history({hours: 24})

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback hours (1-720). Default 168 (7 days).
limitNoMax rows returned (1-100). Default 25.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only and non-destructive behavior, but the description adds substantial context beyond them: client-side filtering, no server-side cap on the upstream endpoint, automatic passthrough of new columns, and no row reshaping. It even warns against fetching unbounded history, which is actionable behavioral guidance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well organized: purpose, row shape, usage context, filter semantics, permission, and example. Every sentence provides operational value, and the core answer to 'what does this do' comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the row shape, typical fields, ordering, dynamic column behavior, and the fact that rows are passed through unmodified. It also covers permission and gives a concrete invocation example, so an agent has enough context to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents ranges and defaults for both parameters, so the baseline is 3. The description adds meaningful extra context by noting the filters are client-side, explaining that the upstream returns the full history with no cap, and recommending narrowing with hours to avoid unbounded fetches. This goes beyond the schema's static definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns recent WAN speedtest results ordered by timestamp, answers a specific user question about internet health, and maps to a concrete endpoint. It also distinguishes itself from ping/traceroute/netflow by naming the exact scenario (WAN throughput trends) where it applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it versus alternatives: it is lower priority than ping/traceroute/netflow for general 'internet slow' investigations, but the right tool when the user asks about WAN throughput trends or recent speedtest runs. This gives the agent a clear selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

syslog_facetsA
Read-onlyIdempotent
Inspect

Top-N value counts for ONE syslog field over a window — 'what are the top actions/reasons on this FortiGate in the last 2 hours' in a single call, instead of pulling rows and counting them yourself. Wraps GET /api/syslog/facets (permission: logs); tag-scoped server-side.

group_by takes one of two kinds of field:

COLUMN (indexed, may run fleet-wide — device_id optional): facility, severity, source

MESSAGE FIELD (parsed out of the message text at read time — device_id REQUIRED): action, reason, devname, type, subtype, level, logdesc, msg, service, policyid, srccountry, dstcountry, srcintf, dstintf, user, group, status, app, appcat, vpntunnel, eventtype, proto

Message fields have no index and cannot get one — they are pulled out of free text — so every message pivot is a sequential scan of the window (~37x the per-row cost of a column pivot). device_id is mandatory for them and the server rejects a fleet-wide message pivot outright.

devname and source are DIFFERENT keys and are deliberately not merged: source is the column syslog arrived with (a relay may have rewritten it to its own name), devname is what the device wrote about itself inside the message. Ask for the one you mean.

Window: hours (1-168, default 24) OR start_time+end_time (ISO-8601 UTC); a window wider than 168h is refused either way. limit is the top-N cut (1-50, default 20).

Reading the result: facets is the top-N; other is everything below the cut, so facets + other sums to matched_rows. rows_without_field counts rows in the window where the field is absent entirely — a large value is normal (a FortiGate emits many message types) and is NOT a failure.

Errors are structured, and two of them are instructions: error='window_too_large' — the row pre-check refused before scanning. Lower hours (halve it and retry) or add/narrow device_id. rows_in_window and max_rows tell you how far over you are. Do NOT retry the same window. error='query_timeout' — the scan passed the 10s server budget. Same remedy: narrow the window, or pivot a column instead.

Example: syslog_facets({group_by: "action", device_id: 372, hours: 2})

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback window in hours (1-168). Default 24.
limitNoTop-N cut (1-50). Default 20; the rest is folded into `other`.
end_timeNoISO-8601 UTC. Must be paired with start_time.
group_byYesField to pivot on. Columns: facility, severity, source (device_id optional). Message fields: action, reason, devname, type, subtype, level, logdesc, msg, service, policyid, srccountry, dstcountry, srcintf, dstintf, user, group, status, app, appcat, vpntunnel, eventtype, proto (device_id REQUIRED).
device_idNoDevice id to pivot within. Required for every message-field group_by; optional for facility/severity/source.
start_timeNoISO-8601 UTC (e.g. 2026-04-23T10:00:00Z). Must be paired with end_time.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotations, the description discloses critical behavior: for message fields, device_id is required and server rejects fleet-wide pivots, scans are sequential and ~37x costlier, and limits like 10s timeout are exposed. It also explains how to interpret results and common errors, providing deep behavioral insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed and organized with clear sections, but it is relatively long. However, every section adds value—from usage, to parameter details, to error handling—and is front-loaded with the most important context. Slightly verbose but justified for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description is remarkably complete: it covers purpose, parameters, constraints, performance implications, result interpretation, and error handling. With no output schema, it explains the output structure, making it fully self-contained for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already has 100% coverage, but the description enriches it substantially: it categorizes fields into columns vs message fields, explains the difference between devname and source, clarifies window constraints (168h) and error handling, and gives examples of valid parameter combinations. This is far beyond schema basics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to get top-N value counts for one syslog field over a window, with a concrete example and alternative approach. It distinguishes itself from row-pulling and syslog_search by focusing on aggregated facets, making it clear what this tool uniquely offers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool and when not to, including specific scenarios like wide windows versus narrow, and when to use device_id. It also contrasts with pulling rows manually and suggests alternatives for wide scans, making usage context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tags_listA
Read-onlyIdempotent
Inspect

List tag definitions. The slug is the stable identifier used everywhere device-tag scoping is enforced (e.g. alert_routing_rules.tag_filters, device_list({tag: ...})). The display name is for humans.

Wraps GET /api/tags. Returns every tag the caller has visibility to (Laravel does not tag-restrict the catalog itself — operators see all tags and use the slugs that match their visible devices). Tag rows are typically O(10s) per install.

Optional type filter: 'device' tags decorate devices and are the most common (these are what device_list({tag: ...}) matches against). 'status' tags are reserved for system-derived states. 'other' is a catch-all. Default 'all' returns every type.

Permission: devices. Example flow: a user says 'check our routers' → call tags_list({type: 'device', search: 'router'}) → pick a slug → call device_list({tag: 'router', status: 'down'}).

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by tag type. Default 'all'.
searchNoCase-insensitive substring on slug or name.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds beyond that: it states the endpoint wrapper (GET /tags), visibility scope ('every tag the caller has visibility to'), expected volume ('O(10s) per install'), and the operational nuance that all tags are visible while scoping is enforced through slugs. This is useful behavioral context without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense yet compact: it front-loads the resource, then explains identifiers, scoping, return scope, type semantics, permissions, and a concrete example flow. Every sentence earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only catalog listing with no output schema, the description covers what tags are, which types exist, how the slug relates to other tools, visibility rules, scale expectations, and a working example. There is no meaningful missing context for an agent to select and call this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description meaningfully expands on both parameters. It details what each `type` value means — 'device' tags are what device_list matches, 'status' tags are system-reserved, 'all' is the default — and clarifies that 'search' is case-insensitive over name or slug. This goes well beyond the bare schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and resource: 'List tag definitions,' and disambiguates what tags are by explaining the stable slug vs. human display name. It also distinguishes this tool from nearby device/network tools by showing it is the tag-definition lookup step feeding device_list, arp_lookup, and alert tag filters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete example flow ('check our routers' → tags_list → device_list) and specifies when type='device' is the relevant filter. It does not explicitly name exclusion cases or alternatives, but the provided example plus slug-vs-display guidance gives an agent clear context for when and how to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

top_bandwidthA
Read-onlyIdempotent
Inspect

Top NetFlow conversations over the last N minutes — the 'who's eating bandwidth right now?' question. Wraps GET /api/getTopBandwidth/{mins}, the same query that powers the dashboard live widget.

Use this for short-window 'right now' inquiries. For longer windows (hours-to-days) or filtered top-talkers, use netflow_search instead — that tool has the rich filter set; this one is the live snapshot.

Server-side cap: top 20 conversations by in-window bytes descending. We don't expose top_n — the upstream endpoint hardcodes the limit and there's no value in lying about that to the LLM.

Each row: {src_host, src_id, src_ip, dst_host, dst_id, dst_ip, bytes, bps}. Hostnames come from the _dns view (PTR + custom overrides); src_id/dst_id are populated when the IP matches a monitored device. bytes is the conversation's in-window share (pro-rated), and bps is averaged across the window — not a live rate.

Permission: vne. Examples: top_bandwidth({minutes: 5}) top_bandwidth({minutes: 60})

ParametersJSON Schema
NameRequiredDescriptionDefault
minutesNoLookback window in minutes (1-1440 / 24h). Default 5. Matched by OVERLAP across the raw and aggregated flow tables with bytes pro-rated to the window, so long lookbacks are honest — not capped by the ~15-minute raw horizon.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite rich annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds substantial behavioral context: the hardcoded 20-conversation cap, the absence of top_n, how hostnames are resolved, how bytes are pro-rated, and how bps is averaged. This goes far beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded, with a clear purpose, usage guidance, output row shape, permission, and examples. Every section adds value and no sentence is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one optional parameter), but the description covers the return shape, row semantics, permissions, example calls, and the key sibling comparison. With no output schema, this is fully sufficient for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description enriches the minutes parameter with crucial semantics: the OVERLAP-matching behavior, pro-rating to the window, and why long lookbacks remain honest. This adds meaning beyond the schema's basic type and default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it returns top NetFlow conversations over a window, wrapping a specific endpoint and answering a clear question. It distinguishes itself from netflow_search by being the live snapshot tool, so an agent can tell it apart immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit: use for short-window 'right now' inquiries, and use netflow_search for longer windows or filtered top-talkers. It names the alternative and the condition that selects it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tracerouteA
Read-onlyIdempotent
Inspect

Traceroute to a target from the Netmon server. Wraps POST /api/getTracerouteInfo/{target} (permission: tools).

The probe runs ON the netmon server — hops reflect the path FROM netmon TO the target, not from wherever mcpmond is running. Server runs traceroute --mtu -m 10 -q 2 -w 1 so you get up to 10 hops with MTU discovery; longer paths get truncated. PTR lookups happen server-side.

Returns rows of {hop, address, latency (ms or null on timeout), hostname, mtu (or null)}.

Example: traceroute({target: "1.1.1.1"})

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYesIP address or hostname to trace.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses the exact execution environment (netmon server, not mcpmond), the precise command flags (--mtu -m 10 -q 2 -w 1), the hop limit and truncation behavior, and server-side PTR lookups. It also explains the return format with null fields on timeout. This is a thorough and honest behavioral contract that goes far beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense yet well-organized: purpose first, then execution context, command specifics, return shape, and an example. Every sentence contributes meaningful detail—nothing is redundant or filler. The front-loaded purpose and the structured flow make it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only network diagnostic tool with no output schema, the description covers all essential aspects: what it does, where it runs, operational limits (10 hops, MTU), behavior on timeout, return field names, and a concrete example. It also notes the permission requirement. An agent has everything needed to invoke it correctly without additional assumptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter 'target' is already documented as an IP or hostname. The description reinforces this and provides a usage example, but it does not add new constraints or disambiguation beyond the schema. It adds mild value by clarifying the target's role in the traceroute context, but the baseline of 3 is appropriate given full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Traceroute to a target from the Netmon server', which is a specific verb, resource, and origin point. It distinguishes itself from network siblings like ping by making clear it traces the path from a fixed server, and it names the underlying API and permission requirement. This is unambiguous and tells an agent exactly what operation is performed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong contextual cues about when this tool is relevant (network path tracing, MTU discovery, hops up to 10) but it never explicitly contrasts it with alternatives or states when not to use it. It does not name ping or other siblings, nor does it give a 'use this if...' rule, leaving usage inference to the agent. The purpose itself implies route tracing, but explicit guidance is missing.

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.

  1. 36 tool updates
    • First observedagent_disk_usage
    • First observedagent_processes
    • First observedagent_services
    • First observedalerts_history
    • First observedalerts_list
    • First observedarp_lookup
    • First observedarp_table
    • First observedcapture_get
    • First observedcapture_list
    • First observeddevice_find
    • First observeddevice_get
    • First observeddevice_list
    • First observeddevice_metric_summary
    • First observedeve_get
    • First observedeve_search
    • First observedeventlog_search
    • First observedflow_summary
    • First observedget_network_entity_info
    • First observedinterfaces_search
    • First observedlog_severity_summary
    • First observedmaintenance_windows_list
    • First observednetflow_raw_search
    • First observednetflow_search
    • First observedoverwatch_summary
    • First observedping
    • First observedport_map
    • First observedsearch_ip
    • First observedsnmp_test
    • First observedsnmp_walk_last
    • First observedsnmp_walk_run
    • First observedspeedtest_history
    • First observedsyslog_facets
    • First observedsyslog_search
    • First observedtags_list
    • First observedtop_bandwidth
    • First observedtraceroute

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.