librenms-mcp
The LibreNMS MCP Server provides comprehensive, programmable access to LibreNMS for querying and managing network monitoring data and resources.
Device & Inventory Management: List, add, update, delete, and rename devices; trigger rediscovery; check availability and outages; set maintenance mode; get device VLANs, links, ports, and inventory.
Port & Port Group Operations: List, search, and get port details (by ID, MAC, or field); update port descriptions; create and manage port groups; assign or remove ports.
Alerting & Logging: List, acknowledge, and unmute alerts; manage alert rules and templates; retrieve event logs, syslogs, alert logs, and auth logs; add custom event/syslog entries.
Device Groups & Locations: Create, update, and delete device groups and locations; add/remove devices from groups; set maintenance mode for groups or all devices at a location.
Networking & Routing: Search ARP/FDB entries; manage BGP sessions; list OSPF instances and ports; list VLANs, links, VRFs, and IP addresses.
Billing: List, create/update, and delete bills; retrieve bill graphs, history, and graph data.
Services: List, add, edit, and delete monitored services per device.
Oxidized (Config Backup): List Oxidized-tracked devices; retrieve and search stored device configurations.
Health & Sensors: List health graphs and sensors; get sensor data by type or ID across all devices.
System: Get LibreNMS system info, ping/health-check the API, and retrieve poller group details.
Search: Search devices by hostname, OS, location, status, or MAC/IP; search ports by alias, description, name, type, or MAC.
Security & Configuration: Supports STDIO, HTTP SSE, and HTTP Streamable transports; optional bearer token auth; read-only mode to disable writes; tag-based tool filtering; rate limiting; SSL/TLS support; optional Sentry integration; pagination for large datasets.
Allows error tracking and performance monitoring via Sentry, with configurable DSN and options.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@librenms-mcplist all devices with status 'down'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LibreNMS MCP Server
Let AI agents query and manage LibreNMS network monitoring through the Model Context Protocol
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-mcpRemember 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-tokenFor more details, visit: https://pypi.org/project/librenms-mcp/
Install from Source
Clone the repository:
git clone https://github.com/mhajder/librenms-mcp.git
cd librenms-mcpInstall dependencies:
# Using UV (recommended)
uv sync
# Or using pip
pip install -e .Configure environment variables:
cp .env.example .env
# Edit .env with your LibreNMS url and tokenRun the server:
# Using UV (recommended)
uv run librenms-mcp
# Or using the installed command directly
librenms-mcpUsing 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:latestOpen 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 devicedevice_add: Add a new devicedevice_update: Update device metadatadevice_delete: Remove a devicedevice_ports: List all ports for a devicedevice_ports_get: Get details for a specific port on a devicedevice_fdb: List the forwarding database (learned MACs) for a devicedevice_nac: List network access control (802.1X / MAB) sessions on a devicedevice_availability: Get device availabilitydevice_outages: Get device outagesdevice_set_maintenance: Set device maintenance modedevice_discover: Discover or add a device using provided credentialsdevice_rename: Rename an existing devicedevice_maintenance_status: Get the maintenance status for a devicedevice_vlans: List VLANs for a devicedevice_links: List links for a devicedevice_wireless_sensors: List wireless sensors (frequency, clients, rssi, ...) with current valuesdevice_parents_set: Set the dependency parents of a device (replaces the current set)device_parents_clear: Remove dependency parents from a devicedevice_eventlog_add: Add an event log entry for a deviceinventory_device: Get inventory for a deviceinventory_device_flat: Get flat inventory for a devicedevicegroups_list: List device groupsdevicegroup_add: Add a device groupdevicegroup_update: Update a device groupdevicegroup_delete: Delete a device groupdevicegroup_devices: List devices in a device groupdevicegroup_set_maintenance: Set maintenance for a device groupdevicegroup_add_devices: Add devices to a device groupdevicegroup_remove_devices: Remove devices from a device grouplocations_list: List all locationslocation_add: Add a locationlocation_edit: Edit a locationlocation_delete: Delete a locationlocation_get: Get details for a locationlocation_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 fieldports_search_mac: Search ports by MAC addressport_get: Get details for a specific portport_fdb: List MAC addresses learned on a portport_ip_info: Get IP address information for a portport_transceiver: Get transceiver information for a portport_description_get: Get a port descriptionport_description_update: Update a port descriptionport_groups_list: List port groupsport_group_add: Add a port groupport_group_list_ports: List ports in a port groupport_group_assign: Assign ports to a port groupport_group_remove: Remove ports from a port group
Port Security Tools
port_security_list: List port security configuration across all devicesport_security_device: Get port security configuration for a deviceport_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 devicedevice_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 asport_bitsare 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 NoDecodeA 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 alertsalert_get_by_id: Get details for a specific alertalert_acknowledge: Acknowledge an alertalert_unmute: Unmute an alertalert_rules_list: List alert rulesalert_rule_get: Get details for a specific alert rulealert_rule_add: Add an alert rulealert_rule_edit: Edit an alert rulealert_rule_delete: Delete an alert rulealert_templates_list: List all alert templatesalert_template_get: Get a specific alert templatealert_template_create: Create a new alert templatealert_template_edit: Edit an alert templatelogs_eventlog: Get event log for a device, or for all devices when no hostname is givenlogs_syslog: Get syslog for a device, or for all devices when no hostname is givenlogs_alertlog: Get alert log for a device, or for all devices when no hostname is givenlogs_authlog: Get the server-wide authentication loglogs_syslogsink: Add a syslog sink
Billing Tools
bills_list: List billsbill_get: Get details for a billbill_graph: Render a bill graph as an imagebill_graph_data: Get bill graph databill_history: Get bill historybill_history_graph: Render a bill history graph as an imagebill_history_graph_data: Get bill history graph databill_create_or_update: Create or update a billbill_delete: Delete a bill
Oxidized Tools
oxidized_list: List devices tracked by Oxidized for config backupoxidized_config_get: Get the stored configuration for a specific deviceoxidized_config_search: Search all stored device configurations for a string
Network & Monitoring Tools
arp_search: Search ARP entriespoller_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 LibreNMSservice_edit: Edit an existing serviceservice_delete: Delete a servicebgp_sessions: List BGP sessionsbgp_session_get: Get details for a specific BGP sessionbgp_session_edit: Edit a BGP sessionfdb_lookup: Lookup forwarding database (FDB) entriesnac_list: List network access control (802.1X / MAB) sessions across all devicesospf_list: List OSPF instancesospf_ports: List OSPF portsvrf_list: List VRFsping: Ping the LibreNMS systemhealth_list: List health sensorshealth_by_type: List health sensors by typehealth_sensor_get: Get details for a health sensorsensors_list: List sensorsswitching_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 to100, minimum1).offset(orstartfor log tools): The number of results to skip.
Pagination Metadata: Every paginated response includes metadata fields:
limit: The active limit.offset(orstart): 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=trueTag-Based Tool Filtering
You can disable specific categories of tools by setting disabled tags:
DISABLED_TAGS=alert,alert-rules,alert-templates,billsA 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 schemascall_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 5bm25 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 minutesIf 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 sentryConfiguration
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=trueFeatures
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
Create a free account at sentry.io
Create a new Python project
Copy your DSN from the project settings
Set it in your
.envfile
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 secondsTransport 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=stdioHTTP 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 tokenWhen 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/sseHTTP 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 tokenWhen 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/mcpNote: 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/healthFor 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 toolsalert_acknowledgeAlert AcknowledgeCIdempotent
Acknowledge an alert in LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional note to attach to the acknowledgement | |
| alert_id | Yes | Alert ID to acknowledge | |
| until_clear | No | If true, acknowledge until the alert clears. If false, acknowledge only this instance. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 IdARead-onlyIdempotent
Get a specific alert from LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | The ID of the alert to retrieve. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AddCDestructive
Add a new alert rule to LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Alert 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeleteADestructiveIdempotent
Delete an alert rule from LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | Alert rule ID to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 EditCDestructiveIdempotent
Edit an existing alert rule in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Alert 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetBRead-onlyIdempotent
Get details for a specific alert rule by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | Alert rule ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListCRead-onlyIdempotent
List all alert rules from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetBRead-onlyIdempotent
Get alerts from LibreNMS with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| order | No | How to order the output, default is by timestamp (descending). Can be appended by DESC or ASC to change the order. Optional. | |
| state | No | Filter the alerts by state: 0 = ok, 1 = alert, 2 = ack. Optional. | |
| offset | No | Number of results to skip (offset) for pagination | |
| severity | No | Filter the alerts by severity. Valid values: ok, warning, critical. Optional. | |
| alert_rule | No | Filter alerts by alert rule ID. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Alert 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 EditCDestructiveIdempotent
Edit an existing alert template in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Alert 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-onlyIdempotent
Get a specific alert template from LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | Alert template ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListCRead-onlyIdempotent
List all alert templates from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 UnmuteAIdempotent
Unmute an alert in LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Alert ID to unmute |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
arp_searchArp SearchCRead-onlyIdempotent
Retrieve ARP entries from LibreNMS by search query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| query | Yes | 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) | |
| device | No | Device hostname or ID to list entries for. Required with query "all" and only valid with it; any other combination returns an error. | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds nothing beyond that โ no mention of pagination behavior, result limits, or the dependency between query and device fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero waste and the key facts front-loaded. It is efficient, though arguably too sparse for the tool's behavioral quirks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema description coverage, the description need not restate return values. However, for a search tool with a non-obvious query/device dependency, the description leaves everything to structured fields and offers no orienting context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the query formats (IPv4, MAC, CIDR, "all") and the device coupling are fully documented in the schema. The description adds no parameter meaning beyond that, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (ARP entries) and identifies the source system (LibreNMS). It does not differentiate itself from nearby siblings like fdb_lookup, ports_search_mac, or device_fdb, which an agent may consider for similar lookups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many other lookup/search siblings. The only usage constraint (query "all" requires device) lives in the 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.
bgp_session_editBgp Session EditBDestructiveIdempotent
Edit BGP session in LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| bgp_id | Yes | BGP session ID | |
| payload | Yes | BGP session payload. Format: {"bgp_descr": "description"} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetBRead-onlyIdempotent
Get BGP session from LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| bgp_id | Yes | BGP session ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 SessionsCRead-onlyIdempotent
List BGP sessions from LibreNMS with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| asn | No | Filter by local ASN | |
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | No | Filter by device hostname or ID. An unknown device returns an error. | |
| bgp_descr | No | Filter by BGP description (SQL LIKE) | |
| bgp_state | No | Filter by BGP state (e.g., established) | |
| bgp_family | No | Filter by address family: 4 (IPv4) or 6 (IPv6) | |
| remote_asn | No | Filter by remote ASN | |
| local_address | No | Filter by local IP address | |
| bgp_adminstate | No | Filter by admin state (start, stop, running) | |
| remote_address | No | Filter by remote IP address |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 UpdateCDestructive
Create or update a bill in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Bill 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeleteADestructiveIdempotent
Delete a bill from LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | Bill ID to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-onlyIdempotent
Get a specific bill from LibreNMS by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Optional period=previous | |
| bill_id | Yes | Bill ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GraphARead-onlyIdempotent
Render a bill graph as an image.
For the underlying numbers rather than a picture, use bill_graph_data.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | Bill ID | |
| graph_type | Yes | Graph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month) |
TDQS
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.
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.
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.
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.
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.
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 DataCRead-onlyIdempotent
Get bill graph data from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | Bill ID | |
| graph_type | Yes | Graph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 HistoryCRead-onlyIdempotent
Get bill history from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| bill_id | Yes | Bill ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GraphARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | Bill ID | |
| graph_type | Yes | Graph type for a past billing period: 'bits' (traffic), 'day' or 'hour' (transfer per day or hour) | |
| history_id | Yes | Bill history ID |
TDQS
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.
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.
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.
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.
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.
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 DataCRead-onlyIdempotent
Get bill history graph data from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | Bill ID | |
| graph_type | Yes | Graph type for a past billing period: 'bits' (traffic), 'day' or 'hour' (transfer per day or hour) | |
| history_id | Yes | Bill history ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListARead-onlyIdempotent
List bills from LibreNMS with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Bill reference filter | |
| limit | No | Maximum number of results to return | |
| custid | No | Customer ID filter | |
| offset | No | Number of results to skip (offset) for pagination | |
| period | No | Optional: previous to list previous period bills |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AddCDestructive
Add a new device to LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Device 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AvailabilityBRead-onlyIdempotent
Get device availability from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Device hostname. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeleteADestructiveIdempotent
Delete a device from LibreNMS by hostname.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Device hostname to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Event log entry payload: - text (required): Event message text - type (optional): Event type/category - severity (optional): Severity level (1-5) | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 FdbARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or device ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-onlyIdempotent
Get device details from LibreNMS by hostname.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Device hostname |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GraphARead-onlyIdempotent
Render a device-level graph as an image.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Graph width in pixels. | |
| height | No | Graph height in pixels. | |
| legend | No | Whether to render the graph legend. | |
| to_time | No | End of the time range, either a relative offset or a Unix timestamp. Defaults to now. | |
| hostname | Yes | Device hostname or device ID | |
| from_time | No | Start 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_type | Yes | Graph type, as returned by device_graphs_list (e.g. 'device_icmp_perf', 'device_poller_perf', 'device_availability') |
TDQS
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.
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.
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.
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.
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.
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 ListARead-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'.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Device hostname or device ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AddBDestructive
Add a new device group to LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Device 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DevicesCDestructive
Add devices to a device group in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name or ID | |
| payload | Yes | Array of device IDs to add. Format: {"devices": [1, 2, 3]} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeleteBDestructiveIdempotent
Delete a device group from LibreNMS by name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name or ID to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DevicesCRead-onlyIdempotent
List devices in a device group from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Set to true to get complete device data instead of just IDs | |
| name | Yes | Device group name or ID | |
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DevicesCDestructive
Remove devices from a device group in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name or ID | |
| payload | Yes | Array of device IDs to remove. Format: {"devices": [1, 2, 3]} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 MaintenanceCDestructiveIdempotent
Set maintenance for a device group in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name or ID | |
| payload | Yes | Maintenance 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListCRead-onlyIdempotent
List all device groups from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 UpdateBDestructiveIdempotent
Update a device group in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name or ID | |
| payload | Yes | Patchable 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_linksDevice LinksBRead-onlyIdempotent
Get network links for a specific device.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 such as pagination behavior or data scope, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler, front-loading the action and resource. It is easy to scan and fully earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with a complete input schema, an output schema, and safety annotations, the description is nearly sufficient. It is slightly incomplete in that it does not clarify how device_links relates to switching_links, but the output schema likely resolves much of the ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, offset, and hostname are already well documented in the schema. The description's phrase 'specific device' mildly reinforces hostname as the key parameter, but it adds no meaningful semantic value beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Get'), a resource ('network links'), and a scope ('for a specific device'), which is clear and actionable. However, it does not differentiate from sibling tools like switching_links, which may overlap in meaning, so it falls short of a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as switching_links, device_ports, or ports_search. The description implies a use case for retrieving links for a device, but it gives no explicit context or exclusions.
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 StatusARead-onlyIdempotent
Check if a device is currently in maintenance mode.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 NacARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or device ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 OutagesBRead-onlyIdempotent
Get device outages from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 PortsBRead-onlyIdempotent
List ports for a device from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| columns | No | Comma-separated list of columns to return (e.g., 'port_id,ifName,ifAlias,ifOperStatus') | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-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, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| ifname | Yes | Interface name | |
| hostname | Yes | Device hostname. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 RenameBDestructiveIdempotent
Rename a device in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Current device hostname or ID | |
| new_hostname | Yes | New hostname for the device |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 MaintenanceBIdempotent
Set device maintenance in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Maintenance 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) | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListARead-onlyIdempotent
List devices from LibreNMS with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| query | No | Query 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 | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 UpdateCDestructiveIdempotent
Update device fields in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Patchable 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 | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 VlansBRead-onlyIdempotent
Get VLANs configured on a specific device.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 LookupBRead-onlyIdempotent
Look up a MAC address in the forwarding database.
| Name | Required | Description | Default |
|---|---|---|---|
| mac | Yes | MAC address to look up. Accepts multiple formats: aa:bb:cc:dd:ee:ff, aabb.ccdd.eeff, or aabbccddeeff |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TypeBRead-onlyIdempotent
Get health data by sensor type for a device.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Sensor type (e.g. temperature, voltage, fanspeed) | |
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListARead-onlyIdempotent
List available health graphs for a device.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-onlyIdempotent
Get a specific sensor by ID for a device.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Sensor type (e.g. temperature, voltage, fanspeed) | |
| hostname | Yes | Device hostname or ID | |
| sensor_id | Yes | Sensor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeviceBRead-onlyIdempotent
Get inventory for a device from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or ID | |
| ent_physical_class | No | Filter by entity physical class (e.g., chassis, module, port, powerSupply, fan, sensor) | |
| ent_physical_contained_in | No | Filter by parent entity index |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 FlatARead-onlyIdempotent
Get flattened inventory for a device from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AddADestructive
Add a new location to LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Location 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeleteBDestructiveIdempotent
Delete a location from LibreNMS by ID or name.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Location ID or name |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 EditCDestructiveIdempotent
Edit a location in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Location patchable fields: - lat: Latitude coordinate (decimal degrees) - lng: Longitude coordinate (decimal degrees) | |
| location | Yes | Location ID or name |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-onlyIdempotent
Get a specific location from LibreNMS by identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Location ID or name |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 MaintenanceBIdempotent
Set maintenance mode for all devices in a location.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Maintenance 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) | |
| location | Yes | Location ID or name |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListBRead-onlyIdempotent
List locations from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AlertlogBRead-onlyIdempotent
Get alert logs for a device from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| start | No | Number of results to skip (offset) for pagination | |
| to_ts | No | End timestamp filter (Unix timestamp or datetime string) | |
| from_ts | No | Start timestamp filter (Unix timestamp or datetime string) | |
| hostname | No | Device hostname or ID. Omit for entries from all devices. | |
| sortorder | No | Sort order: ASC or DESC |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AuthlogARead-onlyIdempotent
Get authentication logs from LibreNMS.
Auth logs are server-wide rather than per-device, so this takes no hostname.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| start | No | Number of results to skip (offset) for pagination | |
| to_ts | No | End timestamp filter (Unix timestamp or datetime string) | |
| from_ts | No | Start timestamp filter (Unix timestamp or datetime string) | |
| sortorder | No | Sort order: ASC or DESC |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 EventlogCRead-onlyIdempotent
Get event logs for a device from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| start | No | Number of results to skip (offset) for pagination | |
| to_ts | No | End timestamp filter (Unix timestamp or datetime string) | |
| from_ts | No | Start timestamp filter (Unix timestamp or datetime string) | |
| hostname | No | Device hostname or ID. Omit for entries from all devices. | |
| sortorder | No | Sort order: ASC or DESC |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 SyslogCRead-onlyIdempotent
Get syslogs for a device from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| start | No | Number of results to skip (offset) for pagination | |
| to_ts | No | End timestamp filter (Unix timestamp or datetime string) | |
| from_ts | No | Start timestamp filter (Unix timestamp or datetime string) | |
| hostname | No | Device hostname or ID. Omit for entries from all devices. | |
| sortorder | No | Sort order: ASC or DESC |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | JSON syslog message(s) to ingest into LibreNMS syslog storage. Accepts a single object or an array of objects. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mac | No | Filter to a single MAC address. Optional. | |
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListCRead-onlyIdempotent
List all OSPF instances from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 PortsBRead-onlyIdempotent
List all OSPF ports/interfaces from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-onlyIdempotent
Get the stored device configuration from Oxidized for a specific device.
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | Yes | Device hostname |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_config_searchOxidized Config SearchBRead-onlyIdempotent
Search all Oxidized device configurations for a string.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| search | Yes | 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'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 no behavioral context beyond that โ no auth requirements, rate limits, or notes about how results are produced โ so it contributes little value over 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words that states the core action and target immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations carry the safety profile. However, for a search tool the description omits pagination behavior context and any differentiation from the sibling oxidized_config_get, leaving it only minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (search, limit, offset) are already documented in the schema, including the important note about '/' not being routable. The description adds no parameter detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Search) and resource (all Oxidized device configurations) with the scope of matching against a string. It is clearly a search tool, distinguishable from the read-style siblings oxidized_config_get and oxidized_list, though it never explicitly names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'search all configs for a string' suggests using it when you want to locate content within configs. There is no explicit when-to-use, when-not-to-use, or mention of the alternative oxidized_config_get for retrieving a single device's config.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oxidized_listOxidized ListBRead-onlyIdempotent
List devices tracked by Oxidized for config backup.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | No | Filter by device hostname or ID. Optional. An unknown device returns an error. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
pingPingARead-onlyIdempotent
Simple API health check - ping LibreNMS API.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetBRead-onlyIdempotent
Get poller group(s) from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| poller_group | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetARead-onlyIdempotent
Get port description from LibreNMS by port ID.
| Name | Required | Description | Default |
|---|---|---|---|
| port_id | Yes | Port ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 UpdateBDestructiveIdempotent
Update port description in LibreNMS by port ID.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Port description payload. Format: {"description": "new description"} | |
| port_id | Yes | Port ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 FdbARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| port_id | Yes | Port ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GetCRead-onlyIdempotent
Get port info from LibreNMS by port ID.
| Name | Required | Description | Default |
|---|---|---|---|
| port_id | Yes | Port ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GraphARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Graph width in pixels. | |
| height | No | Graph height in pixels. | |
| ifname | Yes | Interface name as reported by LibreNMS, e.g. 'Po1' or 'Te2/7' | |
| legend | No | Whether to render the graph legend. | |
| to_time | No | End of the time range, either a relative offset or a Unix timestamp. Defaults to now. | |
| hostname | Yes | Device hostname or device ID | |
| from_time | No | Start 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_type | No | Graph type: 'bits' (traffic), 'upkts' (unicast packets), 'nupkts' (non-unicast packets), 'errors', or 'etherlike'. The LibreNMS names ('port_bits', ...) are accepted too. | bits |
TDQS
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.
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.
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.
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.
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.
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 AddBDestructive
Add a port group to LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Port group payload: - name (required): Port group name - desc (optional): Port group description |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Port IDs to assign. Format: {"port_ids": [1, 2, 3]} | |
| port_group_id | Yes | Port group ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 GraphARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Graph width in pixels. | |
| height | No | Graph height in pixels. | |
| legend | No | Whether to render the graph legend. | |
| to_time | No | End of the time range, either a relative offset or a Unix timestamp. Defaults to now. | |
| port_ids | Yes | One or more port IDs to plot on a single graph. Resolve names to IDs with ports_search_field or device_ports. | |
| from_time | No | Start 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
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.
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.
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.
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.
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.
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 PortsCRead-onlyIdempotent
List ports in a port group from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Port group name or ID | |
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Port IDs to remove. Format: {"port_ids": [1, 2, 3]} | |
| port_group_id | Yes | Port group ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListCRead-onlyIdempotent
List port groups from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 InfoARead-onlyIdempotent
Get port IP info from LibreNMS by port ID.
| Name | Required | Description | Default |
|---|---|---|---|
| port_id | Yes | Port ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeviceARead-onlyIdempotent
Get port security configuration for every port on a device.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or device ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 PortARead-onlyIdempotent
Get port security configuration for a single port.
| Name | Required | Description | Default |
|---|---|---|---|
| port_id | Yes | Port ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListCRead-onlyIdempotent
Get all ports from LibreNMS with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| query | No | Query 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. | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_searchPorts SearchBRead-onlyIdempotent
Search ports in LibreNMS by search string.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| search | Yes | Search string - searches ifAlias, ifDescr, and ifName fields |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 detail beyond 'search by search string', but there is no contradiction or hidden destructive behavior to disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It states the action and scope efficiently, which is appropriate for a simple search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward read-only search with a fully documented schema and an output schema present, the definition is almost complete. It falls slightly short because it never addresses which sibling search variant to choose, but the agent still has enough structured information to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: search, limit, and offset all have descriptions, and the search property explicitly lists the ifAlias, ifDescr, and ifName fields. The description adds no parameter-level 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, 'Search ports', and clarifies the operation is driven by a search string. It is clear about the tool's core function, though it does not explicitly distinguish itself from sibling search tools like ports_search_field or ports_search_mac.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as ports_list, ports_search_field, or ports_search_mac. The description only restates the basic action and leaves sibling selection entirely to inference.
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 FieldCRead-onlyIdempotent
Search ports in LibreNMS by specific field.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | Field to search: ifAlias, ifDescr, ifName, ifType, etc. | |
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination | |
| search | Yes | Search term. "0" is not supported: LibreNMS treats it as empty. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 MacARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mac | Yes | 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 | |
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TransceiverARead-onlyIdempotent
Get port transceiver info from LibreNMS by port ID.
| Name | Required | Description | Default |
|---|---|---|---|
| port_id | Yes | Port ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AddressesBRead-onlyIdempotent
List all IP addresses from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListARead-onlyIdempotent
List all sensors across all devices.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AddCDestructive
Add a service for a device in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Service 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"} | |
| hostname | Yes | Device hostname or ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeleteADestructiveIdempotent
Delete a service from LibreNMS by service ID.
| Name | Required | Description | Default |
|---|---|---|---|
| service_id | Yes | Service ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 EditADestructiveIdempotent
Edit a service in LibreNMS by service ID.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Service 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_id | Yes | Service ID |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DeviceBRead-onlyIdempotent
Get services for a device from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| state | No | Filter by state: 0=Ok, 1=Warning, 2=Critical | |
| offset | No | Number of results to skip (offset) for pagination | |
| hostname | Yes | Device hostname or ID | |
| service_type | No | Filter by service type (SQL LIKE pattern) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListARead-onlyIdempotent
List all services from LibreNMS with optional filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| state | No | Filter by state: 0=Ok, 1=Warning, 2=Critical | |
| offset | No | Number of results to skip (offset) for pagination | |
| service_type | No | Filter by service type (SQL LIKE pattern) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_linksSwitching LinksCRead-onlyIdempotent
List all links from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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: it does not explain what a 'link' is, whether results are paginated, or any other behavioral trait, so it provides no extra value over 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It is efficient, though its brevity edges into under-specification rather than optimal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need not be described, and annotations cover the safety profile. However, the description omits what 'links' refers to and how this tool relates to the similar device_links sibling, leaving a real ambiguity for an agent selecting among many networking tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit and offset are fully documented in the schema itself. The description adds no parameter meaning beyond that, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb 'List' and a resource 'links from LibreNMS', but 'links' is ambiguous in a networking context (switching links could mean topology links, link aggregation, spanning-tree links, etc.). It does not distinguish this tool from the sibling device_links, leaving the agent unsure which to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as device_links or switching_vlans, and no prerequisites or scope conditions are given. The description offers only a bare statement of function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switching_vlansSwitching VlansCRead-onlyIdempotent
List all VLANs from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 InfoCRead-onlyIdempotent
Get system info from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ListBRead-onlyIdempotent
List all VRF (Virtual Routing and Forwarding) instances from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| offset | No | Number of results to skip (offset) for pagination |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
32 tool updates
v1.12.0- Changed
alert_rule_add1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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\": [...]}}"
- Changed
alert_rule_edit1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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)"
- Changed
alert_template_create1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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\": []}"
- Changed
alert_template_edit1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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."
- Changed
arp_search2 fields changed- added
Input schema / properties / deviceAdded 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." +} - changed
Input schema / properties / query / descriptionPrevious 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)"
- Changed
bgp_sessions1 field changed- changed
Input schema / properties / hostname / descriptionPrevious value: -"Filter by device hostname"New value: +"Filter by device hostname or ID. An unknown device returns an error."
- Changed
bill_graph2 fields changed- changed
Input schema / properties / graph_type / descriptionPrevious value: -"Graph type: bits, monthly, hour, or day"New value: +"Graph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month)" - added
Input schema / properties / graph_type / enumAdded value: +[ + "bits", + "monthly" +]
- Changed
bill_graph_data2 fields changed- changed
Input schema / properties / graph_type / descriptionPrevious value: -"Graph type: bits, monthly, hour, or day"New value: +"Graph type for the current billing period: 'bits' (traffic) or 'monthly' (transfer per month)" - added
Input schema / properties / graph_type / enumAdded value: +[ + "bits", + "monthly" +]
- Changed
bill_history_graph2 fields changed- changed
Input schema / properties / graph_type / descriptionPrevious 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)" - added
Input schema / properties / graph_type / enumAdded value: +[ + "bits", + "day", + "hour" +]
- Changed
bill_history_graph_data2 fields changed- changed
Input schema / properties / graph_type / descriptionPrevious 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)" - added
Input schema / properties / graph_type / enumAdded value: +[ + "bits", + "day", + "hour" +]
- Changed
devicegroup_add_devices1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Device group name"New value: +"Device group name or ID"
- Changed
devicegroup_delete1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Device group name to delete"New value: +"Device group name or ID to delete"
- Changed
devicegroup_devices1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Device group name"New value: +"Device group name or ID"
- Changed
devicegroup_remove_devices1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Device group name"New value: +"Device group name or ID"
- Changed
devicegroup_set_maintenance1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Device group name"New value: +"Device group name or ID"
- Changed
devicegroup_update1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Device group name"New value: +"Device group name or ID"
- Changed
location_delete1 field changed- changed
Input schema / properties / location / descriptionPrevious value: -"Location identifier"New value: +"Location ID or name"
- Changed
location_edit1 field changed- changed
Input schema / properties / location / descriptionPrevious value: -"Location identifier or name"New value: +"Location ID or name"
- Changed
location_get1 field changed- changed
Input schema / properties / location / descriptionPrevious value: -"Location identifier or name"New value: +"Location ID or name"
- Changed
location_set_maintenance1 field changed- changed
Input schema / properties / location / descriptionPrevious value: -"Location identifier or name"New value: +"Location ID or name"
- Changed
logs_alertlog5 fields changed- added
Input schema / properties / hostname / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / hostname / defaultAdded value: +null - changed
Input schema / properties / hostname / descriptionPrevious value: -"Device hostname or ID"New value: +"Device hostname or ID. Omit for entries from all devices." - removed
Input schema / properties / hostname / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "hostname" -]
- Changed
logs_eventlog5 fields changed- added
Input schema / properties / hostname / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / hostname / defaultAdded value: +null - changed
Input schema / properties / hostname / descriptionPrevious value: -"Device hostname or ID"New value: +"Device hostname or ID. Omit for entries from all devices." - removed
Input schema / properties / hostname / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "hostname" -]
- Changed
logs_syslog5 fields changed- added
Input schema / properties / hostname / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / hostname / defaultAdded value: +null - changed
Input schema / properties / hostname / descriptionPrevious value: -"Device hostname or ID"New value: +"Device hostname or ID. Omit for entries from all devices." - removed
Input schema / properties / hostname / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "hostname" -]
- Changed
oxidized_config_search1 field changed- changed
Input schema / properties / search / descriptionPrevious 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')."
- Changed
oxidized_list1 field changed- changed
Input schema / properties / hostname / descriptionPrevious value: -"Filter by device hostname. Optional."New value: +"Filter by device hostname or ID. Optional. An unknown device returns an error."
- Changed
poller_group_get5 fields changed- added
Input schema / properties / poller_group / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / poller_group / defaultAdded value: +null - changed
Input schema / properties / poller_group / descriptionPrevious 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." - removed
Input schema / properties / poller_group / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "poller_group" -]
- Changed
port_graph1 field changed- changed
Input schema / properties / graph_type / descriptionPrevious 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."
- Changed
port_group_list_ports1 field changed- changed
Input schema / properties / name / descriptionPrevious value: -"Port group name"New value: +"Port group name or ID"
- Changed
ports_list1 field changed- changed
Input schema / properties / query / descriptionPrevious 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."
- Changed
ports_search_field1 field changed- changed
Input schema / properties / search / descriptionPrevious value: -"Search term"New value: +"Search term. \"0\" is not supported: LibreNMS treats it as empty."
- Changed
ports_search_mac1 field changed- changed
Input schema / properties / mac / descriptionPrevious 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"
- Changed
service_add1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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\"}"
1 tool update
v1.11.3- Changed
device_update1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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"
6 tool updates
v1.11.1- Changed
alert_template_create1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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\": []}"
- Removed
alert_template_delete - Changed
alert_template_edit1 field changed- changed
Input schema / properties / payload / descriptionPrevious 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."
- Changed
bill_graph1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
bill_history_graph1 field changed- changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "type": "object" -}New value: +null
- Changed
location_get1 field changed- changed
Input schema / properties / location / descriptionPrevious value: -"Location identifier."New value: +"Location identifier or name"
11 tool updates
v1.11.0- Added
device_fdb - Added
device_graph - Added
device_graphs_list - Added
device_nac - Added
nac_list - Added
port_fdb - Added
port_graph - Added
port_group_graph - Added
port_security_device - Added
port_security_list - Added
port_security_port
40 tool updates
v1.10.3- Changed
alert_rules_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
alert_templates_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
alerts_get4 fields changed- changed
Input schema / properties / alert_rule / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / state / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
arp_search2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
bgp_sessions5 fields changed- changed
Input schema / properties / asn / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / bgp_family / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / remote_asn / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
bill_history2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
bills_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
device_links2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
device_outages2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
device_ports2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
device_vlans2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
devicegroup_devices2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
devicegroups_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
devices_list3 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / query / descriptionPrevious 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"
- Changed
health_by_type2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
health_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
inventory_device3 fields changed- changed
Input schema / properties / ent_physical_contained_in / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
inventory_device_flat2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
locations_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
logs_alertlog9 fields changed- removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / limit / defaultPrevious value: -nullNew value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - removed
Input schema / properties / start / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / start / defaultPrevious value: -nullNew value: +0 - changed
Input schema / properties / start / descriptionPrevious value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination" - added
Input schema / properties / start / minimumAdded value: +0 - added
Input schema / properties / start / typeAdded value: +"integer"
- Changed
logs_authlog9 fields changed- removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / limit / defaultPrevious value: -nullNew value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - removed
Input schema / properties / start / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / start / defaultPrevious value: -nullNew value: +0 - changed
Input schema / properties / start / descriptionPrevious value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination" - added
Input schema / properties / start / minimumAdded value: +0 - added
Input schema / properties / start / typeAdded value: +"integer"
- Changed
logs_eventlog9 fields changed- removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / limit / defaultPrevious value: -nullNew value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - removed
Input schema / properties / start / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / start / defaultPrevious value: -nullNew value: +0 - changed
Input schema / properties / start / descriptionPrevious value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination" - added
Input schema / properties / start / minimumAdded value: +0 - added
Input schema / properties / start / typeAdded value: +"integer"
- Changed
logs_syslog9 fields changed- removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / limit / defaultPrevious value: -nullNew value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / limit / typeAdded value: +"integer" - removed
Input schema / properties / start / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - changed
Input schema / properties / start / defaultPrevious value: -nullNew value: +0 - changed
Input schema / properties / start / descriptionPrevious value: -"Page number for pagination"New value: +"Number of results to skip (offset) for pagination" - added
Input schema / properties / start / minimumAdded value: +0 - added
Input schema / properties / start / typeAdded value: +"integer"
- Changed
ospf_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
ospf_ports2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
oxidized_config_search2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
oxidized_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
port_group_list_ports2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
port_groups_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
ports_list3 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / query / descriptionPrevious 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."
- Changed
ports_search2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
ports_search_field2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
ports_search_mac2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
routing_ip_addresses2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
sensors_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
services_for_device3 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / state / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
services_list3 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / state / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } +]
- Changed
switching_links2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
switching_vlans2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
- Changed
vrf_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum number of results to return", + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Number of results to skip (offset) for pagination", + "minimum": 0, + "type": "integer" +}
100 tool updates
v1.9.0- First observed
alert_acknowledge - First observed
alert_get_by_id - First observed
alert_rule_add - First observed
alert_rule_delete - First observed
alert_rule_edit - First observed
alert_rule_get - First observed
alert_rules_list - First observed
alert_template_create - First observed
alert_template_delete - First observed
alert_template_edit - First observed
alert_template_get - First observed
alert_templates_list - First observed
alert_unmute - First observed
alerts_get - First observed
arp_search - First observed
bgp_session_edit - First observed
bgp_session_get - First observed
bgp_sessions - First observed
bill_create_or_update - First observed
bill_delete - First observed
bill_get - First observed
bill_graph - First observed
bill_graph_data - First observed
bill_history - First observed
bill_history_graph - First observed
bill_history_graph_data - First observed
bills_list - First observed
device_add - First observed
device_availability - First observed
device_delete - First observed
device_discover - First observed
device_eventlog_add - First observed
device_get - First observed
device_links - First observed
device_maintenance_status - First observed
device_outages - First observed
device_ports - First observed
device_ports_get - First observed
device_rename - First observed
device_set_maintenance - First observed
device_update - First observed
device_vlans - First observed
devicegroup_add - First observed
devicegroup_add_devices - First observed
devicegroup_delete - First observed
devicegroup_devices - First observed
devicegroup_remove_devices - First observed
devicegroup_set_maintenance - First observed
devicegroup_update - First observed
devicegroups_list - First observed
devices_list - First observed
fdb_lookup - First observed
health_by_type - First observed
health_list - First observed
health_sensor_get - First observed
inventory_device - First observed
inventory_device_flat - First observed
location_add - First observed
location_delete - First observed
location_edit - First observed
location_get - First observed
location_set_maintenance - First observed
locations_list - First observed
logs_alertlog - First observed
logs_authlog - First observed
logs_eventlog - First observed
logs_syslog - First observed
logs_syslogsink - First observed
ospf_list - First observed
ospf_ports - First observed
oxidized_config_get - First observed
oxidized_config_search - First observed
oxidized_list - First observed
ping - First observed
poller_group_get - First observed
port_description_get - First observed
port_description_update - First observed
port_get - First observed
port_group_add - First observed
port_group_assign - First observed
port_group_list_ports - First observed
port_group_remove - First observed
port_groups_list - First observed
port_ip_info - First observed
port_transceiver - First observed
ports_list - First observed
ports_search - First observed
ports_search_field - First observed
ports_search_mac - First observed
routing_ip_addresses - First observed
sensors_list - First observed
service_add - First observed
service_delete - First observed
service_edit - First observed
services_for_device - First observed
services_list - First observed
switching_links - First observed
switching_vlans - First observed
system_info - First observed
vrf_list
TDQS
Scored across 110 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
Related MCP Servers
- AlicenseCqualityBmaintenanceA Python-based MCP server that enables querying Cisco's Meraki Dashboard API to discover, monitor, and manage Meraki environments.2245MIT
- AlicenseNot gradedqualityCmaintenanceMCP 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.3MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for interacting with NetBox API, enabling users to query and manage NetBox resources such as devices through natural language.MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for LibreNMS network monitoring โ query devices, alerts, sensors, ports, and more through AI assistants like Claude.MIT