Skip to main content
Glama

LibreNMS MCP Server

Let AI agents query and manage LibreNMS network monitoring through the Model Context Protocol

PyPI Python License

Pre-commit Checks Docker MCP Registry

Installation ยท Tools ยท Configuration ยท Security

LibreNMS MCP Server is a Python-based Model Context Protocol (MCP) server designed to provide advanced, programmable access to LibreNMS network monitoring data and management features. It exposes a modern API for querying, automating, and integrating LibreNMS resources such as devices, ports, alerts, inventory, locations, logs, and more. The server supports both read and write operations, robust security features, and is suitable for integration with automation tools, dashboards, and custom network management workflows.

โœจ Features

Core Features

  • Query LibreNMS devices, ports, inventory, locations, logs, and alerts with flexible filtering

  • Retrieve network topology, device status, and performance metrics

  • Access and analyze alert history, event logs, and system health

  • Monitor interface statistics, port status, and traffic data

  • Track endpoints and connected devices by MAC or IP address

  • Retrieve and manage device groups, port groups, and poller groups

  • Get detailed information about network services and routing

Management Operations

  • Create, update, and delete devices, ports, and groups (if enabled)

  • Manage alert rules, notifications, and device metadata

  • Configure read-only mode to restrict all write operations for safe monitoring

  • Support for bulk operations on devices and ports

Advanced Capabilities

  • Rate limiting and API security features

  • Real-time network monitoring and health tracking

  • Comprehensive logging and audit trails

  • SSL/TLS support and configurable timeouts

  • Optional tool-search transform for large tool catalogs

  • Extensible with custom middlewares and utilities

Related MCP server: Unofficial FortiMonitor MCP Server

๐Ÿš€ Installation

Prerequisites

  • Python 3.11 to 3.15

  • Access to a LibreNMS

  • Valid LibreNMS token with appropriate permissions

Quick Install from PyPI

The easiest way to get started is to install from PyPI:

# Using UV (recommended)
uvx librenms-mcp

# Or using pip
pip install librenms-mcp

Remember to configure the environment variables for your LibreNMS instance before running the server:

# Create environment configuration
export LIBRENMS_URL=https://domain.tld:8443
export LIBRENMS_TOKEN=your-librenms-token

For more details, visit: https://pypi.org/project/librenms-mcp/

Install from Source

  1. Clone the repository:

git clone https://github.com/mhajder/librenms-mcp.git
cd librenms-mcp
  1. Install dependencies:

# Using UV (recommended)
uv sync

# Or using pip
pip install -e .
  1. Configure environment variables:

cp .env.example .env
# Edit .env with your LibreNMS url and token
  1. Run the server:

# Using UV (recommended)
uv run librenms-mcp

# Or using the installed command directly
librenms-mcp

Using Docker

A Docker image is available on GitHub Packages for easy deployment. It runs the HTTP Streamable transport on port 8000 (/mcp).

docker pull ghcr.io/mhajder/librenms-mcp:latest

Open WebUI

Open WebUI 0.6.31 and later connect to the image directly; the separate MCPO image (ghcr.io/mhajder/librenms-mcpo) is no longer published. In Open WebUI, go to Admin Settings > Integrations > External Tool Servers, add a connection of type MCP (Streamable HTTP) with the URL http://<host>:8000/mcp, and set Bearer authentication to your MCP_HTTP_BEARER_TOKEN.

Development Setup

For development with additional tools:

# Clone and install with development dependencies
git clone https://github.com/mhajder/librenms-mcp.git
cd librenms-mcp
uv sync --group dev

# Run tests
uv run pytest

# Run with coverage
uv run pytest --cov=src/

# Run linting and formatting
uv run ruff check .
uv run ruff format .

# Run type checking
uv run ty check .

# Setup pre-commit hooks
uv run prek install

๐Ÿ”ง Configuration

Environment Variables

Boolean settings accept true/false, 1/0, yes/no and on/off (case-insensitive). Any other value stops the server at startup, so a typo cannot silently turn read-only mode or TLS verification off. The exception is SENTRY_SEND_DEFAULT_PII and SENTRY_ENABLE_LOGS: when SENTRY_DSN is set, an invalid value there logs an error and leaves Sentry off, and the server keeps running.

# LibreNMS Connection Details
LIBRENMS_URL=https://domain.tld:8443
LIBRENMS_TOKEN=your-librenms-token

# SSL Configuration
LIBRENMS_VERIFY_SSL=true
LIBRENMS_TIMEOUT=30

# Read-Only Mode
# Set READ_ONLY_MODE true to disable all write operations (put, post, delete)
READ_ONLY_MODE=false

# Disabled Tags
# Comma-separated list of tags to disable tools for (empty by default)
# Example: DISABLED_TAGS=alert,alert-rules,alert-templates,bills
DISABLED_TAGS=

# Logging Configuration
LOG_LEVEL=INFO

# Rate Limiting (requests per minute)
# Set RATE_LIMIT_ENABLED true to enable rate limiting
RATE_LIMIT_ENABLED=false
RATE_LIMIT_MAX_REQUESTS=100
RATE_LIMIT_WINDOW_MINUTES=1

# Tool Search Transform (Optional)
# Set TOOL_SEARCH_ENABLED true to replace full tool listings with search_tools + call_tool
TOOL_SEARCH_ENABLED=false
# Search strategy: bm25 (natural language) or regex (pattern match)
TOOL_SEARCH_STRATEGY=bm25
# Maximum number of tools returned by search_tools
TOOL_SEARCH_MAX_RESULTS=5

# Sentry Error Tracking (Optional)
# Set SENTRY_DSN to enable error tracking and performance monitoring
# SENTRY_DSN=https://your-key@o12345.ingest.us.sentry.io/6789
# Optional Sentry configuration
# SENTRY_TRACES_SAMPLE_RATE=1.0
# SENTRY_SEND_DEFAULT_PII=false
# SENTRY_ENVIRONMENT=production
# SENTRY_RELEASE=1.2.3
# SENTRY_PROFILE_SESSION_SAMPLE_RATE=1.0
# SENTRY_PROFILE_LIFECYCLE=trace
# SENTRY_ENABLE_LOGS=true

# MCP Transport Configuration
# Transport type: 'stdio' (default), 'sse' (Server-Sent Events), or 'http' (HTTP Streamable).
# 'streamable-http' is accepted as an alias for 'http'. Any other value stops the server at startup.
MCP_TRANSPORT=stdio

# HTTP Transport Settings (used when MCP_TRANSPORT=sse or MCP_TRANSPORT=http)
# Host to bind the HTTP server (default: 127.0.0.1)
# MCP_HTTP_HOST=127.0.0.1
# Port to bind the HTTP server (default: 8000)
# MCP_HTTP_PORT=8000
# Optional bearer token for authentication (leave empty for no auth)
# MCP_HTTP_BEARER_TOKEN=

๐Ÿงฐ Available Tools

Device & Inventory Tools

  • devices_list: List all devices (with optional filters)

  • device_get: Get details for a specific device

  • device_add: Add a new device

  • device_update: Update device metadata

  • device_delete: Remove a device

  • device_ports: List all ports for a device

  • device_ports_get: Get details for a specific port on a device

  • device_fdb: List the forwarding database (learned MACs) for a device

  • device_nac: List network access control (802.1X / MAB) sessions on a device

  • device_availability: Get device availability

  • device_outages: Get device outages

  • device_set_maintenance: Set device maintenance mode

  • device_discover: Discover or add a device using provided credentials

  • device_rename: Rename an existing device

  • device_maintenance_status: Get the maintenance status for a device

  • device_vlans: List VLANs for a device

  • device_links: List links for a device

  • device_wireless_sensors: List wireless sensors (frequency, clients, rssi, ...) with current values

  • device_parents_set: Set the dependency parents of a device (replaces the current set)

  • device_parents_clear: Remove dependency parents from a device

  • device_eventlog_add: Add an event log entry for a device

  • inventory_device: Get inventory for a device

  • inventory_device_flat: Get flat inventory for a device

  • devicegroups_list: List device groups

  • devicegroup_add: Add a device group

  • devicegroup_update: Update a device group

  • devicegroup_delete: Delete a device group

  • devicegroup_devices: List devices in a device group

  • devicegroup_set_maintenance: Set maintenance for a device group

  • devicegroup_add_devices: Add devices to a device group

  • devicegroup_remove_devices: Remove devices from a device group

  • locations_list: List all locations

  • location_add: Add a location

  • location_edit: Edit a location

  • location_delete: Delete a location

  • location_get: Get details for a location

  • location_set_maintenance: Set maintenance for a location

Port & Port Group Tools

  • ports_list: List all ports (with optional filters)

  • ports_search: Search ports (general search)

  • ports_search_field: Search ports by a specific field

  • ports_search_mac: Search ports by MAC address

  • port_get: Get details for a specific port

  • port_fdb: List MAC addresses learned on a port

  • port_ip_info: Get IP address information for a port

  • port_transceiver: Get transceiver information for a port

  • port_description_get: Get a port description

  • port_description_update: Update a port description

  • port_groups_list: List port groups

  • port_group_add: Add a port group

  • port_group_list_ports: List ports in a port group

  • port_group_assign: Assign ports to a port group

  • port_group_remove: Remove ports from a port group

Port Security Tools

  • port_security_list: List port security configuration across all devices

  • port_security_device: Get port security configuration for a device

  • port_security_port: Get port security configuration for a single port

Graph Tools

Graphs are returned as MCP images. The tools ask LibreNMS for PNG, which MCP clients such as Claude can display (SVG, LibreNMS's default webui.graph_type, often is not). A LibreNMS release that ignores the request renders in its webui.graph_type format instead; the MIME type is taken from the response.

  • device_graphs_list: List the graph types available for a device

  • device_graph: Render a device-level graph (e.g. device_icmp_perf)

  • port_graph: Render a per-port graph by interface name (bits, upkts, nupkts, errors, etherlike; the LibreNMS names such as port_bits are accepted too)

  • port_group_graph: Render a traffic graph for one or more ports by port ID

Interface names containing a slash (Te2/7) are sent percent-encoded, and some reverse proxies reject or decode the encoded slash. When that happens, port_graph (for bits) and device_ports_get retry by port ID instead, so they still work behind such a proxy. Authentication errors are never retried, and LibreNMS's own "not found" answers are reported as is for names without a slash (a name with a slash is always retried, since a decoding proxy can turn it into a LibreNMS "not found" for the wrong path).

Other tools that put a slash-bearing value in the path (ports_search, ports_search_field, oxidized_config_search with a prefix such as 0.0.0.0/0, location names) have no such fallback. If LibreNMS sits behind Apache, allow encoded slashes so every tool works:

AllowEncodedSlashes NoDecode

A 400 or 404 for a path with an encoded slash that did not come from LibreNMS includes this hint in the tool's error message.

Alerting & Logging Tools

  • alerts_get: List current and historical alerts

  • alert_get_by_id: Get details for a specific alert

  • alert_acknowledge: Acknowledge an alert

  • alert_unmute: Unmute an alert

  • alert_rules_list: List alert rules

  • alert_rule_get: Get details for a specific alert rule

  • alert_rule_add: Add an alert rule

  • alert_rule_edit: Edit an alert rule

  • alert_rule_delete: Delete an alert rule

  • alert_templates_list: List all alert templates

  • alert_template_get: Get a specific alert template

  • alert_template_create: Create a new alert template

  • alert_template_edit: Edit an alert template

  • logs_eventlog: Get event log for a device, or for all devices when no hostname is given

  • logs_syslog: Get syslog for a device, or for all devices when no hostname is given

  • logs_alertlog: Get alert log for a device, or for all devices when no hostname is given

  • logs_authlog: Get the server-wide authentication log

  • logs_syslogsink: Add a syslog sink

Billing Tools

  • bills_list: List bills

  • bill_get: Get details for a bill

  • bill_graph: Render a bill graph as an image

  • bill_graph_data: Get bill graph data

  • bill_history: Get bill history

  • bill_history_graph: Render a bill history graph as an image

  • bill_history_graph_data: Get bill history graph data

  • bill_create_or_update: Create or update a bill

  • bill_delete: Delete a bill

Oxidized Tools

  • oxidized_list: List devices tracked by Oxidized for config backup

  • oxidized_config_get: Get the stored configuration for a specific device

  • oxidized_config_search: Search all stored device configurations for a string

Network & Monitoring Tools

  • arp_search: Search ARP entries

  • poller_group_get: Get poller group(s)

  • routing_ip_addresses: List all IP addresses from LibreNMS.

  • services_list: List all services from LibreNMS.

  • services_for_device: Get services for a device from LibreNMS.

  • service_add: Add a service to LibreNMS

  • service_edit: Edit an existing service

  • service_delete: Delete a service

  • bgp_sessions: List BGP sessions

  • bgp_session_get: Get details for a specific BGP session

  • bgp_session_edit: Edit a BGP session

  • fdb_lookup: Lookup forwarding database (FDB) entries

  • nac_list: List network access control (802.1X / MAB) sessions across all devices

  • ospf_list: List OSPF instances

  • ospf_ports: List OSPF ports

  • vrf_list: List VRFs

  • ping: Ping the LibreNMS system

  • health_list: List health sensors

  • health_by_type: List health sensors by type

  • health_sensor_get: Get details for a health sensor

  • sensors_list: List sensors

  • switching_vlans: List all VLANs from LibreNMS.

  • switching_links: List all links from LibreNMS.

  • system_info: Get system info from LibreNMS.

  • Flexible filtering and search for all major resources (devices, ports, alerts, logs, inventory, etc.)

๐Ÿ“„ Pagination & Limit Support

To prevent overloading LLM contexts when querying large LibreNMS production instances, all list, search, and log tools support pagination.

Key Features

  • Sensible Defaults: All list tools default to returning 100 results per page.

  • Unified Parameters:

    • limit: The maximum number of results to return (defaults to 100, minimum 1).

    • offset (or start for log tools): The number of results to skip.

  • Pagination Metadata: Every paginated response includes metadata fields:

    • limit: The active limit.

    • offset (or start): The active offset.

    • count: The number of items returned in the current page.

    • total: The total number of items available (for log tools, this is provided if returned by the LibreNMS API).

๐Ÿšจ Error Responses

Every tool that returns JSON reports a failure in LibreNMS's own error shape, whether the error came from LibreNMS, from a check in this server, or from an exception such as a timeout:

{"status": "error", "message": "Device typo does not exist"}

Check status == "error". Up to 1.11.3, exceptions were returned as {"error": "..."}; clients that looked for an error key need updating.

๐Ÿ”’ Security & Safety Features

Read-Only Mode

The server supports a read-only mode that disables all write operations for safe monitoring:

READ_ONLY_MODE=true

Tag-Based Tool Filtering

You can disable specific categories of tools by setting disabled tags:

DISABLED_TAGS=alert,alert-rules,alert-templates,bills

A tool is hidden when any of its tags is disabled, and some tools carry more than one category tag: for example, port_graph is tagged graphs and ports, and ospf_list is tagged routing and ospf, so DISABLED_TAGS=ports also hides port_graph. Alerting is split into three tags: alert (current alerts: list, acknowledge, unmute), alert-rules and alert-templates; disable all three to hide every alerting tool.

Besides the categories, read-only marks the tools that stay available in read-only mode. The admin and global-read tags follow the permission groups older LibreNMS releases used for their API routes (can:admin, can:global-read). Current LibreNMS checks permissions per object instead, so treat these two as broad categories rather than an exact match of what your LibreNMS user may do.

Tool Search for Large Toolsets

FastMCP tool search can reduce prompt size for servers with many tools. When enabled, list_tools returns two synthetic tools:

  • search_tools: Finds matching tools and returns their full schemas

  • call_tool: Executes any discovered tool by name

Enable it with:

TOOL_SEARCH_ENABLED=true
TOOL_SEARCH_STRATEGY=bm25    # bm25 or regex
TOOL_SEARCH_MAX_RESULTS=5    # optional, default is 5

bm25 supports natural language queries, while regex uses a regex pattern input for deterministic matching.

Tool search respects existing visibility controls (read-only mode and disabled tags).

Rate Limiting

The server supports rate limiting to control API usage and prevent abuse. If enabled, requests are limited per client using a sliding window algorithm.

Enable rate limiting by setting the following environment variables in your .env file:

RATE_LIMIT_ENABLED=true
RATE_LIMIT_MAX_REQUESTS=100   # Maximum requests allowed per window
RATE_LIMIT_WINDOW_MINUTES=1   # Window size in minutes

If RATE_LIMIT_ENABLED is set to true, the server will apply rate limiting middleware. Adjust RATE_LIMIT_MAX_REQUESTS and RATE_LIMIT_WINDOW_MINUTES as needed for your environment.

Sentry Error Tracking & Monitoring (Optional)

The server optionally supports Sentry for error tracking, performance monitoring, and debugging. Sentry integration is completely optional and only initialized if configured.

Installation

To enable Sentry monitoring, install the optional dependency:

# Using UV (recommended)
uv sync --extra sentry

Configuration

Enable Sentry by setting the SENTRY_DSN environment variable in your .env file:

# Required: Sentry DSN for your project
SENTRY_DSN=https://your-key@o12345.ingest.us.sentry.io/6789

# Optional: Performance monitoring sample rate (0.0-1.0, default: 1.0)
SENTRY_TRACES_SAMPLE_RATE=1.0

# Optional: Include personally identifiable information (default: false).
# When true, tool inputs and outputs (device configs, SNMP credentials) are sent to Sentry.
SENTRY_SEND_DEFAULT_PII=false

# Optional: Environment name (e.g., "production", "staging")
SENTRY_ENVIRONMENT=production

# Optional: Release version (auto-detected from package if not set)
SENTRY_RELEASE=1.2.2

# Optional: Profiling - continuous profiling sample rate (0.0-1.0, default: 1.0)
SENTRY_PROFILE_SESSION_SAMPLE_RATE=1.0

# Optional: Profiling - lifecycle mode for profiling (default: "trace")
# Options: "all", "continuation", "trace"
SENTRY_PROFILE_LIFECYCLE=trace

# Optional: Enable log capture as breadcrumbs and events (default: true)
SENTRY_ENABLE_LOGS=true

Features

When enabled, Sentry automatically captures:

  • Exceptions & Errors: All unhandled exceptions with full context

  • Performance Metrics: Request/response times and traces

  • MCP Integration: Detailed MCP server activity and interactions

  • Logs & Breadcrumbs: Application logs and event trails for debugging

  • Context Data: Environment, client info, and request parameters

Getting a Sentry DSN

  1. Create a free account at sentry.io

  2. Create a new Python project

  3. Copy your DSN from the project settings

  4. Set it in your .env file

Disabling Sentry

Sentry is completely optional. If you don't set SENTRY_DSN, the server will run normally without any Sentry integration, and no monitoring data will be collected.

SSL/TLS Configuration

The server supports SSL certificate verification and custom timeout settings:

LIBRENMS_VERIFY_SSL=true    # Enable SSL certificate verification
LIBRENMS_TIMEOUT=30         # Connection timeout in seconds

Transport Configuration

The server supports multiple transport mechanisms for the MCP protocol. MCP_TRANSPORT is case-insensitive, streamable-http is accepted as an alias for http, and any other value stops the server at startup with an error rather than silently falling back to STDIO:

STDIO Transport (Default)

The default transport uses standard input/output for communication. This is ideal for local usage and integration with tools that communicate via stdin/stdout:

MCP_TRANSPORT=stdio

HTTP SSE Transport (Server-Sent Events)

For network-based deployments, you can use HTTP with Server-Sent Events. This allows the MCP server to be accessed over HTTP with real-time streaming:

MCP_TRANSPORT=sse
MCP_HTTP_HOST=127.0.0.1        # Localhost
MCP_HTTP_PORT=8000           # Port to listen on
MCP_HTTP_BEARER_TOKEN=your-secret-token  # Optional authentication token

When using SSE transport with a bearer token, clients must include the token in their requests:

curl -H "Authorization: Bearer your-secret-token" http://localhost:8000/sse

HTTP Streamable Transport

The HTTP Streamable transport provides HTTP-based communication with request/response streaming. This is ideal for web integrations and tools that need HTTP endpoints:

MCP_TRANSPORT=http
MCP_HTTP_HOST=127.0.0.1        # Localhost
MCP_HTTP_PORT=8000           # Port to listen on
MCP_HTTP_BEARER_TOKEN=your-secret-token  # Optional authentication token

When using streamable transport with a bearer token:

curl -H "Authorization: Bearer your-secret-token" \
     -H "Accept: application/json, text/event-stream" \
     -H "Content-Type: application/json" \
     -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' \
     http://localhost:8000/mcp

Note: The HTTP transport requires proper JSON-RPC formatting with jsonrpc and id fields. The server may also require session initialization for some operations.

Health Endpoint

Both HTTP transports (sse and http) serve GET /health, which answers 200 ok when the server is handling requests. It needs no bearer token and does not contact LibreNMS, so a LibreNMS outage does not mark the MCP server unhealthy. The Docker image's HEALTHCHECK uses it:

curl http://localhost:8000/health

For more information on FastMCP transports, see the FastMCP documentation.

๐Ÿค Contributing

Contributions are welcome. See CONTRIBUTING.md for the dev setup, checks and commit message format, and use the issue templates for bugs and feature requests.

Found a security problem? Please report it privately as described in SECURITY.md.

๐Ÿ“œ License

MIT License - see LICENSE for details.

Available Tools

110 tools
alert_acknowledgeAlert AcknowledgeC
Idempotent

Acknowledge an alert in LibreNMS by ID.

NameRequiredDescriptionDefault
noteNoOptional note to attach to the acknowledgement
alert_idYesAlert ID to acknowledge
until_clearNoIf true, acknowledge until the alert clears. If false, acknowledge only this instance.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

The annotations already communicate that this is a non-read-only, idempotent, non-destructive operation. The description adds no behavioral detail beyond restating the action and does not clarify what acknowledgement changes about the alert state or how until_clear interacts with that state.

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 a single declarative sentence with no filler and the key action and resource are front-loaded. It is compact and readable, though slightly under-specified given the close sibling tools and richer operation semantics.

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

Completeness2/5

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

For a mutating alert operation, the description lacks operational context: when acknowledgement is appropriate, what side effects it has, and how it differs from unmuting. The schema and annotations cover parameters and safety, but not the situational guidance an agent needs to select this tool confidently among many alert-related siblings.

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 alert_id, note, and until_clear are already documented meaningfully in the input schema. The description adds no parameter-level information, but the schema fully carries that burden, making a baseline score of 3 appropriate.

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

Purpose4/5

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

The description states a specific verb ('Acknowledge') and resource ('an alert in LibreNMS') and identifies how the alert is selected ('by ID'). It is clear and unambiguous, though it does not explicitly differentiate this from sibling tools like alert_unmute.

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 guidance is provided about when to use this tool versus alternatives such as alert_unmute or alerts_get. The description gives no context about whether this is the right choice for muting notifications, resolving an alert, or acknowledging only the current occurrence.

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

alert_get_by_idAlert Get By IdA
Read-onlyIdempotent

Get a specific alert from LibreNMS by ID.

NameRequiredDescriptionDefault
alert_idYesThe ID of the alert to retrieve.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/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 only product context ('from LibreNMS') and retrieval semantics, with no additional behavioral details such as not-found behavior or permissions. This is acceptable for a simple read operation.

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?

A single front-loaded sentence communicates the tool's purpose with no filler or redundancy. Every word 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?

The tool is simple: one required parameter, read-only annotations, and an output schema present. The description is complete enough for an agent to select and invoke it correctly; no important operational detail is missing at this level of complexity.

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 documents alert_id with a description and 100% coverage. The description's 'by ID' simply restates the parameter concept without adding format details, minimum semantics, or any meaning beyond what the schema provides. Baseline 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?

The description uses a specific verb ('Get'), a specific resource ('a specific alert'), and the retrieval criterion ('by ID'). It clearly distinguishes this from sibling list tools like alerts_get and from alert_rule_get, which targets rules rather than alerts.

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 implies the tool is for retrieving one alert when the caller already knows its ID, but it does not explicitly state when to prefer this over alerts_get or mention any exclusions. The usage context is clear enough by implication, but not explicitly contrasted with alternatives.

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

alert_rule_addAlert Rule AddC
Destructive

Add a new alert rule to LibreNMS.

NameRequiredDescriptionDefault
payloadYesAlert rule payload fields: - name (required): Rule name - builder (required): Rule builder JSON with conditions - devices (required): Array of device IDs or [-1] for all devices - severity (required): ok, warning, critical - count (optional): Trigger threshold count (default: 1) - delay (optional): Delay before alerting in seconds - interval (optional): Re-alert interval in seconds - mute (optional): Mute alerts (true/false) - invert (optional): Invert rule logic (true/false) - notes (optional): Rule notes - disabled (optional): Disable rule (0/1) Do not include rule_id: LibreNMS would edit that rule instead of adding one. Example: {"name": "Device Down", "severity": "critical", "devices": [-1], "builder": {"condition": "AND", "rules": [...]}}

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false, but the description adds no behavioral context of its own (no mention of auth needs, side effects, or the non-idempotent nature). The one useful warning about omitting rule_id lives in the schema, not the description. 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.

Conciseness4/5

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

A single front-loaded sentence with zero waste. It is arguably under-specified rather than padded, which is penalized under completeness rather than here.

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?

An output schema exists and the parameter schema is rich, so the description needn't explain return values. However, for a destructive, non-idempotent mutation tool the one-line description does not add any behavioral or usage context beyond what annotations and schema already convey.

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 payload description is unusually thorough (required/optional fields, enums for severity, an example, and the rule_id caveat). The description text itself contributes nothing beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb (Add) and resource (alert rule) scoped to LibreNMS, so the operation is unambiguous. It does not explicitly contrast with siblings like alert_rule_edit or alert_rule_delete, though the verb makes the distinction fairly obvious.

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?

There is no guidance on when to use this tool versus alert_rule_edit or alert_rules_list, and no prerequisites or exclusions are stated. The agent must infer usage from the name alone.

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

alert_rule_deleteAlert Rule DeleteA
DestructiveIdempotent

Delete an alert rule from LibreNMS by ID.

NameRequiredDescriptionDefault
rule_idYesAlert rule ID to delete

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, which cover the safety profile of a delete operation. The description adds little behavioral context beyond that, such as permanence or cascading effects, but it does not contradict 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 a single sentence that delivers the action, resource, scope, and identifier requirement with no filler. It is appropriately minimal for a one-parameter delete 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?

For a simple delete operation with one required parameter, destructive/idempotent annotations, and an output schema, the description provides all necessary orientation. An agent understands what to delete and how to identify the target.

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 rule_id is already documented as 'Alert rule ID to delete.' The description reinforces this by saying 'by ID' but adds no new semantic 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 uses the specific verb 'Delete' with a clear resource 'alert rule' and identifies the lookup key 'by ID.' This makes the operation unambiguous and distinguishes it from sibling tools like alert_rule_get, alert_rule_add, and alert_rule_edit.

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 implies when to use the tool: when an alert rule needs to be deleted and its ID is known. It does not explicitly mention alternatives or when-not-to-use conditions, but no sibling tool performs alert rule deletion, so the context is sufficient for correct selection.

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

alert_rule_editAlert Rule EditC
DestructiveIdempotent

Edit an existing alert rule in LibreNMS.

NameRequiredDescriptionDefault
payloadYesAlert rule edit payload (must include rule_id field): - rule_id (required): Integer rule ID to edit. Without it LibreNMS would create a new rule, so the tool refuses the call. - name: Rule name - builder: Rule builder JSON with conditions - devices: Array of device IDs or [-1] for all devices - severity: ok, warning, critical - count: Trigger threshold count - delay: Delay before alerting in seconds - interval: Re-alert interval in seconds - mute: Mute alerts (true/false) - invert: Invert rule logic (true/false) - notes: Rule notes - disabled: Disable rule (0/1)

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=true, so the safety profile is known. The description adds nothing beyond that โ€” no mention of what a destructive edit overwrites, no auth/permission requirement, no idempotency explanation backing the annotation.

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?

A single front-loaded sentence with zero filler. It is efficiently sized, though the extreme brevity is under-specification rather than ideal economy.

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?

Output schema and full parameter coverage remove the need to explain returns or fields, and annotations carry the safety profile. The remaining gap is routing among the many alert_rule/alert siblings, which the description does not address.

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 payload field documents every rule attribute plus the rule_id requirement in detail. The description adds no parameter meaning of its own, which is the correct baseline of 3 when the schema does all the work.

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

Purpose4/5

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

States a specific verb and resource ("Edit an existing alert rule") and the word "existing" implicitly distinguishes it from the sibling alert_rule_add. It never names the alternatives (alert_rule_add, alert_rule_delete, alert_rule_get) that sit in the same family, so differentiation is implied rather than explicit.

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?

The description gives no when-to-use, when-not-to-use, or alternative-routing guidance. With three close siblings (alert_rule_add, alert_rule_delete, alert_rule_get) an agent gets no help deciding among them.

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

alert_rule_getAlert Rule GetB
Read-onlyIdempotent

Get details for a specific alert rule by ID.

NameRequiredDescriptionDefault
rule_idYesAlert rule ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which covers the safety profile. The description adds no behavioral context beyond restating the read-only nature of the operation, but it does not contradict 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 a single, front-loaded sentence with no wasted words. It conveys the action, target resource, and selection criterion immediately, making 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.

Completeness3/5

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

For a simple one-parameter getter with full schema coverage, an output schema, and safety annotations, the description is minimally adequate to invoke the tool correctly. However, it fails to disambiguate from the similarly named alert_get_by_id, leaving a real selection gap in the broader tool context.

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 has 100% parameter description coverage, with rule_id described as 'Alert rule ID' and a minimum of 1. The description's reference to 'by ID' adds no semantic information beyond what the 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.

Purpose4/5

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

The description clearly states a specific verb ('Get'), resource ('details for a specific alert rule'), and selection method ('by ID'). It is unambiguous about what the tool does, though it does not distinguish itself from the sibling tool alert_get_by_id, which appears to overlap in purpose.

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 explicit guidance is given about when to use this tool versus alternatives such as alert_rules_list, alerts_get, or alert_get_by_id. The phrase 'by ID' implies the caller needs a rule ID, but the description does not state when this tool is preferred or when another tool should be used.

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

alert_rules_listAlert Rules ListC
Read-onlyIdempotent

List all alert rules from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 without the description. The description adds only the source system name; it omits pagination behavior and the fact that results are capped by default, which matters for a 'list all' claim.

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?

A single short sentence with the verb and resource front-loaded and no wasted words. It is efficient, though arguably under-specified rather than truly concise.

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 read-only list tool with full annotation coverage, a complete input schema, and an output schema that documents return shape, the description is minimally sufficient. It leaves the agent without any routing guidance among the numerous sibling list tools, which is the main gap.

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% with only two pagination parameters fully documented in the schema, so the baseline of 3 applies. The description adds no parameter context and its wording 'all alert rules' sits slightly at odds with the default limit of 100.

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

Purpose4/5

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

States a specific verb (list) and resource (alert rules) with source (LibreNMS), so an agent knows it enumerates alert rules. It does not explicitly distinguish itself from alert_rule_get, which retrieves a single rule, though 'List all' vs. singular siblings implies the distinction.

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 guidance, prerequisites, or alternatives are given. Nothing tells the agent to prefer alert_rule_get when a specific rule ID is known, nor which of the many sibling list tools is appropriate for a given question.

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

alerts_getAlerts GetB
Read-onlyIdempotent

Get alerts from LibreNMS with optional filters.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
orderNoHow to order the output, default is by timestamp (descending). Can be appended by DESC or ASC to change the order. Optional.
stateNoFilter the alerts by state: 0 = ok, 1 = alert, 2 = ack. Optional.
offsetNoNumber of results to skip (offset) for pagination
severityNoFilter the alerts by severity. Valid values: ok, warning, critical. Optional.
alert_ruleNoFilter alerts by alert rule ID. Optional.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is consistent with them. The description adds little beyond 'optional filters,' but since the annotations cover the safety profile, this is acceptable.

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 a single, front-loaded sentence with no filler or unnecessary detail. It is concise and easy to parse, though it could have included a bit more value without becoming verbose.

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?

Given the simple read-only nature, the rich annotations, and the output schema, the description is sufficient for basic invocation. It does not mention pagination or how to fetch a single alert, but those are covered by schema defaults and the sibling naming convention.

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 provides 100% coverage with descriptions for all six parameters, including defaults and valid values. The description only refers generically to 'optional filters,' so it adds no parameter-level meaning beyond the schema.

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

Purpose4/5

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

The description uses a specific verb ('Get') and a clear resource ('alerts from LibreNMS'), and mentions optional filters, which conveys a list/query operation. It does not explicitly differentiate from alert_get_by_id, but the plural scope makes the distinction reasonably clear.

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 guidance is given about when to use this tool versus alternatives like alert_get_by_id, alert_acknowledge, or alert_rules_list. The phrase 'optional filters' hints at flexibility but does not state conditions or scenarios.

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

alert_template_createAlert Template CreateC

Create a new alert template in LibreNMS.

NameRequiredDescriptionDefault
payloadYesAlert template payload fields: - name (required): Template name - template (required): Template body (Laravel Blade syntax) - title (required): Alert title template - title_rec (required): Recovery title template - alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none) LibreNMS renders title, title_rec and template against test data and reads alert_rules unconditionally, so all five fields must be present. Do not include template_id: LibreNMS would edit that template instead of creating one. Example: {"name": "Custom Alert", "template": "{{ $alert->title }}\nSeverity: {{ $alert->severity }}", "title": "Alert: {{ $alert->title }}", "title_rec": "Recovered: {{ $alert->title }}", "alert_rules": []}

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, and the description adds nothing beyond them. It does not warn that repeated calls create duplicate templates (the non-idempotent consequence), nor note any permission requirements. The valuable behavioral notes (test-data rendering, omitting template_id) live in the schema, not the description.

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?

