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 "Install 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
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.14
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 images are available on GitHub Packages for easy deployment.
# Normal STDIO image
docker pull ghcr.io/mhajder/librenms-mcp:latest
# MCPO image for usage with Open WebUI
docker pull ghcr.io/mhajder/librenms-mcpo:latestDevelopment 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 installConfiguration
Environment Variables
# 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,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=true
# 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)
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_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. LibreNMS serves SVG on current releases and PNG on older ones; 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,errors,etherlike)port_group_graph: Render a traffic graph for one or more ports by port ID
port_graph falls back to the port-group endpoint for bits when the per-port
endpoint fails, which works around LibreNMS releases that return a 500 naming an
empty graph type.
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 devicelogs_syslog: Get syslog for a devicelogs_alertlog: Get alert log for a devicelogs_authlog: Get auth log for a devicelogs_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).
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,billsTool 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: true)
SENTRY_SEND_DEFAULT_PII=true
# 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:
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.
For more information on FastMCP transports, see the FastMCP documentation.
Contributing
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Make your changes
Run tests and ensure code quality (
uv run pytest && uv run ruff check .)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
License
MIT License - see LICENSE file 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 AddADestructive
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) 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 signal a mutating operation via readOnlyHint=false and destructiveHint=true, so the safety profile is covered without description help. The description itself adds no behavioral context beyond what the annotations provide—no mention of duplicate-rule handling, validation outcomes, or side effects. It is consistent with the annotations, so 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, front-loaded sentence with zero filler. All necessary detail is delegated to the schema and annotations, which is the appropriate division of labor 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?
For a one-parameter create tool with a comprehensive payload schema, an output schema, and annotations covering the mutating nature, the definition is nearly complete. The only real gap is the missing when-to-use guidance relative to alert_rule_edit and alert_rule_delete.
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 schema is exceptionally detailed: it enumerates required vs optional fields, defaults, allowed severity values, and includes a JSON example. Per the baseline rule, the description need not compensate since the schema fully documents 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 ('Add'), a clear resource ('alert rule'), and a destination ('LibreNMS'). The create semantics are unambiguous against the sibling tools alert_rule_edit and alert_rule_delete, so an agent can select it correctly without inspecting 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 guidance is given on when to use this tool versus alert_rule_edit, alert_rule_delete, or alert_rules_list. There are no stated prerequisites, such as needing valid device IDs or a formatted builder JSON, and no exclusions. The agent must infer the intent from the tool 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 EditADestructiveIdempotent
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): Rule ID to edit - 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?
The description only restates the operation ('Edit an existing alert rule') and adds no behavioral detail beyond annotations. With readOnlyHint=false and destructiveHint=true, an agent can infer mutation, but the description does not explain whether editing replaces the full rule or merges partial fields, or what destructive 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?
A single, front-loaded sentence with no filler. It immediately tells the agent what action is performed and on what resource.
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 combination of detailed payload schema and annotations covers most operational context, but the description lacks guidance on update semantics (partial vs. full replacement) and what happens with omitted optional fields. For a mutation tool with destructiveHint=true, this is a meaningful gap despite the rich 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?
Schema description coverage is 100% and the payload parameter is extensively documented with field names, types, and constraints. The tool description itself contributes no additional 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?
The description states a specific verb ('Edit'), a resource ('existing alert rule'), and the domain ('LibreNMS'). This clearly distinguishes it from sibling tools like alert_rule_add, alert_rule_delete, and alert_rule_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?
The word 'existing' implies this tool is for modifying already-created alert rules rather than creating new ones, which provides clear context. It does not explicitly name alternatives or state when not to use it, but the purpose is unambiguous against the sibling set.
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.
Returns: dict: The JSON response from the API.
| 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 only that it comes from LibreNMS and returns a dict, but it fails to disclose that the list is paginated via limit/offset, which contradicts the literal 'List all' claim and could mislead an agent about the full result 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?
The description is appropriately short and front-loaded with the core action. The 'Returns: dict' line is low-value filler because an output schema exists, but it does not significantly hurt readability or 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 with two optional parameters and a safe annotation profile, the description is minimally viable. The main gaps are the missing pagination caveat and lack of sibling differentiation, both of which matter for correct invocation when agents need 'all' rules or need to distinguish alert rules from alerts.
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 already documented, so the baseline is 3. The description adds no additional meaning about when to adjust these parameters or how pagination interacts with the 'all' claim, but it does not need to compensate for missing schema info.
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 all alert rules from LibreNMS.' It is clear that this tool lists alert rules rather than individual alerts or template rules, so it is distinguishable in intent. However, it does not explicitly differentiate itself from sibling list/get tools, and 'all' is slightly misleading given the pagination parameters.
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 about when to use this tool versus alternatives such as alert_rule_get, alerts_get, or alert_templates_list. It does not mention when-not-to-use, exclusions, or any conditions that would route an agent to a sibling tool.
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 CreateA
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. 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 signal this is not read-only, not idempotent, and not destructive, so the description only needs to add behavioral context. 'Create a new alert template' accurately conveys the operation, but it does not disclose duplicate-handling behavior, validation expectations, or any side effects beyond creation.
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 does not repeat schema contents, though it offers little beyond the basic 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?
Given the nested payload schema and existing output schema, the description is minimally adequate for a create operation. However, it relies heavily on the schema for parameter semantics and does not provide guidance on when to choose create over edit or how the created template relates to alert_rules.
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 coverage is 100% and the payload schema itself provides detailed field descriptions, required fields, and an example. The tool description adds no parameter-level meaning, but 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 states a specific verb ('Create'), a specific resource ('alert template'), and the system ('LibreNMS'), clearly distinguishing this from siblings like alert_template_edit, alert_template_get, and alert_templates_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 implies 'use when you need to create a new alert template,' which is clear enough in context. However, it does not explicitly contrast with alert_template_edit or state when not to use it, leaving the alternative-selection reasoning partially implicit.
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 EditADestructiveIdempotent
Edit an existing alert template in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Alert template edit payload (must include template_id): - template_id (required): Template ID to edit. Without it LibreNMS creates a new template instead of editing the existing one. - 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 destructiveHint=true, readOnlyHint=false, and idempotentHint=true, giving the agent a clear safety profile. The description itself adds no behavioral traits beyond the basic edit action, though it does not contradict the annotations. The full-replacement behavior is disclosed only in the schema, not in 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?
The description is a single front-loaded sentence with no filler or redundant phrasing. It says precisely what the tool does, and the schema is allowed to carry the detailed invocation details.
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 description alone is sparse, but the rich input schema covers all required fields and flags the critical full-replacement behavior, while an output schema exists and annotations cover the safety profile. The only notable gap is the lack of explicit routing to alert_template_create for new-template scenarios, but that is inferable from the name and 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?
Schema description coverage is 100%, and the input schema fully documents the nested payload structure including template_id, name, template, title, title_rec, and alert_rules. The tool description itself contributes no parameter-level 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 uses a specific verb ('Edit') with a specific resource ('existing alert template') and platform ('LibreNMS'), which clearly distinguishes it from alert_template_create and alert_template_get. The word 'existing' immediately signals that this tool modifies rather than creates.
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 explicitly state when to use this tool versus alert_template_create or other siblings. The phrase 'existing alert template' implies use for templates that already exist, and the schema's requirement to include template_id adds operational context, but no explicit alternatives or exclusions are provided in the description.
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 ListBRead-onlyIdempotent
List all alert templates from LibreNMS.
Returns: dict: The JSON response from the API.
| 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 little beyond that, and it does not mention pagination behavior or the fact that 'all' may be limited by limit/offset.
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 short and front-loaded with the core purpose. The 'Returns: dict' line adds minor value but is mostly redundant given the output 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?
For a simple read-only list tool with full parameter documentation, an output schema, and safe-operation annotations, the description is mostly sufficient. A brief note about pagination would make it fully complete, but 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%, so limit and offset are already fully documented. The description does not add any additional parameter-level 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 a specific verb ('List') and resource ('alert templates') with a clear source ('LibreNMS'). It distinguishes itself from single-item tools like alert_template_get, though it doesn't explicitly name any sibling.
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 alert_template_get or alert_rules_list. The only usage signal is the tool's name and the phrase 'List all,' which implies enumeration but offers no exclusions or alternative routing.
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 SearchARead-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 IP address, MAC address, CIDR notation, or "all" (use with device parameter for all entries on a device) | |
| 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 little behavioral context beyond the resource and query mechanism, but no contradiction exists and the output schema covers return structure.
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 states the action, resource, and mechanism with zero wasted words. It is appropriately sized for a tool whose schema and annotations carry most operational 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 search tool with full schema coverage and an output schema, the description is nearly complete. It could add a brief note about supported query types or pagination behavior, but those are already present in the parameter descriptions.
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 query, limit, and offset. The description's phrase 'by search query' aligns with the query parameter but does not add 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 states a specific verb and resource: 'Retrieve ARP entries from LibreNMS by search query.' The resource 'ARP entries' is distinct from sibling tools like fdb_lookup or ports_search_mac, so an agent can differentiate it 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?
The description implies usage when ARP entries are needed, and the schema details supported query formats like IP, MAC, and CIDR. However, it does not explicitly compare against alternative lookup tools, provide exclusions, or state when a different tool should be preferred.
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 SessionsARead-onlyIdempotent
List BGP sessions from LibreNMS with optional filters.
Returns: dict: The JSON response from the API.
| 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 | |
| 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?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read operation. The description adds the source system (LibreNMS) and a redundant return-type note, but no substantive behavioral context such as pagination semantics or how filters combine. 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 short and front-loaded with the core purpose in the first sentence. The 'Returns: dict' line is somewhat redundant given the output schema, so it does not fully earn its place, but the overall size and structure are 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?
For a read-only list tool with an output schema and 100% parameter coverage in the schema, the description conveys the essential action and source. It does not mention pagination details beyond the limit/offset parameters or the singular sibling for single-session lookup, but these are discoverable. The description is slightly thin yet adequate for selection and 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 each of the 11 parameters is already documented in the input schema. The description's 'optional filters' generalizes the parameter set but adds no meaning beyond what the schema provides. A baseline score of 3 is appropriate because the schema 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 states a specific action and resource: 'List BGP sessions from LibreNMS with optional filters.' This clearly identifies what the tool does and avoids tautology. However, it does not explicitly contrast with the sibling tools bgp_session_get or bgp_session_edit, so differentiation relies mostly on the plural 'sessions' vs. singular naming.
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' implies that this is the listing/filtering entry point for BGP sessions, which is useful contextual guidance. However, there is no explicit when-to-use, when-not-to-use, or reference to alternatives such as bgp_session_get for a single session or bgp_session_edit for modifications. The intended usage 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.
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: bits, monthly, hour, or day |
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 known. The description adds that the output is an image, but it does not disclose details like image format, response wrapping, or any other behavioral traits. 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 short sentences, front-loaded with the core action, and no filler. The alternative is mentioned in a single clarifying sentence, making the definition both concise and well structured.
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 tool with full schema coverage and safety annotations, the description tells an agent everything essential: what it produces (image), and what the alternative is for data (bill_graph_data). No critical details are missing 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 both bill_id and graph_type are already documented in the schema. The description does not add parameter-level meaning beyond what the schema 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 clearly states a specific action and resource: 'Render a bill graph as an image.' It also distinguishes itself from the sibling bill_graph_data, which provides numbers, so an agent can immediately understand what this tool produces.
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 not to use this tool: 'For the underlying numbers rather than a picture, use bill_graph_data.' This clearly names the alternative and the condition for choosing it, leaving no ambiguity about tool selection.
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: bits, monthly, hour, or day |
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 and side-effect profile is already known. The description adds no additional behavioral context such as data granularity, graph type implications, timezone handling, or output characteristics beyond what the schema and annotations already 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?
The description is a single compact sentence with no fluff, though 'from LibreNMS' is somewhat redundant given the tool context. It is front-loaded and efficient, but slightly thin in substance.
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 two-parameter tool with an output schema, the mechanics of invocation are covered by the schema and annotations. However, the description alone does not fully disambiguate this tool from the many related bill graph/history siblings, so completeness is 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 the two parameters are already adequately described in the input schema. The tool description itself contributes no extra parameter-level meaning, placing it at 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 uses a specific verb ('Get') and a clear resource ('bill graph data'), so an agent can tell it is a read operation for billing graph information. It does not explicitly differentiate itself from sibling tools like bill_graph or bill_history_graph_data, so it misses the top score.
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. Given many sibling graph tools such as bill_graph, bill_history_graph, and bill_history_graph_data, an agent has no stated selection criteria, exclusions, or hints about which one fits a given request.
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: bits, monthly, hour, or day | |
| history_id | Yes | Bill history ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context by specifying that the result is an image rather than raw data, which is especially valuable given there is no 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?
Two short sentences, no filler, and the core purpose is front-loaded. The alternative tool reference is placed second, making the guidance 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 simple, low-complexity tool with full schema coverage and safety-relevant annotations, the description is complete. It explains what the tool produces (an image), identifies the correct alternative when raw numbers are needed, and all required parameters are documented.
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 each parameter has a description, so the schema carries the param semantics. The description does not add extra meaning to bill_id, history_id, or graph_type, 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 clearly states 'Render a graph for a past billing period as an image', identifying the specific action, resource, and output type. It also distinguishes itself from bill_history_graph_data by noting the alternative is for underlying numbers rather than a picture.
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 not to use this tool: 'For the underlying numbers rather than a picture, use bill_history_graph_data.' This gives concrete routing guidance to the relevant sibling and clarifies the intended use case.
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 DataBRead-onlyIdempotent
Get bill history graph data from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | Bill ID | |
| graph_type | Yes | Graph type: bits, monthly, hour, or day | |
| 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?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description's 'Get' wording is consistent with the safety profile. The description adds no further behavioral context beyond that, such as how invalid IDs are handled or what data is actually returned, but the low bar set by the annotations is met.
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 with no filler or redundant elaboration. It is front-loaded and easy to parse, though it mostly restates the tool's name rather than adding substantial new 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?
Despite having annotations and a complete input schema, the description leaves too much unresolved for correct tool selection. The existence of closely related sibling tools and the lack of any clarifying context about the relationship between bill_id and history_id means an agent may not confidently choose 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 all three parameters (bill_id, history_id, graph_type) are already documented in the schema. The description adds no additional semantic meaning, such as how the parameters interact or what the returned graph data represents, 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 specific verb ('Get') and resource ('bill history graph data') from LibreNMS, making the basic purpose clear. However, it does not differentiate this tool from closely named siblings such as bill_graph_data, bill_history_graph, and bill_history, so the purpose is clear at a surface level but not fully disambiguated.
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 its many siblings. There is no mention of prerequisites, typical use cases, or when to prefer bill_history_graph_data over bill_graph_data or bill_history_graph.
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 DevicesBDestructive
Add devices to a device group in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name | |
| 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?
The annotations already declare readOnlyHint=false and destructiveHint=true, signaling mutation and potential destructiveness. The description does not add details about what exactly happens when devices are added, whether the operation overwrites existing members, or whether it is reversible. It adds no context beyond the annotations, so a mid-range score is appropriate; there is no contradiction between description and 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 concise single sentence that states the action and resource clearly. It contains no filler or redundant information. It could perhaps mention the payload format or a sibling contrast, but it is appropriately sized for a simple mutation 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?
The schema fully documents both parameters, and annotations identify the operation as destructive yet not read-only. However, the description does not state anything about the behavior of adding devices, such as whether duplicates are handled, whether the list replaces or appends, or what the response contains despite an output schema existing. For a simple write operation with full schema coverage, this is adequate but not rich.
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 covers 100% of both parameters with descriptions, so the baseline is 3. The description itself adds no parameter semantics beyond what the schema already provides. The payload format is documented in the schema, so the description does not need to compensate.
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 and resource: 'Add devices to a device group in LibreNMS.' It identifies the verb (Add), the resource (device group), and the object (devices). It is distinguishable from siblings like devicegroup_remove_devices and devicegroup_add, though it does not explicitly differentiate itself from those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as devicegroup_add, devicegroup_update, or devicegroup_remove_devices. The description gives no context about prerequisites, such as the need for an existing device group, or when adding devices is appropriate. The agent must rely on 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.
devicegroup_deleteDevicegroup DeleteADestructiveIdempotent
Delete a device group from LibreNMS by name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name 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 and idempotentHint=true, covering the key safety behaviors. The description itself adds no further behavioral context, such as cascade effects on group members or behavior when the group does not exist; the annotations carry the transparency burden.
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 with no filler. It front-loads the action and resource, then narrows the identifier method, making it quick and easy for an agent 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 simple one-parameter delete operation, the description is complete, especially given the destructive and idempotent annotations plus the presence of an output schema. Nothing essential for selecting or invoking the tool 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%, and the single 'name' parameter is already described as 'Device group name to delete'. The description's 'by name' wording reinforces the schema but adds no extra semantic detail, such as case sensitivity, required format, or uniqueness expectations.
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'), resource ('device group'), and identifier method ('by name'), clearly distinguishing it from sibling tools like device_delete or location_delete. It leaves no ambiguity about what action is performed.
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 description: use this when you need to delete a device group by name. However, it does not explicitly state when not to use it or mention alternatives, such as device_delete for devices or devicegroup_update for modifying a group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
devicegroup_devicesDevicegroup DevicesBRead-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 | |
| 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, destructiveHint=false, fully covering the safety profile. The description adds no behavioral context beyond the bare 'List' — it does not mention that full=true changes the return shape or that limit/offset control pagination, though those details live in the schema. With the bar lowered by annotations, the description still contributes nothing extra, so a modest score is warranted.
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 of eight words with zero waste, and the verb 'List' is front-loaded. There is nothing to trim, and the terseness is proportionate for a simple read 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?
The definition benefits from rich structured data: an output schema documents return values, annotations cover the safety profile, and the schema fully documents parameter semantics. The only notable gap is routing guidance between this and the large sibling set, especially devices_list and the devicegroup mutation tools. For a low-complexity read tool, this is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all four parameters (name, full, limit, offset) documented in the input schema, so the baseline 3 applies. The description itself adds no parameter detail, but none is needed since the schema carries the load. No enums or complex types require further explanation.
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 devices in a device group from LibreNMS.' The scoping 'in a device group' clearly sets it apart from a generic device listing, and the verb 'List' is unambiguous. It does not explicitly name sibling alternatives like devices_list or devicegroup_add_devices, 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 description provides no guidance on when to use this tool versus alternatives. It does not mention devices_list for unfiltered device queries, nor devicegroup_add_devices/remove_devices for membership modification. An agent must infer usage purely 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.
devicegroup_remove_devicesDevicegroup Remove DevicesADestructive
Remove devices from a device group in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name | |
| 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, so the safety profile is known. The description adds the specific target of the destructive action (device memberships are removed) but does not disclose reversibility, side effects on missing IDs, or what happens to the group. This is modest added context above 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 that front-loads the action and resource. Every word contributes to the core purpose, with no filler or repetition.
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 annotations cover parameters, payload format, and destructive nature, and an output schema exists. The description is adequate but leaves usage-vs-alternatives and behavioral nuances unaddressed, making it minimally complete rather than fully self-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%, with both parameters documented (name and payload format). The tool description itself adds no parameter detail, so per the high-coverage baseline a 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 ('Remove') and a clear resource ('devices from a device group') and scopes it to LibreNMS. This distinguishes it from siblings like devicegroup_add_devices and devicegroup_delete, so an agent can identify its role immediately.
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 alternatives. It does not mention devicegroup_add_devices, devicegroup_delete, or any conditions or preconditions, leaving the agent to 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.
devicegroup_set_maintenanceDevicegroup Set MaintenanceCDestructiveIdempotent
Set maintenance for a device group in LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Device group name | |
| 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 readOnlyHint=false, idempotentHint=true, and destructiveHint=true. The description adds no additional behavioral context, such as what gets destroyed or overwritten, whether existing maintenance windows are replaced, or what side effects the maintenance mode has. With a destructive mutation, the description should provide more transparency beyond the bare action phrase.
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 that immediately identifies the tool's purpose. There is no redundant wording or repetition of the schema details.
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 destructive annotation and the existence of sibling maintenance tools, the description is too thin. It does not explain what 'set maintenance' means operationally, whether the window replaces existing maintenance, or how this differs from device-level or location-level maintenance. The payload schema covers parameter formats well, but the overal semantics and operational context are 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 input schema already documents name and payload fields including formats, optionality, and defaults. The description itself adds no parameter semantics, but the baseline of 3 applies because the schema carries the full burden successfully.
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') on a specific resource ('device group') within LibreNMS, so an agent can tell it is a maintenance-window mutation for device groups. However, it does not explicitly distinguish it from the sibling tools device_set_maintenance or location_set_maintenance, so it misses some 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?
There is no guidance on when to use this tool versus device_set_maintenance or location_set_maintenance. The description does not state prerequisites, such as needing an existing device group, nor whether this should be preferred for group-level maintenance. The agent is left to infer usage 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.
devicegroups_listDevicegroups ListARead-onlyIdempotent
List all device groups from LibreNMS.
Returns: dict: The JSON response from the API.
| 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 that this is a list operation against LibreNMS and returns a dict, but does not discuss pagination behavior despite the limit/offset parameters, nor any auth requirements. 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?
The description is short and front-loaded, stating the core purpose in the first sentence. The 'Returns: dict: The JSON response from the API' section is somewhat redundant and adds little value, but the overall structure remains 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 read-only list tool with an output schema, annotations, and fully documented pagination parameters, the description is mostly complete. It could explicitly warn that 'all' is constrained by the default limit and offset, but the schema already provides that information.
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 limit and offset already in the input schema. The tool description adds no additional parameter context. The baseline of 3 is appropriate because the schema carries the parameter documentation 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: 'List all device groups from LibreNMS.' This clearly identifies the operation and differentiates it from sibling tools like devicegroup_add, devicegroup_update, and devicegroup_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?
The description gives no guidance on when to use this tool versus alternatives. It does not mention that this is for listing all groups, while other tools handle creation, updates, deletion, or membership queries. An agent must infer usage from the name and schema.
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 | |
| 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 communicate destructive and non-read-only behavior, so the description's short 'Update' statement is acceptable. The payload schema separately implies patch-like semantics via 'Patchable fields,' but the description itself adds no additional behavioral context about what changes or side effects may occur. 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. It is concise and to the point, though it could have used extra space to clarify 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?
With a rich input schema and annotations, the description is minimally adequate, but it lacks guidance on prerequisites, how the update affects existing device assignments, or when this tool should be preferred over related devicegroup operations. The presence of an output schema means return values need not be covered.
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 the schema already documents both parameters, including the patchable fields inside the payload object. The tool description itself adds no parameter-level meaning, so a 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 specific verb and resource: 'Update a device group in LibreNMS.' It clearly distinguishes from sibling tools like devicegroup_add and devicegroup_delete, though it does not elaborate on what kinds of updates are supported within the description itself.
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 alternatives such as devicegroup_add_devices, devicegroup_remove_devices, or devicegroup_set_maintenance. There are no explicit conditions, exclusions, or alternative routing.
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.
| 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 declare readOnlyHint true, idempotentHint true, and destructiveHint false, so the safety profile is fully covered. The description adds no behavioral detail beyond the annotations, but it also does not contradict them; it is minimally acceptable given the annotation coverage.
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 that states the operation, the resource, and the lookup key with no filler or repetition. 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 two-parameter read-only getter, the description is complete: the parameters are fully documented in the schema, the annotations cover safety, and an output schema exists to define return values. 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 description coverage is 100%, so the schema already fully documents hostname and ifname. The description reinforces that ifname is the interface name, but it does not add meaning beyond the schema—matching the baseline 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 ('Get'), a clear resource ('port info'), and a precise scope ('for a device by interface name'). It is unambiguous on its own but does not explicitly differentiate itself from sibling tools like device_ports or port_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?
The phrase 'by interface name' implies the tool is used when you have both a device hostname and an interface name, but it gives no explicit when-to-use or when-not-to-use guidance and names no alternatives. The usage context is present but only implied.
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 UpdateBDestructiveIdempotent
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: Custom display name - 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 indicate readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the mutation and destructive potential are disclosed structurally. The description's 'Update' is consistent with those annotations but adds no additional behavioral context, such as consequences of setting disabled/ignore or patch semantics. This meets the minimum bar given annotations carry the safety profile.
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. It is concise, though slightly underspecified for a destructive update tool; this is a completeness issue rather than a conciseness failure.
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 rich input schema, output schema, and annotations cover most call mechanics, so the description does not need to explain return values or every field. However, it omits usage guidance, patch/replacement semantics, and explicit warnings about destructive effects, making it adequate but incomplete for a tool with this 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?
Schema description coverage is 100%, and the payload property already documents all patchable fields and their meanings. The description adds no parameter-level detail, 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 clear verb and resource: 'Update device fields in LibreNMS.' It is not a tautology and conveys that this tool modifies device attributes. It does not explicitly differentiate from sibling tools like device_rename or device_set_maintenance, 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 description provides no guidance on when to use this tool versus alternatives such as device_add, device_rename, or device_set_maintenance. There are no exclusions, prerequisites, or context clues about choosing this over sibling tools.
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 DeleteADestructiveIdempotent
Delete a location from LibreNMS by identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Location identifier |
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, so the safety profile is covered. The description itself does not add context about consequences such as irreversible removal or restrictions when a location is in use, 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?
A single front-loaded sentence with no filler. Every word contributes to identifying the action, target, and lookup method.
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 delete operation with annotations covering destructive/idempotent behavior and an output schema present, the description is nearly sufficient. It only lacks explicit notes about deletion constraints or irreversible effects, which are already hinted by the destructive annotation.
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%: the single required 'location' parameter is already described as 'Location identifier'. The description's 'by identifier' repeats this without adding format, source, or lookup guidance, so it meets the baseline but adds no 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 uses a specific verb 'Delete' with a clear resource 'a location from LibreNMS' and the method 'by identifier'. This cleanly distinguishes it from sibling tools such as location_get, location_add, and location_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?
No guidance is provided about when to choose this tool over alternatives or when deletion is not appropriate. The description states only the operation, leaving the agent to infer usage from the sibling list and annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
location_editLocation EditBDestructiveIdempotent
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 identifier or name |
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 state. Annotations mark the tool as destructive, idempotent, and not read-only, but the description does not explain what gets modified, whether updates are partial, or any operational implications.
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 directly communicates the action and target resource 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?
For a two-parameter tool with a rich input schema and an output schema, the description is minimally adequate but not fully self-sufficient. It omits when to use the tool and what the destructive/idempotent behavior means in practice, leaving the agent to rely mostly on names and 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?
The schema already documents both parameters with 100% coverage, including the payload's patchable lat/lng fields. The description adds no additional parameter meaning beyond naming the operation, 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 ('Edit'), resource ('location'), and system ('LibreNMS'), making the core operation clear. It is distinguishable from siblings like location_add and location_delete by verb, though it does not explicitly contrast itself 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 on when to use this tool vs. alternatives such as location_add, location_delete, or location_set_maintenance. No exclusions, prerequisites, or context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
location_getLocation GetBRead-onlyIdempotent
Get a specific location from LibreNMS by identifier.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | Location identifier 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 covered. The description adds no further behavioral context such as error behavior, required permissions, or return characteristics, and it merely restates the 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?
The description is a single, front-loaded declarative 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?
For a one-parameter read tool with an output schema and read-only/idempotent annotations, the description is nearly complete. A pointer to locations_list for enumeration would strengthen it, but nothing critical is missing for correct invocation of this simple 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?
The schema fully documents the single parameter as 'Location identifier or name', and the description's 'by identifier' adds little beyond that. With 100% schema description coverage, a 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 names the operation ('Get'), the resource ('location'), and the scope ('specific ... by identifier'), making the tool's purpose clear. It does not explicitly name sibling tools like locations_list or location_delete, but the word 'specific' already signals that this is for retrieving one item rather than listing all.
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 this tool is for fetching one known location by identifier rather than enumerating or modifying locations. However, it does not explicitly state when to use this tool over locations_list or location_delete, and no exclusions or alternatives are mentioned.
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 MaintenanceAIdempotent
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 identifier 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 cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds the meaningful behavioral fact that the operation is broad-impact, affecting ALL devices in the location. However, it does not disclose whether an existing maintenance window gets overridden or how the operation interacts with active maintenance, though these are minor given the idempotentHint.
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 — 'Set maintenance mode for all devices in a location' — with zero filler or redundancy. Every word earns its place, conveying the verb, resource, and scope in under ten 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?
The total package is strong: a rich 100%-covered schema detailing formats and defaults, an output schema, and consistent annotations describing the mutation profile. The description's brevity is mostly sufficient, though it could have named the sibling alternatives for maintenance scoping, leaving that differentiation to inference from tool names.
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 schema itself documents the required duration in 'H:i' format, optional title/notes/start fields, and the start default of now. The description adds no parameter-level meaning beyond what the schema provides, 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 ('Set') and resource ('maintenance mode') with an explicit scope ('all devices in a location'), which clearly differentiates it from sibling tools device_set_maintenance and devicegroup_set_maintenance operating at different levels. An agent can immediately recognize this as the location-wide variant of the maintenance operation.
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 scope statement implies usage — an agent targeting all devices in a location should pick this tool — but the description never names alternatives or states when not to use it. Routing relies on the naming pattern (location_ vs device_ vs devicegroup_set_maintenance) rather than explicit guidance.
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 AlertlogARead-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 | Yes | Device hostname or ID | |
| 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 read-only, idempotent, and non-destructive behavior. The description adds only modest behavioral context by framing the call as device-scoped log retrieval; it does not describe ordering, filter semantics, or anything unusual, but 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 front-loaded sentence with no filler or repetition. It is concise, though it is also minimal enough that it leaves usage and differentiation to 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 read query with full schema coverage, an output schema, and read-only annotations, the short description is mostly sufficient. The main missing piece is sibling disambiguation (e.g., vs alerts_get or logs_eventlog), which prevents a 5.
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 (limit, start, from_ts, to_ts, hostname, sortorder) are fully documented in the input schema. The description itself adds no parameter-level meaning, but the schema carries the 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'), resource ('alert logs'), and scope ('for a device'), so an agent can identify what the tool does. It doesn't explicitly contrast with alert_get_by_id, alerts_get, or the other logs_* siblings, so it stops 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 phrasing implies the tool is for historical alert logs scoped to one device, which gives the agent a reasonable usage context. However, it does not state when to choose it over alerts_get/alert_get_by_id or mention any exclusions or alternatives.
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 EventlogARead-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 | Yes | Device hostname or ID | |
| 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 covered. The description adds 'for a device from LibreNMS' as extra context, but does not disclose behavioral details such as pagination defaults, time-filter semantics, or sort behavior beyond what structured fields already 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?
The description is a single, front-loaded sentence with no filler or redundant restatement. It communicates the core purpose efficiently and is easy for an agent 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 that the input schema fully documents all six parameters, an output schema exists, and annotations cover the read-only, idempotent, non-destructive behavior, the brief description is complete. No critical information needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter has a descriptive comment, so the baseline is 3. The description itself adds no parameter-specific meaning, but the schema already carries that burden adequately.
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 clear resource ('event logs') and scope ('for a device'), and identifies the source system (LibreNMS). This distinguishes it from sibling log tools like logs_syslog or logs_authlog by naming the event-log resource.
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 of retrieving event logs for a device, giving some context, but provides no explicit guidance on when to choose this tool over sibling log tools, nor any exclusions or alternatives. Selection criteria are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logs_syslogLogs SyslogBRead-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 | Yes | Device hostname or ID | |
| 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 covered. The description adds no behavioral context beyond the factual resource and scope, but it also does not contradict the annotations. No annotation 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?
The description is one short sentence with no filler, front-loading the verb and resource. Every word contributes: 'Get syslogs for a device from LibreNMS' is minimally sufficient at this level.
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, an output schema, and read-only/idempotent annotations, the description covers the operational essentials for calling the tool. It is slightly less complete than ideal because it does not hint at pagination/time-filter behavior or differentiate from the similarly named sibling, though these are inferable from the 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?
Schema description coverage is 100%, and each parameter has a clear description and default. The tool description does not need to restate parameter details; the baseline 3 applies because the schema 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 ('Get'), a distinct resource ('syslogs'), and a scope ('for a device'), which clearly identifies what the tool does. It does not explicitly contrast itself with sibling log tools like logs_syslogsink, so it stops 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?
There is no guidance about when to use this tool versus logs_eventlog, logs_alertlog, logs_authlog, or logs_syslogsink. The phrase 'for a device' weakly implies device-scoped syslog retrieval, but no exclusions or alternative conditions are stated.
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 ListARead-onlyIdempotent
List all OSPF instances from LibreNMS.
Returns: dict: The JSON response from the API.
| 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 scope that this returns all OSPF instances and that the response is a dict from the API, but does not disclose pagination behavior or any other operational traits.
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 short and front-loaded with the core purpose. The 'Returns' section adds marginal value since an output schema exists, but the overall structure is clean and economical.
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 two optional, well-documented parameters, the description covers the essential behavior. However, it lacks any mention of pagination caveats or how this relates to similarly named OSPF tools, which 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 both limit and offset clearly documented in the schema. The description adds no additional meaning to 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 clearly states the action ('List') and the resource ('all OSPF instances from LibreNMS'). This distinguishes it from related sibling tools like ospf_ports, which targets OSPF ports rather than instances.
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 ospf_ports or vrf_list. It simply announces what the tool does, leaving selection entirely to the agent's inference.
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.
Returns: dict: The JSON response from the API.
| 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?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds minimal behavioral context ('List all') and a redundant return type, but does not mention pagination implications or the fact that the default limit is 100, so it does not fully clarify behavior beyond the annotations and 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 main description is one concise, front-loaded sentence. The 'Returns' line adds little value because an output schema exists, but the overall text is still compact and not bloated.
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 with fully documented pagination parameters, an output schema, and safety annotations, the description is mostly complete. It lacks sibling usage guidance, but the essential invocation details are covered elsewhere.
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 already documented in the input schema. The description adds no additional 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 clearly names the action ('List') and the resource ('OSPF ports/interfaces from LibreNMS'), which is specific enough to distinguish it from generic port tools. However, it does not explicitly contrast with sibling tools like ospf_list or device_ports, so it falls just 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 versus alternatives such as ospf_list, ports_list, or device_ports. The description simply states what it does without offering any selection criteria or exclusions.
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 SearchARead-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) |
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 the scope of 'all' configs but does not disclose additional behavior such as case sensitivity, match semantics, or performance characteristics. This is acceptable 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?
The description is a single sentence with no filler. The action and resource are front-loaded, 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 simple search tool, the description, combined with the fully described parameters, existing output schema, and read-only annotations, covers everything an agent needs to select and invoke it correctly. No critical 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%, and each parameter (search, limit, offset) has a clear description. The tool description adds no extra semantic meaning beyond restating the search string concept, so it meets the baseline but does not go further.
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 ('Search') with a specific resource ('all Oxidized device configurations') and a clear object ('for a string'). The word 'all' distinguishes it from related tools like oxidized_config_get, which presumably retrieves a single device's config, making 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 description implies this tool is for searching across all device configs, but it does not explicitly state when to use it versus alternatives like oxidized_config_get or oxidized_list. Given the large sibling set, adding a note such as 'use when you need to find which configs contain a string; use oxidized_config_get for a specific device's config' would improve guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oxidized_listOxidized ListARead-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. 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 provide readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the domain context that these devices are tracked for config backup, but it does not disclose any behavioral details beyond that, such as pagination behavior or result 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?
The description is one focused sentence with no filler, front-loading the core action and resource. Every word contributes meaning, and there is no redundancy with the schema or annotations.
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 operation, the description, schema, annotations, and output schema together provide sufficient context. The description could be slightly more complete by mentioning that this is the go-to for Oxidized device inventory, 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 description coverage is 100% and all three parameters have clear descriptions in the schema. The description itself adds no additional meaning about parameters, so the baseline score of 3 is appropriate since 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 clearly states a specific verb ('List') and a specific resource ('devices tracked by Oxidized for config backup'), which distinguishes it from sibling tools like oxidized_config_get and oxidized_config_search. It also differentiates from the more general devices_list by specifying the Oxidized tracking 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?
The description implies usage when you need the list of Oxidized-tracked devices, which is clear enough. However, it does not explicitly state when to prefer this over sibling tools such as devices_list or oxidized_config_search, nor does it provide exclusions or alternative routing.
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.
Returns: dict: The JSON response from the 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, idempotentHint, and destructiveHint, so the safety profile is fully covered. The description adds that it returns the JSON response, but it does not add further behavioral detail such as error behavior or timeout expectations; the low bar for a no-parameter health check is still met.
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 short lines with no filler. The core purpose is front-loaded, and the return-type note is compact and 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?
For a zero-parameter, read-only health check with output schema and safety annotations present, the description is sufficient. Nothing important is missing for an agent 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 zero parameters, so there is nothing for the description to explain. Schema description coverage is effectively 100%, and the baseline for a no-parameter tool is 4.
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 explicitly states the verb 'ping' and the resource 'LibreNMS API', framing the tool as a health check. This clearly identifies what the tool does and separates it from the many sibling tools, none of which are API health checks.
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 'Simple API health check' gives clear context for when to use it: to verify API connectivity/health. It does not explicitly discuss exclusions or alternatives, but the tool's unique role and zero-parameter design make those less necessary.
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 GetARead-onlyIdempotent
Get poller group(s) from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| poller_group | Yes | Poller group identifier or 'all' |
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 operation read-only, idempotent, and non-destructive, and the description is consistent with that. The description adds no meaningful behavioral context beyond the annotations, but none is seriously needed for this simple getter.
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 directly names the action and target resource. 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?
For a one-parameter read-only getter with full schema coverage and an output schema, the description is sufficient. The input schema explains the only parameter, and annotations cover the 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 poller_group parameter is clearly documented as 'Poller group identifier or all'. The tool description itself does not add parameter-level detail, but the schema already provides the necessary 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 states a specific verb and resource: it gets poller group(s) from LibreNMS. It is clear and not a tautology, but it does not explicitly differentiate itself from sibling tools; however, no sibling tool appears to cover poller groups.
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, and it does not state prerequisites or exclusions. The intended usage is only implied by the tool name and parameter schema.
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.
Some LibreNMS releases fail to render through the per-port endpoint and answer 500 with an empty graph type in the message. For 'bits' this tool then falls back to the port-group endpoint, which renders the same traffic data, so callers still get a graph without needing a port ID.
| 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), 'errors', or 'etherlike' | bits |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool readOnly, idempotent, and non-destructive. Beyond that, the description discloses a real behavioral trait: certain LibreNMS releases return 500 on the per-port endpoint, and for 'bits' the tool transparently falls back to the port-group endpoint. This is valuable context that annotations cannot 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?
Three sentences, no filler. The purpose is front-loaded in the first sentence, and the following two sentences earn their place by explaining a non-obvious fallback. It is dense but not bloated.
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 8-parameter read-only graph tool with fully documented schema and no output schema, the description is complete: it states the image output, the scope, and the failure fallback. Nothing required 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 coverage is 100%, so the baseline is 3. The description adds parameter-specific value by explaining the behavior of graph_type='bits' (including fallback to the port-group endpoint), which is more than the schema's type list provides. Other parameters remain documented only by the schema, which is fine.
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 opens with a specific verb-resource pair: 'Render a per-port graph as an image', with 'interface traffic' as an example. It distinguishes from sibling graph tools by explicitly framing this as per-port and mentioning the port-group endpoint as a fallback, so an agent can tell it apart from port_group_graph and device_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 gives clear context for when the tool is appropriate: per-port graphs, with a concrete fallback route when the per-port endpoint fails. It does not explicitly name sibling alternatives or say when not to use it, but the per-port framing and fallback note are enough to guide selection.
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 PortsARead-onlyIdempotent
List ports in a port group from LibreNMS.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Port group name | |
| 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?
The annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe read-only nature is covered. The description adds no new behavioral details such as output shape, pagination behavior, or error conditions, 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 one sentence with no filler or redundant content. The core operation and scope are front-loaded, 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 read-only listing operation, the description plus the fully documented schema, annotations, and available output schema provide enough context for an agent to select and call the tool correctly. No significant contextual 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?
Schema description coverage is 100%, so the description does not need to explain parameters. The name parameter's meaning ('Port group name') is already documented, and limit/offset have clear defaults and descriptions. The tool description adds no parameter context 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 ('List') and resource ('ports in a port group'), which clearly distinguishes this from sibling tools like ports_list (all ports) and port_get (single port). It also names the source system (LibreNMS), making the operation 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 context of operation is clear: it is the tool to use when you need the ports belonging to a named port group. However, it does not explicitly state when not to use it or point to alternatives such as ports_list, ports_search, or device_ports, so usage 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.
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 ListARead-onlyIdempotent
List port groups from LibreNMS.
Returns: dict: The JSON response from the API.
| 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?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds 'Returns: dict' which is redundant with the output schema and provides no additional behavioral context such as pagination behavior, default limits, or whether all port groups or only accessible ones are returned.
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 short and front-loaded with the core purpose. The Returns line is somewhat redundant given the output schema, but the overall size is appropriate and there is no unnecessary verbosity.
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 operation, the description is reasonably complete. Annotations cover the safety profile, the schema covers pagination parameters, and the output schema documents return values. It lacks usage guidance and behavioral detail, but the tool's simplicity keeps these gaps minor.
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 limit and offset parameters are fully documented in the input schema. The description does not add any extra parameter semantics, 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 clearly states 'List port groups from LibreNMS', using a specific verb ('List') and resource ('port groups'). This distinguishes it from sibling tools like port_group_list_ports, which lists the ports within a group, and port_group_add/remove, which mutate group membership.
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: call this when you want to see the available port groups. However, it provides no explicit guidance on when it should be preferred over alternatives, nor does it mention exclusions or related tools that might be more appropriate in certain scenarios.
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 ListBRead-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: Filter by device ID 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 and idempotentHint=true, covering the safety profile. The description adds the scope ('all ports from LibreNMS') and optional filtering, but does not disclose pagination behavior, defaults, or result-set characteristics beyond what the schema and output schema 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?
The description is a single compact sentence with no filler. The key action and scope are front-loaded, making it immediately parseable and appropriate in length.
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 listing tool, the schema, annotations, and output schema cover most operational details. However, the sibling list contains multiple port-related tools, and the description does not clarify when this global list is the right choice, leaving an agent to infer the boundaries.
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, query, and offset each documented. The description's 'optional filters' is generic and adds no 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: 'Get all ports from LibreNMS with optional filters.' It clearly indicates a global listing operation rather than a device-scoped one, though it does not explicitly contrast with sibling tools like ports_search or device_ports_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?
No guidance is given about when to use ports_list versus the many related siblings such as device_ports_get, ports_search, or port_get. The phrase 'all ports' hints at broad use, but there are no exclusions, alternatives, or selection criteria.
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 FieldARead-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 |
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, so the safety profile is established. The description adds the operation type and resource scope, but no deeper behavioral details such as matching behavior, pagination nuances, or result shape. No contradiction with annotations 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 one concise, front-loaded sentence that avoids filler and immediately communicates the core operation. It could be slightly more informative, but it is appropriately sized for a simple read-only 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?
Given the presence of a full output schema, complete parameter documentation, and safety-rich annotations, the description is sufficiently complete for a simple search operation. The only notable gap is the lack of explicit sibling differentiation, which is already covered in the usage dimension.
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 all four parameters, including field examples, limit, offset, and search term. The description does not add parameter-level meaning beyond what the schema already provides, 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 clearly states the action ('Search'), the resource ('ports in LibreNMS'), and the mechanism ('by specific field'). This is enough to distinguish it from broader siblings like ports_search and ports_search_mac, 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 phrase 'by specific field' implies the tool should be used when searching for ports by a known field such as ifAlias or ifDescr. However, the description does not explicitly state when to prefer this tool over ports_search, ports_search_mac, or port_get, leaving the routing partly 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_macPorts Search MacARead-onlyIdempotent
Search ports in LibreNMS by MAC address.
| Name | Required | Description | Default |
|---|---|---|---|
| mac | Yes | MAC address to search. Accepts multiple formats: 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 readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the scope 'ports in LibreNMS' but does not disclose additional behavioral details such as match semantics or whether partial MAC matches are supported. This 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 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 simple read-only search tool, the schema fully documents parameters, annotations cover safety, and an output schema exists. The main missing piece is explicit routing guidance against similar search tools, but the description is otherwise sufficient for an agent 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%, and the description adds no parameter meaning beyond what the schema already provides. The 'by MAC address' wording simply echoes the required 'mac' parameter description.
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 ('Search'), a specific resource ('ports in LibreNMS'), and a clear search criterion ('by MAC address'). This differentiates it from siblings like ports_list, port_get, and generic ports_search, which would not filter by 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?
The description gives no guidance on when to use this tool versus alternatives such as fdb_lookup, arp_search, or ports_search. It only restates the search capability, leaving the agent to infer when this specific tool is the right choice.
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.
Returns: dict: The JSON response from the API.
| 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 the read-only/idempotent/non-destructive safety profile, so the description only needs to add scoping context; it does note the LibreNMS source and JSON dict return. It does not disclose that the default limit is 100 or that 'all' is only achieved through pagination, which is a notable gap for a listing 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?
The description is short, front-loaded with the main behavior, and free of filler. The 'Returns' line is somewhat redundant given the output schema, but it is minor and does not hurt usability.
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 low-complexity, two-optional-parameter listing tool with full schema coverage, an output schema, and safety annotations, the description is sufficient for an agent to select and invoke it. The main omission, pagination behavior, is partially covered by the parameter descriptions but deserves more explicit mention.
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 already fully documented, so the description adds no parameter-level meaning. A baseline of 3 is appropriate because the schema carries the load and the description does not compensate.
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 all IP addresses') and a source system ('LibreNMS'), making the tool's core function clear. However, the 'routing' qualifier in the name is not explained and sibling tools such as port_ip_info, arp_search, and fdb_lookup are not differentiated, so it is not a fully distinctive definition.
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 for when to use this tool instead of related IP/address-oriented siblings, and there is no mention of pagination or scale considerations even though the schema includes limit and offset. The agent must infer usage entirely from the schema and context.
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 (defaults to device IP) - 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 declare destructiveHint=true, but the description merely says 'Add' without explaining whether adding overrides existing services, the return value, or other side effects. The description adds no behavioral context beyond the basic 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, direct sentence with no filler, and the core action is front-loaded. It is concise, though it sacrifices behavioral detail that would make it more helpful.
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 create operation with a nested payload and a destructive hint, the description is too thin. It leaves the agent to infer prerequisites, edge cases, and side effects from the schema and sibling names, making it incomplete for safe 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 coverage is 100%, and the payload parameter in the schema is detailed with field descriptions and an example. The tool description itself adds no additional 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?
The description uses a specific verb and resource ('Add a service for a device'), clearly indicating a creation action in LibreNMS. It is distinguishable from sibling tools like service_edit and service_delete, though it does not explicitly mention those 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?
The description provides no guidance on when to use this tool versus service_edit or when existing services might be affected. It does not mention prerequisites, such as the device needing to exist, or any conditions that would make an alternative tool preferable.
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 LinksBRead-onlyIdempotent
List all links from LibreNMS.
Returns: dict: The JSON response from the API.
| 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 fact that it returns 'the JSON response from the API' — which is low-value and somewhat obvious. No additional behavioral context (e.g., full-response format, no filtering) is provided beyond what annotations supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core action. The returns line adds minimal value but doesn't waste much space. It could be improved by stating that the JSON is returned as a dict, which it does — but that's close to trivial.
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 2-parameter list operation and rich annotations (read-only, idempotent), the description is mostly complete. However, it lacks any clarification of what 'links' means or how pagination behaves end-to-end, and the presence of an output schema reduces the need to describe return structure. Minor gaps keep it from being higher.
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 limit and offset are documented with defaults and descriptions in the schema. The tool description adds no new parameter semantics. Baseline 3 is appropriate since the schema fully handles 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?
The description states a clear verb and resource: 'List all links from LibreNMS.' This is serviceable, though 'links' is ambiguous in a network monitoring context (physical links, port links, etc.). From the sibling tools (device_links, switching_vlans) it can be inferred to be switching/LLDP-style links, but the description doesn't disambiguate on its own.
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 it lists all links, which signals a broad list operation. However, there is no explicit guidance on when to choose this over siblings like device_links or ports_list. The pagination parameters (limit/offset) imply list usage, but no alternatives or exclusions are mentioned.
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.
Returns: dict: The JSON response from the API.
| 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 the operation as read-only and idempotent, so the description does not need to repeat that. However, the description says 'List all VLANs,' yet the parameters include limit and offset, implying pagination; this behavior is not disclosed. The return type note adds little value beyond the 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 description is very short and front-loaded with the core action. The returns line is somewhat generic and redundant given the output schema, but overall there is no filler 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?
While annotations and output schema cover safety and return shape, the description omits important usage context. It does not clarify pagination behavior despite claiming to list 'all' VLANs, and it does not distinguish itself from the similar sibling device_vlans. An agent may still invoke it correctly for the first page, but the 'all' wording is misleading without pagination guidance.
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 clear descriptions for limit and offset, including defaults and value ranges. The description adds no additional parameter semantics, but none are needed 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 operation: 'List all VLANs from LibreNMS.' The word 'all' suggests a global scope, which helps differentiate it from the sibling device_vlans that lists VLANs for a specific device. However, it does not explicitly name the sibling or state 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 guidance is given about when to use this tool versus alternatives. It does not mention that device_vlans should be used for per-device VLAN listing, nor does it explain any prerequisites or context. The intended use case is only implied by the name and short description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system_infoSystem InfoBRead-onlyIdempotent
Get system info from LibreNMS.
Returns: dict: The JSON response from the 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 safety profile is covered. The description adds only that the response is a dict/JSON from the API, which is minor but not contradictory. It does not disclose additional behavioral details like authentication needs or what 'system info' includes.
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 and front-loaded with the core purpose. The additional return-type line is brief and adds useful information without bloating the 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 zero-parameter, read-only tool, the description is mostly sufficient. However, it lacks any guidance on what 'system info' encompasses or when to select this over other getter tools, so an agent may not fully understand its scope of applicability.
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 zero parameters and 100% schema description coverage, so there are no parameter semantics for the description to clarify. With no parameters, a baseline of 4 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 operation as retrieving system info from LibreNMS, using a specific verb and resource. It does not explicitly differentiate from sibling tools, but 'system info' is distinct enough from the many alert/device/port getters in the sibling 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 provided about when to use this tool or how it relates to alternatives. The description only states what the tool does and gives no context about which scenarios call for system_info versus other list/get tools.
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.
Returns: dict: The JSON response from the API.
| 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 and idempotentHint=true, so the safety profile is covered. The description adds minimal behavioral context beyond the source ('from LibreNMS') and the return type, but does not disclose pagination behavior or other operational 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?
The description is short and front-loaded with the core purpose. The 'Returns: dict' line is somewhat redundant given the output schema, but it is not verbose or distracting.
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 annotations, a documented schema, and an output schema, the description is mostly sufficient. It could clarify pagination implications of 'all VRF instances' versus the limit/offset parameters, but the schema covers those details.
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 have descriptive comments with defaults. The description adds no parameter-level meaning, but the schema fully documents the parameters, 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: 'List all VRF instances from LibreNMS.' It is clear and unambiguous about what the tool does. However, it does not explicitly differentiate itself from sibling tools, even though the VRF resource is unique among 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 gives no guidance on when to use this tool versus alternatives. It simply states the action with no mention of contexts, exclusions, or related tools that might be more appropriate.
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. Dates show when Glama detected each change.
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
Many tool clusters are easy to confuse: device_ports vs device_ports_get vs port_get, alerts_get vs alert_get_by_id vs alert_rule_get, port_fdb vs device_fdb vs fdb_lookup, and ports_search vs ports_search_field vs ports_search_mac all require careful reading to avoid misselection. The descriptions help, but at this scale the boundaries between similar tools are genuinely unclear.
Most names use snake_case with resource prefixes and readable verb placement, but conventions are mixed: plural list names like devicegroups_list collide with singular action names like devicegroup_add, and some tools are noun phrases like system_info or health_by_type. Overall it is fairly navigable but not pattern-predictable.
110 tools is an extreme number for a single MCP server, far beyond the typical well-scoped range and even beyond the 50+ extreme threshold. Even for a broad platform like LibreNMS, this creates a large selection burden and should be split into smaller domain-focused servers.
The surface is impressively broad, covering device lifecycle, alerts, alert rules/templates, bills, locations, ports, services, logs, and many network data views. Minor gaps exist such as no alert template delete, no port group deletion/update, and no explicit maintenance-clear tool, but these are workable rather than blocking.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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.
The official MCP Server for the Mux API
Related MCP Servers
- AlicenseCqualityCmaintenanceA Python-based MCP server that enables querying Cisco's Meraki Dashboard API to discover, monitor, and manage Meraki environments.2241MIT
- AlicenseNot gradedqualityBmaintenanceMCP 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
- FlicenseNot gradedqualityDmaintenanceMCP server for interacting with NetBox API, enabling users to query and manage NetBox resources such as devices through natural language.-
- AlicenseNot gradedqualityDmaintenanceMCP server for LibreNMS network monitoring — query devices, alerts, sensors, ports, and more through AI assistants like Claude.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mhajder/librenms-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server