A single front-loaded sentence with zero filler, which is efficient. It is arguably too terse for a mutation tool, but nothing in it is wasted.

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?

An output schema exists, so return values need not be explained, and the schema itself carries rich field-level detail. However, for a create/mutation operation the description omits routing guidance versus alert_template_edit and any idempotency warning, leaving a visible gap.

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 baseline is 3. The single 'payload' parameter is exhaustively documented in the schema, including required fields, an example, and the template_id gotcha; the description adds no additional parameter meaning.

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

Purpose4/5

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

States a specific verb ('Create') and resource ('alert template') with the target system (LibreNMS), so the operation is unambiguous. It does not, however, differentiate itself in text from siblings like alert_template_edit or alert_template_get, relying on the name alone.

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?

The description offers no when-to-use guidance, no prerequisites, and no mention of the sibling alert_template_edit for modifying existing templates. An agent must infer the create-vs-edit boundary purely from the tool name.

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

alert_template_editAlert Template EditC
DestructiveIdempotent

Edit an existing alert template in LibreNMS.

NameRequiredDescriptionDefault
payloadYesAlert template edit payload (must include template_id): - template_id (required): Integer template ID to edit. Without it LibreNMS would create a new template, so the tool refuses the call. - name (required): Template name - template (required): Template body (Laravel Blade syntax) - title (required): Alert title template - title_rec (required): Recovery title template - alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none) LibreNMS replaces the whole template on edit, so resend every field, not just the ones being changed.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=true, covering the safety profile. The description itself adds nothing beyond that โ€” it does not mention the full-template-replacement behavior or the refusal when template_id is missing (those details live only in the schema).

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?

A single short, front-loaded sentence with no waste. It is efficient, though its brevity borders on under-specification rather than true conciseness.

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?

An output schema exists so return values need not be described, and the schema documents destructive replacement semantics. However, for a destructive mutation the description contributes essentially nothing on its own, leaving it minimally adequate.

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 single nested payload object is thoroughly documented with all required fields. The description adds no parameter detail of its own, so the baseline 3 applies since the schema does all the heavy lifting.

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

Purpose4/5

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

States a specific verb ("Edit") and resource ("alert template") scoped to "existing" templates in LibreNMS. The word "existing" implicitly distinguishes it from the sibling alert_template_create, though it does not name the sibling explicitly.

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?

The description gives no guidance on when to use this tool versus alert_template_create or alert_template_get. There is no mention of prerequisites (e.g., that the template must already exist) or conditions that would select an alternative.

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

alert_template_getAlert Template GetA
Read-onlyIdempotent

Get a specific alert template from LibreNMS by ID.

NameRequiredDescriptionDefault
template_idYesAlert template ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/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, which fully cover the safety profile. The description's 'Get' phrasing aligns with these annotations, and the presence of an output schema removes the need to describe return values. No additional behavioral disclosure is needed.

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?

A single, concise sentence that contains only essential information: the action, the resource, and the selection criterion. No filler 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?

For a one-parameter read-only tool with a complete input schema, an output schema, and safety annotations, the description covers everything needed for correct invocation. Nothing important 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 description coverage is 100%: template_id is documented with type, minimum, and a description. The tool description adds no extra parameter-level meaning beyond what the schema already provides, so baseline 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?

The description states a specific verb ('Get'), a clear resource ('specific alert template from LibreNMS'), and the access method ('by ID'). It clearly distinguishes from list- and mutation-oriented sibling tools like alert_templates_list, alert_template_create, and alert_template_edit.

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 implies the tool is for retrieving one known template by ID, which is enough for a simple getter. However, it does not explicitly mention when not to use it or point to alternatives such as alert_templates_list for listing all templates.

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

alert_templates_listAlert Templates ListC
Read-onlyIdempotent

List all alert templates from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 fully covered by structured data. The description adds essentially nothing beyond that: no pagination behavior, no result-size expectations, no indication of how templates are ordered or whether the list is filtered by anything.

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?

A single short sentence with zero filler and the resource front-loaded. It is efficient, though the brevity is a consequence of under-specification rather than disciplined editing.

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?

An output schema exists, so return-value documentation is not required, and the annotations cover safety. What remains missing is pagination guidance for a list endpoint (interaction of limit/offset, whether the full list is large), which is the main thing an agent needs to call this 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 both limit and offset are already documented in the schema, making the baseline 3 appropriate. The description adds no extra meaning such as default page size behavior or whether large limits are expensive.

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

Purpose4/5

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

The description states a clear verb and resource ('List all alert templates') and names the source system (LibreNMS), so the agent knows what it does. However, it does nothing to distinguish this from sibling tools like alert_template_get, alert_template_create, or alert_template_edit, leaving sibling selection to inference.

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?

There is no when-to-use guidance, no mention of when a single-template lookup (alert_template_get) would be preferable, and no prerequisites or exclusions. The agent gets a purpose statement but no routing logic.

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

alert_unmuteAlert UnmuteA
Idempotent

Unmute an alert in LibreNMS by ID.

NameRequiredDescriptionDefault
alert_idYesAlert ID to unmute

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds nothing beyond the schema about edge-case behavior (e.g., unmuting an already-unmuted alert), but with annotations present the bar is lower and there is no contradiction.

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?

A single nine-word sentence that front-loads the verb and resource and contains zero filler. Every word earns its place.

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 mutation with annotations and an output schema, the description is nearly sufficient. However, the large sibling list contains alert_acknowledge, a closely related operation, and the description offers no contrast to help an agent decide between acknowledging and unmuting an alert.

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% โ€” alert_id is already fully documented with type, minimum value, and a description. The tool description merely repeats 'by ID' and adds no extra meaning such as where to source the ID or how it maps to LibreNMS alert identifiers. 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 uses a specific verb ('unmute') with a clear resource ('alert'), system ('LibreNMS'), and method ('by ID'). It distinguishes itself from siblings such as alert_get_by_id, alerts_get, and alert_acknowledge โ€” an agent can tell this is the inverse operation without opening any schemas.

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?

The description gives no guidance on when to use this tool versus alert_acknowledge or alerts_get, and no prerequisites are stated (e.g., the alert must currently be muted, or that the ID typically comes from alerts_get). Usage is only implied by the verb, which is not enough for reliable tool selection.

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

bgp_session_editBgp Session EditB
DestructiveIdempotent

Edit BGP session in LibreNMS by ID.

NameRequiredDescriptionDefault
bgp_idYesBGP session ID
payloadYesBGP session payload. Format: {"bgp_descr": "description"}

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

The description simply restates the operation without adding behavioral details. Annotations already convey readOnlyHint=false, idempotentHint=true, and destructiveHint=true, but the description does not explain side effects, which fields are overwritten, or any permission or rate-limit considerations.

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?

A single, front-loaded sentence with no filler. Every element contributes to the agent's understanding of the tool's purpose.

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 two-parameter edit with full schema coverage and an output schema, the description identifies the resource, system, and identifier. The schema and annotations carry most behavioral and safety context, though adding usage guidance would make it fully complete.

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%, with bgp_id and payload both described in the input schema. The description adds no extra parameter semantics beyond restating the operation target.

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 ('Edit'), a clear resource ('BGP session'), and the lookup mechanism ('by ID'). It is immediately distinguishable from sibling tools such as bgp_session_get and bgp_sessions.

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?

Provides no guidance on when to use this tool versus alternatives, such as when to prefer bgp_session_get for retrieval or how this relates to other BGP tools. The intended context must be inferred solely from the verb 'Edit' and the sibling tool names.

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

bgp_session_getBgp Session GetB
Read-onlyIdempotent

Get BGP session from LibreNMS by ID.

NameRequiredDescriptionDefault
bgp_idYesBGP session ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds no additional behavioral context beyond the ID-based lookup, which is already present in the schema's parameter description.

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?

One short sentence with no filler, front-loading the action and resource. Every word contributes to meaning.

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 1-parameter read operation with annotations covering safety and an output schema present, the description is minimally sufficient. It does not explain error behavior or prerequisites, but these are not critical for a straightforward get-by-ID tool.

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% and the sole parameter bgp_id is described with a type, minimum, and description. The description's 'by ID' phrase merely restates the parameter's purpose, adding no additional semantics.

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

Purpose4/5

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

The description uses a specific verb ('Get') and resource ('BGP session from LibreNMS') and identifies the retrieval mode ('by ID'). It is clear enough to distinguish from sibling tools like bgp_sessions or bgp_session_edit, though it does not name them explicitly.

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 guidance is given on when to use this tool versus alternatives such as bgp_sessions for listing sessions or bgp_session_edit for modifications. The 'by ID' phrase weakly implies use when an ID is known, but there is no explicit context or exclusion.

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

bgp_sessionsBgp SessionsC
Read-onlyIdempotent

List BGP sessions from LibreNMS with optional filters.

NameRequiredDescriptionDefault
asnNoFilter by local ASN
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameNoFilter by device hostname or ID. An unknown device returns an error.
bgp_descrNoFilter by BGP description (SQL LIKE)
bgp_stateNoFilter by BGP state (e.g., established)
bgp_familyNoFilter by address family: 4 (IPv4) or 6 (IPv6)
remote_asnNoFilter by remote ASN
local_addressNoFilter by local IP address
bgp_adminstateNoFilter by admin state (start, stop, running)
remote_addressNoFilter by remote IP address

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered structurally. The description adds nothing behavioral beyond that โ€” no mention of pagination behavior, default result size, or what happens with zero matches, so it earns little credit.

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?

A single front-loaded sentence with zero waste. It is efficient, though the brevity borders on under-specification rather than tight, purposeful concision.

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?

With an output schema present and full schema coverage, the return shape and parameters are covered elsewhere, so the description needn't repeat them. However, for an 11-parameter listing tool it should at least hint at filter combination behavior or pagination defaults, which it omits.

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 all 11 parameters (including filter semantics like SQL LIKE for bgp_descr and family 4/6 for bgp_family) are already documented in the schema. The description's generic 'optional filters' adds no meaning beyond it; baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('List BGP sessions from LibreNMS') plus the scope qualifier 'with optional filters'. This distinguishes it from siblings like bgp_session_get and bgp_session_edit by implication (plural list vs. single fetch vs. edit), but no sibling is named explicitly.

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?

Only says 'with optional filters' โ€” it never says when to use this list tool versus bgp_session_get or bgp_session_edit, nor any exclusions. Usage is barely implied, with no routing guidance for an agent choosing among BGP tools.

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

bill_create_or_updateBill Create Or UpdateC
Destructive

Create or update a bill in LibreNMS.

NameRequiredDescriptionDefault
payloadYesBill payload fields: - bill_id (for updates only): Existing bill ID - bill_name (required for create): Bill name - ports (required for create): Array of port IDs to include - bill_type (required): "quota" or "cdr" (95th percentile) - bill_quota (required if quota type): Quota in bytes - bill_cdr (required if cdr type): Committed data rate - bill_day (optional): Billing day of month (1-31) - bill_custid (optional): Customer ID reference - bill_ref (optional): Billing reference - bill_notes (optional): Notes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=true. The description adds the 'create or update' upsert behavior, but this is already evident from the tool name. It does not disclose side effects, which fields are overwritten, permission requirements, or consequences of providing/omitting bill_id. The description provides no meaningful behavioral insight beyond the annotations and name.

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

Conciseness3/5

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

The description is a single eight-word sentence with no filler, making it concise and front-loaded. However, given the nested payload schema and the number of sibling tools, this is arguably too terse to be appropriately sized. It communicates the basic operation but misses the opportunity to add scoping or usage context.

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

Completeness2/5

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

Despite a rich input schema and the presence of an output schema, the description alone is incomplete for a tool with dual create/update modes and conditional fields. It fails to explain when each mode applies, how bill_id routes to update, or how this tool fits among the bill-related siblings. The schema compensates for parameter details, but usage context remains unresolved.

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%, with the payload field description detailing bill_id, bill_name, ports, bill_type, and conditional quota/cdr fields. The tool description itself contains zero parameter information, so it neither enhances nor harms what the schema already provides. This fits the baseline 3 for full schema coverage.

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

Purpose4/5

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

The description states a specific operation, 'Create or update', and a specific resource, 'a bill in LibreNMS'. This clearly identifies the tool's purpose and separates it from sibling read/delete tools like bill_get and bill_delete. However, it adds minimal detail beyond the title and doesn't list any bill fields, so it is clear but not highly informative.

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?

There is no guidance on when to use this tool versus alternatives, no exclusions, and no mention of prerequisites. The description does not explain that bill_id is required for updates or that bill_name/ports are required for creation. The agent must infer usage entirely from the input schema and sibling names.

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

bill_deleteBill DeleteA
DestructiveIdempotent

Delete a bill from LibreNMS by ID.

NameRequiredDescriptionDefault
bill_idYesBill ID to delete

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description does not contradict these but also adds no behavioral detail 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 a single, efficient sentence with no filler or redundant phrasing. It states the essential information upfront and earns its place entirely.

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 simple one-parameter destructive operation with complete annotations and an output schema, the description covers what is needed to select and invoke the tool correctly. No significant context 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 fully documents bill_id with type, minimum, requirement, and a description. The description's phrase 'by ID' simply echoes the schema's 'Bill ID to delete' without adding extra 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?

The description clearly states the action ('Delete'), the resource ('a bill'), and the identifying mechanism ('by ID'). This strongly distinguishes it from siblings like bill_get, bill_create_or_update, and bills_list.

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 makes the primary use case obvious: deleting a specific bill by ID. However, it provides no explicit guidance on when not to use this tool, nor does it reference any alternative such as bill_create_or_update for modifying a bill.

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

bill_getBill GetA
Read-onlyIdempotent

Get a specific bill from LibreNMS by ID.

NameRequiredDescriptionDefault
periodNoOptional period=previous
bill_idYesBill ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which fully covers the safety profile. The description adds no extra behavioral context beyond the obvious read operation, so it neither contradicts nor significantly enriches 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 a single, front-loaded sentence with no filler. Every word contributes to identifying the action, resource, and lookup key.

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 simple two-parameter schema, rich annotations, and the presence of an output schema, the description is complete enough for an agent to correctly invoke the tool. No critical behavioral or parameter context 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 description coverage is 100%, so the schema already documents bill_id and period. The description adds no parameter-level detail beyond 'by ID', which matches the schema. Baseline 3 is appropriate since the schema carries the parameter 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 uses a specific verb ('Get') with a concrete resource ('a specific bill') and the access method ('by ID'). This clearly distinguishes it from sibling tools like bills_list, bill_graph, and bill_delete.

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 implies a clear use case: call this when you have a known bill_id and need a single bill. It does not name alternative tools or exclusions, but the 'by ID' qualifier provides enough contextual guidance for basic selection.

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

bill_graphBill GraphA
Read-onlyIdempotent

Render a bill graph as an image.

For the underlying numbers rather than a picture, use bill_graph_data.

NameRequiredDescriptionDefault
bill_idYesBill ID
graph_typeYesGraph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month)

TDQS

A3.8/5.0
Behavior3/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 fully covered. The description adds that the output is an image, which is useful context, but says nothing about format, size, or rendering behavior beyond that.

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?

Two short sentences, zero waste, and the image-vs-numbers distinction is front-loaded and immediately actionable.

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 read-only, idempotent rendering tool with 100% schema coverage and no output schema, the description covers what the tool returns (an image) and how to get raw numbers instead. Adequate, though it could note the image format or any size limits.

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 graph_type enum is documented in the schema with meanings for 'bits' and 'monthly'. The description adds no parameter detail beyond what the schema already provides, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Render a bill graph as an image') and names the sibling it is not (bill_graph_data) with the distinguishing criterion (image vs numbers). Clear, though 'bill graph' is somewhat generic given many *_graph siblings.

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?

Explicitly routes the agent: use bill_graph for an image, bill_graph_data for the underlying numbers. Names the alternative and the condition that selects it, though it doesn't exclude other graph siblings like bill_history_graph.

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

bill_graph_dataBill Graph DataC
Read-onlyIdempotent

Get bill graph data from LibreNMS.

NameRequiredDescriptionDefault
bill_idYesBill ID
graph_typeYesGraph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month)

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.3/5.0
Behavior2/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 safety is covered. The description adds nothing beyond them โ€” no note on auth scope, rate limits, or the difference in data returned compared to the other bill graph tools.

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

Conciseness3/5

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

It is a single short sentence with no wasted clauses, so it is not verbose. However, the one sentence is largely filler ('from LibreNMS' is branding), so brevity here reflects under-specification rather than efficient communication.

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

Completeness2/5

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

An output schema exists, so return-value explanation is not required. But for a tool sitting in a cluster of confusable bill-graph siblings, the description provides no disambiguation, which is exactly the context an agent needs to select it 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%: bill_id is documented and graph_type carries an enum with meanings ('bits' traffic vs 'monthly' transfer per month). The description adds no parameter meaning of its own, so the baseline 3 is appropriate.

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

Purpose2/5

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

The description restates the tool's own name and title ('Bill Graph Data' โ†’ 'Get bill graph data'), giving no verb-plus-resource detail beyond that. It fails to distinguish itself from near-identical siblings such as bill_graph, bill_history_graph, and bill_history_graph_data, leaving the agent unable to tell which graph is returned.

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?

There is no statement of when to use this tool versus bill_graph or bill_history_graph, and no prerequisites or exclusions are mentioned. With four sibling tools in the same bill/graph family, this silence is a real gap.

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

bill_historyBill HistoryC
Read-onlyIdempotent

Get bill history from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
bill_idYesBill ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds no behavioral context beyond 'Get,' such as pagination behavior, historical scope, or any other operational trait. It does not contradict the annotations, but it contributes no additional behavioral transparency.

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

Conciseness3/5

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

The description is only one short sentence with no fluff, which is concise. However, it is under-specified for the complexity of the tool and its many sibling tools, so the brevity comes at the cost of useful content. It is not poorly structured, but it does not earn a higher score due to missing contextual information.

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

Completeness2/5

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

Given that an output schema exists, return values need not be described. However, the description omits any clarifying context about what type of bill history is returned, how pagination works, or how this differs from bill_history_graph and bill_history_graph_data. An agent would struggle to select this tool reliably among the many bill-related siblings.

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%, with bill_id, limit, and offset all clearly documented in the input schema. The description itself adds no extra parameter meaning, but the schema carries the burden adequately, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description states a clear verb and resource: 'Get bill history from LibreNMS.' It communicates what the tool does at a basic level. However, with siblings like bill_history_graph, bill_history_graph_data, and bill_get, it does not differentiate which variant of history this returns, so it lacks the distinguishing clarity needed for a 5.

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?

There is no guidance about when to use this tool versus alternatives such as bill_history_graph, bill_history_graph_data, or bill_get. The description simply states what it does without any context, exclusions, or conditions for selection.

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

bill_history_graphBill History GraphA
Read-onlyIdempotent

Render a graph for a past billing period as an image.

For the underlying numbers rather than a picture, use bill_history_graph_data.

NameRequiredDescriptionDefault
bill_idYesBill ID
graph_typeYesGraph type for a past billing period: 'bits' (traffic), 'day' or 'hour' (transfer per day or hour)
history_idYesBill history ID

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds genuinely useful behavioral context by disclosing that the response is an image rather than structured data โ€” critical information with no output schema. It omits image format and any size/pagination notes.

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?

Two short sentences, zero filler, with the primary capability front-loaded and the alternative-tool hint immediately after. Every sentence earns its place.

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 three-required-parameter read tool with full schema coverage and no output schema, the description supplies the missing piece โ€” that the return is an image. It stops short of describing format or how the image is delivered, which would complete 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%, and the schema itself documents bill_id, history_id, and the graph_type enum values with their meanings. The description adds no parameter detail beyond what the schema already provides, so the baseline 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?

States a specific verb (render), resource (graph for a past billing period), and output form (image) in one sentence. It clearly separates itself from bill_history_graph_data and the other graph siblings by declaring it returns a picture, not numbers.

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?

Explicitly routes the agent to bill_history_graph_data when the underlying numbers are wanted instead of a picture, which is the key decision point between the two siblings. It does not, however, clarify the boundary against bill_graph/bill_graph_data (current vs past period).

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

bill_history_graph_dataBill History Graph DataC
Read-onlyIdempotent

Get bill history graph data from LibreNMS.

NameRequiredDescriptionDefault
bill_idYesBill ID
graph_typeYesGraph type for a past billing period: 'bits' (traffic), 'day' or 'hour' (transfer per day or hour)
history_idYesBill history ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.3/5.0
Behavior2/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 no behavioral context beyond those annotationsโ€”no auth requirements, rate limits, or return characteristicsโ€”and does not contradict them.

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

Conciseness3/5

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

It is a single short, front-loaded sentence with no wasted words, so it is concise. However, it is under-specified rather than informativeโ€”the sentence essentially restates the name and contributes little.

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

Completeness2/5

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

With three required parameters and several similarly named siblings, the description provides no scope distinction or routing information. The output schema covers return values, but the selection context an agent needs 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 description coverage is 100%, with clear parameter documentation including an explanatory enum for graph_type ('bits', 'day', 'hour'). The description adds no parameter meaning, so the baseline 3 applies.

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

Purpose2/5

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

The description restates the tool name and title ('Get bill history graph data') and adds only 'from LibreNMS,' which is system context rather than a distinguishing purpose. It does not differentiate from near-identical siblings such as bill_graph_data, bill_history_graph, or bill_graph.

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 guidance, prerequisites, or alternatives are provided. Given the sibling set contains confusingly similar names (bill_graph, bill_graph_data, bill_history_graph), the absence of any routing hint leaves the agent without guidance.

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

bills_listBills ListA
Read-onlyIdempotent

List bills from LibreNMS with optional filters.

NameRequiredDescriptionDefault
refNoBill reference filter
limitNoMaximum number of results to return
custidNoCustomer ID filter
offsetNoNumber of results to skip (offset) for pagination
periodNoOptional: previous to list previous period bills

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds little beyond restating 'optional filters' found in the schema, but it does not contradict the annotations and the read-only behavior is consistent with 'List bills'.

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 a single sentence that front-loads the verb and resource, followed by the key feature (optional filters). There is no wasted wording, and it is appropriately sized for a simple listing tool.

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?

With a full input schema, output schema, and safety annotations, the description is largely sufficient. It could add guidance on filter interaction or distinctions from related bill tools, but the structured data already covers parameter meanings and return shape, making the definition complete enough 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?

Schema description coverage is 100%, so the schema already documents each parameter (ref, limit, custid, offset, period). The description only says 'optional filters' without adding meaning beyond what the schema provides, so the 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 uses a specific verb ('List') and resource ('bills from LibreNMS'), clearly conveying a plural listing operation. It distinguishes itself from sibling tools like bill_get or bill_delete by emphasizing listing with optional filters rather than fetching, deleting, or graphing a single bill.

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 implies usage: when you need a list of bills, potentially filtered, use this tool. However, it provides no explicit alternatives or conditions for when not to use it, nor does it reference sibling tools like bill_get for single-bill retrieval or bill_history for historical periods.

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

device_addDevice AddC
Destructive

Add a new device to LibreNMS.

NameRequiredDescriptionDefault
payloadYesDevice add payload. Required and optional fields: - hostname (required): Device hostname or IP - version (optional): SNMP version (v1, v2c, v3). Default: v2c - community (required for v1/v2c): SNMP community string - authlevel (required for v3): noAuthNoPriv, authNoPriv, authPriv - authname (required for v3): SNMPv3 username - authpass (required for v3 with auth): Authentication password - authalgo (optional): MD5 or SHA - cryptopass (required for authPriv): Privacy password - cryptoalgo (optional): AES or DES - port (optional): SNMP port (default: 161) - transport (optional): udp or tcp - poller_group (optional): Poller group ID - force_add (optional): Skip ICMP/SNMP checks (true/false) - ping_fallback (optional): Add as ping-only if SNMP fails

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false, so the mutation/side-effect profile is covered there. The description adds no extra behavioral contextโ€”no mention of prerequisites, duplicate handling, whether discovery runs, or required permissionsโ€”so it adds little 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.

Conciseness4/5

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

The description is one short, scannable sentence with no filler. It is slightly redundant with the tool name, but it adds the LibreNMS target. There is no structural waste, though it is brief enough that some would consider it under-specified.

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?

Given the rich nested schema and available annotations, the description is minimally sufficient but not complete. It omits when to choose it over siblings, any behavioral caveats, and what side effects adding a device may have, which are noticeable gaps for a mutation tool with a nested payload.

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%: the payload property documents every field, defaults, and conditional requirements (SNMP v1/v2c vs v3). The prose description adds nothing about parameters, but with full schema coverage the description is not required to compensate. Baseline 3 applies.

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

Purpose4/5

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

The description states a specific action and resource: 'Add a new device to LibreNMS.' It is clear and unambiguous, and the name/title mirror it. However, it does not explicitly differentiate this from siblings like device_discover or device_update, so it stops short of a 5.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool instead of siblings such as device_update, device_delete, or device_discover. The phrase 'Add a new device' implies intent, but there are no alternatives, exclusions, or conditions, leaving the agent to infer context.

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

device_availabilityDevice AvailabilityB
Read-onlyIdempotent

Get device availability from LibreNMS.

NameRequiredDescriptionDefault
hostnameYesDevice hostname.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/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 safe read nature is covered. The description adds minimal behavioral contextโ€”it only names the source system and the fact that it retrieves availability. It doesn't describe output format, timing behavior, or what 'availability' encompasses, but with strong annotations the bar is lower.

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 a single concise sentence with no wasted words. It is not front-loaded with extra fluff, and it uses a clear verb. Brief but appropriately sized for such a simple tool.

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?

Given the tool only has one parameter, full schema coverage, an output schema, and strong safety annotations, the description covers the essential invocation context. It could mention what the response contains or distinguish from device_outages, but the overall package is reasonably complete for an agent to call it 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 schema already documents the single parameter (hostname) adequately. The description adds no semantic detail about what hostname should be (e.g., FQDN vs display name), but the schema carries the weight, so baseline 3 is appropriate.

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

Purpose4/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: 'Get device availability from LibreNMS.' This clearly identifies what the tool does. However, it does not explicitly distinguish itself from sibling tools like device_get or device_outages, so it lacks sibling differentiation.

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 guidance is provided about when to use this tool versus alternatives like device_get, devices_list, or device_outages. The description gives no context about typical use cases, prerequisites, or exclusions.

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

device_deleteDevice DeleteA
DestructiveIdempotent

Delete a device from LibreNMS by hostname.

NameRequiredDescriptionDefault
hostnameYesDevice hostname to delete

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the core safety profile is covered externally. The description adds no further behavioral context such as whether deletion cascades to ports, services, or historical data, but it does not contradict the annotations either.

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 a single, direct sentence that front-loads the action and object. Every word earns its place, and there is no unnecessary elaboration for such a simple one-parameter tool.

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?

Given the tool's low complexity, one required parameter, complete schema coverage, strong annotations, and an existing output schema, the description is sufficient for an agent to make a correct call. A minor gap is the absence of any note about side effects or irreversibility, though destructiveHint partially covers that.

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 describes the only parameter, hostname, as 'Device hostname to delete', and schema coverage is 100%. The description's phrase 'by hostname' merely restates the schema rather than adding new meaning like format requirements, case sensitivity, or edge-case behavior.

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 ('Delete'), a definite resource ('a device from LibreNMS'), and the identifying key ('by hostname'). This makes the operation unmistakable and distinguishes it clearly from sibling delete tools that target other resource types such as rules, locations, or bills.

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 implies the use case: use this tool when you need to remove a device from LibreNMS by hostname. However, it does not explicitly name alternatives, say when not to use it, or mention any prerequisites such as the device needing to exist beforehand.

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

device_discoverDevice DiscoverB

Trigger device rediscovery in LibreNMS.

NameRequiredDescriptionDefault
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

Annotations indicate the tool is not read-only and not idempotent, but the description adds no behavioral context beyond that. It does not disclose whether the trigger is asynchronous, what side effects occur (e.g., polling, ARP/SNMP discovery), or what happens for unknown/nonexistent hostnames.

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?

A single, front-loaded sentence with no filler. Every word contributes to stating the action and target, which is the ideal level of brevity for a simple one-parameter operation.

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?

Given a simple one-parameter schema and the presence of an output schema, the description is minimally adequate. However, it lacks context about what rediscovery entails, whether it returns immediately or runs asynchronously, and how errors are handled. These gaps could cause an agent to misuse or misinterpret the call despite the simple input.

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%, and the schema already documents hostname as 'Device hostname or ID'. The tool description adds no extra meaning regarding the parameter's format, resolution, or examples, so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific action ('trigger') on a specific resource ('device rediscovery') in a named system (LibreNMS). 'Rediscovery' is a distinct operation from sibling tools like device_get or device_update, though it does not explicitly name an alternative.

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 guidance is given on when to use this tool versus alternatives such as device_update, device_set_maintenance, or device_add. The description does not mention prerequisites, typical scenarios, or exclusions; usage must be inferred entirely from the tool name.

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

device_eventlog_addDevice Eventlog AddC

Add a custom event log entry for a device.

NameRequiredDescriptionDefault
payloadYesEvent log entry payload: - text (required): Event message text - type (optional): Event type/category - severity (optional): Severity level (1-5)
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) already establish this as a non-idempotent write that is not destructive. The description adds essentially nothing beyond that โ€” no mention of device-existence requirements, payload limits, side effects, or whether entries are appended. All-false annotations carry the behavioral burden and the description does not enrich them.

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?

A single front-loaded sentence with zero filler. Every word adds meaning, and the size is proportionate to a two-parameter tool.

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

Completeness2/5

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

Although the output schema covers return values and the input schema documents parameters, the description is incomplete for a mutation tool: it does not state that the hostname must reference an existing device, how this relates to logs_eventlog, or what happens on repeated calls. An agent is left to infer operational context.

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 documents hostname and payload (including text/type/severity sub-fields). The description contributes no parameter information, so the baseline of 3 is appropriate; a small gap is that the severity range (1-5) direction is not clarified anywhere.

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

Purpose4/5

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

The description uses a specific verb ('Add') with a specific resource ('custom event log entry') and target ('a device'). The write polarity clearly separates it from read-oriented siblings like logs_eventlog, though it does not explicitly name an alternative.

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?

There is no guidance on when to use this tool versus alternatives, no prerequisites (e.g., the device must already exist), and no conditions or exclusions. The only implied usage is the verb itself, which does not rise to real guidance.

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

device_fdbDevice FdbA
Read-onlyIdempotent

List the forwarding database (learned MAC addresses) for a device.

Each entry carries the port_id it was learned on, so this is the device-wide view of what is plugged into a switch.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or device ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds useful behavioral context by explaining that entries carry the learned port_id and that this is a device-wide perspective of switch connectivity, which is valuable 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?

Two sentences accomplish everything: the first states the action and object, the second explains the key output detail and perspective. No filler or repetition of schema information appears.

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?

The tool is simple, annotations cover safety, the schema fully documents parameters, and an output schema exists, so the description does not need to explain return values. The only notable gap is lack of explicit routing to sibling tools, but this does not prevent 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?

Schema description coverage is 100%, so the parameters hostname, limit, and offset are already fully documented. The description does not add parameter-specific semantics, but it also does not need to because the schema carries that burden.

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

Purpose4/5

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

The description uses a specific verb ('List') and resource ('forwarding database (learned MAC addresses)') for a device, making the primary purpose clear. It adds 'device-wide view of what is plugged into a switch,' which hints at a distinction from per-port or lookup siblings, though it does not explicitly name them.

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 implies use when you need the device-wide FDB view, and it characterizes the result as learned MACs with port_id. However, it gives no explicit guidance about when to choose this over sibling tools like fdb_lookup or port_fdb, and it does not state exclusions or alternatives.

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

device_getDevice GetA
Read-onlyIdempotent

Get device details from LibreNMS by hostname.

NameRequiredDescriptionDefault
hostnameYesDevice hostname

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/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 read-only nature is covered. The description adds no further behavioral context such as error handling when a hostname is not found, authentication requirements, or response details, but it does not contradict 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 a single sentence that communicates the action, target, source, and lookup key with no filler. It is front-loaded and easy to parse.

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, idempotent lookup tool with an output schema and safety annotations, the description provides all essential operational context. The agent knows what input to supply and what kind of result to expect; output structure is delegated to the output schema.

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 has 100% coverage for the single parameter, including a description of 'Device hostname'. The tool description only repeats the fact that lookup is by hostname and adds no format, validation, or meaning 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 uses a specific verb ('Get'), a clear resource ('device details'), a source ('LibreNMS'), and a lookup key ('by hostname'). This differentiates it from sibling tools like devices_list (enumeration) and device_ports_get (specific port data).

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 phrase 'by hostname' implies this is the tool for fetching a single device's general details, but the description provides no explicit guidance about when not to use it or which sibling alternative to prefer for more specific data (e.g., ports, availability, VLANs). Usage context is implied, not stated.

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

device_graphDevice GraphA
Read-onlyIdempotent

Render a device-level graph as an image.

NameRequiredDescriptionDefault
widthNoGraph width in pixels.
heightNoGraph height in pixels.
legendNoWhether to render the graph legend.
to_timeNoEnd of the time range, either a relative offset or a Unix timestamp. Defaults to now.
hostnameYesDevice hostname or device ID
from_timeNoStart of the time range, either a relative offset such as '-1d', '-6h' or '-1w', or a Unix timestamp. Defaults to the LibreNMS default (-1d).
graph_typeYesGraph type, as returned by device_graphs_list (e.g. 'device_icmp_perf', 'device_poller_perf', 'device_availability')

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds that the output is an image, which is useful, but it does not disclose output format, potential errors, or any rendering-specific behavior beyond that.

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 a single, front-loaded sentence with no wasted words. Every token earns its place: it names the operation, the resource, and the output type.

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?

The schema carries most parameter context, but there is no output schema and the description does not specify the return format beyond 'image'. It also lacks guidance on how to obtain valid graph_type values, though the schema does reference device_graphs_list.

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 fully documents all seven parameters including defaults and types. The description adds no parameter-level meaning, which is acceptable given the baseline of 3 for high 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 uses a specific verb ('Render'), a clear resource ('device-level graph'), and an explicit output type ('as an image'). This distinguishes it from sibling graph tools like bill_graph and port_graph, and from device_graphs_list which lists graph types rather than rendering them.

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 implies when to use this tool: when a device-level graph image is needed. However, it does not explicitly compare against alternatives such as port_graph, bill_graph, or device_graphs_list, and gives no guidance on 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.

device_graphs_listDevice Graphs ListA
Read-onlyIdempotent

List the graph types available for a device.

Use this to discover the values accepted by the graph_type argument of device_graph, for example 'device_icmp_perf' or 'device_poller_perf'.

NameRequiredDescriptionDefault
hostnameYesDevice hostname or device ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the output is a set of allowed graph_type values, but it does not disclose additional behavioral traits such as error behavior or auth requirements. Given the annotations, this is adequate but not rich.

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?

Two sentences, both purposeful: the first states the core action, the second provides usage context and concrete examples. No redundant wording or unnecessary detail.

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 list tool with an output schema, this description is complete. It defines the per-device scope, explains the purpose (graph type discovery), and connects directly to the dependent tool device_graph. Nothing essential 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 documents hostname as 'Device hostname or device ID' with 100% schema description coverage. The description adds no extra meaning to the hostname parameter itself; the examples of graph_type values relate to the output, not the parameter. Baseline 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?

The description states a specific verb ('List') and resource ('graph types available for a device'), and the second sentence clarifies that it is the discovery tool for valid values of device_graph's graph_type argument. This distinguishes it clearly from device_graph and other graph-related siblings like port_graph.

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 says 'Use this to discover the values accepted by the graph_type argument of device_graph', giving the agent a precise condition for when to call this tool. Concrete examples ('device_icmp_perf', 'device_poller_perf') further aid selection.

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

devicegroup_addDevicegroup AddB
Destructive

Add a new device group to LibreNMS.

NameRequiredDescriptionDefault
payloadYesDevice group payload fields: - name (required): Group name - type (required): "static" or "dynamic" - desc (optional): Group description - rules (required if dynamic): Dynamic group rule builder JSON - devices (required if static): Array of device IDs Example static group: {"name": "Routers", "type": "static", "devices": [1, 2, 3]} Example dynamic group: {"name": "Linux Servers", "type": "dynamic", "rules": {"condition": "AND", "rules": [{"field": "os", "operator": "equal", "value": "linux"}]}}

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnly=false, so the safety profile is covered. The description confirms a mutation ('Add') but adds no context about duplicate names, acknowledged side effects, or authorization requirements; this is adequate but not enriched beyond 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 a single front-loaded sentence with no filler or repetition. It states the action and target immediately, earning a maximum structure score.

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 complex nested-payload tool, the schema fully documents fields, required conditionals, and examples, and an output schema exists for return values. The only notable gap is lack of explicit usage routing, but the overall package is 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?

Schema description coverage is 100% and the payload property schema contains detailed field descriptions, conditional requirements, and examples. The tool description itself adds no parameter-level meaning, so it relies on the schema, matching the baseline for high coverage.

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

Purpose4/5

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

The description states a clear verb ('Add') and a specific resource ('device group to LibreNMS'), making the primary action unambiguous. It does not explicitly contrast with sibling tools such as devicegroup_update or devicegroup_delete, so it falls short of full differentiation.

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?

The description provides no guidance on when to use this tool instead of devicegroup_update, devicegroup_delete, or devicegroup_add_devices. 'Add a new' only weakly implies creation of new groups, so an agent must infer the usage context.

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

devicegroup_add_devicesDevicegroup Add DevicesC
Destructive

Add devices to a device group in LibreNMS.

NameRequiredDescriptionDefault
nameYesDevice group name or ID
payloadYesArray of device IDs to add. Format: {"devices": [1, 2, 3]}

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=true, so the mutation profile is covered structurally. The description adds nothing on top: it doesn't say whether the add appends to or replaces existing membership, whether it needs specific permissions, or what happens on duplicate device IDs. With annotations present the bar is lower, but zero added context earns a 2.

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?

A single front-loaded sentence with no waste or filler. It is arguably under-specified rather than bloated, so it earns a 4 rather than a 5 for structure.

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?

An output schema exists, so return values needn't be described, and the schema fully documents both parameters. What's missing is behavioral context for a destructive, non-idempotent mutation (append vs replace, duplicate handling), leaving the definition minimally viable.

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%, including the nested payload format {"devices": [1, 2, 3]}, so the schema carries full parameter documentation. The description adds no syntax or format detail beyond it, making the baseline 3 correct.

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

Purpose4/5

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

States a specific verb and resource: adding devices to a device group in LibreNMS. This distinguishes it from the sibling devicegroup_remove_devices by the verb alone, though it never names or contrasts that sibling explicitly.

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?

There is no when-to-use guidance, no mention of the alternative devicegroup_remove_devices or devicegroup_devices, and no prerequisites. The agent must infer from the name alone 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.

devicegroup_deleteDevicegroup DeleteB
DestructiveIdempotent

Delete a device group from LibreNMS by name.

NameRequiredDescriptionDefault
nameYesDevice group name or ID to delete

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

The annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds only the fact that lookup is by name, and says nothing about what is destroyed alongside the group (membership mappings, alert bindings) or whether the group must already exist.

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?

A single front-loaded sentence with the verb, resource, source system, and key all up front. No waste, though it is terse enough that there was room for one clarifying clause about side effects.

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?

With one required parameter, full schema coverage, an output schema, and annotations carrying the destructive/idempotent semantics, the minimum an agent needs to invoke it is present. The gaps are around consequences of the deletion, which a destructive tool would ideally disclose.

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 sole parameter is documented by the schema itself, giving a baseline of 3. The description ('by name') actually narrows the schema, which accepts 'name or ID to delete', introducing a slight ambiguity rather than adding meaning.

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

Purpose4/5

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

States a specific verb (Delete) and resource (device group) scoped to LibreNMS, with the lookup key (by name) made explicit. It cleanly separates this from sibling destructive tools like device_delete or location_delete because the resource is named. It stops short of explicitly routing the agent away from adjacent devicegroup_* siblings.

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 guidance, no prerequisites, and no exclusions relative to siblings such as devicegroup_remove_devices or devicegroup_update. The agent gets no signal about whether the group must be empty, what happens to member devices, or when to prefer another tool.

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

devicegroup_devicesDevicegroup DevicesC
Read-onlyIdempotent

List devices in a device group from LibreNMS.

NameRequiredDescriptionDefault
fullNoSet to true to get complete device data instead of just IDs
nameYesDevice group name or ID
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds essentially nothing beyond the annotations โ€“ no mention of pagination defaults, the effect of 'full', or rate limits โ€“ so it earns little credit for behavioral context.

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?

One front-loaded sentence with zero waste; the resource and source are stated immediately. It is efficient, though brevity here shades into under-specification.

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?

An output schema exists, so return values need not be explained, and the schema fully documents parameters. However, for a tool sitting among many device/devicegroup siblings, the absence of any disambiguation or usage context leaves a gap.

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% with 4 documented parameters, so the schema carries parameter meaning ('full' toggles complete data vs IDs, limit/offset for pagination). The description adds no syntax or format detail beyond that, which matches the baseline of 3.

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

Purpose4/5

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

States a specific verb ('List') and resource ('devices in a device group'), which separates it from devices_list and devicegroup_add_devices. It does not explicitly name the sibling it is not, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus devices_list, devicegroup_devices-style siblings, or when the group name vs ID is required. The agent must infer usage entirely from the name.

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

devicegroup_remove_devicesDevicegroup Remove DevicesC
Destructive

Remove devices from a device group in LibreNMS.

NameRequiredDescriptionDefault
nameYesDevice group name or ID
payloadYesArray of device IDs to remove. Format: {"devices": [1, 2, 3]}

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, non-idempotent, and non-readOnly, so the safety profile is covered structurally. The description adds nothing beyond that restatement: it does not say whether devices are deleted from LibreNMS or merely unlinked from the group, nor how to recover from a mistaken removal.

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?

A single clean sentence with no filler, front-loading the verb and target. It is concise to the point of being terse, but nothing is wasted.

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?

An output schema exists and annotations carry the safety profile, so return values and risk are covered elsewhere. Missing are usage context and clarification of what removal actually mutates, which matters for a destructive tool.

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%, with both 'name' and 'payload' documented in the schema including the payload format example. The description contributes no additional parameter meaning, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('Remove') and resource ('devices from a device group'), which distinguishes it functionally from devicegroup_add_devices and devicegroup_devices. However, it never names or contrasts those siblings explicitly, so the differentiation requires inference.

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 guidance, no prerequisites, and no mention of alternatives such as devicegroup_add_devices or devicegroup_update. The agent is left to infer the context from the name alone.

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

devicegroup_set_maintenanceDevicegroup Set MaintenanceC
DestructiveIdempotent

Set maintenance for a device group in LibreNMS.

NameRequiredDescriptionDefault
nameYesDevice group name or ID
payloadYesMaintenance mode payload: - duration (required): Duration in "H:i" format (e.g., "02:00" for 2 hours) - title (optional): Maintenance window title - notes (optional): Maintenance notes - start (optional): Start time in "Y-m-d H:i:00" format (default: now)

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds nothing beyond this โ€“ it doesn't say what maintenance does to the group, whether existing windows are overwritten, or what 'destructive' means here (e.g., alert suppression). With annotations covering the safety profile, no added context means a low score.

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?

A single, front-loaded sentence with zero waste. It is efficient, though its brevity is part of the definition's overall thinness rather than a deliberate structural choice.

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?

Annotations carry the safety profile and an output schema exists, so return values need no explanation. However, for a destructive mutation on device groups, the description says nothing about the effect of entering maintenance, leaving a noticeable gap.

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% and the nested payload schema already documents duration, title, notes, and start with formats and defaults. The description adds no parameter meaning, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource ('set maintenance for a device group') and scopes it to device groups, which distinguishes it from the sibling device_set_maintenance. It does not explicitly name that sibling, so it falls short of 5.

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 guidance, no prerequisites, and no mention of the closely related device_set_maintenance or location_set_maintenance alternatives. The agent must infer everything from the tool name.

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

devicegroups_listDevicegroups ListC
Read-onlyIdempotent

List all device groups from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds nothing beyond that โ€“ notably it says 'all' while the schema paginates with a default limit of 100, so it does not disclose result-size behavior.

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?

A single short, front-loaded sentence with no redundancy or filler. It is efficient, though so terse that there is essentially nothing left to structure.

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 simple read-only list tool with full schema coverage and an output schema, the description is minimally viable. The word 'all' conflicts mildly with default limit=100, and no context is given for how this differs from devicegroup_devices.

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% for both limit and offset, so the schema already documents pagination semantics fully. The description adds no syntax, format, or default-value detail, which is the expected baseline 3 when the schema does the heavy lifting.

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

Purpose4/5

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

States a clear verb and resource ('List all device groups'), which an agent can distinguish from mutation siblings like devicegroup_add or devicegroup_delete. However, it does nothing to separate itself from devicegroup_devices, which lists devices within a group, so the sibling differentiation is incomplete.

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?

There is no when-to-use guidance and no alternatives named. With many list-oriented siblings (port_groups_list, devices_list, location_get), the agent gets no help deciding when this tool is the right one.

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

devicegroup_updateDevicegroup UpdateB
DestructiveIdempotent

Update a device group in LibreNMS.

NameRequiredDescriptionDefault
nameYesDevice group name or ID
payloadYesPatchable fields: - name: New group name - type: "static" or "dynamic" - desc: Group description - rules: Dynamic group rules (for dynamic groups) - devices: Array of device IDs (for static groups)

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=true. The description adds no behavioral context beyond what annotations provide, such as what gets destroyed, auth requirements, or side effects. It only restates the action.

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 a single short sentence that is front-loaded with the verb and resource. There is no wasted text. It is appropriately concise for the amount of information it chooses to convey.

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?

Given that the input schema has full parameter coverage, an output schema exists, and annotations cover the safety profile, the minimal description is nearly sufficient. The only notable gap is the lack of when-to-use guidance relative to siblings, but structured fields compensate well.

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 both parameters and their nested fields. The description adds no parameter semantics or syntax details. A baseline 3 is appropriate when structured fields carry the full parameter burden.

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

Purpose4/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: 'Update a device group in LibreNMS.' It is clear what the tool does. However, it does not explicitly distinguish itself from siblings like devicegroup_add or devicegroup_delete, so it falls short of a 5.

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

Usage Guidelines2/5

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

The description offers no guidance on when to use this tool versus alternatives. It does not mention conditions for updating an existing group, prerequisites, or that devicegroup_add should be used for new groups. Usage is only implied by the name.

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

device_maintenance_statusDevice Maintenance StatusA
Read-onlyIdempotent

Check if a device is currently in maintenance mode.

NameRequiredDescriptionDefault
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/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 the point-in-time scope ('currently') but no additional behavioral detail such as response shape or edge cases, which is acceptable given the annotations and existing output schema.

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 entire description is one focused, front-loaded sentence with no filler or redundant wording. Every word contributes to the tool's purpose.

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 simple single-parameter status check with a complete input schema, read-only annotations, and an output schema present, the description is sufficiently complete. An agent has enough information to select and invoke it 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 input schema has 100% description coverage for the single hostname parameter, describing it as 'Device hostname or ID'. The tool description does not add further parameter-level meaning, so the schema already carries the burden and 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?

The description uses a specific verb ('Check') and resource ('device maintenance status'), clearly distinguishing this read-only status query from sibling tools like device_set_maintenance. The phrase 'currently in maintenance mode' makes the tool's exact function immediately understandable.

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 implies this tool should be used when the agent needs to determine a device's maintenance state, rather than change it. It does not explicitly name an alternative such as device_set_maintenance for toggling maintenance mode, so it stops short of a top score, but the context is clear enough.

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

device_nacDevice NacA
Read-onlyIdempotent

List network access control (802.1X / MAB) sessions on a device.

Shows authenticated endpoints per port, including the authentication method and the assigned VLAN where the device reports it.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or device ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds useful behavioral context: it shows authenticated endpoints per port, includes authentication method, and notes that VLAN assignment is shown only 'where the device reports it'โ€”a meaningful caveat about data availability. 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?

Two concise sentences with no filler. The primary action is front-loaded, and the follow-up sentence adds relevant output details. Every word contributes to understanding.

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 read-only list operation with an output schema and well-documented parameters, the description covers what the tool returns and its device scope. It could have explicitly referenced a sibling like nac_list for broader context, but nothing essential 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%, with all three parameters (hostname, limit, offset) having descriptions. The tool description does not add parameter-specific meaning beyond stating the device scope and output contents, so the baseline 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?

The description states a specific verb and resource: 'List network access control (802.1X / MAB) sessions on a device.' It clearly scopes to a single device, distinguishing it from the sibling tool nac_list which likely covers sessions across multiple devices. The added detail about authenticated endpoints, authentication method, and VLAN makes the purpose unmistakable.

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 this tool is for listing NAC sessions on a specific device, giving the context of when to use it. However, it does not explicitly mention alternatives or when not to use it, such as pointing to nac_list for a global view, so it falls short of full exclusion guidance.

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

device_outagesDevice OutagesB
Read-onlyIdempotent

Get device outages from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/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 only the source system (LibreNMS) and offers no additional behavioral context such as pagination or filtering 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 a single, efficient sentence with no wasted words. It is appropriately concise for a simple read-only lookup tool.

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 straightforward read-only query with a required hostname parameter, an output schema, and full annotation coverage, the description is mostly complete. It could be improved by noting how outages are defined or when to prefer this over similar tools, but nothing essential to invoking 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 description coverage is 100%, so the parameters are already documented. The description does not add any meaning beyond the schema, which is acceptable per the baseline for full schema coverage.

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

Purpose4/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: 'Get device outages from LibreNMS.' It is clear about what the tool does, but it does not differentiate this from potentially related sibling tools such as device_availability or alerts_get.

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?

There is no guidance on when to use this tool versus alternatives. No context is given about which scenarios call for device outages compared to other monitoring or alerting tools, and no exclusions are mentioned.

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

device_portsDevice PortsB
Read-onlyIdempotent

List ports for a device from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
columnsNoComma-separated list of columns to return (e.g., 'port_id,ifName,ifAlias,ifOperStatus')
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/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 no extra behavioral context such as pagination behavior, default limits, or how columns filtering affects results, but it also does not contradict 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 a single compact sentence that leads with the verb and resource. There is no filler or redundant content, making it appropriately sized and front-loaded.

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?

The schema, annotations, and output schema cover most invocation needs, so a sparse description can be acceptable. However, the existence of a nearly identically named sibling (device_ports_get) and no clarification of scope leaves a material selection gap for the agent.

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%, with all four parameters documented (hostname, limit, offset, columns). The phrase 'for a device' restates the hostname parameter and adds no additional semantic detail beyond what the schema already provides.

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

Purpose4/5

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

The description states a clear action ('List') on a specific resource ('ports') scoped to a device from LibreNMS. It is unambiguous in what the tool does, but it does not differentiate from the similarly named sibling device_ports_get or related tools like ports_list.

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 guidance is given on when to use this tool versus alternatives. The description does not mention device_ports_get, ports_list, or ports_search, nor any conditions that would select one over the other.

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

device_ports_getDevice Ports GetA
Read-onlyIdempotent

Get port info for a device by interface name.

Names like 'Te2/7' can fail by name behind proxies that reject or decode the encoded slash. The port is then looked up by ID instead; that response has the same shape but lacks the computed rate fields (in_rate, out_rate, ...).

NameRequiredDescriptionDefault
ifnameYesInterface name
hostnameYesDevice hostname.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already state readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds valuable non-obvious behavior: the fallback to ID lookup and the resulting schema difference (missing in_rate/out_rate fields). This is exactly the kind of context annotations cannot convey. It doesn't mention auth/permissions, but that's minor for a read 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?

Front-loaded with the purpose, then a concise caveat about proxy behavior and fallback. Two sentences, no waste. Could potentially be tightened but is appropriately sized.

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?

Given there's an output schema, the description needn't explain return values, and it correctly notes the shape difference in the fallback case. It's complete enough for an agent to call correctly. Lacks explicit mention of pagination or error handling, but those are less critical here.

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% and parameter descriptions are provided, so baseline is 3. The description implies that ifname is used for the lookup but doesn't add format details or examples beyond 'Te2/7', which is more of an example than parameter semantics. No additional value over schema.

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

Purpose4/5

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

Clear specific verb+resource: 'Get port info for a device by interface name.' Distinguishes itself from siblings like device_ports (which lists ports for a device generally) by emphasizing lookup by interface name. However, it doesn't explicitly contrast with port_get or device_ports, so sibling differentiation is only implied.

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 explicit when-to-use guidance or alternatives named. It describes a failure mode (name lookup failing behind proxies) but doesn't say 'use this instead of X when Y'. An agent must infer which sibling to use.

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

device_renameDevice RenameB
DestructiveIdempotent

Rename a device in LibreNMS.

NameRequiredDescriptionDefault
hostnameYesCurrent device hostname or ID
new_hostnameYesNew hostname for the device

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

The description adds no behavioral detail beyond what the annotations already declare. With destructiveHint=true and idempotentHint=true, the safety profile is known, but the description does not explain any side effects of renaming (e.g., impact on references, monitoring, or historical data), so it provides minimal value 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?

A single, direct sentence that immediately communicates the operation. There is no redundant information or filler; the description earns its place and is easily parsed.

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 simple two-parameter rename operation, the description is minimally adequate, especially with annotations covering destructive and idempotent behavior and an output schema present. However, it lacks any guidance on selection relative to device_update and does not mention potential side effects that would help an agent invoke it responsibly for a destructive operation.

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%: both hostname and new_hostname have clear descriptions ('Current device hostname or ID' and 'New hostname for the device'). The tool description adds nothing beyond the schema, 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.

Purpose4/5

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

The description states a specific verb ('Rename') and resource ('a device in LibreNMS'), making the tool's core function unambiguous. However, it does not explicitly differentiate from the sibling device_update, which could plausibly also change a device's hostname.

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 guidance is provided about when to use this tool versus alternatives like device_update or device_add. The description only states the action without any context about prerequisites, intended use cases, or conditions that would make another tool preferable.

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

device_set_maintenanceDevice Set MaintenanceB
Idempotent

Set device maintenance in LibreNMS.

NameRequiredDescriptionDefault
payloadYesMaintenance mode payload: - duration (required): Duration in "H:i" format (e.g., "02:00" for 2 hours) - title (optional): Maintenance window title - notes (optional): Maintenance notes - start (optional): Start time in "Y-m-d H:i:00" format (default: now)
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already indicate a non-read-only, idempotent, non-destructive write, and no annotation contradiction exists. However, the description adds no behavioral context beyond the bare action, such as what setting maintenance does, whether it suppresses alerts, or how it interacts with device_maintenance_status.

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 a single front-loaded sentence with no filler; every word contributes the action and target. Given the schema carries parameter detail, the brevity is appropriate.

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?

Together with the complete input schema, output schema, and annotations, the description is minimally viable for invoking the tool correctly. It is less complete for selection and expectation-setting because it does not explain the effect of maintenance or how it relates to sibling maintenance tools, but the schema and annotations compensate for much of the missing context.

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 payload and hostname fields are already documented with formats, defaults, and required fields. The tool description itself adds no parameter-level meaning, which meets the baseline but does not exceed it.

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

Purpose4/5

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

The description states a specific action ('Set') and resource ('device maintenance') in the context of LibreNMS, so an agent can tell this is a write operation targeting a single device. It is not as detailed as explicitly contrasting with devicegroup_set_maintenance or location_set_maintenance, but the device scope is clear from the description and hostname parameter.

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?

There is no guidance on when to choose this tool over the closely related devicegroup_set_maintenance, location_set_maintenance, or device_maintenance_status siblings. The description gives no when-to-use, when-not-to-use, or prerequisite context; an agent must infer the selection criteria entirely from the tool name and schema.

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

devices_listDevices ListA
Read-onlyIdempotent

List devices from LibreNMS with optional filters.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
queryNoQuery parameters for filtering devices. Examples: - {"type": "hostname", "query": "router"} - search by hostname substring - {"type": "os", "query": "linux"} - filter by operating system - {"type": "location", "query": "datacenter"} - filter by location - {"type": "up"} or {"type": "down"} - filter by status - {"order": "hostname ASC"} - sort results Valid type values: all, active, ignored, up, down, disabled, os, mac, ipv4, ipv6, location, location_id, hostname, sysName, display, device_id, type, serial, version, hardware, features
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, fully covering the safety profile, so the bar is lower. The description adds modest behavioral context (the tool supports filtering), but it does not disclose pagination behavior, default result limits, or how a malformed free-form query object is handled. 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?

A single seven-word sentence is front-loaded with the verb and resource and contains zero redundant phrasing. It does not repeat the schema or annotations, and every word earns its place; there is no filler to trim and nothing important is buried.

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?

The tool is a straightforward read-only list operation with an output schema present and annotations covering the safety profile. All three parameters are fully documented in the input schema, so the thin description does not create a functional gap; the only missing narrative is explicit pagination/limit context, which the schema already conveys through defaults and minimums.

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 query parameter documentation is unusually rich with examples, valid type values, and ordering syntax, so the schema carries all parameter meaning. The description itself only restates that filters are optional, adding no semantic value beyond what the input schema already provides, which matches the baseline-3 case.

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

Purpose4/5

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

The description names a specific verb (List), a clear resource (devices from LibreNMS), and a scope qualifier (optional filters). The collection-vs-single distinction against sibling device_get is implicit in the verb but not explicitly drawn out; it is clear and unambiguous but does not name alternatives the way top-tier definitions do.

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 no explicit when-to-use or when-not-to-use guidance. 'With optional filters' implies the tool is for enumerating or searching devices, and the schema's filter examples hint at usage patterns, but tool-selection context versus device_get, ports_list, or devices_list's sibling list tools is left to inference rather than stated.

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

device_updateDevice UpdateC
DestructiveIdempotent

Update device fields in LibreNMS.

NameRequiredDescriptionDefault
payloadYesPatchable device fields: - notes: Device notes/comments - purpose: Device purpose description - override_sysLocation: true/false to override SNMP location - location_id: Location ID to assign - poller_group: Poller group ID - ignore: 0/1 to ignore device in alerts - disabled: 0/1 to disable polling - snmp_disable: 0/1 to disable SNMP polling - display_template: Custom display name template (LibreNMS >= 26.5) - display: Custom display name (LibreNMS < 26.5 only; read-only since 26.5, use display_template) - type: Device type classification
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=true. The description adds nothing on top of that: it doesn't say whether fields are patched (merge) or replaced, which fields can disrupt polling/alerts, or that omitted fields are left untouched. For a destructive mutation with zero added context, this is a notable gap.

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?

A single front-loaded sentence with no filler or repetition. It is appropriately terse, though the terseness is what leaves the other dimensions thin rather than being wasteful.

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?

The output schema exists, so return values need not be explained, and the schema documents both parameters fully. However, for a destructive, nested-payload mutation, the description omits merge semantics and the consequences of fields like disabled/snmp_disable โ€” gaps the structured fields don't cover.

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 payload property itself enumerates all patchable fields, so the schema carries the semantic load. The description contributes nothing beyond the schema, which sets the baseline at 3.

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

Purpose3/5

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

States a clear verb and resource ('Update device fields in LibreNMS'), but 'fields' is generic and gives no hint of what is updatable or how it differs from near-siblings like device_rename or device_set_maintenance. An agent cannot distinguish this tool from its device_* siblings 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 Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no mention of alternatives. The description never says to use this for arbitrary field patches versus device_rename for hostname changes or device_set_maintenance for maintenance state, all of which exist as siblings.

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

device_vlansDevice VlansB
Read-onlyIdempotent

Get VLANs configured on a specific device.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and a non-destructive operation, so the description does not contradict them and only needs to add context beyond the annotations. It adds device scoping, but does not disclose pagination behavior, ordering, or any other operational details beyond what the schema and annotations already imply.

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 a single clear sentence with no filler or redundancy. It is appropriately sized for a simple read operation, though it could have added a brief alternative-tool mention without becoming verbose.

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?

Annotations cover the safety profile, the input schema documents all parameters with descriptions, and an output schema exists, so return shape does not need to be explained. The main gap is the lack of explicit positioning relative to 'switching_vlans', but for a low-complexity read tool the description is otherwise sufficient.

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 parameters 'hostname', 'limit', and 'offset' are already documented. The description adds little beyond reinforcing that the operation is device-scoped, which maps to 'hostname'. With full schema coverage, the baseline of 3 is appropriate.

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

Purpose4/5

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

The description uses a concrete verb, 'Get', and a specific resource, 'VLANs configured on a specific device', which clearly conveys the tool's scope. It is slightly generic and does not explicitly differentiate itself from the similar sibling 'switching_vlans', but the 'on a specific device' qualifier gives enough clarity for most selection cases.

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 guidance is provided about when to use this tool versus alternatives such as 'switching_vlans' or other device-scoped list tools. The description implies a use case, but it does not state exclusions, prerequisites, or which sibling tools cover different scopes.

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

fdb_lookupFdb LookupB
Read-onlyIdempotent

Look up a MAC address in the forwarding database.

NameRequiredDescriptionDefault
macYesMAC address to look up. Accepts multiple formats: aa:bb:cc:dd:ee:ff, aabb.ccdd.eeff, or aabbccddeeff

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds no behavioral context beyond the lookup action, such as behavior on no match or whether all devices are searched. 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 a single, front-loaded sentence with no filler. Every word contributes to stating the core action and resource, making it highly efficient.

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 simple one-parameter tool with an output schema, the description is adequate for basic invocation. However, the presence of overlapping siblings (device_fdb, port_fdb, ports_search_mac) means the description lacks the contextual information needed for an agent to reliably select this tool over alternatives.

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 input schema fully documents the mac parameter and accepted formats. The tool description merely repeats 'MAC address' without adding any new semantic meaning or clarifying how parameters combine.

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

Purpose4/5

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

The description clearly states the action ('look up') and resource ('forwarding database'), making the basic purpose understandable. However, it does not differentiate from sibling tools like device_fdb or port_fdb that also operate on the forwarding database, so the scope remains somewhat ambiguous.

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?

The description gives no guidance on when to choose this tool over alternatives such as device_fdb, port_fdb, ports_search_mac, or arp_search. It does not say whether this is a global lookup across all devices or per-device, nor does it mention any exclusions or prerequisites.

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

health_by_typeHealth By TypeB
Read-onlyIdempotent

Get health data by sensor type for a device.

NameRequiredDescriptionDefault
typeYesSensor type (e.g. temperature, voltage, fanspeed)
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/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 and there is no contradiction. The description adds no further behavioral context such as matching semantics, pagination behavior, or error conditions, so it stays at a baseline level.

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 a single, tightly worded sentence that front-loads the action and key filters. There is no filler, repetition, or unnecessary detail.

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?

With annotations, full schema descriptions, and an output schema, the core invocation details are present. However, the description lacks tool-selection context among overlapping health/sensor tools, leaving the agent to infer which sibling to choose.

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%, with each parameter already explained. The description adds only the conceptual 'by sensor type' grouping, which the schema already reflects, so no meaningful extra parameter semantics are provided.

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

Purpose4/5

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

Description uses a specific verb ('Get'), names the resource ('health data'), and narrows it with 'by sensor type for a device.' It is clear and specific, but does not explicitly distinguish itself from overlapping siblings like health_list, health_sensor_get, or sensors_list.

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?

There is no guidance about when to use this tool versus alternatives, no mention of exclusions, and no stated condition such as 'use this when filtering by sensor type.' The intended usage is only implied by the description and input schema.

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

health_listHealth ListA
Read-onlyIdempotent

List available health graphs for a device.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description is consistent with them. The phrase 'available' adds slight context that only currently available graphs are listed, but no additional behavioral details such as empty-result behavior or pagination semantics are disclosed.

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?

A single concise sentence with the verb and object front-loaded. There is no filler, and every word contributes to understanding the tool's purpose.

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 straightforward list operation with full parameter documentation, an output schema, and safety annotations, the description is essentially complete. It only lacks explicit routing among sibling tools, but the complexity is low enough that this is not a major gap.

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 description does not need to explain hostname, limit, or offset. It adds no parameter-specific meaning beyond what the schema already provides, which is acceptable but not extra value.

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

Purpose4/5

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

The description clearly states a specific verb ('List') and resource ('available health graphs for a device'). It is distinguishable from most siblings, though it does not explicitly differentiate itself from similar tools like device_graphs_list or health_by_type.

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 intended use is implied: call this when you need the available health graphs for a given device. However, there is no explicit guidance about when to choose this tool over sibling tools such as device_graphs_list or health_by_type, and no exclusions are mentioned.

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

health_sensor_getHealth Sensor GetA
Read-onlyIdempotent

Get a specific sensor by ID for a device.

NameRequiredDescriptionDefault
typeYesSensor type (e.g. temperature, voltage, fanspeed)
hostnameYesDevice hostname or ID
sensor_idYesSensor ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe read-only nature is established. The description adds no significant behavioral context beyond the schema, but it also does not contradict 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 a single efficient sentence with no filler. It front-loads the action and resource, making it immediately 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?

Given the tool's simplicity, full schema coverage, output schema, and strong annotations, the description is sufficient for correct invocation. Nothing critical is missing for an agent to select and call the tool.

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 every parameter is already documented with type and description. The description only restates the core lookup intent without adding extra semantic depth beyond the schema.

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

Purpose4/5

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

The description clearly states the verb 'Get' and the resource 'specific sensor by ID for a device,' which is distinct from list-style siblings like health_list and sensors_list. It does not explicitly name a sibling tool, but the focus on a single sensor ID makes the 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 Guidelines3/5

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

The wording implies use when a single sensor is needed by ID, but it does not explicitly state when to prefer this tool over alternatives such as health_by_type or sensors_list. There is no exclusionary or alternative guidance, so usage context is only lightly inferred.

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

inventory_deviceInventory DeviceB
Read-onlyIdempotent

Get inventory for a device from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or ID
ent_physical_classNoFilter by entity physical class (e.g., chassis, module, port, powerSupply, fan, sensor)
ent_physical_contained_inNoFilter by parent entity index

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/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 description adds no additional behavioral context. It does not mention the hierarchical/structured nature of the response, how filters affect the data, or any quirks such as pagination defaults. The description merely restates the tool's action without expanding on behavior 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 a single clear sentence with no filler or repetition. It immediately conveys the tool's core action and domain, making it easy to parse.

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?

Given the output schema and comprehensive parameter descriptions, a basic call is feasible. However, the description lacks context about the relationship to inventory_device_flat, when to use filters like ent_physical_class or ent_physical_contained_in, and how the nested output differs from flat alternatives. For a tool with a sibling variant, this is a notable gap.

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 input schema already documents all five parameters with descriptions and defaults. The tool description adds no param-level detail, but since the schema carries the burden, baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly states the verb ('Get'), the resource ('inventory for a device'), and the domain ('from LibreNMS'). However, it does not differentiate from the sibling tool inventory_device_flat, which likely returns a flattened version of the same inventory, so some ambiguity remains.

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?

There is no guidance on when to use this tool versus inventory_device_flat or other inventory-related tools such as sensors_list or health_list. The description implies usage through its wording but provides no explicit context, alternatives, or exclusions.

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

inventory_device_flatInventory Device FlatA
Read-onlyIdempotent

Get flattened inventory for a device from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/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 fully covered. The description adds the 'flattened' qualifier but does not describe return behavior, pagination semantics, or any side effects beyond what the annotations provide. This is adequate but not enriching.

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 a single front-loaded sentence with zero filler. Every word contributes: the verb, the resource shape ('flattened'), the target ('device'), and the source ('LibreNMS'). It is an ideal concise definition.

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 tool with an output schema, annotations covering safety, and 100% schema parameter documentation, the description is nearly complete. The only minor gap is not explaining what 'flattened' means in practice or how it differs from the nested inventory response, though the word itself signals the distinction.

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%, with clear descriptions for hostname, limit, and offset. The tool description itself adds no parameter-level meaning, so it does not compensate or extend beyond the schema. The baseline of 3 is appropriate when the schema carries the full burden.

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 uses a specific verb ('Get') and resource ('flattened inventory for a device') and names the source system (LibreNMS). It clearly distinguishes itself from the sibling tool 'inventory_device' by the word 'flattened', so an agent can immediately tell this tool returns a flat representation rather than a nested one.

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 implies a use case through the word 'flattened' (use when you need a flat inventory view), but it does not explicitly state when to prefer this tool over 'inventory_device' or any alternative. There is no explicit when-not-to-use guidance, so the usage context is only implied.

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

location_addLocation AddA
Destructive

Add a new location to LibreNMS.

NameRequiredDescriptionDefault
payloadYesLocation payload fields: - location (required): Location name - lat (required): Latitude coordinate (decimal degrees) - lng (required): Longitude coordinate (decimal degrees) - fixed_coordinates (optional): 0 = update from device, 1 = fixed (default: 1)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already state that this is a non-readonly, destructive operation. The description complements them by indicating the specific side effect โ€” creating a new location โ€” but it does not disclose additional behavioral context such as duplicate handling, coordinate validation, or whether existing locations can be overwritten.

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 a single, front-loaded sentence with no filler or redundant information. Every word contributes to the tool's purpose.

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 creation tool with a fully documented nested payload schema, annotations, and an output schema, the description is mostly sufficient. It could be slightly stronger by explicitly naming the sibling edit tool, but 'new' and the sibling list already provide enough contextual signal.

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 has 100% description coverage and documents the required payload fields, including location, lat, lng, and the optional fixed_coordinates default. The description itself adds no parameter-level detail, so it meets the baseline but does not exceed 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 uses a specific verb and resource: 'Add a new location to LibreNMS.' The word 'new' clearly signals creation, distinguishing it from sibling tools like location_edit, location_delete, and location_set_maintenance.

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 clearly implies this tool is for creating a new location, which gives basic selection context. However, it does not explicitly mention alternatives, prerequisites, or when not to use the tool, leaving some guidance to inference.

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

location_deleteLocation DeleteB
DestructiveIdempotent

Delete a location from LibreNMS by ID or name.

NameRequiredDescriptionDefault
locationYesLocation ID or name

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true. The description adds no behavioral context beyond those annotations: it does not mention permanence, permissions, side effects, or what happens if the location does not exist.

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?

One short sentence, front-loaded with the verb and resource, with zero wasted words. The identifier is included efficiently.

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?

Given an output schema, rich annotations covering destructiveness and idempotency, and a fully described single parameter, the description is largely complete for correct invocation. It could mention that deletion is permanent or any prerequisites, but annotations already cover the critical safety profile.

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 parameter schema already explains 'Location ID or name'. The description simply repeats that identifier information without adding syntax, format, or constraint details. Baseline 3 is appropriate when the schema does the heavy lifting.

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 'Delete', resource 'a location', scope 'from LibreNMS', and identifier 'by ID or name'. It clearly distinguishes from siblings like location_add, location_edit, and location_get without needing to open their schemas.

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?

The description gives no explicit when-to-use guidance, no alternatives, and no prerequisites. It merely states the deletion action, leaving the agent to infer context from the name and siblings.

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

location_editLocation EditC
DestructiveIdempotent

Edit a location in LibreNMS.

NameRequiredDescriptionDefault
payloadYesLocation patchable fields: - lat: Latitude coordinate (decimal degrees) - lng: Longitude coordinate (decimal degrees)
locationYesLocation ID or name

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=true, giving the agent the safety profile. The description adds nothing beyond thisโ€”it does not explain what gets modified, whether the edit is partial or full, or any permissions required. No contradiction exists, but there is no added behavioral context.

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 a single, front-loaded sentence with no wasted words. It is arguably under-specified, but for conciseness and structure, it is efficient and clear.

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?

Given that an output schema exists and schema coverage is 100%, the description need not explain return values or parameter formats. However, for a destructive edit tool with nested payload and multiple location siblings, the description is minimally viableโ€”it omits any note about modifying an existing location, whether the edit is destructive, or how it relates to location_add/delete. The annotations and schema carry most of the context, but some gaps remain.

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%, with both parameters and the nested payload fields fully documented in the schema. The description adds no parameter meaning beyond what the schema already provides, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb ('Edit') and resource ('a location in LibreNMS'), making the basic purpose clear. However, it does not differentiate this tool from siblings like location_add, location_delete, location_get, or location_set_maintenance, so it falls short of a 5.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as location_add or location_delete. It is not misleading, but it offers no usage context at all.

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

location_getLocation GetA
Read-onlyIdempotent

Get a specific location from LibreNMS by identifier.

NameRequiredDescriptionDefault
locationYesLocation ID or name

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/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 fully covered without the description. The description adds only the 'by identifier' keying hint; it discloses nothing further about behavior because none is needed for a safe single-item read with an output schema.

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?

One sentence, front-loaded with the verb and resource and free of filler. Every word earns its place for a tool this simple.

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 one-parameter read tool, the description, annotations, complete schema coverage and existing output schema together give an agent everything needed to invoke it correctly. The only shortfall is the absence of explicit sibling routing to locations_list.

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 single parameter already documents itself as 'Location ID or name'. The description's 'by identifier' merely echoes this, adding no syntax, format, or matching-rule detail beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

Clear verb+resource: 'Get a specific location from LibreNMS by identifier.' The word 'specific' implicitly contrasts with the sibling locations_list, and 'by identifier' signals the lookup key. It does not explicitly name the alternative list tool, but an agent can distinguish the single-item fetch from the list.

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?

Usage is implied: fetch one location when you already have its ID or name, versus locations_list for enumeration. There is no explicit when-to-use or when-not-to-use statement and no named alternative, so the routing guidance is only inferable.

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

location_set_maintenanceLocation Set MaintenanceB
Idempotent

Set maintenance mode for all devices in a location.

NameRequiredDescriptionDefault
payloadYesMaintenance mode payload: - duration (required): Duration in "H:i" format (e.g., "02:00" for 2 hours) - title (optional): Maintenance window title - notes (optional): Maintenance notes - start (optional): Start time in "Y-m-d H:i:00" format (default: now)
locationYesLocation ID or name

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare the mutation profile (non-read-only, idempotent, non-destructive), so the bar is lower. The description does add blast-radius context ('all devices in a location'), which matters for a bulk write, but it says nothing about how the window expires or how to clear maintenance early, despite 'duration' being required in the payload.

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?

A single nine-word sentence with the target scope front-loaded and zero filler. It is efficient, though arguably thinner than the operation's complexity warrants, which is a completeness issue rather than a conciseness one.

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?

With a 100%-covered schema, output schema present, and annotations covering the safety profile, the core call path is documented. Still missing is any statement routing the agent between location-, devicegroup-, and device-level maintenance, and any note on immediate effect or cancellation for a bulk state change.

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 nested payload already documents duration format, title, notes, and start-time default, so the description need not repeat parameter detail. Baseline 3 applies; the description adds no parameter meaning of its own.

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

Purpose4/5

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

States a specific verb ('Set maintenance mode') plus the resource and its scope ('all devices in a location'), which distinguishes it in spirit from the device-scoped and group-scoped siblings. It never names those siblings (device_set_maintenance, devicegroup_set_maintenance), so the differentiation must be inferred from the word 'location'.

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?

The description gives no when-to-use guidance, no prerequisites, and no alternative tools. An agent facing device_set_maintenance, devicegroup_set_maintenance, and location_set_maintenance receives no statement of which scope to pick. Implied usage exists only through the word 'location'.

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

locations_listLocations ListB
Read-onlyIdempotent

List locations from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. However, the description adds no additional behavioral context such as pagination behavior, scope, or ordering, and it does not disclose anything 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 extremely concise at six words, with the verb and resource front-loaded. There is no filler or redundant explanation, and every word contributes to the basic meaning.

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 list operation with optional pagination parameters, no required parameters, a complete input schema, and an output schema, the minimal description is mostly sufficient to invoke correctly. It lacks explicit routing to sibling tools, which prevents a perfect score.

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 limit and offset are already fully documented. The description adds no extra parameter semantics, matching the baseline for schema-covered parameters.

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

Purpose4/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 ('locations'), which clearly identifies the operation. It is distinct from the singular location_get and mutation-focused sibling tools, though it does not explicitly contrast with them.

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?

There is no guidance about when to use this tool versus alternatives such as location_get, nor any exclusions or conditions. An agent must infer usage solely from the name and minimal verb phrase.

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

logs_alertlogLogs AlertlogB
Read-onlyIdempotent

Get alert logs for a device from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
startNoNumber of results to skip (offset) for pagination
to_tsNoEnd timestamp filter (Unix timestamp or datetime string)
from_tsNoStart timestamp filter (Unix timestamp or datetime string)
hostnameNoDevice hostname or ID. Omit for entries from all devices.
sortorderNoSort order: ASC or DESC

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/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 fully covered without the description. The description adds only that the source is LibreNMS and that retrieval is device-oriented, which is modest context beyond the structured fields.

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?

A single front-loaded sentence with no filler; the action and resource lead immediately and nothing is wasted.

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?

Return values need not be described since an output schema exists, and parameters are fully covered. The remaining gap is the failure to position this tool against its many log-fetching siblings, leaving the agent to infer which log endpoint to call.

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 all six parameters (limit, start, to_ts, from_ts, hostname, sortorder) are already documented in the schema. The description's 'for a device' loosely maps to hostname but adds no format, default, or pagination detail beyond what the schema provides; baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb (Get) and resource (alert logs) scoped to a device from LibreNMS, so the operation is unambiguous. However, it does not distinguish itself from near-identical siblings like logs_eventlog, logs_syslog, and logs_authlog, which share the same verb+resource pattern.

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 guidance on when to choose this over the other log tools (logs_eventlog, logs_syslog, logs_authlog). The phrase 'for a device' implies device scoping, but hostname is optional and no conditions or alternatives are named.

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

logs_authlogLogs AuthlogA
Read-onlyIdempotent

Get authentication logs from LibreNMS.

Auth logs are server-wide rather than per-device, so this takes no hostname.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
startNoNumber of results to skip (offset) for pagination
to_tsNoEnd timestamp filter (Unix timestamp or datetime string)
from_tsNoStart timestamp filter (Unix timestamp or datetime string)
sortorderNoSort order: ASC or DESC

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds useful context by revealing that auth logs are global across the server, which explains why there is no hostname filtering. This goes beyond what the annotations alone 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?

Two short sentences with no filler. The action is front-loaded and the scope clarification is concise and relevant.

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 full schema descriptions, a true output schema, and safety annotations, the description covers the essential invocation context. The server-wide/no-hostname note addresses the one subtlety that could otherwise lead to a wrong call.

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 parameters are already well documented. The description adds meaning by explicitly stating that the tool takes no hostname because auth logs are server-wide, helping an agent avoid expecting a device-scoped parameter.

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 uses a specific verb and resource: 'Get authentication logs from LibreNMS.' It also distinguishes itself from sibling log tools by noting auth logs are server-wide and take no hostname, making its scope clear.

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 states the context for use: authentication logs are server-wide rather than per-device, so no hostname should be passed. It does not explicitly name sibling alternatives such as logs_eventlog or logs_syslog, but the scoping guidance is clear.

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

logs_eventlogLogs EventlogC
Read-onlyIdempotent

Get event logs for a device from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
startNoNumber of results to skip (offset) for pagination
to_tsNoEnd timestamp filter (Unix timestamp or datetime string)
from_tsNoStart timestamp filter (Unix timestamp or datetime string)
hostnameNoDevice hostname or ID. Omit for entries from all devices.
sortorderNoSort order: ASC or DESC

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 fully carried by structured data. The description adds essentially nothing beyond restating the operation: no pagination behavior, ordering defaults, timestamp handling, or rate-limit context beyond what the schema parameters already state.

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?

A single front-loaded sentence with zero padding. It is efficient, though arguably under-specifies given the tool's sibling surface area.

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?

Return values need not be explained since an output schema exists, and all parameters are documented in the schema. The remaining gap is routing among closely named sibling log tools, which the description does not address.

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%, with every one of the six parameters individually documented (limit, start, to_ts, from_ts, hostname, sortorder). The description adds no parameter detail, so baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb (Get) and resource (event logs) plus the source system (LibreNMS), so the basic operation is unambiguous. However, it does not distinguish this from the many sibling log tools (logs_syslog, logs_alertlog, logs_authlog, logs_syslogsink), and its phrase 'for a device' slightly conflicts with the hostname parameter note that omitting it returns entries from all devices.

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?

There is no guidance on when to choose this tool over the sibling log tools (syslog, alertlog, authlog) or device_eventlog_add. The agent is left to infer the distinction purely from the name.

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

logs_syslogLogs SyslogC
Read-onlyIdempotent

Get syslogs for a device from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
startNoNumber of results to skip (offset) for pagination
to_tsNoEnd timestamp filter (Unix timestamp or datetime string)
from_tsNoStart timestamp filter (Unix timestamp or datetime string)
hostnameNoDevice hostname or ID. Omit for entries from all devices.
sortorderNoSort order: ASC or DESC

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: no mention of pagination behavior, no note that timestamps can be Unix or datetime strings, no hint about result ordering or volume. With annotations carrying the burden, the description contributes almost no extra behavioral context.

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?

A single short sentence with no filler and the core action front-loaded. Nothing is wasted, but its brevity is a byproduct of under-specification rather than disciplined editing.

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?

An output schema exists, so return values need not be described, and all parameters are documented in the schema. What remains missing is any guidance on the tool's place among the four sibling log endpoints and its device-scoping behavior, which is the main ambiguity an agent would face.

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 all six parameters (limit, start, to_ts, from_ts, hostname, sortorder) are already documented in the schema. The description adds no parameter-level meaning beyond restating that results are device-scoped, and even that conflicts slightly with the schema's note that omitting hostname returns all devices. Baseline 3 is appropriate when the schema does the work.

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

Purpose3/5

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

The description states a verb (Get) and resource (syslogs) plus a source system (LibreNMS), so the basic operation is identifiable. However it makes no attempt to distinguish this tool from closely named siblings such as logs_authlog, logs_eventlog, logs_alertlog, or especially logs_syslogsink, which an agent could easily confuse. This places it above a tautology but below a definition that cleanly separates it from alternatives.

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?

There is no guidance on when to choose this tool versus the other log tools (authlog, eventlog, alertlog, syslogsink) or when a syslog query is appropriate at all. No prerequisites, no exclusions, no alternatives are named. The agent must infer usage entirely from the name.

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

logs_syslogsinkLogs SyslogsinkB

Add a syslog entry to LibreNMS via API sink.

NameRequiredDescriptionDefault
payloadYesJSON syslog message(s) to ingest into LibreNMS syslog storage. Accepts a single object or an array of objects.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate this is not read-only, not idempotent, and not destructive, so the core behavioral profile is partially covered. However, the description itself adds little beyond those annotations: it does not explain duplicate-handling behavior, rate limits, or what happens on invalid payloads.

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 a single, front-loaded sentence with no filler. It states the essential operation clearly and does not waste words.

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?

This is a simple single-parameter tool with a detailed schema description and an output schema present. The description covers the core operation, and the schema covers payload semantics, leaving no major missing piece for a straightforward API sink call.

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 description already provides 100% coverage for the single payload parameter, including that it accepts a single object or an array. The tool description does not repeat or add parameter-level detail, so baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly identifies the action ('Add') and the resource ('syslog entry to LibreNMS via API sink'), making the operation easy to grasp. It does not explicitly differentiate from sibling logs_syslog, but the 'sink' terminology and 'entry' suggest ingestion rather than retrieval.

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?

There is no guidance about when to use this tool versus alternatives like logs_syslog or logs_eventlog. The description implies it is for ingesting syslog entries, but it does not state exclusions, prerequisites, or when a sibling tool would be more appropriate.

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

nac_listNac ListA
Read-onlyIdempotent

List network access control (802.1X / MAB) sessions across all devices.

Note that LibreNMS answers with a 404 and "Nac entry does not exist" rather than an empty list when nothing matches.

NameRequiredDescriptionDefault
macNoFilter to a single MAC address. Optional.
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish that this is read-only, idempotent, and non-destructive, so the description adds valuable non-obvious behavior: the 404 and 'Nac entry does not exist' response instead of an empty list. This is exactly the kind of edge-case disclosure that helps an agent handle failures correctly.

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 very concise: one sentence declares the tool's function and scope, and a second sentence provides a critical behavioral warning. No filler or redundant restatement of the schema exists.

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?

With an output schema present and fully described parameters, the description covers the main contextual gapโ€”the unusual 404 behavior on no matches. It lacks explicit alternative tool routing, but for the tool itself it is sufficiently complete.

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 schema itself clearly documents all three parameters (mac, limit, offset) with defaults and constraints. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a specific action ('List'), a clear resource ('network access control (802.1X / MAB) sessions'), and a precise scope ('across all devices'). This makes the tool's core purpose immediately understandable, though it does not explicitly name or distinguish itself from sibling tools like device_nac.

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 phrase 'across all devices' implies a global listing use case, which weakly suggests that a per-device alternative like device_nac would be used instead. However, there is no explicit guidance on when to choose this tool over siblings or 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.

ospf_listOspf ListC
Read-onlyIdempotent

List all OSPF instances from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 fully covered by structured data. The description adds nothing behavioral beyond that โ€” no mention of pagination semantics, result caps, or instance scoping โ€” so it fails the (lower) bar that annotations set.

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?

One short, front-loaded sentence with zero filler and the resource named first. It is efficient, though arguably too terse for the tool's routing needs.

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?

An output schema exists, so return values need no explanation, and the schema fully documents pagination. What is missing is usage context relative to ospf_ports and any behavioral nuance, leaving the definition minimally viable rather than complete.

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 both limit and offset are documented with defaults and minimums in the schema. The description contributes no additional parameter meaning, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb+resource ("List all OSPF instances") plus the data source (LibreNMS), so the agent knows exactly what is returned. It does not distinguish itself from the sibling ospf_ports, which is the nearest potential confusion point.

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 guidance on when to prefer this over ospf_ports, no prerequisites, and no exclusion conditions. "List all" implies an unfiltered enumeration but the description never says so or routes the agent elsewhere.

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

ospf_portsOspf PortsB
Read-onlyIdempotent

List all OSPF ports/interfaces from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered. The description adds only scope ("all") and the data source; it says nothing about response size, pagination defaults, or whether results are filtered per device.

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?

A single short sentence with the resource front-loaded and no filler. It is efficient, though it is arguably too terse to be maximally useful.

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?

An output schema exists, so return values need not be described, and annotations cover the safety profile. For a simple paginated list tool this is minimally adequate, but the lack of differentiation from ospf_list and any usage context leaves a real gap.

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 both limit/offset are fully documented in the schema with defaults and minimums. The description adds no additional meaning about these parameters, so the baseline of 3 applies.

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

Purpose4/5

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

The description has a specific verb and resource ("List all OSPF ports/interfaces") and names its source (LibreNMS), so an agent knows exactly what data comes back. However, it does not differentiate itself from the closely named sibling ospf_list, leaving ambiguity about which OSPF endpoint to pick.

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?

There is no when-to-use guidance, no prerequisites, and no mention of the alternative ospf_list (which could mean OSPF neighbors versus interfaces). The agent must infer usage purely from the name and sibling list.

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

oxidized_config_getOxidized Config GetA
Read-onlyIdempotent

Get the stored device configuration from Oxidized for a specific device.

NameRequiredDescriptionDefault
hostnameYesDevice hostname

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/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 context by saying the configuration is 'stored' and sourced 'from Oxidized', which clarifies this is a retrieval of existing data rather than a live fetch or mutation. It does not go further into error or availability behavior, but that is acceptable given 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 a single, front-loaded sentence with no filler. Every word earns its place: the verb, the data source, the resource, and the selection criterion are all present.

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 simple single-parameter getter with a true output schema and annotations covering safety and idempotency, this description is complete. An agent can confidently invoke it when it needs a stored Oxidized config for a specific hostname. No critical operational information 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 documents hostname with 100% coverage, so the description does not need to add much. It reinforces that hostname selects the specific device, but it adds no format, validation, or fallback information beyond what the schema already 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 ('Get'), a specific resource ('stored device configuration from Oxidized'), and a clear target ('for a specific device'). This distinguishes it from siblings like oxidized_config_search and oxidized_list by emphasizing a direct, single-device retrieval rather than searching or listing.

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 implies the right context: use when you need the stored Oxidized configuration for a known device and you have its hostname. It does not explicitly contrast with oxidized_config_search or oxidized_list, so there is a slight gap in when-not-to-use guidance, but the intended scenario is clear.

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

oxidized_listOxidized ListB
Read-onlyIdempotent

List devices tracked by Oxidized for config backup.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameNoFilter by device hostname or ID. Optional. An unknown device returns an error.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/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 only that the devices are Oxidized-managed backups; it says nothing about pagination behavior or the unknown-hostname error path.

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?

A single front-loaded sentence with no redundant or filler content. Nothing in it needs trimming.

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?

An output schema exists, so return values need no explanation, and the annotations cover safety. What is missing is the relationship to oxidized_config_get/oxidized_config_search and any note that the hostname filter can error on unknown devices, leaving the agent to discover the discovery-to-fetch workflow on its own.

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 limit, offset and hostname are already fully documented in the schema. The description adds no extra meaning about filtering or pagination defaults, which matches the baseline for a fully-documented schema.

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

Purpose4/5

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

Specific verb-plus-resource: 'List devices tracked by Oxidized for config backup' tells the agent exactly what is returned and why. It implies a distinction from oxidized_config_get and oxidized_config_search but never names those siblings, so the differentiation is only inferable.

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, and no pointer to the sibling tools that fetch or search actual configs. The agent must infer that this is the discovery step before oxidized_config_get.

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

pingPingA
Read-onlyIdempotent

Simple API health check - ping LibreNMS API.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/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 safe, side-effect-free nature is fully covered by structured data. The description adds only that this is a connectivity/health check, with no detail on latency, auth requirements, or error behavior beyond what the 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?

A single front-loaded sentence with zero redundancy. It states the tool's function immediately and adds no filler.

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 an output schema present, zero parameters, and annotations covering the safety profile, the description is complete for what an agent needs. No missing information would change how the tool is invoked.

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 tool takes zero parameters, so there is nothing for the description to clarify; the schema is empty with additionalProperties false. The baseline of 4 for a parameterless tool applies.

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

Purpose4/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: a health check that pings the LibreNMS API. It is unambiguous what the tool does, though it does not contrast itself with any sibling tool (none of which perform a connectivity check, so differentiation is less critical).

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 phrase 'health check' implies when to use it (verify the API is reachable before or during other operations), but there is no explicit when-to-use, when-not-to-use, or alternative named. Usage is left to inference.

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

poller_group_getPoller Group GetB
Read-onlyIdempotent

Get poller group(s) from LibreNMS.

NameRequiredDescriptionDefault
poller_groupNoPoller group ID or name. Omit (or pass 'all') to list every poller group; a group literally named 'all' must be fetched by its ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/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 fully covered by structured data. The description adds nothing beyond that โ€“ no note on the list-all default behavior or result volume โ€“ so it contributes no extra behavioral context.

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?

A single short, front-loaded sentence with no filler or repetition. It is appropriately sized for a one-parameter read tool, though it is terse enough to border on under-specification.

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?

With an output schema present, return values need not be described, and the single optional parameter is fully documented in the schema. Annotations cover safety, so the only real gap is the absence of usage context, which is minor for a simple getter.

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 schema fully explains the optional poller_group parameter including the 'all' handling, so the description need not repeat it. Baseline 3 applies since the description adds no parameter meaning of its own.

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

Purpose4/5

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

The description gives a clear verb ('Get') and resource ('poller group(s)') scoped to LibreNMS, so an agent immediately knows it retrieves poller group records. It does not differentiate from siblings, but no other poller-group tool exists in the sibling list, so there is little to disambiguate.

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?

The description offers no guidance on when to call this versus alternatives, nor any prerequisites or context (e.g., that it can be used to resolve a group name to an ID for other tool calls). The only usage hint lives in the parameter schema, not the description.

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

port_description_getPort Description GetA
Read-onlyIdempotent

Get port description from LibreNMS by port ID.

NameRequiredDescriptionDefault
port_idYesPort ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare the tool read-only, idempotent, and non-destructive, and the description does not contradict these. The description adds no additional behavioral context such as error behavior, default values, or return format, but for a simple read operation the annotations carry the burden adequately.

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 a single, compact sentence with no filler. It front-loads the action and resource and provides the key lookup mechanism immediately.

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?

This is a simple single-parameter read tool with full annotations and an output schema present. The description states exactly what is needed to invoke it correctly, and nothing important is missing for an agent to select and call it.

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 single parameter is documented as 'Port ID.' The description merely restates that the lookup is by port ID without adding new semantic details, so the schema already handles 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 uses a specific verb ('Get'), a clear resource ('port description'), and a clear lookup key ('by port ID'). This distinguishes it from related tools like port_get, which targets a broader port object, and port_description_update, which modifies the field.

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 implies the appropriate use case: when you have a port ID and need its description. However, it does not explicitly state when not to use it or mention alternatives such as port_get or ports_search, so the guidance is only implicit.

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

port_description_updatePort Description UpdateB
DestructiveIdempotent

Update port description in LibreNMS by port ID.

NameRequiredDescriptionDefault
payloadYesPort description payload. Format: {"description": "new description"}
port_idYesPort ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already carry the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=true), and the description is consistent with them โ€” no contradiction. However, the description adds little beyond the annotations: it doesn't state that the existing description is overwritten or that repeated calls with the same payload are safe. With annotations present, the bar is lower, so a 3 is appropriate.

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?

A single front-loaded sentence with zero filler: action, resource, and identifier method delivered in eight words. Appropriately sized for a simple 2-parameter tool with rich schema documentation.

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?

Given the 100% schema coverage, presence of annotations, and an output schema signal, the description is sufficient for basic invocation. Gaps remain: no mention of overwrite semantics despite destructiveHint=true, and no warning that payload allows additionalProperties beyond 'description'. Adequate but minimal for a mutation tool.

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%: payload's exact format is documented ('{"description": "new description"}') and port_id has type and minimum constraints. The description merely echoes 'by port ID' and adds no meaning beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('Update'), resource ('port description in LibreNMS'), and identification method ('by port ID'). The purpose is unambiguous, but it doesn't explicitly distinguish itself from siblings like port_description_get or port_get โ€” the differentiation rests on naming convention rather than description content.

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 guidance on when to use this tool versus alternatives. The description mentions no prerequisites (e.g., the port must exist), no reference to port_description_get for read operations, and no exclusion of other port-update paths. An agent must infer usage entirely from the tool name and context.

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

port_fdbPort FdbA
Read-onlyIdempotent

List the MAC addresses learned on a port, from the forwarding database.

This answers "what is connected to this port". To go the other way and find which port a known MAC sits on, use fdb_lookup instead.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
port_idYesPort ID

Output Schema

NameRequiredDescription

No output parameters

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, covering the safety profile. The description adds useful behavioral context by identifying the data source (forwarding database) and the conceptual direction of the query, while also clarifying the reverse-lookup relationship with fdb_lookup.

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 tight sentences: the first states the core function, and the second provides the differentiating use case and points to the alternative. No wasted words, and the main purpose 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?

Given the read-only annotations, complete parameter schema, and existing output schema, the description provides everything an agent needs to select and invoke the tool correctly. It also resolves ambiguity against the closely related fdb_lookup sibling.

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%, with each parameter already documented in the input schema. The description itself does not add parameter-level meaning beyond naming the resource, so the baseline of 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 uses a specific verb and resource: 'List the MAC addresses learned on a port, from the forwarding database.' It clearly states what the tool does and even frames it as answering 'what is connected to this port', which distinguishes it from the sibling fdb_lookup.

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 the agent when to use this tool ('what is connected to this port') and when not to, directing it to fdb_lookup when the goal is to find which port a known MAC sits on. This is clear routing guidance with a named alternative.

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

port_getPort GetC
Read-onlyIdempotent

Get port info from LibreNMS by port ID.

NameRequiredDescriptionDefault
port_idYesPort ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description is consistent with them. However, the description adds no behavioral context beyond what the annotations and schema already communicate, such as returned data scope, error behavior, or any special constraints.

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 one short, front-loaded sentence with no filler words. It is economical and easy to parse, though its brevity leaves some guidance gaps that are penalized in other dimensions.

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 simple single-parameter getter with rich annotations and an output schema, this description is minimally sufficient for invocation. However, it is vague about what 'port info' includes and does not help an agent choose among the many port-related sibling tools, so it is not fully complete.

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 port_id is documented in the schema. The description merely repeats the 'by port ID' concept without adding semantic detail, 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.

Purpose4/5

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

The description uses a specific verb ('Get'), a clear resource ('port info'), a source ('LibreNMS'), and a lookup key ('by port ID'). It is clear enough to understand the core operation, though it does not explicitly distinguish itself from related siblings like device_ports_get or port_graph.

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?

The description provides no guidance on when to use this tool versus alternatives such as ports_list, ports_search, or device_ports_get. There is no mention of exclusions, prerequisites, or sibling routing, so an agent must infer usage from the name and parameter alone.

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

port_graphPort GraphA
Read-onlyIdempotent

Render a per-port graph as an image, for example interface traffic.

Names like 'Te2/7' can fail by name behind proxies that reject or decode the encoded slash. For 'bits' this tool then falls back to the port-group endpoint, which renders the same traffic data by port ID, so callers still get a graph.

NameRequiredDescriptionDefault
widthNoGraph width in pixels.
heightNoGraph height in pixels.
ifnameYesInterface name as reported by LibreNMS, e.g. 'Po1' or 'Te2/7'
legendNoWhether to render the graph legend.
to_timeNoEnd of the time range, either a relative offset or a Unix timestamp. Defaults to now.
hostnameYesDevice hostname or device ID
from_timeNoStart of the time range, either a relative offset such as '-1d', '-6h' or '-1w', or a Unix timestamp. Defaults to the LibreNMS default (-1d).
graph_typeNoGraph type: 'bits' (traffic), 'upkts' (unicast packets), 'nupkts' (non-unicast packets), 'errors', or 'etherlike'. The LibreNMS names ('port_bits', ...) are accepted too.bits

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered. The description adds behavior those annotations cannot: an internal fallback path on name-resolution failure that is limited to graph_type 'bits', implying other types may hard-fail. That is meaningful operational context.

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?

Purpose is front-loaded in the first sentence, with the edge-case note quarantined to a second paragraph. Both paragraphs earn their place, though the fallback explanation is slightly verbose for what it conveys.

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 an image-rendering read tool with full annotation coverage and a 100%-documented schema, the description supplies the one thing structured fields can't: the name-resolution failure mode and the conditional automatic fallback. 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.

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description does add value beyond the schema by tying ifname name-format fragility and the graph_type 'bits' fallback together, but it adds no syntax or format detail for width/height/legend/from_time/to_time that the schema doesn't already carry.

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

Purpose4/5

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

Specific verb+resource: 'Render a per-port graph as an image', with the example 'interface traffic' pinning down the resource. The 'per-port' scope implicitly separates it from sibling graph tools like device_graph and port_group_graph, though it never names them explicitly.

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 second paragraph gives real operating guidance: name-form ifnames such as 'Te2/7' can fail behind slash-rejecting proxies, and for 'bits' the tool transparently falls back to the port-group endpoint. However, it never states when to pick this over device_graph or port_group_graph, or what to do for non-'bits' types when the name fails.

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

port_group_addPort Group AddB
Destructive

Add a port group to LibreNMS.

NameRequiredDescriptionDefault
payloadYesPort group payload: - name (required): Port group name - desc (optional): Port group description

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare that this is not read-only and is destructive, and the description merely reiterates the mutation ('Add') without adding further behavioral context. There is no mention of duplicate-name behavior, whether the operation overwrites anything, permission requirements, or side effects 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 a single, front-loaded sentence with no filler or repetition. It states the action and target system directly, earning its place without wasted words.

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 one-parameter creation tool, the schema fully documents the payload and annotations communicate the mutating/destructive nature. The description could be more complete by clarifying duplicate handling or explicitly routing away from assign/remove siblings, but nothing essential for a basic invocation 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 description coverage is 100%, with the payload property documenting both 'name' as required and 'desc' as optional. The tool description itself adds no parameter-level detail, so the baseline score of 3 applies because the schema already carries the semantic load.

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

Purpose4/5

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

The description uses a specific verb ('Add') and names the resource ('a port group to LibreNMS'), so an agent can tell this action creates a port group. It does not explicitly contrast itself with sibling tools like port_group_assign or port_group_remove, which would make it fully differentiated.

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?

Usage context is implied: an agent would call this when it wants to add a new port group. However, there is no explicit guidance about when to prefer this over port_group_assign, port_group_remove, or port_groups_list, and no exclusions or prerequisites are stated.

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

port_group_assignPort Group AssignB

Assign ports to a port group in LibreNMS.

NameRequiredDescriptionDefault
payloadYesPort IDs to assign. Format: {"port_ids": [1, 2, 3]}
port_group_idYesPort group ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already convey that this is a non-read-only, non-idempotent, non-destructive operation. The description adds no behavioral context beyond that, such as whether existing port assignments are replaced, whether the group must already exist, or how failures are handled.

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 a single, front-loaded sentence with no filler. Every word contributes to identifying the tool's purpose and scope.

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 two-parameter mutation with full schema coverage, annotations, and an output schema, the description is minimally sufficient for an agent to invoke the tool correctly. It lacks usage and alternative guidance, but the core invocation details are present.

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 fully documents both parameters, including the structured payload format with port_ids. The description adds nothing beyond the schema, 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?

The description uses a specific verb ('Assign') and resource ('ports' to a 'port group'), and names the system context ('LibreNMS'). This clearly distinguishes it from sibling tools like port_group_add, port_group_remove, and port_group_list_ports.

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?

The description does not explain when to use this tool versus alternatives such as port_group_add or port_group_remove, nor does it mention prerequisites or exclusions. It only states the action itself, providing no additional routing guidance.

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

port_group_graphPort Group GraphA
Read-onlyIdempotent

Render a traffic graph for one or more ports, by port ID.

Plots every supplied port on the same axes, which makes it useful for comparing members of a LAG. Unlike port_graph this takes numeric port IDs rather than interface names.

NameRequiredDescriptionDefault
widthNoGraph width in pixels.
heightNoGraph height in pixels.
legendNoWhether to render the graph legend.
to_timeNoEnd of the time range, either a relative offset or a Unix timestamp. Defaults to now.
port_idsYesOne or more port IDs to plot on a single graph. Resolve names to IDs with ports_search_field or device_ports.
from_timeNoStart of the time range, either a relative offset such as '-1d', '-6h' or '-1w', or a Unix timestamp. Defaults to the LibreNMS default (-1d).

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 meaningful behavioral context beyond annotations: it plots all supplied ports on the same axes and supports LAG comparison. This is useful but does not fully describe the output format or any rendering details.

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?

Two sentences, front-loaded with the primary action and resource, followed by a clear differentiator from the sibling tool. Every sentence earns its place with no filler or repetition of schema content.

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 read-only graphing tool with six well-documented parameters and clear annotations, the description covers the essential selection and invocation context. The only notable omission is the absence of any statement about what the tool returns or how the rendered graph is delivered, but the phrase 'Render a traffic graph' gives reasonable expectation of the outcome.

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 explains each parameter, including port_ids, time range, width, height, and legend. The description slightly reinforces that port IDs are numeric and that all ports share a single graph, but it does not add substantial parameter-level meaning beyond what the schema already 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 action ('Render a traffic graph') on a specific resource ('one or more ports, by port ID') and immediately distinguishes itself from the closely named sibling port_graph by the input type. There is no ambiguity about 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?

It explicitly names port_graph as the alternative and gives the differentiating condition: this tool takes numeric port IDs rather than interface names. It also gives a concrete use case ('comparing members of a LAG'), so an agent knows when to choose this tool over its siblings.

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

port_group_list_portsPort Group List PortsC
Read-onlyIdempotent

List ports in a port group from LibreNMS.

NameRequiredDescriptionDefault
nameYesPort group name or ID
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 fully covered in structured data. The description adds nothing beyond that โ€“ 'from LibreNMS' is only a source label, with no note on pagination behavior, result scope, or empty-group handling.

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?

A single efficient sentence with the resource front-loaded and zero filler. It is arguably under-specified rather than over-wordy, but nothing in it is wasted.

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?

Annotations cover the safety profile and an output schema exists, so return values need no explanation, and the schema fully documents the inputs. The remaining gap is routing guidance among the many port-related siblings and any indication of pagination limits, which leaves the definition only minimally viable.

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%, with all three parameters (name, limit, offset) documented in the schema itself, including pagination semantics. The description contributes nothing further, so the baseline 3 applies.

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

Purpose4/5

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

Specific verb+resource: 'List ports in a port group' precisely names the operation and scope. It distinguishes itself from nearby siblings like ports_list (all ports) and port_groups_list (groups, not their members) through the 'in a port group' qualifier, though it never names an alternative explicitly.

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?

There is no guidance on when to use this tool versus ports_list, ports_search, port_group_graph, or port_group_assign, all of which touch overlapping port/group data. The agent must infer selection purely from the name.

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

port_group_removePort Group RemoveB

Remove ports from a port group in LibreNMS.

NameRequiredDescriptionDefault
payloadYesPort IDs to remove. Format: {"port_ids": [1, 2, 3]}
port_group_idYesPort group ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, but the description adds no behavioral context beyond the bare action. It does not mention what happens for missing port IDs, whether removal is idempotent, what response to expect, or any prerequisite conditions. It merely restates the mutation.

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 a single clear sentence with no filler. The verb and object are front-loaded, and every word contributes to conveying the tool's purpose.

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?

The schema and output schema cover invocation details, and the description states the core action. However, for a state-changing operation it leaves behavioral expectations and usage boundaries unstated, making it minimally viable but not fully complete.

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 both parameters are already documented, including the expected payload format for port IDs. The description itself adds no parameter-level meaning, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description uses a specific verb and resource, 'Remove ports from a port group', and names the system (LibreNMS). It clearly communicates the operation, though it does not explicitly contrast with related sibling tools like port_group_assign or port_group_add.

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 guidance is provided about when to use this tool versus related alternatives. With siblings such as port_group_assign, port_group_add, and port_group_list_ports present, the agent is left to infer the appropriate selection without any explicit when-to-use or when-not-to-use information.

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

port_groups_listPort Groups ListC
Read-onlyIdempotent

List port groups from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 nothing behavioral beyond the name - no note on pagination defaults, result shape, or empty-result behavior - so it contributes little beyond the structured fields.

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?

A single short sentence that is front-loaded and free of filler. It is efficient, though its brevity tips toward under-specification rather than optimal conciseness.

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?

An output schema exists, so return values need not be explained, and annotations cover the safety profile; the two parameters are fully documented. What is missing is disambiguation from closely named siblings (port_group_list_ports), which an agent needs given the crowded namespace.

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%, with limit and offset fully documented in the schema, so the baseline is 3. The description adds no parameter meaning beyond the schema, leaving it as a pure schema-driven case.

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

Purpose4/5

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

The description names a specific verb (List) and resource (port groups) plus the backing system (LibreNMS), so the agent knows exactly what the tool returns. It does not, however, distinguish this from close siblings such as port_group_list_ports or port_group_add/remove, leaving ambiguity about scope.

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?

There is no guidance on when to use this tool versus alternatives like port_group_list_ports, ports_list, or ports_search. No prerequisites, filters, or context of use are stated, leaving usage entirely to inference.

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

port_ip_infoPort Ip InfoA
Read-onlyIdempotent

Get port IP info from LibreNMS by port ID.

NameRequiredDescriptionDefault
port_idYesPort ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so there is no contradiction. The description adds minimal context (source system and lookup key), but it does not disclose extra behaviors such as error/empty-result handling, auth requirements, or output shape; with annotations covering the safety profile, this is acceptable but not deeply enriched.

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?

A single, front-loaded sentence with no filler. It states the action, resource, source, and parameter in as few words as possible.

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 lookup with a full schema and an output schema present, the description covers everything needed to select and invoke the tool. Return values are specified by the output schema, and safety is covered by annotations.

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% โ€” port_id is described in the schema as 'Port ID.' The description only repeats 'by port ID' and adds no new meaning beyond the schema, so the baseline 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?

The description uses a specific verb ('Get'), a clear resource ('port IP info'), a source system ('LibreNMS'), and the lookup key ('port ID'). This distinguishes it from siblings like port_get or device_ports_get, which target broader port or device data.

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 phrase 'by port ID' implies the tool is for lookups when a port ID is available and IP info is needed, but it does not explicitly state when to prefer it over related port/device tools or mention any exclusions/alternatives.

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

port_security_devicePort Security DeviceA
Read-onlyIdempotent

Get port security configuration for every port on a device.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or device ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already establish read-only, idempotent, non-destructive behavior, so the description need not restate that. It adds scope but does not disclose that 'every port' may require paging through limit/offset, which is a meaningful behavioral trait beyond the annotation set.

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?

A single, front-loaded sentence contains the verb, resource, and scope with no filler or redundancy. Every word earns its place.

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 retrieval with a required hostname, paging params, annotations, and an output schema, the description is nearly complete. The only missing contextual piece is explicit guidance on the all-ports versus pagination relationship.

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 limit, offset, and hostname are already documented. The description adds no additional parameter detail beyond mapping 'a device' to hostname, matching the baseline for 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?

Description uses a specific verb ('Get'), names the resource ('port security configuration'), and defines the scope as 'every port on a device'. This distinguishes it from siblings like port_security_port or port_security_list without needing schema inspection.

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 clearly implies the tool is for per-device, all-port port-security retrieval. It does not explicitly say 'use port_security_port for a single port' or list when-not conditions, so it falls short of full alternative routing.

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

port_security_listPort Security ListA
Read-onlyIdempotent

List port security configuration across all devices.

Covers switchport port-security state such as the maximum number of learned MAC addresses, violation mode and current status.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful context about the fields covered (max MACs, violation mode, status), but does not disclose pagination behavior or potential result size. Since annotations carry the main safety burden, a 3 is appropriate.

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 fluff, the action is front-loaded, and the coverage details are listed compactly. Every sentence earns its place.

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 list tool with an output schema and safety annotations, the description sufficiently explains scope and covered fields. Pagination is not explicitly mentioned, but the limit/offset parameters make it inferable, 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 description coverage is 100% for both parameters (limit and offset), so the schema fully documents their meaning. The description adds no additional parameter semantics, matching the baseline for fully covered schemas.

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

Purpose4/5

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

The description states a specific verb ('List'), a resource ('port security configuration'), and a scope ('across all devices'), which helps distinguish it from per-device or per-port alternatives. However, it does not explicitly name sibling tools like port_security_device or port_security_port, so differentiation is implicit rather than direct.

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 phrase 'across all devices' implies that this tool is for global listing, while per-device or per-port siblings exist as alternatives. But the description provides no explicit when-to-use or when-not-to-use guidance, leaving the decision to inference.

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

port_security_portPort Security PortA
Read-onlyIdempotent

Get port security configuration for a single port.

NameRequiredDescriptionDefault
port_idYesPort ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral details beyond the read-only 'Get' operation, but no contradiction exists and the tool is simple enough that this is acceptable.

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 a single compact sentence that immediately states the action, resource, and scope. There is no redundant wording or filler.

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 one well-documented parameter, annotations covering the read-only behavior, and an output schema present, the description is sufficient for an agent to correctly invoke this tool. No major contextual gaps remain.

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%: the single required parameter port_id is documented as 'Port ID' with a minimum of 1. The description does not add further parameter context, but the schema already carries the necessary meaning, so the baseline 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?

The description states a specific verb ('Get'), a specific resource ('port security configuration'), and a clear scope ('for a single port'). This distinguishes it from sibling tools like port_security_list and port_security_device, which operate at list or device level.

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 phrase 'for a single port' implies this tool is for retrieving one port's security configuration rather than a list of entries. However, it does not explicitly mention when to prefer a sibling tool such as port_security_list or port_security_device, leaving the routing largely implicit.

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

ports_listPorts ListC
Read-onlyIdempotent

Get all ports from LibreNMS with optional filters.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
queryNoQuery parameters for filtering ports: - columns: Comma-separated list of fields to return (e.g., "port_id,ifName,ifAlias") - device_id: Only return ports of this device (device ID or hostname) Available columns: port_id, device_id, ifDescr, ifName, ifAlias, ifType, ifSpeed, ifOperStatus, ifAdminStatus, etc.
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 nothing beyond that profile โ€” no note on pagination behavior, result volume, or default scoping โ€” so it contributes no behavioral context of its own.

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?

A single compact sentence with no filler and the core action front-loaded. It is efficient, though its brevity is partly under-specification rather than disciplined trimming.

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?

An output schema exists, so return values need not be explained, and annotations cover safety. Still, for a list tool sitting among many port-listing siblings, the description omits the scoping and selection guidance an agent needs to pick it correctly, making it only minimally adequate.

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 limit, offset, and the query object are fully documented in the schema itself, including the available columns and device_id filter. The description adds no parameter meaning beyond that, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb (get) and resource (ports) plus the source system (LibreNMS), so the operation is unambiguous. However, it does nothing to distinguish itself from several siblings that also enumerate ports (device_ports, device_ports_get, ports_search), leaving an agent to guess which list endpoint applies.

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?

The phrase 'with optional filters' hints that filtering is possible but never says when to choose this tool over ports_search, device_ports, or port_get. No prerequisites, scope constraints, or exclusion conditions are given.

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

ports_search_fieldPorts Search FieldC
Read-onlyIdempotent

Search ports in LibreNMS by specific field.

NameRequiredDescriptionDefault
fieldYesField to search: ifAlias, ifDescr, ifName, ifType, etc.
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination
searchYesSearch term. "0" is not supported: LibreNMS treats it as empty.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/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 fully covered. The description adds nothing beyond that: no note on pagination behavior despite limit/offset, no result-cap or rate-limit context, and no hint about how field selection affects matching.

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?

A single front-loaded sentence with zero filler. Its brevity is efficient rather than padded, though the terseness is what creates the gaps captured in the other dimensions.

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

Completeness2/5

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

An output schema exists so return values need not be explained, and the schema documents all four parameters. What is missing is the routing context: with three near-identical port search siblings, an agent needs at least a clause explaining when this field-based search is the right 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%, including the useful note that search term "0" is treated as empty and the field examples, so the schema carries the full burden. The description contributes no additional parameter meaning, which is the expected baseline of 3 when the schema is complete.

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

Purpose3/5

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

The description states a verb and resource ("Search ports") and adds a scope hint ("by specific field"), which is more than a tautology. However, it does not distinguish this tool from the closely related siblings ports_search and ports_search_mac, leaving the agent to guess which search variant applies.

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?

There is no when-to-use guidance, no prerequisites, and no mention of the alternative search tools (ports_search, ports_search_mac) that clearly overlap. The agent must infer the choice purely from the name and the parameter list.

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

ports_search_macPorts Search MacA
Read-onlyIdempotent

Find the switch ports where a MAC address was learned (forwarding table).

This searches LibreNMS's FDB data, i.e. where a host's MAC appears on the network, not the ports' own hardware addresses: a port's own MAC is not found unless another device learned it. Results are ordered by how many MACs each port has learned, so the access port the host is plugged into usually comes first.

NameRequiredDescriptionDefault
macYesMAC address of a host to locate (looked up in the forwarding tables, not ports' own MACs). Accepts aa:bb:cc:dd:ee:ff, aa-bb-cc-dd-ee-ff, aabb.ccdd.eeff, or aabbccddeeff
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly=true, idempotent=true, destructive=false, so safety is covered. The description goes further by disclosing a genuine behavioral trait: results are ordered by how many MACs each port has learned, so the access port usually ranks first. That ordering insight is not derivable from annotations or schema.

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 core action and the key caveat are front-loaded in the first sentence, with supporting detail after. It is mildly verbose but each sentence contributes useful disambiguation or ordering context, so nothing is wasted.

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?

With an output schema present and full parameter coverage, the description does not need to explain return values. It covers the central gotcha and ordering behavior, leaving only the sibling-routing question (vs fdb_lookup/port_fdb) unaddressed.

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 mac, limit, and offset with accepted formats. The description reinforces the 'not ports' own MACs' caveat but adds no new syntax or constraint beyond the schema, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb+resource (find switch ports where a MAC was learned) and names the underlying data source (LibreNMS FDB). It sharply distinguishes itself from the intuitive misreading (ports' own hardware MACs), though it does not explicitly differentiate itself from nearby siblings like fdb_lookup or port_fdb.

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?

Usage is implied by the framing 'where a host's MAC appears on the network', which tells the agent the lookup context. However, there is no explicit when-to-use/when-not and no pointer to alternatives such as fdb_lookup or device_fdb, so routing relies on inference.

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

port_transceiverPort TransceiverA
Read-onlyIdempotent

Get port transceiver info from LibreNMS by port ID.

NameRequiredDescriptionDefault
port_idYesPort ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

The description states a read operation ('Get'), which aligns with the annotations readOnlyHint=true, idempotentHint=true, and destructiveHint=false. It does not add behavioral context beyond that, such as error behavior or data source limitations, but the annotations already cover the safety profile and no contradiction exists.

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 a single, focused sentence that front-loads the main action and resource. Every word contributes meaning, and there is no redundancy or unnecessary detail.

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 simple, read-only getter with one required parameter, an output schema, and clear annotations, this description provides all necessary context for an agent to select and invoke the tool. No critical information 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 single parameter port_id is fully described in the schema ('Port ID.'), and the description reiterates that the lookup is by port ID. Since schema description coverage is 100%, the description does not need to add much parameter-level detail beyond what is already provided.

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 identifies the action (get), the resource (port transceiver info), the source system (LibreNMS), and the required input (port ID). It is specific enough to distinguish from sibling tools like port_get or ports_list, which target different port-related resources.

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 implies the tool is used when port transceiver information is needed for a specific port ID. However, it does not explicitly state when to prefer this over alternatives or mention any exclusions or fallback tools, so usage guidance is only implicit.

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

routing_ip_addressesRouting Ip AddressesB
Read-onlyIdempotent

List all IP addresses from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/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 safety is fully covered. The description adds only 'List all', which hints at a potentially unbounded result set but says nothing about pagination behavior or volume beyond what the schema's limit/offset already imply.

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?

A single short sentence with no filler and the purpose front-loaded. It is efficient, though its brevity comes at the cost of the missing scope information noted elsewhere.

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?

An output schema exists and annotations cover the safety profile, so return values and side effects need no elaboration. However, for a listing tool surrounded by address-adjacent siblings, the description leaves the routing-table scope and disambiguation unaddressed.

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%, with limit and offset fully documented in the schema itself. The description contributes no additional parameter meaning, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb and resource: 'List all IP addresses'. The LibreNMS qualifier gives source context, but the description does not distinguish this from sibling tools that also surface IP data such as arp_search or port_ip_info.

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 indication of when to use this versus arp_search, port_ip_info, or other address-related siblings. With ~90 sibling tools, the absence of any routing context or disambiguation is a real gap for selection.

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

sensors_listSensors ListA
Read-onlyIdempotent

List all sensors across all devices.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the cross-device scoping constraint, which is useful context, but discloses no additional behavior such as pagination size limits or response ordering.

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?

A single sentence with no filler, front-loading the action, resource, and scope. Every word contributes to meaning.

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 simple listing tool, the description, annotations, and fully documented parameters are sufficient. The output schema is present, so return-value detail does not need to be repeated in the description.

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 both limit and offset are already documented in the input schema. The description adds no new parameter meaning, 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?

States a specific verb ('List'), resource ('sensors'), and scope ('across all devices'), clearly identifying it as a broad enumeration tool. It is readily distinguishable from sibling tools like health_sensor_get, which focus on individual sensors.

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 phrase 'across all devices' implies this is the right tool for unfiltered sensor enumeration, but the description gives no explicit guidance on when to prefer it over alternatives such as health_sensor_get or alerts_get. Usage context is implied rather than stated.

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

service_addService AddC
Destructive

Add a service for a device in LibreNMS.

NameRequiredDescriptionDefault
payloadYesService monitoring payload: - type (required): Service check type (e.g., "http", "https", "dns", "ping", "smtp", "ssh", "tcp", "icmp") - ip (optional): Service IP address or hostname to check (defaults to the device's poller target: its overwrite IP if set, else its hostname) - desc (optional): Service description - param (optional): Check parameters/arguments (service-specific) - ignore (optional): Exclude from alerts (0/1) Example: {"type": "http", "desc": "Web Server", "param": "-p 8080 -u /health"}
hostnameYesDevice hostname or ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=true, so the safety profile is partly covered, but the description adds nothing beyond that. In particular it never warns that the operation is non-idempotent (duplicate calls may create duplicate service checks) or that it mutates device monitoring state, which is the most decision-relevant behavior here.

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?

A single front-loaded sentence with no filler or redundancy. It is efficiently written, though its brevity is achieved by omitting information rather than by tight editing of substantive content.

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

Completeness2/5

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

For a mutating, explicitly destructive, non-idempotent tool with a nested payload object, one sentence is not enough. The output schema removes the need to explain return values, but nothing covers duplicate handling, required device preconditions, or what 'destructive' means in this context.

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 nested payload schema is unusually rich, enumerating type/ip/desc/param/ignore and supplying a concrete JSON example. The description text itself contributes no parameter meaning, so the baseline of 3 applies โ€” the schema is doing all the work.

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

Purpose4/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 ('Add a service') and scopes it to 'a device in LibreNMS', which is enough to distinguish it from read-oriented siblings like services_list or services_for_device. However, it never contrasts itself with service_edit or service_delete, so the agent must infer the create-vs-modify boundary from the name alone.

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?

There is no when-to-use guidance, no stated prerequisites (e.g. that the device must already exist), and no routing to alternatives such as service_edit for an already-monitored service. The purpose implies it creates a new check, but nothing in the text helps the agent choose between this and its siblings.

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

service_deleteService DeleteA
DestructiveIdempotent

Delete a service from LibreNMS by service ID.

NameRequiredDescriptionDefault
service_idYesService ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

The description does not contradict the annotations and the destructive nature is reflected by destructiveHint=true and idempotentHint=true. However, it adds no extra behavioral context beyond the schema and annotations, such as permanence, cascading effects, or failure 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 a single, front-loaded sentence with no filler. Every word contributes to understanding the tool's action and target.

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 destructive delete operation with full schema coverage and a provided output schema, the description is complete. The annotations cover destructive and idempotence traits, and nothing essential for correct invocation 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 description coverage is 100% and the single parameter service_id is already documented as an integer. The description only restates the selection mechanism ('by service ID') rather than adding meaning such as where to find the ID or how it is validated.

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 uses a specific verb and resource: 'Delete a service from LibreNMS by service ID.' It clearly identifies the action and distinguishes this from sibling tools like service_add and service_edit.

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 intended use is implied by the action verb: call this when deleting a service. However, the description does not explicitly mention alternatives (e.g., service_edit for modifications, service_add for creation) 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.

service_editService EditA
DestructiveIdempotent

Edit a service in LibreNMS by service ID.

NameRequiredDescriptionDefault
payloadYesService patchable fields: - service_ip: Service IP address - service_desc: Service description - service_param: Service check parameters - service_disabled: 0/1 to enable/disable - service_ignore: 0/1 to ignore in alerts
service_idYesService ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

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

The description adds no behavioral context beyond what the annotations already provide. The mutating and destructive nature is encoded by readOnlyHint=false and destructiveHint=true, while the description simply restates 'Edit'. It does not explain whether the payload replaces the full service definition, whether edits are reversible, or what side effects may occur.

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?

One compact sentence states the action, the resource, and the identifying parameter with no filler. It is front-loaded with the verb and immediately tells the agent what the tool does.

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 CRUD edit operation, the combination of a clear one-sentence description, a fully documented input schema, an output schema, and safety annotations is largely sufficient. A bit more context about destructive overwrite behavior would improve it, but nothing critical is missing for invoking 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 input schema already documents service_id and payload fields clearly. The description adds no extra meaning about parameter formats, constraints, or payload usage, but it does not need to because the schema carries this information.

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 uses a specific verb ('Edit'), a clear resource ('service'), and the lookup key ('service ID'), so an agent can immediately tell this is an update operation. It distinguishes itself from siblings like service_add, service_delete, and services_list without needing to open their schemas.

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 implies the tool is for modifying an existing service, and 'by service ID' signals that the service must already exist. However, it does not explicitly name alternatives or state when not to use it, such as pointing to service_add for creation or service_delete for removal. Usage is clear but mostly implied rather than stated.

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

services_for_deviceServices For DeviceB
Read-onlyIdempotent

Get services for a device from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
stateNoFilter by state: 0=Ok, 1=Warning, 2=Critical
offsetNoNumber of results to skip (offset) for pagination
hostnameYesDevice hostname or ID
service_typeNoFilter by service type (SQL LIKE pattern)

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate basic safety behavior. However, the description adds no behavioral context beyond the schema and annotationsโ€”it fails to mention filtering semantics, pagination, or any operational side effects. The bar is lower with annotations present, but the description still contributes nothing behavioral.

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 a single tightly-worded sentence that directly states the tool's purpose with no filler. It is appropriately sized for the tool's complexity given that the schema and output schema carry the technical details, though it could have added sibling differentiation without harming conciseness.

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?

With rich annotations, a fully described input schema, and an output schema present, the overall context is largely complete: safety profile, all parameters, and return structure are available. The description supplies the core purpose and device scoping; only explicit guidance about when to choose this over siblings is missing, which is a minor gap given the sibling list.

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 input schema fully documents all five parameters including the state filter meanings and service_type LIKE behavior. The description itself adds no parameter-level detail, which aligns with the baseline of 3 for high-coverage schemas.

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

Purpose4/5

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

The description 'Get services for a device from LibreNMS' clearly states a specific operation and resource scope, distinguishing it from generic service tools like services_list by requiring a device context. However, it does not explicitly name any sibling tool or contrast its scope, so it stops short of a 5.

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

Usage Guidelines3/5

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

The phrase 'for a device' implicitly signals that this tool should be used when services need to be scoped to one device, hinting at a difference from services_list. There is no explicit when-to-use guidance, alternative mention, or exclusion, so the guidance is only implied.

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

services_listServices ListA
Read-onlyIdempotent

List all services from LibreNMS with optional filters.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
stateNoFilter by state: 0=Ok, 1=Warning, 2=Critical
offsetNoNumber of results to skip (offset) for pagination
service_typeNoFilter by service type (SQL LIKE pattern)

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/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 the scope ('all services') but otherwise does not disclose additional behavioral details such as default pagination or filter behavior beyond what the schema already states.

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?

A single sentence that states the action, resource, and filtering capability with no wasted words. The essential information is front-loaded and immediately useful to an agent.

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 list tool with full schema coverage, annotations, and an output schema, the description is nearly complete. It could add a note about pagination defaults or the relationship to 'services_for_device', but nothing essential is missing 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.

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents all four parameters and their meanings. The description only says 'optional filters' without elaborating, which is acceptable given the schema carries the parameter-level detail.

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

Purpose4/5

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

The description uses a specific verb ('List') and resource ('all services from LibreNMS'), making the core action unmistakable. It does not explicitly differentiate from the sibling 'services_for_device', but 'all services' strongly implies a global listing rather than a per-device one.

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 implies this is the tool for listing all services and optionally filtering them, which is reasonably clear. However, it does not explicitly address when to prefer it over alternatives like 'services_for_device' or when not to use it, leaving some routing to inference.

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

switching_vlansSwitching VlansC
Read-onlyIdempotent

List all VLANs from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/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 fully covered by structured data. The description adds only the data source; it says nothing about scope (all devices vs. one), auth requirements, or rate limits, so it contributes little 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.

Conciseness4/5

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

A single front-loaded sentence with zero filler, which is appropriate for a simple list operation. It is arguably too terse for the ambiguity it leaves, but there is no wasted text.

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?

An output schema exists and annotations cover safety, so return values and side effects need no explanation. The remaining gap is scope: with device_vlans present in the sibling set, the description should state whether this returns VLANs across all devices or something narrower.

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% with only two self-documenting pagination parameters (limit, offset), so the schema does the heavy lifting and the baseline of 3 applies. The description adds no additional meaning about pagination defaults or limit ranges.

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

Purpose4/5

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

The description gives a clear verb+resource ("List all VLANs") plus the data source ("from LibreNMS"), so an agent knows exactly what object is returned. However, it does not differentiate itself from the sibling device_vlans, nor does it clarify whether the listing is global or implicitly scoped, which is the one ambiguity that matters here.

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?

There is no when-to-use guidance, no mention of the closely related device_vlans sibling, and no stated prerequisites or pagination expectations. The agent is left to infer that this is the global counterpart to the per-device VLAN tool.

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

system_infoSystem InfoC
Read-onlyIdempotent

Get system info from LibreNMS.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.5/5.0
Behavior2/5

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

The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond that, such as authentication requirements, rate limits, or what the returned 'system info' includes. It is not contradictory, but it contributes nothing 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.

Conciseness4/5

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

The description is a single short sentence with no filler or repetition. It is front-loaded and structurally clean, though its brevity reflects under-specification rather than efficient communication.

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

Completeness2/5

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

The tool has an output schema, so return values need not be detailed in the description. However, the description remains too vague for a zero-parameter tool surrounded by many similar system-information siblings; it does not explain what 'system info' means or help an agent choose it 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 tool has zero parameters, which is the baseline for a 4 under the rubric. The description appropriately omits parameter details because there are none to describe.

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

Purpose2/5

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

The description restates the tool name and title almost verbatim: 'Get system info from LibreNMS.' It does not specify what kind of system information is returned, and it fails to distinguish this tool from many siblings that also return system-level data (health_list, sensors_list, inventory_device, etc.).

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?

There is no guidance on when to use this tool instead of alternatives such as health_list, inventory_device, or sensors_list. The description provides no context, prerequisites, or exclusion criteria.

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

vrf_listVrf ListB
Read-onlyIdempotent

List all VRF (Virtual Routing and Forwarding) instances from LibreNMS.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return
offsetNoNumber of results to skip (offset) for pagination

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/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 fully covered by structured data. The description adds no behavioral context beyond that โ€” it says nothing about pagination behavior, result volume, permissions, or scope.

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?

A single front-loaded sentence with no filler; it communicates the action, the resource, and the source system without waste.

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?

With an output schema present and annotations carrying the safety profile, the description need not explain return values. It is essentially complete for a simple read-only list tool, though a note on result scoping or pagination expectations would close the remaining gap.

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%, with both limit and offset fully documented in the schema, so the baseline is 3. The description contributes no additional parameter meaning such as default page size or recommended pagination patterns.

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

Purpose4/5

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

States a specific verb (List) and a specific resource (VRF instances) plus the data source (LibreNMS). The resource is distinct from every sibling tool, so it is easy to route to, though the description never explicitly contrasts itself with related network-listing tools such as switching_vlans or ospf_list.

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?

There is no guidance on when to use this tool versus alternatives, and no prerequisites, scope, or filtering conditions are mentioned. The agent must infer the usage context entirely from the tool name.

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. 32 tool updatesv1.12.0
    • Changedalert_rule_add1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Alert rule payload fields:\n- name (required): Rule name\n- builder (required): Rule builder JSON with conditions\n- devices (required): Array of device IDs or [-1] for all devices\n- severity (required): ok, warning, critical\n- count (optional): Trigger threshold count (default: 1)\n- delay (optional): Delay before alerting in seconds\n- interval (optional): Re-alert interval in seconds\n- mute (optional): Mute alerts (true/false)\n- invert (optional): Invert rule logic (true/false)\n- notes (optional): Rule notes\n- disabled (optional): Disable rule (0/1)\n\nExample:\n{\"name\": \"Device Down\", \"severity\": \"critical\", \"devices\": [-1], \"builder\": {\"condition\": \"AND\", \"rules\": [...]}}"New value: +"Alert rule payload fields:\n- name (required): Rule name\n- builder (required): Rule builder JSON with conditions\n- devices (required): Array of device IDs or [-1] for all devices\n- severity (required): ok, warning, critical\n- count (optional): Trigger threshold count (default: 1)\n- delay (optional): Delay before alerting in seconds\n- interval (optional): Re-alert interval in seconds\n- mute (optional): Mute alerts (true/false)\n- invert (optional): Invert rule logic (true/false)\n- notes (optional): Rule notes\n- disabled (optional): Disable rule (0/1)\n\nDo not include rule_id: LibreNMS would edit that rule instead of adding one.\n\nExample:\n{\"name\": \"Device Down\", \"severity\": \"critical\", \"devices\": [-1], \"builder\": {\"condition\": \"AND\", \"rules\": [...]}}"
    • Changedalert_rule_edit1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Alert rule edit payload (must include rule_id field):\n- rule_id (required): Rule ID to edit\n- name: Rule name\n- builder: Rule builder JSON with conditions\n- devices: Array of device IDs or [-1] for all devices\n- severity: ok, warning, critical\n- count: Trigger threshold count\n- delay: Delay before alerting in seconds\n- interval: Re-alert interval in seconds\n- mute: Mute alerts (true/false)\n- invert: Invert rule logic (true/false)\n- notes: Rule notes\n- disabled: Disable rule (0/1)"New value: +"Alert rule edit payload (must include rule_id field):\n- rule_id (required): Integer rule ID to edit. Without it LibreNMS would create a new\n  rule, so the tool refuses the call.\n- name: Rule name\n- builder: Rule builder JSON with conditions\n- devices: Array of device IDs or [-1] for all devices\n- severity: ok, warning, critical\n- count: Trigger threshold count\n- delay: Delay before alerting in seconds\n- interval: Re-alert interval in seconds\n- mute: Mute alerts (true/false)\n- invert: Invert rule logic (true/false)\n- notes: Rule notes\n- disabled: Disable rule (0/1)"
    • Changedalert_template_create1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Alert template payload fields:\n- name (required): Template name\n- template (required): Template body (Laravel Blade syntax)\n- title (required): Alert title template\n- title_rec (required): Recovery title template\n- alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none)\n\nLibreNMS renders title, title_rec and template against test data and reads\nalert_rules unconditionally, so all five fields must be present.\n\nExample:\n{\"name\": \"Custom Alert\", \"template\": \"{{ $alert->title }}\\nSeverity: {{ $alert->severity }}\", \"title\": \"Alert: {{ $alert->title }}\", \"title_rec\": \"Recovered: {{ $alert->title }}\", \"alert_rules\": []}"New value: +"Alert template payload fields:\n- name (required): Template name\n- template (required): Template body (Laravel Blade syntax)\n- title (required): Alert title template\n- title_rec (required): Recovery title template\n- alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none)\n\nLibreNMS renders title, title_rec and template against test data and reads\nalert_rules unconditionally, so all five fields must be present. Do not\ninclude template_id: LibreNMS would edit that template instead of creating one.\n\nExample:\n{\"name\": \"Custom Alert\", \"template\": \"{{ $alert->title }}\\nSeverity: {{ $alert->severity }}\", \"title\": \"Alert: {{ $alert->title }}\", \"title_rec\": \"Recovered: {{ $alert->title }}\", \"alert_rules\": []}"
    • Changedalert_template_edit1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Alert template edit payload (must include template_id):\n- template_id (required): Template ID to edit. Without it LibreNMS creates a new\n  template instead of editing the existing one.\n- name (required): Template name\n- template (required): Template body (Laravel Blade syntax)\n- title (required): Alert title template\n- title_rec (required): Recovery title template\n- alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none)\n\nLibreNMS replaces the whole template on edit, so resend every field, not just\nthe ones being changed."New value: +"Alert template edit payload (must include template_id):\n- template_id (required): Integer template ID to edit. Without it LibreNMS would create a\n  new template, so the tool refuses the call.\n- name (required): Template name\n- template (required): Template body (Laravel Blade syntax)\n- title (required): Alert title template\n- title_rec (required): Recovery title template\n- alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none)\n\nLibreNMS replaces the whole template on edit, so resend every field, not just\nthe ones being changed."
    • Changedarp_search2 fields changed
      • addedInput schema / properties / device
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Device hostname or ID to list entries for. Required with query \"all\" and only valid with it; any other combination returns an error."
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Search string for ARP entries. Supports IP address, MAC address, CIDR notation, or \"all\" (use with device parameter for all entries on a device)"New value: +"Search string for ARP entries. Supports an IPv4 address, MAC address, IPv4 CIDR notation (e.g. 10.0.0.0/24), or \"all\" (requires the device parameter; lists all entries on that device)"
    • Changedbgp_sessions1 field changed
      • changedInput schema / properties / hostname / description
        Previous value: -"Filter by device hostname"New value: +"Filter by device hostname or ID. An unknown device returns an error."
    • Changedbill_graph2 fields changed
      • changedInput schema / properties / graph_type / description
        Previous value: -"Graph type: bits, monthly, hour, or day"New value: +"Graph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month)"
      • addedInput schema / properties / graph_type / enum
        Added value: +[
        +  "bits",
        +  "monthly"
        +]
    • Changedbill_graph_data2 fields changed
      • changedInput schema / properties / graph_type / description
        Previous value: -"Graph type: bits, monthly, hour, or day"New value: +"Graph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month)"
      • addedInput schema / properties / graph_type / enum
        Added value: +[
        +  "bits",
        +  "monthly"
        +]
    • Changedbill_history_graph2 fields changed
      • changedInput schema / properties / graph_type / description
        Previous value: -"Graph type: bits, monthly, hour, or day"New value: +"Graph type for a past billing period: 'bits' (traffic), 'day' or 'hour' (transfer per day or hour)"
      • addedInput schema / properties / graph_type / enum
        Added value: +[
        +  "bits",
        +  "day",
        +  "hour"
        +]
    • Changedbill_history_graph_data2 fields changed
      • changedInput schema / properties / graph_type / description
        Previous value: -"Graph type: bits, monthly, hour, or day"New value: +"Graph type for a past billing period: 'bits' (traffic), 'day' or 'hour' (transfer per day or hour)"
      • addedInput schema / properties / graph_type / enum
        Added value: +[
        +  "bits",
        +  "day",
        +  "hour"
        +]
    • Changeddevicegroup_add_devices1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Device group name"New value: +"Device group name or ID"
    • Changeddevicegroup_delete1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Device group name to delete"New value: +"Device group name or ID to delete"
    • Changeddevicegroup_devices1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Device group name"New value: +"Device group name or ID"
    • Changeddevicegroup_remove_devices1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Device group name"New value: +"Device group name or ID"
    • Changeddevicegroup_set_maintenance1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Device group name"New value: +"Device group name or ID"
    • Changeddevicegroup_update1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Device group name"New value: +"Device group name or ID"
    • Changedlocation_delete1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"Location identifier"New value: +"Location ID or name"
    • Changedlocation_edit1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"Location identifier or name"New value: +"Location ID or name"
    • Changedlocation_get1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"Location identifier or name"New value: +"Location ID or name"
    • Changedlocation_set_maintenance1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"Location identifier or name"New value: +"Location ID or name"
    • Changedlogs_alertlog5 fields changed
      • addedInput schema / properties / hostname / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / hostname / default
        Added value: +null
      • changedInput schema / properties / hostname / description
        Previous value: -"Device hostname or ID"New value: +"Device hostname or ID. Omit for entries from all devices."
      • removedInput schema / properties / hostname / type
        Removed value: -"string"
      • removedInput schema / required
        Removed value: -[
        -  "hostname"
        -]
    • Changedlogs_eventlog5 fields changed
      • addedInput schema / properties / hostname / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / hostname / default
        Added value: +null
      • changedInput schema / properties / hostname / description
        Previous value: -"Device hostname or ID"New value: +"Device hostname or ID. Omit for entries from all devices."
      • removedInput schema / properties / hostname / type
        Removed value: -"string"
      • removedInput schema / required
        Removed value: -[
        -  "hostname"
        -]
    • Changedlogs_syslog5 fields changed
      • addedInput schema / properties / hostname / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / hostname / default
        Added value: +null
      • changedInput schema / properties / hostname / description
        Previous value: -"Device hostname or ID"New value: +"Device hostname or ID. Omit for entries from all devices."
      • removedInput schema / properties / hostname / type
        Removed value: -"string"
      • removedInput schema / required
        Removed value: -[
        -  "hostname"
        -]
    • Changedoxidized_config_search1 field changed
      • changedInput schema / properties / search / description
        Previous value: -"Search string to look for in all stored device configs (e.g. an IP address, interface name, ACL name, or any config keyword)"New value: +"Search string to look for in all stored device configs (e.g. an IP address, interface name, ACL name, or any config keyword). Must not contain '/': LibreNMS cannot route it, so search for a part without it (e.g. '10.0.0.0' instead of '10.0.0.0/24')."
    • Changedoxidized_list1 field changed
      • changedInput schema / properties / hostname / description
        Previous value: -"Filter by device hostname. Optional."New value: +"Filter by device hostname or ID. Optional. An unknown device returns an error."
    • Changedpoller_group_get5 fields changed
      • addedInput schema / properties / poller_group / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / poller_group / default
        Added value: +null
      • changedInput schema / properties / poller_group / description
        Previous value: -"Poller group identifier or 'all'"New value: +"Poller group ID or name. Omit (or pass 'all') to list every poller group; a group literally named 'all' must be fetched by its ID."
      • removedInput schema / properties / poller_group / type
        Removed value: -"string"
      • removedInput schema / required
        Removed value: -[
        -  "poller_group"
        -]
    • Changedport_graph1 field changed
      • changedInput schema / properties / graph_type / description
        Previous value: -"Graph type: 'bits' (traffic), 'upkts' (unicast packets), 'errors', or 'etherlike'"New value: +"Graph type: 'bits' (traffic), 'upkts' (unicast packets), 'nupkts' (non-unicast packets), 'errors', or 'etherlike'. The LibreNMS names ('port_bits', ...) are accepted too."
    • Changedport_group_list_ports1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"Port group name"New value: +"Port group name or ID"
    • Changedports_list1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"Query parameters for filtering ports:\n- columns: Comma-separated list of fields to return (e.g., \"port_id,ifName,ifAlias\")\n- device_id: Filter by device ID\n\nAvailable columns: port_id, device_id, ifDescr, ifName, ifAlias, ifType, ifSpeed, ifOperStatus, ifAdminStatus, etc."New value: +"Query parameters for filtering ports:\n- columns: Comma-separated list of fields to return (e.g., \"port_id,ifName,ifAlias\")\n- device_id: Only return ports of this device (device ID or hostname)\n\nAvailable columns: port_id, device_id, ifDescr, ifName, ifAlias, ifType, ifSpeed, ifOperStatus, ifAdminStatus, etc."
    • Changedports_search_field1 field changed
      • changedInput schema / properties / search / description
        Previous value: -"Search term"New value: +"Search term. \"0\" is not supported: LibreNMS treats it as empty."
    • Changedports_search_mac1 field changed
      • changedInput schema / properties / mac / description
        Previous value: -"MAC address to search. Accepts multiple formats: aa:bb:cc:dd:ee:ff, aa-bb-cc-dd-ee-ff, aabb.ccdd.eeff, or aabbccddeeff"New value: +"MAC address of a host to locate (looked up in the forwarding tables, not ports' own MACs). Accepts aa:bb:cc:dd:ee:ff, aa-bb-cc-dd-ee-ff, aabb.ccdd.eeff, or aabbccddeeff"
    • Changedservice_add1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Service monitoring payload:\n- type (required): Service check type (e.g., \"http\", \"https\", \"dns\", \"ping\", \"smtp\", \"ssh\", \"tcp\", \"icmp\")\n- ip (optional): Service IP address (defaults to device IP)\n- desc (optional): Service description\n- param (optional): Check parameters/arguments (service-specific)\n- ignore (optional): Exclude from alerts (0/1)\n\nExample: {\"type\": \"http\", \"desc\": \"Web Server\", \"param\": \"-p 8080 -u /health\"}"New value: +"Service monitoring payload:\n- type (required): Service check type (e.g., \"http\", \"https\", \"dns\", \"ping\", \"smtp\", \"ssh\", \"tcp\", \"icmp\")\n- ip (optional): Service IP address or hostname to check (defaults to the device's poller target: its overwrite IP if set, else its hostname)\n- desc (optional): Service description\n- param (optional): Check parameters/arguments (service-specific)\n- ignore (optional): Exclude from alerts (0/1)\n\nExample: {\"type\": \"http\", \"desc\": \"Web Server\", \"param\": \"-p 8080 -u /health\"}"
  2. 1 tool updatev1.11.3
    • Changeddevice_update1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Patchable device fields:\n- notes: Device notes/comments\n- purpose: Device purpose description\n- override_sysLocation: true/false to override SNMP location\n- location_id: Location ID to assign\n- poller_group: Poller group ID\n- ignore: 0/1 to ignore device in alerts\n- disabled: 0/1 to disable polling\n- snmp_disable: 0/1 to disable SNMP polling\n- display: Custom display name\n- type: Device type classification"New value: +"Patchable device fields:\n- notes: Device notes/comments\n- purpose: Device purpose description\n- override_sysLocation: true/false to override SNMP location\n- location_id: Location ID to assign\n- poller_group: Poller group ID\n- ignore: 0/1 to ignore device in alerts\n- disabled: 0/1 to disable polling\n- snmp_disable: 0/1 to disable SNMP polling\n- display_template: Custom display name template (LibreNMS >= 26.5)\n- display: Custom display name (LibreNMS < 26.5 only; read-only since 26.5, use display_template)\n- type: Device type classification"
  3. 6 tool updatesv1.11.1
    • Changedalert_template_create1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Alert template payload fields:\n- name (required): Template name\n- template (required): Template body (Laravel Blade syntax)\n- title (optional): Alert title template\n- title_rec (optional): Recovery title template\n- rules (optional): Array of alert rule IDs to associate with this template\n\nExample:\n{\"name\": \"Custom Alert\", \"template\": \"{{ $alert->title }}\\nSeverity: {{ $alert->severity }}\", \"title\": \"Alert: {{ $alert->title }}\"}"New value: +"Alert template payload fields:\n- name (required): Template name\n- template (required): Template body (Laravel Blade syntax)\n- title (required): Alert title template\n- title_rec (required): Recovery title template\n- alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none)\n\nLibreNMS renders title, title_rec and template against test data and reads\nalert_rules unconditionally, so all five fields must be present.\n\nExample:\n{\"name\": \"Custom Alert\", \"template\": \"{{ $alert->title }}\\nSeverity: {{ $alert->severity }}\", \"title\": \"Alert: {{ $alert->title }}\", \"title_rec\": \"Recovered: {{ $alert->title }}\", \"alert_rules\": []}"
    • Removedalert_template_delete
    • Changedalert_template_edit1 field changed
      • changedInput schema / properties / payload / description
        Previous value: -"Alert template edit payload (must include id field):\n- id (required): Template ID to edit\n- name: Template name\n- template: Template body (Laravel Blade syntax)\n- title: Alert title template\n- title_rec: Recovery title template\n- rules: Array of alert rule IDs to associate with this template"New value: +"Alert template edit payload (must include template_id):\n- template_id (required): Template ID to edit. Without it LibreNMS creates a new\n  template instead of editing the existing one.\n- name (required): Template name\n- template (required): Template body (Laravel Blade syntax)\n- title (required): Alert title template\n- title_rec (required): Recovery title template\n- alert_rules (required): Array of alert rule IDs to associate with this template (use [] for none)\n\nLibreNMS replaces the whole template on edit, so resend every field, not just\nthe ones being changed."
    • Changedbill_graph1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedbill_history_graph1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Changedlocation_get1 field changed
      • changedInput schema / properties / location / description
        Previous value: -"Location identifier."New value: +"Location identifier or name"
  4. 11 tool updatesv1.11.0
    • Addeddevice_fdb
    • Addeddevice_graph
    • Addeddevice_graphs_list
    • Addeddevice_nac
    • Addednac_list
    • Addedport_fdb
    • Addedport_graph
    • Addedport_group_graph
    • Addedport_security_device
    • Addedport_security_list
    • Addedport_security_port
  5. 40 tool updatesv1.10.3
    • Changedalert_rules_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedalert_templates_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedalerts_get4 fields changed
      • changedInput schema / properties / alert_rule / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / state / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedarp_search2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedbgp_sessions5 fields changed
      • changedInput schema / properties / asn / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / bgp_family / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / remote_asn / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedbill_history2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedbills_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddevice_links2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddevice_outages2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddevice_ports2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddevice_vlans2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddevicegroup_devices2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddevicegroups_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeddevices_list3 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Query parameters for filtering devices. Examples:\n- {\"type\": \"hostname\", \"query\": \"router\"} - search by hostname substring\n- {\"type\": \"os\", \"query\": \"linux\"} - filter by operating system\n- {\"type\": \"location\", \"query\": \"datacenter\"} - filter by location\n- {\"type\": \"up\"} or {\"type\": \"down\"} - filter by status\n- {\"limit\": 50} - limit number of results\n- {\"order\": \"hostname ASC\"} - sort results\n\nValid type values: all, active, ignored, up, down, disabled, os, mac, ipv4, ipv6, location, location_id, hostname, sysName, display, device_id, type, serial, version, hardware, features"New value: +"Query parameters for filtering devices. Examples:\n- {\"type\": \"hostname\", \"query\": \"router\"} - search by hostname substring\n- {\"type\": \"os\", \"query\": \"linux\"} - filter by operating system\n- {\"type\": \"location\", \"query\": \"datacenter\"} - filter by location\n- {\"type\": \"up\"} or {\"type\": \"down\"} - filter by status\n- {\"order\": \"hostname ASC\"} - sort results\n\nValid type values: all, active, ignored, up, down, disabled, os, mac, ipv4, ipv6, location, location_id, hostname, sysName, display, device_id, type, serial, version, hardware, features"
    • Changedhealth_by_type2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedhealth_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedinventory_device3 fields changed
      • changedInput schema / properties / ent_physical_contained_in / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedinventory_device_flat2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedlocations_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedlogs_alertlog9 fields changed
      • removedInput schema / properties / limit / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / limit / default
        Previous value: -nullNew value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / limit / type
        Added value: +"integer"
      • removedInput schema / properties / start / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / start / default
        Previous value: -nullNew value: +0
      • changedInput schema / properties / start / description
        Previous value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination"
      • addedInput schema / properties / start / minimum
        Added value: +0
      • addedInput schema / properties / start / type
        Added value: +"integer"
    • Changedlogs_authlog9 fields changed
      • removedInput schema / properties / limit / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / limit / default
        Previous value: -nullNew value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / limit / type
        Added value: +"integer"
      • removedInput schema / properties / start / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / start / default
        Previous value: -nullNew value: +0
      • changedInput schema / properties / start / description
        Previous value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination"
      • addedInput schema / properties / start / minimum
        Added value: +0
      • addedInput schema / properties / start / type
        Added value: +"integer"
    • Changedlogs_eventlog9 fields changed
      • removedInput schema / properties / limit / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / limit / default
        Previous value: -nullNew value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / limit / type
        Added value: +"integer"
      • removedInput schema / properties / start / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / start / default
        Previous value: -nullNew value: +0
      • changedInput schema / properties / start / description
        Previous value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination"
      • addedInput schema / properties / start / minimum
        Added value: +0
      • addedInput schema / properties / start / type
        Added value: +"integer"
    • Changedlogs_syslog9 fields changed
      • removedInput schema / properties / limit / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / limit / default
        Previous value: -nullNew value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / limit / type
        Added value: +"integer"
      • removedInput schema / properties / start / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / start / default
        Previous value: -nullNew value: +0
      • changedInput schema / properties / start / description
        Previous value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination"
      • addedInput schema / properties / start / minimum
        Added value: +0
      • addedInput schema / properties / start / type
        Added value: +"integer"
    • Changedospf_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedospf_ports2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedoxidized_config_search2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedoxidized_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedport_group_list_ports2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedport_groups_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedports_list3 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Query parameters for filtering ports:\n- columns: Comma-separated list of fields to return (e.g., \"port_id,ifName,ifAlias\")\n- device_id: Filter by device ID\n- limit: Maximum number of results\n\nAvailable columns: port_id, device_id, ifDescr, ifName, ifAlias, ifType, ifSpeed, ifOperStatus, ifAdminStatus, etc."New value: +"Query parameters for filtering ports:\n- columns: Comma-separated list of fields to return (e.g., \"port_id,ifName,ifAlias\")\n- device_id: Filter by device ID\n\nAvailable columns: port_id, device_id, ifDescr, ifName, ifAlias, ifType, ifSpeed, ifOperStatus, ifAdminStatus, etc."
    • Changedports_search2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedports_search_field2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedports_search_mac2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedrouting_ip_addresses2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedsensors_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedservices_for_device3 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / state / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedservices_list3 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / state / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedswitching_links2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedswitching_vlans2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedvrf_list2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum number of results to return",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of results to skip (offset) for pagination",
        +  "minimum": 0,
        +  "type": "integer"
        +}
  6. 100 tool updatesv1.9.0
    • First observedalert_acknowledge
    • First observedalert_get_by_id
    • First observedalert_rule_add
    • First observedalert_rule_delete
    • First observedalert_rule_edit
    • First observedalert_rule_get
    • First observedalert_rules_list
    • First observedalert_template_create
    • First observedalert_template_delete
    • First observedalert_template_edit
    • First observedalert_template_get
    • First observedalert_templates_list
    • First observedalert_unmute
    • First observedalerts_get
    • First observedarp_search
    • First observedbgp_session_edit
    • First observedbgp_session_get
    • First observedbgp_sessions
    • First observedbill_create_or_update
    • First observedbill_delete
    • First observedbill_get
    • First observedbill_graph
    • First observedbill_graph_data
    • First observedbill_history
    • First observedbill_history_graph
    • First observedbill_history_graph_data
    • First observedbills_list
    • First observeddevice_add
    • First observeddevice_availability
    • First observeddevice_delete
    • First observeddevice_discover
    • First observeddevice_eventlog_add
    • First observeddevice_get
    • First observeddevice_links
    • First observeddevice_maintenance_status
    • First observeddevice_outages
    • First observeddevice_ports
    • First observeddevice_ports_get
    • First observeddevice_rename
    • First observeddevice_set_maintenance
    • First observeddevice_update
    • First observeddevice_vlans
    • First observeddevicegroup_add
    • First observeddevicegroup_add_devices
    • First observeddevicegroup_delete
    • First observeddevicegroup_devices
    • First observeddevicegroup_remove_devices
    • First observeddevicegroup_set_maintenance
    • First observeddevicegroup_update
    • First observeddevicegroups_list
    • First observeddevices_list
    • First observedfdb_lookup
    • First observedhealth_by_type
    • First observedhealth_list
    • First observedhealth_sensor_get
    • First observedinventory_device
    • First observedinventory_device_flat
    • First observedlocation_add
    • First observedlocation_delete
    • First observedlocation_edit
    • First observedlocation_get
    • First observedlocation_set_maintenance
    • First observedlocations_list
    • First observedlogs_alertlog
    • First observedlogs_authlog
    • First observedlogs_eventlog
    • First observedlogs_syslog
    • First observedlogs_syslogsink
    • First observedospf_list
    • First observedospf_ports
    • First observedoxidized_config_get
    • First observedoxidized_config_search
    • First observedoxidized_list
    • First observedping
    • First observedpoller_group_get
    • First observedport_description_get
    • First observedport_description_update
    • First observedport_get
    • First observedport_group_add
    • First observedport_group_assign
    • First observedport_group_list_ports
    • First observedport_group_remove
    • First observedport_groups_list
    • First observedport_ip_info
    • First observedport_transceiver
    • First observedports_list
    • First observedports_search
    • First observedports_search_field
    • First observedports_search_mac
    • First observedrouting_ip_addresses
    • First observedsensors_list
    • First observedservice_add
    • First observedservice_delete
    • First observedservice_edit
    • First observedservices_for_device
    • First observedservices_list
    • First observedswitching_links
    • First observedswitching_vlans
    • First observedsystem_info
    • First observedvrf_list

TDQS

C2.9/5.0

Scored across 110 tools

Disambiguation3/5

Many tools target distinct resources and actions, but the set contains several near-overlapping groups (e.g., ports_search, ports_search_field, ports_search_mac, port_get, device_ports_get; device_fdb, port_fdb, fdb_lookup, ports_search_mac). Descriptions generally clarify boundaries, but the sheer volume makes misselection plausible for less common operations.

Naming Consistency3/5

Most names use a resource_action snake_case pattern, but consistency breaks down with singular/plural prefixes (device/devices, devicegroup/devicegroups, alert_template/alert_templates, service/services) and mixed verb styles (list/get/search/create_or_update). Names remain readable but do not follow a single predictable convention.

Tool Count1/5

With 110 tools, the surface is extremely large for any single MCP server and far exceeds the recommended 3-15 range. Although LibreNMS is broad, this count creates substantial cognitive load and overlaps that are difficult for an agent to manage reliably.

Completeness4/5

Coverage is strong across devices, ports, alerts, bills, groups, locations, services, logs, routing, and switching. Minor gaps exist, such as no delete operation for alert templates and limited create/delete lifecycle for discovered routing entities like BGP sessions, but agents can work around these.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the FortiMonitor v2 monitoring API. 241 tools across 33 modules covering server management, outage monitoring, maintenance windows, metrics, notifications, cloud monitoring, SNMP, dashboards, reporting, and more. Unofficial community project, not affiliated with Fortinet. Python, MIT license, Docker and local deployment supported.
    3
    MIT