MikroMCP
MikroMCP turns MikroTik RouterOS into an AI-native MCP server, enabling AI agents to inspect, diagnose, and safely manage routers through ~77 structured tools.
System Management: Retrieve system status (CPU, memory, identity, license, health sensors), manage the clock, reboot devices, and execute guarded RouterOS console commands via SSH.
Interfaces & IP: List and manage network interfaces (Ethernet, VLANs, bridges, WiFi, WireGuard), IP addresses, and bridge ports.
DHCP & DNS: Manage DHCP servers, pools, and leases; manage static DNS records and read resolver settings.
Firewall & Policy: Inspect and manage firewall filter, NAT, and mangle rules, address lists, and IPSec peers/policies.
Routing: Manage static routes, policy routing rules, and custom routing tables; view BGP peer and OSPF neighbor states.
Security & Users: Manage certificates and local RouterOS user accounts.
QoS, HA & Monitoring: Manage simple queues, VRRP instances, Netwatch entries, and read SNMP/NTP settings.
Diagnostics: Run ping, traceroute, and torch from the router; filter system logs; discover neighbors via CDP/LLDP/MNDP; view ARP table.
Automation: Manage and execute RouterOS scripts, scheduled jobs, packages, containers, and files.
Safe Change Management: Preview changes with dry-run, plan/apply/rollback workflows with journaling, idempotent writes, and confirmation tokens for destructive actions.
Fleet Operations: Health-check individual routers and bulk-execute tools across multiple routers in parallel by ID or tag.
Production Features: RBAC, bearer tokens, per-router credentials, TLS, audit logging, circuit breakers, retry policies, rate limiting, and maintenance windows.
Provides tools for managing and automating MikroTik RouterOS devices, including system status, network operations, firewall, routing, diagnostics, and change management.
MikroMCP
AI-native network automation for MikroTik RouterOS and SwOS. MikroMCP exposes RouterOS routers and SwOS switches as a typed, auditable Model Context Protocol server so Claude, Cursor, Codex, and other MCP clients can inspect, diagnose, and safely operate MikroTik gear in natural language.
MikroMCP exists because raw router CLI access is the wrong abstraction for AI agents. RouterOS is powerful, but asking an LLM to improvise shell commands against production network gear is risky. MikroMCP gives agents a controlled tool surface: strict schemas, idempotent writes, dry-run previews, per-router circuit breakers, retry policies, RBAC, audit logs, snapshots, and rollback-aware change workflows.
In one sentence: MikroMCP turns MikroTik RouterOS into a production-minded MCP control plane for AI infrastructure, DevOps automation, and modern router management.

Quick Start
That's the whole setup for a single-router stdio deployment. For standalone binaries, Docker, HTTP/SSE mode, the RouterOS API prerequisites, and the full 15-minute walkthrough, see the Getting Started guide.
Related MCP server: RouterOS MCP Server
Feature Showcase
Category | What MikroMCP covers |
๐งญ Router management | System status, clock, reboot, packages, files, scripts, scheduler jobs, containers |
๐ Network operations | Interfaces, VLANs, IP addresses, DHCP leases, DNS static records, bridge ports, WiFi clients |
๐ฅ Firewall and policy | Filter/NAT rules, mangle rules, address lists, route tables, routing rules |
๐ฐ๏ธ Routing visibility | Static routes, routing tables, BGP peers, OSPF neighbors |
๐ SwOS switches | Experimental. MikroTik SwOS and SwOS Lite switches ( |
๐ Secure access | HTTP bearer auth, bcrypt token hashes, RBAC, router/tool restrictions, confirmation tokens |
๐งช Diagnostics | Router-originated |
๐ก๏ธ Change safety | Dry-run, idempotent writes, snapshots, write journal, |
โ๏ธ Production behavior | Retries for read tools, per-router circuit breakers, correlation IDs, structured logs, audit logs |
๐ค AI-agent fit | Human-readable responses plus structured JSON content for reasoning, chaining, and automation; server advertises an |
๐งฉ MCP compatibility | stdio for desktop clients, Streamable HTTP and legacy SSE for remote or service-style clients |
133 typed tools in total โ browse the full catalog with parameters, defaults, and copy-paste example prompts in Available Tools.
Demo
Usage
Review by Claude

Real-World Usage Examples
Router Inspection
Use MikroMCP to inspect core-01. Summarize system resources, RouterOS version,
running interfaces, active routes, DNS settings, and recent warning/error logs.
Flag anything that looks operationally risky.Firewall Management
List firewall filter and NAT rules on edge-01. Identify disabled rules,
overlapping port forwards, broad accept rules, and anything without comments.
Do not change anything yet.Safe Static Route Change
Dry-run a route on core-01 for 10.20.0.0/16 via 192.168.88.1 in the main table.
Show the exact planned diff and tell me whether an existing route conflicts.WireGuard Operations
Show WireGuard peers on branch-02. Sort by last handshake age and flag peers
that have not handshaken recently or have no transfer counters.Interface Diagnostics
Check interface health on edge-01, then run ping and traceroute from the router
to 1.1.1.1. If packet loss is present, use torch on the WAN interface for a
short traffic snapshot.Plan / Apply / Rollback Workflow
Create a change plan that adds a DNS record and a firewall address-list entry
on edge-01. Use dry-run first, explain the plan, then wait for approval before
applying anything.Why MikroMCP Is Useful For AI Agents
MCP gives LLMs a standard way to call tools. MikroMCP makes RouterOS a high-quality MCP target by turning network operations into well-described, machine-readable, permission-aware actions.
AI assistants can use MikroMCP to:
Investigate router state without memorizing RouterOS command syntax.
Chain tool calls across interfaces, routes, firewall rules, logs, and diagnostics.
Return both operator-friendly summaries and structured JSON for follow-up reasoning.
Preview changes before mutation and explain exactly what would happen.
Respect tool-level authorization, router scoping, maintenance windows, and confirmation gates.
FAQ
What is MikroMCP?
MikroMCP is an open-source Model Context Protocol (MCP) server that exposes MikroTik RouterOS as 133 typed, auditable tools โ letting AI assistants inspect, diagnose, and safely operate routers in natural language instead of improvising CLI commands.
MikroMCP vs RouterOS API
The RouterOS REST/API exposes raw endpoints. MikroMCP wraps them in schema-validated, idempotent, dry-run-able tools with RBAC, audit logging, snapshots, and rollback โ the safety layer an LLM needs before it touches production gear.
MikroMCP vs SSH automation
Instead of brittle SSH scripts that screen-scrape CLI output, MikroMCP returns structured, typed results with confirmation gates and per-router circuit breakers. SSH is used only where REST can't reach โ ping and guarded run_command.
MikroMCP for Claude Code
MikroMCP speaks MCP over stdio and HTTP/SSE, so Claude Code and Claude Desktop drive RouterOS directly. Pair it with the bundled usage skill for safe, guided workflows.
MikroMCP for Codex
Codex connects to MikroMCP over the standard MCP protocol โ see Connecting to AI Assistants.
MikroMCP for Cursor
Cursor connects to MikroMCP as an MCP server (stdio or HTTP) to inspect and manage MikroTik routers without leaving the editor.
MikroMCP for OpenClaw
Any MCP-compatible client โ OpenClaw included โ can use MikroMCP; configure it as a stdio or HTTP MCP server.
RouterOS AI Automation Guide
Start with Getting Started to install and connect, then use the usage skill and Available Tools to automate RouterOS safely with an AI assistant.
Best MCP Servers for Network Engineers
MikroMCP is purpose-built for MikroTik/RouterOS operations with production-grade safety โ dry-run, rollback, audit, and RBAC โ making it a strong MCP choice for network engineers adopting AI tooling.
Documentation
The README stays intentionally short. Everything below is documented in depth in the wiki:
Resource | Use it for |
Install (npm, binary, Docker), configure, and connect in 15 minutes | |
Enable the REST API, create a user, TLS and firewall | |
Router registry, credentials, all environment variables | |
Run commands, HTTP/SSE transport, troubleshooting | |
Register MikroMCP in Claude Desktop | |
Claude Code, Cursor, Codex, HTTP/Docker/systemd | |
Install the MikroMCP usage skill so your assistant drives the tools safely | |
All 133 tools โ parameters and example prompts | |
System layers, request pipeline, auth model | |
Error categories, retry engine, circuit breaker | |
Threat model, hardening checklist, vulnerability reporting | |
Project structure, tests, MCP Inspector workflow | |
Adding tools, coding conventions, PR checklist | |
Shipped milestones and guiding principles |
Contributing
Issues, bug reports, tool requests, documentation improvements, and pull requests are welcome.
Good first contributions:
Add a read-only tool for an uncovered RouterOS surface.
Add screenshots, demo GIFs, or topology diagrams.
Expand tests around RouterOS response normalization and idempotency edge cases.
Help validate RouterOS version compatibility across real MikroTik devices and CHR.
Development standards:
TypeScript strict mode, ESM imports with
.jsextensionsZod schemas with
.strict(), idempotency anddryRunfor write toolsMikroMCPErrorfor domain errors, focused Vitest coverage for every tool
Please open an issue before large changes so maintainers can align on scope.
Acknowledgements
@f0086 โ SwOS / SwOS Lite switch support (v1.9.0), which took MikroMCP beyond RouterOS for the first time.
@karamble โ full SwOS support (v1.14.0): the full-SwOS dialect, whole-switch config apply, backups, firmware upgrades, password changes and switch-bound secrets.
Security
MikroMCP controls real network devices โ treat it like an operations system: least-privilege RouterOS users, verified TLS (or pinned fingerprints), credentials only in ~/.mikromcp/.env, scoped RBAC identities, and audit logging for shared use. The full hardening checklist and vulnerability-reporting process are on the Security page.
Community And Support
โญ Star the repository if MikroMCP helps your MikroTik or MCP workflow.
๐ด Fork it to add RouterOS surfaces your network depends on.
๐งต Open an issue for bugs, feature requests, compatibility notes, or documentation gaps.
License
MikroMCP is released under the MIT License.
Available Tools
133 toolsapply_planApply PlanADestructive
Execute write operations in order, stopping on first failure. Each step is snapshotted and journaled individually. Non-admin identities need a confirmationToken (same two-step flow as other destructive tools). Undo individual steps via rollback_change with the returned journal IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Ordered list of write operations to apply in sequence | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: ordered execution, halt-on-first-failure (consistent with idempotentHint=false, since partial application is non-repeating), per-step snapshot/journal creation, the confirmationToken requirement for non-admin callers, and the rollback path. Nothing contradicts the destructiveHint/readOnlyHint declarations.
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 tight sentences, zero filler, ordered by importance: what execution means, how it's journaled, then the auth requirement and undo path. Every clause carries operational 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?
For a destructive batch tool with no output schema, the description covers the essentials: sequencing, failure behavior, auth prerequisites, and where the returned journal IDs go. It even hints at the return value (journal IDs) that the absent output schema would otherwise hide.
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 67%, and the schema already documents steps, its item shape and the routerId default. The description adds the key semantic that confirmationToken is a non-admin requirement, but the token's acquisition flow and routerId's effect are left to the schema. Adequate but not compensatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it executes an ordered batch of write operations. The failure semantics ('stopping on first failure') and per-step journaling make the operation concrete. It doesn't explicitly differentiate itself from siblings like plan_changes or bulk_execute, so an agent must infer the preview-then-apply relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage conditions: non-admin identities need a confirmationToken, and individual steps are undone via rollback_change. The phrase 'same two-step flow as other destructive tools' signals prior token acquisition. What's missing is an explicit statement that plan_changes should be called first to preview the plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_swos_configApply SwOS ConfigADestructiveIdempotent
Apply a switch config document (the format get_swos_config exports) to a SwOS switch. Plans every change against the switch first; dryRun defaults to true. Writes only the endpoints that change: the VLAN table grows first (new VLANs and members), then the per-port settings (VLAN, isolation, storm and flood control), port names/negotiation/enabled, LAG and SNMP, then the table shrinks (removed VLANs and members), then system โ so no port loses its VLAN mid-apply. Refuses management changes (address, allow-from) unless includeManagement is true, and any plan that would cut a linked port off (its untagged VLAN moved or dropped, a trunk losing tagged VLANs or becoming an access port, a forced VLAN, a port that starts filtering VLANs, the port disabled, renegotiating, isolated from another linked port or moved in or out of a LAG, every linked port dropped from allow_from_ports; only risks the plan introduces) unless acceptLockoutRisk is true. All six endpoints are snapshotted before a real apply, so rollback_change restores the previous state; the result names any endpoint whose snapshot failed, and says so when none was recorded. A document that moves management to another VLAN (allow_from_vlan) and changes a port's VLAN settings or the VLAN table's membership at the same time is refused, because that cannot be written in a safe order (sys.b goes last and cuts the session): apply the VLAN changes first, then the move. snmp.community may reference only the secrets bound to the switch (its secrets list in routers.yaml); a switch without a list may reference none.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | The switch config: a YAML document (as text) or the same structure as an object. `version: 1`, then any of `system`, `ports`, `vlans`, `snmp`; only the settings it names are changed. `snmp.community` may be `${NAME}`, replaced by the server's MIKROMCP_SECRET_<NAME> value; no other field may reference a secret. | |
| dryRun | No | Plan and show every change without writing to the switch. | |
| routerId | No | Router ID; omit to use the default router. | |
| pruneVlans | No | When the config has a `vlans` list, remove VLANs the switch has but the list does not. | |
| acceptLockoutRisk | No | Apply a plan whose warnings show a linked port being cut off (its VLAN, untagged traffic, link, isolation or LAG changing). Refused unless this is true; a dry run shows the warnings without it. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. | |
| includeManagement | No | Allow changes to how the switch is reached: address acquisition, static IP and the allow-from settings. Refused unless this is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructive/idempotent; the description adds the write ordering (VLANs first, table shrink last), the full list of lockout-risk conditions, the six-endpoint snapshot before a real apply, the rollback_change recovery path, the management-change refusal, the safe-order refusal for management moves, and the secrets binding rule for snmp.community.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense paragraph, but it is front-loaded with the core action and the dryRun default, and the chronological ordering gives it structure. Nearly every clause carries a distinct rule, so the length is justified by the tool's complexity, though the run-on semicolon chains hurt scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-risk, 7-parameter tool with no output schema, the description covers the missing surface: result reporting on snapshot failures, refusal conditions, secret scoping, ordering constraints, and the rollback path. An agent has everything needed to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning: the dryRun default, the refusal semantics behind includeManagement/acceptLockoutRisk, the confirmationToken approval flow, and that pruning/table shrink is tied to the vlans list. The parameter-to-behavior mapping is clearer here than in the schema alone.
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: 'Apply a switch config document (the format get_swos_config exports) to a SwOS switch.' It ties itself to its siblings get_swos_config (producer of the format) and rollback_change (which reverses it), so an agent can distinguish it without opening another 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?
Explicit when-to-use and when-it-refuses: dryRun defaults to true, includeManagement gates management changes, acceptLockoutRisk gates plans that cut off linked ports, and confirmationToken handles the APPROVAL_REQUIRED flow. It even gives ordering advice for the multi-step management-move case ('apply the VLAN changes first, then the move').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandwidth_testBandwidth TestARead-only
Run a RouterOS bandwidth test from the router to a remote host running a RouterOS btest server. Returns TX and RX throughput in Mbps. Duration capped at 20 seconds. Saturates the link โ not auto-retried.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Remote host running RouterOS btest server | |
| duration | No | Test duration in seconds (max 20) | |
| protocol | No | Test protocol | tcp |
| routerId | No | Router ID; omit to use the default router. | |
| direction | No | Test direction | both |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=true and destructiveHint=false, but the description adds critical context: the test saturates the link and is not auto-retried. This goes beyond the annotations, which already indicate safe behavior, to warn about real-world impact.
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 just two sentences. The first sentence states purpose and output, the second adds key constraints and warnings. Every word is necessary; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly includes return format. It covers the main behavioral traits (duration cap, link saturation, no retry). However, it does not mention error cases (e.g., if the remote host is not running a btest server). For a simple diagnostic tool, this is nearly 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?
All 5 parameters are documented in the schema (100% coverage). The description adds value by specifying that the tool returns TX and RX throughput in Mbps, which is not present in the input schema. No further parameter details are needed beyond what 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 clearly states the tool runs a RouterOS bandwidth test, specifies it tests from router to a remote host running a btest server, and returns TX/RX throughput. It distinguishes itself from sibling diagnostic tools like ping, traceroute, and torch by focusing specifically on bandwidth testing.
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 context about duration cap and link saturation, implying careful use, but does not explicitly state when to use vs. alternatives (e.g., ping for latency, traceroute for path). No exclusions or when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_executeBulk ExecuteADestructive
Fan out a single-router tool to many routers in parallel (up to concurrency), targeted by routerIds or tag. Write tools need two-step confirmation for every role: call without confirmationToken to get a fleet token, then re-call with it. Read-only tools fan out immediately. Writes snapshot+journal each router for rollback. Returns per-router results with succeeded/failed counts. To fan out a read-only tool, prefer bulk_read.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Target all routers with ALL of these tags (mutually exclusive with routerIds) | |
| params | Yes | Params to pass to the tool (omit routerId โ injected per router) | |
| toolName | Yes | Name of the tool to fan out (must be a single-router tool) | |
| routerIds | No | Explicit list of router IDs to target | |
| concurrency | No | Max simultaneous router calls | |
| confirmationToken | No | Fleet confirmation token from a prior APPROVAL_REQUIRED response. Required to fan out any write tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true/readOnly=false, but the description adds substantial context beyond them: the two-step fleet confirmation token flow, snapshot+journal per-router rollback, and the shape of the response (succeeded/failed counts). These are exactly the mutation-safety details an agent needs and that the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then sequences confirmation, rollback, return, and the alternative routing in tight sentences. Every sentence carries distinct information with no restatement of the name or title.
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 destructive, multi-target tool with no output schema, the description covers the targeting model, the confirmation requirement, rollback behavior, and return summary. Nothing an agent needs in order to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 still adds meaning by framing concurrency as the parallel fan-out cap, clarifying that targeting is by routerIds or tag, and explaining the confirmationToken round-trip. It does not add format/syntax beyond the schema, so it sits just above baseline.
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 ('fan out a single-router tool to many routers in parallel') and immediately bounds it ('targeted by routerIds or tag'). It explicitly names the sibling it is not for read-only cases ('prefer bulk_read'), so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing ('To fan out a read-only tool, prefer bulk_read') plus the write-path workflow (call without confirmationToken to get a fleet token, then re-call). The read-vs-write selection condition is fully spelled out with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_readBulk ReadARead-onlyIdempotent
Fan out a read-only single-router tool (list_*, get_* and others annotated read-only) to many routers in parallel (up to concurrency), targeted by routerIds or tag. Unlike bulk_execute, the server refuses every write tool and the traffic-generating diagnostics (ping, traceroute, torch, bandwidth_test) with BULK_READ_TOOL_NOT_READ_ONLY, and never needs a confirmation token, snapshot or journal โ so an MCP client can allow bulk_read without allowing fleet-wide writes. Use bulk_execute for anything else. Returns per-router results with succeeded/failed counts.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Target all routers with ALL of these tags (mutually exclusive with routerIds) | |
| params | Yes | Params to pass to the tool (omit routerId โ injected per router) | |
| toolName | Yes | Name of the read-only single-router tool to fan out (e.g. list_interfaces) | |
| routerIds | No | Explicit list of router IDs to target | |
| concurrency | No | Max simultaneous router calls |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: the specific BULK_READ_TOOL_NOT_READ_ONLY rejection code, the fact that no confirmation token, snapshot or journal is required, and the security rationale (an MCP client can allow it without allowing fleet-wide writes). This is exactly the extra behavioral disclosure expected when annotations carry the safety baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and the long second sentence is dense but each clause (refusals, no token, security implication, alternative) earns its place. Slightly overlong for a single block, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fan-out tool with no output schema, the description covers the essential concerns: targeting, parallelism, refusal semantics, and return shape (per-router results with succeeded/failed counts). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so toolName, params, routerIds, tags and concurrency are all documented in the schema. The description echoes targeting by routerIds or tag and the concurrency cap but adds no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: fan out a read-only single-router tool to many routers in parallel, and names the two targeting modes (routerIds or tag). It explicitly contrasts with the sibling bulk_execute, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use bulk_execute for anything else, and enumerates what bulk_read will refuse (write tools, ping, traceroute, torch, bandwidth_test). The when-to-use and when-not-to-use conditions are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_router_healthCheck Router HealthARead-onlyIdempotent
Probe a device: RouterOS routers via system/resource, SwOS switches via sys.b. Returns health status, firmware version, uptime, and (RouterOS only) CPU load and memory info. Unlike other tools, this never throws โ unreachable devices are reported as healthy=false.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds valuable behavioral context: 'never throws' and the unreachable-device handling (reported as healthy=false), plus the distinction between RouterOS and SwOS. This goes beyond annotations without contradiction, though it doesn't cover auth or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary action, and every clause adds value (device types, return fields, and the non-throwing behavior). No redundancy or fluff; it is efficiently 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 tool with one optional parameter and no output schema, the description sufficiently covers what the tool does, what it returns, and its failure mode. It also clarifies platform-specific differences in returned data, making it complete for the given 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 coverage is 100% since the only parameter, routerId, has a clear description ('Router ID; omit to use the default router'). The description does not add any additional semantics beyond 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 clearly states the tool's action: 'Probe a device' with specific protocols (system/resource, sys.b) and explicitly lists the returned fields (health status, firmware version, uptime, CPU load, memory info). It distinguishes itself from siblings by mentioning 'Unlike other tools, this never throws,' making its unique behavior 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 implies usage via 'Probe a device' and its focus on health, but it does not explicitly state when to use this tool over alternatives, nor does it name specific sibling tools. The 'Unlike other tools' hint suggests robustness as a differentiator, but exclusions or alternative recommendations are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_backupCreate BackupADestructive
Create a binary configuration backup on a MikroTik router. The backup is saved as .backup on the router's filesystem. To encrypt it, prefer passwordSecret (a MIKROMCP_SECRET_ bound to the router in routers.yaml โ the password never reaches the conversation) over a literal password. Dry run checks that the secret resolves.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Backup file name (without extension) | backup |
| dryRun | No | Preview the backup without creating it | |
| password | No | Literal password to encrypt the backup. It stays in the conversation history; prefer passwordSecret | |
| routerId | No | Router ID; omit to use the default router. | |
| passwordSecret | No | Encrypt with the server's MIKROMCP_SECRET_<NAME> value, bound to this router by its secrets list in routers.yaml. The value never reaches the conversation | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is covered. The description adds genuinely new behavior: the artifact lands as <name>.backup on the router filesystem and dry run only validates secret resolution rather than creating anything โ context the 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 tight sentences with no filler: the action, the output artifact, then the encryption preference with dry-run behavior. The most decision-critical constraint (secret over literal password) 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?
For a destructive zero-required-param mutation with a fully documented schema and no output schema, this is nearly complete. The one gap is that it doesn't flag overwrite risk if <name>.backup already exists on the router filesystem, which matters for a destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds decision-relevant semantics by stating a preference ordering between password and passwordSecret and explaining that the secret value never enters the conversation, which is more than the per-field descriptions convey on their own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a binary configuration backup on a MikroTik router') plus the resulting file name, which is far more concrete than a tautology. It does not explicitly differentiate itself from siblings like export_config or save_swos_backup, which is the only thing keeping it from 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?
It gives useful in-tool guidance โ prefer passwordSecret over a literal password, and dry run verifies the secret resolves. It never says when to pick this over export_config (textual export) or save_swos_backup, so sibling-level routing is left implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_fileDelete FileADestructiveIdempotent
Delete a file from the router filesystem by name. Idempotent: returns not_found gracefully if the file does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Exact file name on the router (e.g. flash/backup.backup) | |
| dryRun | No | Preview deletion without removing the file | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations by stating 'returns not_found gracefully if the file does not exist.' Annotations already provide destructiveHint=true and idempotentHint=true, so the description elaborates on the idempotent behavior. However, it could mention permission requirements or side effects.
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 with two sentences, front-loading the key action ('Delete a file...'). No redundant information, and each sentence serves a 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 tool has 4 parameters including dryRun and confirmationToken, the description does not explain their purpose or the approval flow. Since there is no output schema, the description should hint at return values. The tool is destructive, so missing context on confirmation token undermines safe usage.
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 input schema already documents each parameter (routerId, name, dryRun, confirmationToken). The tool description adds no additional meaning beyond the schema, meeting the baseline expectation.
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 tool's purpose: 'Delete a file from the router filesystem by name.' It uses a specific verb ('Delete') and resource ('file'), distinguishing it from sibling tools like upload_file, list_files, and manage_* tools.
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 on when to use this tool versus alternatives. The description mentions idempotency and graceful handling of non-existent files, but does not provide context for when deletion is appropriate or when to prefer other tools (e.g., backup before delete).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_configExport ConfigADestructiveIdempotent
Export the router configuration as a RouterOS script. When no file is specified, returns the script text inline. When a file is specified, saves it as .rsc on the router's filesystem. Supports compact mode to show only non-default values.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Save the export to a file on the router (without extension); omit to return inline | |
| compact | No | Export only non-default settings (compact format) | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true, readOnly=false, so the safety profile is covered. The description adds genuinely new behavioral context: the file is written as <file>.rsc on the router filesystem, and the no-file path returns inline text, which tells the agent what side effect to expect. It does not mention the approval/confirmation flow, though the schema parameter covers 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?
Three tight sentences, front-loaded with purpose and then the two conditional behaviors; 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?
With no output schema, the description usefully explains the return format (inline script text vs file on disk), which is what an agent most needs here. It omits any mention of the destructive-action confirmation requirement, but that is documented on the confirmationToken parameter, so the gap is 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 coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by naming the exact artifact created (<file>.rsc) and restating that compact mode filters to non-default values, resolving ambiguity about what 'compact' produces.
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 (export) and resource (router configuration) plus the output format (RouterOS script), so the agent knows exactly what it produces. It does not distinguish itself from adjacent tools like create_backup or get_file_content, 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?
It explains the two operating modes (no file = inline text, file = saved to disk), which implies when each is appropriate, but it never explicitly says when to use this tool versus create_backup or how to read the saved file afterward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_urlFetch URLADestructive
Send an HTTP/HTTPS request from the router using /tool/fetch. Response body is returned inline (capped at 64 KB with [TRUNCATED] marker). Use outputFile to save to router filesystem instead. Not read-only: POSTs have side effects and outputFile writes to the router.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to fetch from the router | |
| method | No | HTTP method | GET |
| httpData | No | Request body for POST | |
| routerId | No | Router ID; omit to use the default router. | |
| outputFile | No | Save response body to this router file path instead of returning inline | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply readOnlyHint=false, destructiveHint=true, and idempotentHint=false. The description adds genuine context beyond them: the 64 KB response cap with a [TRUNCATED] marker, and the reasons for the write profile (POST side effects, outputFile writes). This enriches rather than merely repeats 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?
Four tight sentences, front-loaded with the core action and followed by return behavior and the write caveat. No filler; each sentence carries distinct 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?
With no output schema present, the description carries the return-value burden and does so by explaining the inline body, its 64 KB cap, and truncation. The confirmationToken approval flow is left entirely to the schema, leaving a small gap for a destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters including outputFile's inline-vs-file behavior. The description adds only marginal parameter meaning (the truncation limit tied to inline returns), 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 and resource ('Send an HTTP/HTTPS request from the router using /tool/fetch') with concrete scope. It is a unique capability in the sibling set, and an agent can identify exactly what it does 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?
Provides clear conditional guidance on output handling ('Use outputFile to save to router filesystem instead'), helping the agent choose between inline return and file storage. It does not name alternative tools, but no sibling competes for this function, so context is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_container_configGet Container ConfigARead-onlyIdempotent
Read global container configuration: registry URL, RAM high-water mark, and veth interface.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, and idempotent behavior. The description confirms the read operation and lists specific fields returned, adding some context but not elaborating on other behavioral traits like permissions or error 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 12-word sentence that is front-loaded and contains no unnecessary words. Every part is informative and 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 tool with one optional parameter, the description is fairly complete. It lists the specific configuration items returned. Minor omission: does not clarify behavior when routerId is omitted vs provided, but the schema param description covers that. Output schema is absent but the description mitigates it by listing fields.
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% coverage with a clear description for the optional 'routerId' parameter. The description does not need to add further parameter details, and 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 the verb 'Read' and specifies the resource 'global container configuration' along with exact items (registry URL, RAM high-water mark, veth interface). This distinguishes it from write siblings like manage_container_config.
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 for reading configuration but does not explicitly state when to use this tool versus alternatives (e.g., manage_container_config for modifications). No exclusions or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dns_settingsGet DNS SettingsARead-onlyIdempotent
Read DNS resolver configuration: upstream servers, cache size, cache TTL, and whether remote DNS requests are allowed.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, indicating a safe, read-only, idempotent operation. The description adds context by enumerating exactly what configuration fields are read (upstream servers, cache size, etc.), which goes beyond the annotation metadata and helps the agent understand the return content.
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, well-structured sentence that begins with the imperative verb 'Read' and immediately states the resource. Every word serves a purpose, with 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 simple read tool with one optional parameter and no output schema, the description is fairly complete. It lists all major fields that would be returned. However, it lacks details about potential error conditions or the exact structure of the response, but it is sufficient given the tool's low complexity and the presence of supportive 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 coverage is 100% for the single optional parameter 'routerId', which the schema describes as 'Router ID; omit to use the default router.' The description does not add any additional meaning about this parameter beyond what the schema already provides. Since coverage is high, 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 clearly states the tool reads DNS resolver configuration and lists specific attributes: upstream servers, cache size, cache TTL, and remote DNS request allowance. It uses a specific verb ('Read') and resource ('DNS resolver configuration'), and is easily distinguishable from sibling tools like manage_dns_settings (write) and get_ntp_settings (different 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 provides no explicit guidance on when to use this tool versus alternatives. It does not mention that manage_dns_settings is used for modifications, nor does it specify any prerequisites or restrictions (e.g., router context). The agent must infer usage from the 'Read' verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_contentGet File ContentARead-onlyIdempotent
Read a text file's contents from a MikroTik router. Only suitable for text files โ binary files will return garbled content.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Exact file name on the router (e.g. flash/script.rsc) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate read-only and idempotent behavior. The description adds a critical behavioral note about binary files causing garbled output, which is not captured in structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no extraneous information. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description could specify return format (e.g., plain text). However, given the simple read operation and rich annotations, the current description is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and parameter descriptions are adequate. The description does not add new meaning beyond the schema, 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 clearly states 'Read a text file's contents from a MikroTik router,' providing a specific verb and resource. It effectively distinguishes from sibling tools like upload_file or delete_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly warns that binary files return garbled content, guiding the agent to use this tool only for text files. Does not name alternative tools for binary files, but the guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logGet LogARead-onlyIdempotent
Read and filter the system log from a MikroTik router. Supports filtering by topic, message prefix, and a time window (last N minutes) measured against the router's own clock. Entries with unparseable timestamps are included conservatively.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| prefix | No | Substring to match against the log message | |
| topics | No | Filter entries whose topics field contains any of these strings (e.g. ["firewall", "dhcp"]) | |
| routerId | No | Router ID; omit to use the default router. | |
| sinceMinutes | No | Only return entries from the last N minutes (1โ1440), measured against the router's clock |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds valuable behavioral details: time window measured against router's clock and conservative inclusion of unparseable timestamps, which go 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 only two sentences, with the first sentence delivering the core purpose and the second adding key features and an edge case. Every word serves a purpose; no 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?
With 6 optional parameters and no output schema, the description covers main filtering options and an edge case. It lacks detail on return format, but the tool's name and purpose imply a list of log entries; sufficient for a read 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?
All parameters have descriptions in the schema (100% coverage). The description only summarizes filtering by topic, prefix, and time window, adding no new details beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the verb 'Read and filter' and the resource 'system log from a MikroTik router'. It distinguishes the tool from sibling list tools by focusing on log reading with filtering capabilities, leaving no ambiguity about its 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?
The description outlines supported filters (topic, prefix, time window), implying when to use the tool (e.g., when logs need filtering). However, it does not explicitly state when not to use it or suggest alternatives, though no direct sibling conflict exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ntp_settingsGet NTP SettingsARead-onlyIdempotent
Retrieve NTP client settings from a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint. The description adds only generic context ('from a MikroTik router') without additional behavioral 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?
One concise sentence that conveys the core purpose without unnecessary words, well 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?
For a simple retrieval tool with no output schema, the description adequately covers what the tool does, though it could specify what 'NTP client settings' includes.
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 single parameter 'routerId' is already described in the schema. The description adds no further parameter 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 states a specific verb ('Retrieve') and resource ('NTP client settings') and clearly distinguishes from sibling tools like 'manage_ntp_client' which suggests mutation.
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 guidance on when to use this tool versus alternatives, though the purpose is clear from the name and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ovpn_serverGet OpenVPN ServerARead-onlyIdempotent
Get the OpenVPN server configuration on a MikroTik router. Throws NOT_FOUND if the OpenVPN package is not installed.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate safe, read-only, idempotent behavior. The description adds value by disclosing that a NOT_FOUND error occurs if the OpenVPN package is missing, which is not covered by 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 two short sentences, front-loaded with the main action, and contains no redundant or irrelevant 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?
For a simple read tool with good annotations, the description covers the core purpose and one key error. However, it could mention the return format or additional error cases for completeness.
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 a clear description for the single optional parameter (routerId). The tool description does not add extra parameter 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 clearly states the tool retrieves OpenVPN server configuration on a MikroTik router, with a specific error condition. It distinguishes from siblings like manage_ovpn_server (modification) and list_ovpn_clients (client 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 verb 'Get' and readOnlyHint imply read-only usage, and the description mentions an error condition (NOT_FOUND). However, it does not explicitly state when to avoid using it or name alternatives for write operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_snmp_settingsGet SNMP SettingsARead-onlyIdempotent
Retrieve SNMP settings from a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is read-only, non-destructive, idempotent, and has a closed world. The description adds minimal behavioral context beyond stating the resource type and source device. It does not contradict annotations but also does not disclose any additional behaviors or 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 a single, concise sentence with no unnecessary words. It is front-loaded and immediately conveys 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?
Given the simplicity of the tool (one optional parameter, no output schema, no nested objects), the description is minimally adequate. However, it lacks details about which specific SNMP settings are returned or any format expectations, which would improve completeness.
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 single optional parameter well-documented in the schema. The description adds no additional meaning about parameters beyond what the schema provides, so the baseline score 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 verb 'Retrieve', the resource 'SNMP settings', and the target 'MikroTik router'. It distinctly identifies the tool's function and differentiates it from sibling tools like get_dns_settings or get_ntp_settings.
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. There is no mention of prerequisites, typical usage scenarios, or when to prefer other tools for similar purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_swos_configGet SwOS ConfigARead-onlyIdempotent
Export a SwOS switch's configuration as one YAML document: system settings (including management access), every port's name, enabled state and VLAN settings, the VLAN table (full SwOS) and SNMP. The SNMP community is never exported. The document is the input format of apply_swos_config, so it doubles as a backup you can read and diff.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (read-only, idempotent, non-destructive), and the description adds substantive behavior: exact export contents, the explicit exclusion of the SNMP community, and the YAML output relationship to apply_swos_config. This goes well beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the action and output format, followed by contents, exclusion, and relationship to the apply tool. Every sentence carries 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?
For a read-only export tool with no output schema, the description explains the return document's contents and its role as apply_swos_config input. Annotations cover safety and the schema covers the only parameter, leaving no material gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sole parameter routerId is documented in the schema with default-router behavior. The description adds no additional parameter meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Export) and resource (SwOS switch configuration) plus the output format (YAML). It enumerates contents and names the related sibling apply_swos_config, letting an agent distinguish it from status/backup tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly positions the tool as a read/diff backup and as the input format for apply_swos_config, which tells the agent when it is useful. It does not explicitly exclude alternatives such as save_swos_backup, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_swos_endpointGet SwOS EndpointARead-onlyIdempotent
Fetch and decode a single SwOS '.b' endpoint (link.b, sys.b, poe.b, lacp.b, rstp.b, snmp.b, fwd.b, vlan.b, stats.b, sfp.b, host.b, acl.b, ...) as structured data. Unknown keys are preserved under '_raw'.
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | Yes | '.b' endpoint to fetch (see list_swos_endpoints) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile. The description adds a valuable behavioral detail: unknown keys are preserved under '_raw', which tells the agent how to handle unexpected fields. It does not mention authentication or error behavior, but given the annotation coverage this is a solid addition.
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 tight sentences: the first front-loads the purpose with examples, the second adds a key behavioral note. No filler or redundancy, every clause 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 tool with 100% schema coverage, rich annotations, and no output schema, the description covers what the tool does and a key behavior (_raw). Nothing critical is missing for an agent to 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?
Schema description coverage is 100%, so both parameters are documented in the schema. The description lists many endpoint examples, but this largely duplicates the enum and adds no syntax or semantic detail beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch and decode') and resource ('a single SwOS '.b' endpoint') with examples, and the word 'single' implicitly distinguishes it from list_swos_endpoints. However, it does not explicitly name the sibling or contrast it with get_swos_config or other SwOS tools, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (fetch one endpoint's structured data) but provides no explicit when-to-use, when-not-to-use, or alternative tool guidance. An agent must infer that list_swos_endpoints is for listing and this is for retrieving a specific endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_swos_statusGet SwOS StatusARead-onlyIdempotent
Retrieve status from a MikroTik SwOS switch (SwOS or SwOS Lite): identity, model, firmware, uptime, per-port link state/speed/duplex, PoE mode/state/power, and SFP modules.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Which status endpoints to fetch | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds a compatibility constraint ('SwOS or SwOS Lite') and lists return content, but does not disclose deeper behavior like multiple HTTP requests, failure modes, or return format. 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 a single, dense sentence that leads with the action and resource, then compacts the full scope into a list. Every clause contributes meaning; 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 read-only status tool with two well-documented parameters and strong annotations, the description is largely complete. It lists the returned data categories, making up for the lack of an output schema. It could have mentioned the include parameter's default behavior or the distinction from get_swos_endpoint, but these are minor gaps.
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 baseline is 3. The description adds value by explaining what the cryptic enum values ('link.b', 'sys.b', 'poe.b', 'sfp.b') actually return: link state/speed/duplex, system identity/model/uptime, PoE details, and SFP modules. This maps directly to the include parameter, exceeding the schema's minimal 'Which status endpoints to fetch'.
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 ('Retrieve') and a clear resource ('status from a MikroTik SwOS switch'), then enumerates the exact data categories: identity, model, firmware, uptime, per-port link state, PoE, and SFP modules. This distinguishes it from siblings like get_system_status (RouterOS status) and get_swos_endpoint (raw endpoint 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?
The description implies usage: it should be used when you need switch status information from a SwOS/SwOS Lite device. However, it provides no explicit when-to-use guidance, exclusions, or alternatives, such as noting that get_swos_endpoint is for raw endpoint data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_system_clockGet System ClockARead-onlyIdempotent
Read the current date, time, and timezone from a MikroTik router. Focused single-purpose alternative to the clock section in get_system_status.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds that it reads the clock, but no further behavioral details are provided. With annotations covering the safety profile, a score of 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 concise sentences with no wasted words. It is front-loaded with the purpose and immediately provides distinguishing 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?
For a simple read-only tool with good annotations, the description is complete enough. It does not specify return values, but given the straightforward nature of the tool, 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?
The schema provides 100% coverage for the single optional parameter (routerId). The description does not add additional semantics beyond the schema's 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 clearly states it reads date/time/timezone from a MikroTik router. It distinguishes itself from get_system_status by being a focused single-purpose 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?
The description positions it as an alternative to the clock section in get_system_status, providing usage context. However, it does not explicitly state when not to use it or list other alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_system_statusGet System StatusARead-onlyIdempotent
Retrieve system status information from a MikroTik router including resource usage, identity, license, routerboard details, health sensors, and clock.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. | |
| sections | No | Which system information sections to include |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds context about the variety of data sections retrievable (e.g., health, clock) and mentions the routerId parameter. No contradictions.
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 efficiently conveys the tool's purpose and scope. No 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?
With 2 parameters fully described, no output schema, and annotations confirming safety, the description is adequate. However, it lacks any description of the output format or structure, which would be helpful for an agent to interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters (routerId, sections) having clear descriptions and enums. The description's mention of 'resource usage, identity, license, routerboard details, health sensors, and clock' maps directly to the sections enum, but adds no new 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 clearly states the verb 'Retrieve' and resource 'system status' with a specific list of included sections (resource usage, identity, license, routerboard details, health sensors, clock). This distinguishes it from sibling tools like get_system_clock, which only returns clock info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving broad system status but does not explicitly provide when-to-use or when-not-to-use guidance. Given many sibling tools that retrieve specific status pieces, it would benefit from stating that this is a comprehensive overview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upgrade_statusGet Upgrade StatusARead-onlyIdempotent
Read the current RouterOS package upgrade status and routerboard firmware versions. Shows installed version, latest available version, update channel, and firmware upgrade availability.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds value by specifying the exact information returned (versions, channel, firmware availability), enhancing transparency beyond the annotations. No contradictions. A slight deduction because the description doesn't mention any side effects (though none exist).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the key action and resource. No unnecessary words. 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?
Tool is simple with one optional parameter and no output schema. Description fully explains the return values and covers all necessary context. No gaps.
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% (both properties described). The description does not add any additional meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Read' and identifies the resource as 'RouterOS package upgrade status and routerboard firmware versions'. It lists concrete output fields (installed version, latest available, update channel, firmware upgrade availability), making its purpose crystal clear and distinguishing it from siblings like 'manage_upgrade' which perform modifications.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit 'when to use' or alternative guidance, but the name and description strongly imply it is for pre-upgrade checks. The sibling tool 'manage_upgrade' exists, suggesting this is for read-only status. A score of 4 reflects clear implicit usage without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_address_list_entriesList Address List EntriesARead-onlyIdempotent
List firewall address list entries on a MikroTik router. Supports filtering by list name and address.
| Name | Required | Description | Default |
|---|---|---|---|
| list | No | Filter by address list name | |
| address | No | Filter by address (IP or CIDR) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so description does not need to reiterate safety. It adds filtering context but no additional behavioral details beyond schema. No contradictions.
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 core purpose and includes key detail (filtering) without superfluous 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?
Given the tool's simplicity as a read-only list operation with three optional parameters and no output schema, the description sufficiently covers the functionality. Slight gap: no mention of return format or ordering, but not critical.
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%, providing clear definitions for all three parameters. The description merely repeats the filtering capability, adding no new meaning beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'firewall address list entries', and distinguishes it from sibling tools like 'manage_address_list_entry' by focusing on listing. The mention of filtering adds specificity.
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 indicates when to use the tool (to list entries with filtering options) but does not explicitly state when not to use it or suggest alternatives among siblings, though context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_arp_entriesList ARP EntriesBRead-onlyIdempotent
List ARP table entries on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| address | No | Filter by IP address (substring match) | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by interface (substring match) | |
| macAddress | No | Filter by MAC address (substring match) |
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 no behavioral details beyond that, such as pagination, performance impact, or rate limits. It fails to disclose any hidden behaviors.
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 8 words, single sentence, no redundant information. Every word is meaningful.
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 provides the basic purpose but omits details like the return format, default router behavior, or that filters use substring matching. For a simple list tool with full schema coverage, it is adequate but not thorough.
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 does not add any additional meaning beyond the schema descriptions. Parameters are adequately documented in the schema itself.
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 tool lists ARP table entries on a MikroTik router. It is specific about the resource (ARP entries) and the action (list), and distinguishes it from other list tools by naming the resource 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?
No guidance on when to use this tool versus alternatives like list_neighbors or address list tools. The description lacks context for when filtering by interface/address/mac is appropriate, and does not mention when to avoid using it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bgp_peersList BGP PeersARead-onlyIdempotent
List BGP sessions on a MikroTik router (RouterOS 7+). Returns state, remote AS, prefix counts, and uptime.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Filter by session state (e.g. established, active, idle) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, indicating safe read-only behavior. The description adds useful context: target RouterOS version 7+ and specific returned fields, enhancing transparency beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence that front-loads the purpose and returns, with no wasted words. It efficiently conveys the necessary 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 no output schema, the description provides sufficient context by listing return fields. It covers the core functionality, though missing details like default router behavior or error handling. Still, it is largely complete for a simple list 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 covers both parameters with descriptions, achieving 100% coverage. The description adds examples of allowed state values (established, active, idle) but does not significantly add meaning beyond the schema. 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 it lists BGP sessions on a specific platform (MikroTik RouterOS 7+), with explicit mention of returned fields (state, remote AS, prefix counts, uptime). This distinguishes it from sibling list tools like list_ospf_neighbors or list_ipsec_peers.
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 on when to use this tool vs alternatives (e.g., list_ospf_neighbors). Usage is implied by the purpose (BGP sessions), but no exclusions or context for 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.
list_bridge_portsList Bridge PortsARead-onlyIdempotent
List bridge port entries (interface membership, PVID, STP role and status) on a MikroTik router. Supports filtering by bridge and interface, with pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| bridge | No | Only ports of this bridge | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Only the port entry for this interface |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (read-only, idempotent, non-destructive, closed-world). The description adds useful context by naming the entry fields returned (interface membership, PVID, STP role/status) and noting filtering/pagination support, though it does not discuss auth or pagination behavior in depth.
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 tightly written sentences: the core purpose and returned fields come first, followed by filtering/pagination capabilities. There is 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?
Given full schema documentation, safe read-only annotations, and no output schema, the description supplies enough context to call the tool correctly, including what entries contain and that filtering/pagination exist. Minor omissions like default router behavior are already covered by 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%, so every parameter is already documented in the input schema. The description only generically mentions filtering by bridge/interface and pagination, adding no syntax or format meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (List), resource (bridge port entries), platform (MikroTik router), and even enumerates the returned fields. It clearly distinguishes this read-only listing from sibling tools like manage_bridge_port and list_bridges.
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 it by stating it lists bridge port entries and supports filtering by bridge/interface, but it never explicitly contrasts usage with siblings such as manage_bridge_port, list_bridges, or list_interfaces. This is adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bridgesList BridgesARead-onlyIdempotent
List bridge interfaces and their port members on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent. Description adds that port members are included, but no additional behavioral details (e.g., pagination behavior, performance characteristics). Value added beyond annotations is minimal.
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?
Single sentence of 14 words, front-loaded with the verb 'List'. No unnecessary words 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?
Given the tool's simplicity and high schema coverage, the description is complete enough. It states what the tool returns (bridge interfaces and port members), which is sufficient for an agent to decide to invoke it. No output schema, but the implied return structure is clear.
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?
Input schema covers all 3 parameters (routerId, limit, offset) with descriptions. Description does not add further meaning beyond what the schema provides, 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?
Description clearly states the action (List) and resource (bridge interfaces and their port members). It differentiates from sibling tools like 'list_interfaces' or 'manage_bridge' by specifying both the resource and the 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?
No explicit guidance on when to use or when not to use this tool over alternatives. The name and description imply it's for retrieving bridge interface information, 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.
list_certificatesList CertificatesBRead-onlyIdempotent
List certificates on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by certificate name (substring match) | |
| limit | No | Max results to return. | |
| expired | No | Filter by expiry status; omit to return all | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not add behavioral context beyond annotations (readOnlyHint=true, idempotentHint=true). It is truthful but shallow; no mention of filtering behavior or results handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, no wasted words. However, the simplicity suits a list tool and information density is adequate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description does not explain return values. Annotations cover safety, but for a list tool, describing the result format would improve completeness.
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?
Parameter descriptions in the input schema are complete (100% coverage). The tool description adds no new meaning, so 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 'List certificates on a MikroTik router' with a specific verb and resource. It distinguishes the tool from siblings like list_files or list_interfaces, but does not elaborate on scope or 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 on when to use this tool versus alternatives. Despite many sibling list tools, the description offers no context for selection or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connectionsList ConnectionsARead-onlyIdempotent
List active connection tracking entries from the router firewall table. Filters are applied client-side. Useful for diagnosing NAT and firewall behavior.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| protocol | No | Filter by protocol (exact match, e.g. tcp, udp, icmp) | |
| routerId | No | Router ID; omit to use the default router. | |
| dstAddress | No | Filter by destination address (substring match) | |
| srcAddress | No | Filter by source address (substring match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint: true, destructiveHint: false, idempotentHint: true) indicate a safe, read-only operation. The description adds that 'Filters are applied client-side,' which is crucial behavioral context not present in annotations, informing the agent about performance and data handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two sentences that cover purpose, source, filter behavior, and use case. Every word serves a purpose; no 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?
Given the 5 parameters, all documented in schema, and no output schema, the description covers the main function and filter behavior. It does not specify the return format (e.g., list of objects with fields), but for a simple list tool with read-only hints, this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description adds limited value beyond the schema, only mentioning that filters are client-side, which is a general observation. No specific parameter meanings are elaborated beyond what's in 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 action (list) and the resource (active connection tracking entries from the router firewall table). This distinguishes it from many sibling list_* tools that target different resources (e.g., list_firewall_rules, list_interfaces).
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 mentions the tool is 'useful for diagnosing NAT and firewall behavior,' providing a clear use case. It does not explicitly state when not to use it or list alternatives, but the context is adequate given the sibling list of many specialized tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_container_envsList Container EnvsARead-onlyIdempotent
List container environment variable entries, optionally filtered by container name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by container name (exact match) | |
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds the filtering behavior, but overall adds little beyond the annotations. 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?
One sentence, 8 words, front-loaded with action and resource. Every word is necessary; no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with complete schema descriptions and informative annotations, the description is sufficient. No output schema is present, but the tool's purpose is straightforward. Could briefly note that entries are key-value pairs, but not critical.
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?
All three parameters have descriptions in the input schema (100% coverage). The description does not add new meaning beyond repeating the filtering capability. 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 action (list), resource (container environment variable entries), and optional filtering by container name. It distinguishes itself from siblings like list_containers or manage_container_env.
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 for reading env entries, optionally filtered, but does not explicitly state when to use this tool vs alternatives like manage_container_env (which modifies). No when-not or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_container_mountsList Container MountsARead-onlyIdempotent
List container volume mount definitions with source path, destination path, and mount name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by mount name (exact match) | |
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description carries minimal burden. It adds no new behavioral details (e.g., pagination, permissions, default router behavior), which is acceptable but not exemplary.
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 extraneous words. It efficiently communicates purpose and output 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?
For a simple list query with three optional parameters and no output schema, the description is largely sufficient. It specifies returned fields. Minor omission: behavior when routerId is omitted (default router) is in schema, not description, but that's acceptable.
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 described. The description adds value by specifying the output fields (source path, destination path, mount name), which aids in tool selection beyond the schema alone.
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 tool lists container volume mount definitions and specifies the returned fields (source path, destination path, mount name). It distinguishes itself from sibling tools like manage_container_mount (which modifies mounts) and list_containers.
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 provide when-to-use or when-not-to-use guidance. It implies a read-only query, but lacks mention of alternatives or exclusions. However, the context of sibling tools makes usage inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_containersList ContainersARead-onlyIdempotent
List RouterOS container instances with status, image, and network information.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as readOnly (readOnlyHint=true), non-destructive, and idempotent. The description adds no behavioral context beyond these annotations, such as authorization needs or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that is front-loaded with the core purpose. No wasteful 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 description provides basic purpose but lacks details on output format, pagination, or behavior when routerId is omitted. Given the simplicity and absence of output schema, it is adequate but not 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% for the only parameter (routerId). The description does not add any additional meaning or usage guidance for the parameter, 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 clearly states the tool lists RouterOS container instances with specific details (status, image, network information). It uses a specific verb 'List' and resource, and distinguishes from sibling list_* tools for other resource types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is provided. However, the name and description imply it is for listing containers, and siblings cover other resources, so usage is straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dhcp_clientsList DHCP ClientsBRead-onlyIdempotent
List DHCP client configurations on a MikroTik router. Shows which interfaces obtain their IP via DHCP, current status, and assigned address.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| status | No | Filter by DHCP client status | all |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by interface or display name (exact match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds the useful detail that output includes interface, DHCP status, and assigned address, but says nothing about pagination defaults, result ordering, or the default-router behavior when routerId is omitted.
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 action and resource, with zero filler. Every clause 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 list tool with annotated safety, fully documented parameters, and no output schema, the description is nearly complete: it covers the resource and the shape of the returned data. The only gap is that it doesn't hint at pagination scaling or how status/interface filters interact with the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (limit, offset, status, routerId, interface) are fully documented in the schema. The description adds no parameter-level meaning beyond what the schema already 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?
States a specific verb (list) and resource (DHCP client configurations) on MikroTik, and the second sentence explains what data those configurations expose. It is distinguishable from list_dhcp_servers/list_dhcp_leases by the word 'client', though it never names the 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?
The description gives no explicit when-to-use or when-not-to-use guidance, and no routing to alternatives such as manage_dhcp_client for mutations or list_dhcp_leases for server-side leases. Usage is only inferable from the tool name and read-only annotations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dhcp_leasesList DHCP LeasesARead-onlyIdempotent
List DHCP leases on a MikroTik router with optional filtering by server, status, lease type (dynamic/static), and MAC address. Supports pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| server | No | Filter by DHCP server name | |
| status | No | Filter by lease status | all |
| routerId | No | Router ID; omit to use the default router. | |
| leaseType | No | Filter by lease type (dynamic or static) | all |
| macAddress | No | Filter by MAC address (exact match, case-insensitive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is fully consistent with annotations (readOnlyHint, destructiveHint, idempotentHint). It adds context about filtering and pagination behavior, which complements the annotations without 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 a single, clear sentence that front-loads the core function and lists key capabilities. Every word adds value; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the rich schema, the description is complete. It mentions pagination (important for listing tools) and all filter options. No output schema is needed as the return format is implicit.
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 good descriptions for all 7 parameters. The description briefly mentions the filter options but adds no significant semantic value beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists DHCP leases on a MikroTik router, with optional filtering by server, status, type, and MAC address, and supports pagination. It is specific and distinguishes it from sibling tools like 'list_dhcp_clients' and 'manage_dhcp_lease'.
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 it (to view leases with optional filters) but does not explicitly mention when not to use it or suggest alternatives like 'manage_dhcp_lease' for modifications. The context is clear enough for a read-only list tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dhcp_serversList DHCP ServersARead-onlyIdempotent
List DHCP servers on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by interface name (exact match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, fully describing the safety profile. The description adds no extra behavioral details beyond the obvious listing 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 sentence of six words. Every word is necessary and there is no 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?
The tool is a simple list operation with no output schema, so the description is nearly complete. A minor improvement could be mentioning pagination or default router behavior, but it is adequate as is.
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 parameters documented. The description does not add any semantic beyond what the schema already provides, so 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 the action (List), the resource (DHCP servers), and the scope (on a MikroTik router). It is specific and distinguishes from sibling tools like list_dhcp_clients and list_dhcp_leases.
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 manage_dhcp_server for configuration. No situational context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dns_entriesList DNS EntriesARead-onlyIdempotent
List static DNS entries on a MikroTik router with optional filtering by name and type.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by hostname (partial match) | |
| type | No | Filter by record type | all |
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds the specificity of 'static DNS entries' (implying non-dynamic records) and optional filtering, which is consistent and adds value 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 that efficiently conveys the core purpose and filtering capability without any fluff 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?
The description lacks mention of return values (e.g., list of matching entries or empty response) or behavior for edge cases. Given the absence of an output schema, this information would help complete the context, though the description is minimally sufficient for a list 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 coverage is 100%, with each parameter having clear descriptions. The tool description only mirrors 'optional filtering by name and type' without adding new semantics or 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 clearly states the action 'List' and the resource 'static DNS entries on a MikroTik router' with optional filtering. It distinguishes itself from sibling list tools by specifying the DNS entry type and from manage_dns_entry which handles modifications.
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 vs alternatives. While it mentions filtering, it does not explain when list_dns_entries is preferred over manage_dns_entry or other list tools for different DNS scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesList FilesARead-onlyIdempotent
List files on a MikroTik router filesystem. Supports filtering by name and type.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by file name (substring match) | |
| type | No | Filter by file type (e.g. script, backup, package) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, and idempotent behavior. The description adds no significant behavioral context beyond 'list files,' which is consistent with annotations but does not address aspects like completeness or ordering of results.
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, zero waste. Front-loaded with core purpose, followed by filtering capabilities. No unnecessary 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?
Meets minimal needs for a simple list tool with optional filters. Minor ambiguity about filter behavior (substring vs exact) and no mention of return format, but adequate given annotations cover safety and idempotency.
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 clear parameter descriptions. The description reiterates filtering by name and type but adds no semantics beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists files on a MikroTik router filesystem, with specific filtering support, distinguishing it from sibling list tools (e.g., list_interfaces, list_scripts) by explicitly naming the resource 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 description does not provide guidance on when to use this tool versus alternatives like get_file_content or delete_file, nor does it mention prerequisites or context. However, the purpose is straightforward for a list operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_firewall_rulesList Firewall RulesARead-onlyIdempotent
List firewall rules from the filter or nat table on a MikroTik router. Supports filtering by chain and disabled state, with pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Filter rules by chain name (e.g. forward, input, srcnat) | |
| limit | No | Max results to return. | |
| table | No | Firewall table to query: filter or nat | filter |
| offset | No | Pagination offset. | |
| disabled | No | Filter by disabled state: true, false, or all | all |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds that it supports filtering and pagination, which is consistent. No contradictions.
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, front-loaded with purpose and followed by capabilities. No unnecessary 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?
No output schema, and the description does not describe the return format or pagination metadata. For a list tool, this is adequate but incomplete for an agent to fully understand the output.
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 baseline is 3. The description reinforces the meaning of table, chain, disabled, and pagination parameters, but adds limited additional value 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 it lists firewall rules from the filter or nat table on a MikroTik router, with filtering and pagination. This distinguishes it from siblings like list_mangle_rules and manage_firewall_rule.
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 for read-only listing of firewall rules, but does not explicitly mention when to use this tool versus alternatives. However, the context of sibling tools and the clear purpose makes it adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_interface_list_membersList Interface List MembersARead-onlyIdempotent
List interface list memberships (which interface belongs to which list, e.g. WAN/LAN) on a MikroTik router. Supports filtering by list and interface, with pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| list | No | Only members of this interface list | |
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Only memberships of this interface |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety and idempotency profile is fully covered elsewhere. The description only adds the pagination note, contributing little behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core scoping ('which interface belongs to which list') front-loaded and filtering/pagination following. No wasted words, though it is slightly leaner than a fully structured 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 read-only, non-destructive list tool with 100% schema coverage and no output schema, the definition is adequately complete. The only omission is explicit routing versus sibling listing tools, which is minor given the clarifying parenthetical.
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 list, interface, limit, offset, and routerId are all documented in the schema. The description restates filtering by list/interface and pagination, adding no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (interface list memberships), and the parenthetical 'which interface belongs to which list, e.g. WAN/LAN' clarifies the semantic distinction from the sibling list_interface_lists. It stops short of explicitly naming that sibling, but the concept is 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 a read/listing use case but gives no explicit when-to-use, when-not, or routing to alternatives like list_interface_lists or list_interfaces. Usage is inferable from the purpose but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_interface_listsList Interface ListsARead-onlyIdempotent
List all interface lists defined on the router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description adds no behavioral detail beyond confirming the list 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?
Single sentence of 8 words, perfectly concise and front-loaded with the core action and 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?
No output schema and no description of return format; for a list tool, the agent would need to know what fields are returned (e.g., IDs, names). Missing this context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters; the description adds no extra 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 clearly states the action ('List') and the specific resource ('interface lists'), distinguishing it from sibling tools like 'list_interfaces' and 'manage_interface_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 explicit guidance on when to use this tool vs alternatives; the read-only nature is implied by annotations but not clarified in text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_interfacesList InterfacesARead-onlyIdempotent
List network interfaces on a MikroTik router with optional filtering by type and status. Supports pagination and optional traffic counters.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by interface type | all |
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| status | No | Filter by running status | all |
| routerId | No | Router ID; omit to use the default router. | |
| macAddress | No | Filter by MAC address (case-insensitive exact match on mac-address field) | |
| includeCounters | No | Include traffic counters (tx-byte, rx-byte, etc.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds value by mentioning pagination support and optional traffic counters, which are behavioral traits not covered by 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 with no wasted words. The purpose is front-loaded, and every part adds value. Highly 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 list tool with comprehensive schema and annotations, the description is complete. It covers filtering, pagination, and counters. However, no output schema exists, so return value details are not explained. Still adequate given the 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 baseline is 3. The description mentions filtering, pagination, and counters, which correspond to parameters, but adds no new meaning beyond the schema descriptions.
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'), the resource ('network interfaces on a MikroTik router'), and optional features (filtering, pagination, counters). It distinguishes from sibling list tools by specifying 'interfaces'.
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 for listing interfaces but does not explicitly state when to use this tool vs alternatives like list_bridges or list_wifi_interfaces. No exclusion or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ip_addressesList IP AddressesARead-onlyIdempotent
List IPv4 addresses assigned to interfaces on a MikroTik router, including dynamic ones (DHCP client, PPP). Supports filtering by interface and disabled state, with pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| disabled | No | Filter by disabled state: true, false, or all | all |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Only addresses on this interface |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint false), lowering the bar, and the description still adds real value: address entries include dynamic ones originating from DHCP client and PPP, which is a behavioral trait not visible in the schema. It does not mention auth/permission requirements or result-size characteristics, but the dynamic-inclusion note is genuinely informative.
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 compact sentences, front-loaded with what is listed and followed by scoping and pagination details; every clause carries information. Minor room to be tighter, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description covers resource scope, dynamic-address inclusion, available filters, and pagination. The main residual gap is what a returned record actually contains, which is not described, though the annotations and full schema coverage keep this from being a serious omission.
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 five parameters (limit, offset, disabled, routerId, interface) are already documented in the schema. The description restates the interface and disabled filters and pagination at a high level without adding format, syntax, or default behavior beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (IPv4 addresses assigned to interfaces on a MikroTik router), plus a distinguishing scope detail: dynamic addresses from DHCP client and PPP are included. That is clear and non-tautological, but it never names or contrasts with siblings like list_interfaces, list_dhcp_leases, or manage_ip_address, so an agent must infer the boundary 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 enumerates capabilities ('supports filtering by interface and disabled state, with pagination') but gives no when-to-use guidance, no prerequisites, and no indication of when to prefer this over list_interfaces or manage_ip_address. Filtering capabilities describe the tool, not when to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ip_poolsList IP PoolsARead-onlyIdempotent
List IP address pools on a MikroTik router. Supports filtering by name and pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by pool name (substring match) | |
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the description adds minimal behavioral context. It mentions filtering and pagination, which are consistent with a read operation, but does not elaborate on other traits like rate limits or performance.
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, front-loaded with the core purpose, and contains no redundant information. 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 list tool with comprehensive parameter schema and annotations highlighting safety, the description covers the key behaviors (filtering, pagination). The absence of an output schema reduces the need to explain return format. Minor omission: could mention default router behavior, but that's already in 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%, with each parameter (routerId, name, limit, offset) well-described. The description reiterates 'filtering by name and pagination' but adds no new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the resource ('IP address pools'), and the context ('on a MikroTik router'). It also mentions filtering and pagination, differentiating it from sibling tools like manage_ip_pool.
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 for listing IP pools with optional filters and pagination, but does not explicitly state when to use this tool versus alternatives, nor does it provide exclusion conditions. Given the large set of sibling list tools, more guidance would be helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ipsec_peersList IPSec PeersARead-onlyIdempotent
List IPSec peers on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| address | No | Filter by remote address (substring match) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds no additional behavioral context beyond the obvious 'list' operation. 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?
The description is a single concise sentence that efficiently conveys the tool's purpose without any redundant words or unnecessary 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?
For a simple read-only list tool with comprehensive annotations and full schema coverage, the description is complete enough. It covers what the tool does without needing to explain return values (no 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 has 100% coverage with descriptions for all three parameters (routerId, address, limit). The description does not add extra meaning beyond the schema, so 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 'List IPSec peers on a MikroTik router', specifying the verb (List), resource (IPSec peers), and context (MikroTik router). It effectively distinguishes from sibling tools like manage_ipsec_peer and other list_* tools.
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 (e.g., list_ipsec_policies, manage_ipsec_peer). There is no mention of prerequisites, context for filtering, or conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ipsec_policiesList IPSec PoliciesBRead-onlyIdempotent
List IPSec policies on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. | |
| dstAddress | No | Filter by destination address (substring match) | |
| srcAddress | No | Filter by source address (substring match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true, covering behavioral traits. The description adds no extra behavioral context beyond stating the resource type. 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?
Single sentence, no redundant information. Efficient 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?
For a list operation with complete schema and no output schema, the description is sufficient. It could mention that results are returned as a list, but not critical.
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?
Input schema has 100% description coverage for all 4 parameters, each with clear descriptions. The tool description adds no additional meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and resource 'IPSec policies' with scope 'on a MikroTik router'. It effectively conveys the tool's function, though it does not explicitly differentiate from sibling tools like list_ipsec_peers.
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 vs alternatives (e.g., manage_ipsec_policy for modifications). There is no mention of use cases or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ip_servicesList IP ServicesARead-onlyIdempotent
List IP services on a MikroTik router (api, api-ssl, ssh, telnet, www, www-ssl, winbox, ftp) with their port numbers and enabled/disabled status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by service name (api, api-ssl, ssh, telnet, www, www-ssl, winbox, ftp) | |
| enabled | No | When true, return only enabled services; when false, only disabled services | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint. The description adds that it returns port numbers and status, which is consistent with annotations. No additional behavioral traits disclosed 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 that efficiently conveys the tool's purpose and the resources it covers, with no extraneous 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 simple list operation with no output schema, the description adequately specifies what is returned (port numbers and enabled/disabled status). All parameters are optional, implying full list by default. No missing critical 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 already documents all three parameters adequately. The description does not add significant meaning beyond the schema's parameter descriptions.
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 'list' and resource 'IP services' on a MikroTik router, and specifies the services and returned data (port numbers, enabled/disabled status). It distinguishes from sibling 'manage_ip_service' tools.
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 read operation, and sibling tools like 'manage_ip_service' provide context, but it does not explicitly state when to use this tool vs alternatives or mention any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_journalList Write JournalARead-onlyIdempotent
List recent entries from the server's write journal (write-journal.ndjson): every journaled write with its journalId, timestamp, tool, router, parameters (as redacted at write time), snapshot ids and outcome โ newest first. Read-only. Use it to recover a lost journalId for rollback_change, or to audit what was written when. Only entries with rollbackable: true can be rolled back โ dry runs and writes without snapshots (run_command, plan_changes) cannot.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | No | Only entries written by this tool | |
| limit | No | Max entries to return | |
| routerId | No | Only entries for this router id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds real context beyond them: the backing file, newest-first ordering, that parameters are shown as redacted at write time, and the rollbackable: true gate. That last point is critical behavioral knowledge an agent cannot infer from the schema or 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?
Three sentences, front-loaded with identity and contents, then the usage routing, then the rollback caveat. Dense but no sentence is redundant โ each carries information not present elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating returned fields, ordering, and redaction behavior. Combined with the schema's filter documentation and the annotations' safety profile, an agent has everything needed to call this and interpret the result.
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 of the three filters (tool, limit, routerId) is already documented in the schema, so the description need only reach baseline. It mentions 'router' and 'tool' as entry fields but adds no filtering syntax or interaction details 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?
States a specific verb and resource โ 'List recent entries from the server's write journal (write-journal.ndjson)' โ and enumerates the exact fields each entry carries (journalId, timestamp, tool, router, parameters, snapshot ids, outcome) plus ordering (newest first). This is unmistakably distinct from siblings like get_log or list_scripts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two explicit use cases ('recover a lost journalId for rollback_change' and 'audit what was written when'), naming the downstream sibling tool that consumes the output. It also states the precondition for the follow-up action: only entries with rollbackable: true can be rolled back, and names the writes that never can be.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_log_actionsList Log ActionsARead-onlyIdempotent
List RouterOS logging action targets (system/logging/action) with optional type filter.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by action type (exact match): memory, disk, remote, echo, email | |
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds the path and filter capability but does not disclose additional behavioral aspects such as pagination or error handling beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence (12 words) that conveys the essential purpose without unnecessary elaboration. 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 list tool with no output schema, the description is adequate but lacks details on pagination, default limit behavior, or what the response contains. It is minimally complete given the 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 coverage is 100% with descriptions for each parameter. The description briefly mentions 'type filter' but does not add meaningful meaning beyond what the schema already specifies for parameters like 'type' (enum) and 'limit' (default).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'RouterOS logging action targets', and specifies the API path 'system/logging/action'. It also mentions an optional type filter, distinguishing it from sibling tools like 'list_log_rules' and 'manage_log_action'.
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 alternatives. While the read-only nature is implied by 'list', no guidance is given for choosing between this and other list or manage tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_log_rulesList Log RulesARead-onlyIdempotent
List RouterOS logging rules (system/logging) with optional topic substring and action exact-match filtering.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| topics | No | Filter by topics (substring match) | |
| routerId | No | Router ID; omit to use the default router. | |
| logAction | No | Filter by log action target (exact match on action field) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds minimal behavioral detail beyond the annotations, only confirming the listing 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, well-structured sentence that efficiently conveys the tool's purpose and key filtering capabilities without unnecessary 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 description, alongside comprehensive annotations and schema, fully covers the tool's behavior for its simplicity. No output schema is provided, but typical list tool patterns apply.
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 descriptions cover all 4 parameters (100% coverage). The description adds that 'topics' uses substring matching and 'logAction' uses exact matching, providing extra clarity 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 tool lists RouterOS logging rules with specific filtering options (topic substring, action exact-match), distinguishing it from related list tools like list_log_actions and manage_log_rule.
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 for reading logging rules with optional filters, but does not explicitly mention when not to use it or suggest alternative tools for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mangle_rulesList Mangle RulesARead-onlyIdempotent
List firewall mangle rules on a MikroTik router in evaluation order. Supports filtering by chain, action, and disabled state.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Filter by chain name (e.g. prerouting, forward, postrouting) | |
| action | No | Filter by mangle action (e.g. mark-routing, mark-connection) | |
| disabled | No | Filter by disabled state | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior. The description adds that rules are listed in evaluation order, which is a useful behavioral detail not covered by annotations. No contradictions.
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: first states core function and ordering, second lists filters. Extremely concise with no wasted words, front-loading the essential 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?
For a read-only list tool with optional filters and no output schema, the description covers the key aspects: resource, order, and filter capabilities. It could mention what fields are returned, but it is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all parameters. The description merely restates that filtering by chain, action, and disabled state is supported, adding no new 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 clearly states the tool lists firewall mangle rules on a MikroTik router in evaluation order. The verb 'List' and resource 'mangle rules' are specific and differentiate it from sibling list tools like list_firewall_rules.
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 for mangle rules with filtering, but it does not explicitly contrast with similar tools like list_firewall_rules or state when not to use it. No exclusion or alternative guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_neighborsList NeighborsBRead-onlyIdempotent
List discovered neighbors (CDP/LLDP/MNDP) on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by interface name (substring match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds no further behavioral context (e.g., no mention of required permissions, default return behavior, or pagination). It does not contradict annotations, but adds minimal value.
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, well-structured sentence that conveys the core functionality without any superfluous words. It is front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with an output schema absent, the description adequately covers the tool's purpose and scope. It could mention default behavior (e.g., returns all neighbors if no filter) but overall is sufficient given the annotations and schema richness.
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 clear descriptions for all three parameters (routerId, interface, limit). The description does not add meaning beyond what the schema provides, meeting 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 explicitly states the action (list), the resource (discovered neighbors), and the specific protocols (CDP/LLDP/MNDP) on a MikroTik router. It clearly distinguishes from sibling tools like list_ospf_neighbors or list_bgp_peers.
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 provide any guidance on when to use this tool versus alternatives (e.g., list_ospf_neighbors, list_bgp_peers). There are no exclusions, prerequisites, or contextual hints to help an agent decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_netwatch_entriesList Netwatch EntriesBRead-onlyIdempotent
List Netwatch monitoring entries on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | Filter by host (substring match) | |
| limit | No | Max results to return. | |
| status | No | Filter by current status | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, non-destructive, and idempotent behavior. The description adds minimal context about the resource type but does not elaborate on pagination, filtering details, or return structure. With annotations covering safety, this is adequate.
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 unnecessary words. It is concise 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 tool has no output schema and 4 parameters. The description is minimal but combined with annotations and schema, it covers essential information. It could mention that it returns a list of entries, but overall it is adequate for a simple list 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%, and each parameter is well-documented in the schema. The description adds no additional parameter meaning beyond the schema, 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 states the tool lists Netwatch monitoring entries on a MikroTik router, specifying the resource and action. However, it does not explicitly differentiate from sibling list tools, though the resource name is distinct.
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 like manage_netwatch_entry for create/update/delete operations. There is no mention of prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ospf_neighborsList OSPF NeighborsARead-onlyIdempotent
List OSPF neighbors on a MikroTik router (RouterOS 7+). Returns neighbor state, interface, DR/BDR, and uptime.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Filter by neighbor state (e.g. full, 2-way, init) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds that it returns specific fields and targets RouterOS 7+, but does not disclose any additional behavioral traits 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?
Single sentence, front-loaded with the core purpose, and includes relevant return fields. No superfluous 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?
For a simple list tool with read-only semantics and no output schema, the description adequately covers the purpose, router version, and returned fields. Slightly more detail on filtering or scope could be added but not necessary.
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 provides descriptions for both parameters (routerId and state) with 100% coverage. The tool description does not add further meaning beyond what the schema offers.
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?
Clearly states it lists OSPF neighbors on a MikroTik router with RouterOS 7+, and specifies the return fields (state, interface, DR/BDR, uptime). Distinct from sibling tools like list_bgp_peers or list_neighbors.
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 for retrieving OSPF neighbor information but does not provide explicit guidance on when to use this tool over alternatives such as list_neighbors or other protocol-specific list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ovpn_clientsList OpenVPN ClientsARead-onlyIdempotent
List OpenVPN client interfaces on a MikroTik router. Shows name, remote server, and connection status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint: true, destructiveHint: false) already convey the non-destructive behavior. The description adds minor context about returned fields but does not discuss pagination or response format. 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 sentences: first states purpose, second lists output. Clearly front-loaded and no unnecessary 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 description covers the tool's purpose and returned data. Annotations and schema handle safety and parameters. No output schema but the description compensates by listing key fields.
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?
Input schema has 100% coverage with descriptions for all 3 parameters. The tool description does not add extra meaning beyond the schema, 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 states it lists OpenVPN client interfaces on a MikroTik router and specifies the output fields (name, remote server, connection status). It distinguishes itself from sibling tools like manage_ovpn_client and other list tools.
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?
While no explicit when-to-use or alternatives are provided, the context of list tools and the sibling manage_ovpn_client implies this is for read-only listing. The description does not guide against misuse, but the purpose is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_packagesList PackagesARead-onlyIdempotent
List installed RouterOS packages with version and enabled status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by package name (exact match) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description does not contradict these and adds minimal extra behavioral context (e.g., 'installed' implies read-only). With annotations present, the description's burden is lowered, but it does not provide additional transparency beyond what is already structured.
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 wasted words. It is front-loaded with the main purpose and is 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?
Given the tool's simplicity (2 optional parameters, no output schema) and the annotations covering safety, the description is fairly complete. It mentions the output fields (version and enabled status). However, it could note the lack of pagination or sorting, but that is not critical for a list 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 both routerId and name are well-described in the schema. The description does not add further meaning beyond the schema, which already provides adequate semantics. 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?
Description clearly states the tool lists installed packages with version and enabled status, specifying the resource (packages), action (list), and output details. It is distinct from sibling tools like manage_package.
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, such as manage_package or other list tools. The description lacks context about exclusions 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.
list_pppoe_clientsList PPPoE ClientsARead-onlyIdempotent
List PPPoE client interfaces on a MikroTik router. Shows name, parent interface, ISP username, and connection status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| status | No | Filter by running status | all |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by parent interface name (exact match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description only adds that it returns specific fields. It does not describe pagination behavior or the meaning of the status filter, which are present in the schema but 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 two sentences long, front-loading the purpose and key output fields. Every sentence provides necessary information without 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?
The description covers the main purpose and output fields. However, it could mention that the tool supports pagination via limit and offset parameters, though these are detailed in the schema. For a simple listing tool, the description is nearly 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?
All 5 parameters have descriptions in the schema with 100% coverage. The tool description does not add any additional meaning or constraints beyond what is already provided in the input schema, so it meets the baseline without adding 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 the tool lists PPPoE client interfaces on a MikroTik router and specifies the fields returned (name, parent interface, ISP username, connection status). It uses a specific verb-resource pair and effectively distinguishes from sibling tools like manage_pppoe_client.
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 read-only query but does not provide explicit guidance on when to use this tool versus alternatives. It lacks information about prerequisites, such as requiring a router connection, and does not mention 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.
list_ppp_profilesList PPP ProfilesARead-onlyIdempotent
List PPP profiles including the built-in default and default-encryption profiles.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by profile name (exact match) | |
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds context about built-in profiles but does not disclose any additional behavioral traits such as pagination behavior or whether the list includes inactive profiles. The description does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no redundancies. It is front-loaded with the core action and includes an important detail about built-in profiles. Every word contributes 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 tool with 3 parameters and high schema coverage, the description is adequate but minimal. It does not specify the return format (e.g., array of profile objects) or pagination details, though annotations indicate read-only and idempotent behavior. Without an output schema, the description could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all 3 parameters have descriptions). The description does not add any extra meaning beyond what the schema already provides. For example, it does not explain the purpose of filtering by name or the limit parameter. Baseline 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 the tool lists PPP profiles, specifically mentioning built-in profiles like 'default' and 'default-encryption'. The verb 'List' with resource 'PPP profiles' is specific, and the tool distinguishes itself from siblings like 'list_pppoe_clients' which lists connections, not profiles.
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 (e.g., 'list_pppoe_clients' for active connections) or any prerequisites. An agent cannot infer appropriate usage context beyond the obvious listing action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_queuesList QueuesARead-onlyIdempotent
List simple queues on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| target | No | Filter by target address (substring match) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, indicating a safe read operation. The description adds no further behavioral context, such as potential side effects or performance implications, 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 conveys the purpose efficiently with no redundant information. It is front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with 3 optional parameters and no output schema, the description is reasonably complete. It covers the core purpose and the parameter details are in the schema. However, it could optionally mention the return format or that it returns a list of queue objects.
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 fully documents the three parameters (routerId, target, limit). The description does not add any additional meaning or clarification 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 'List simple queues on a MikroTik router' using a specific verb and resource. It distinguishes itself from sibling tools like manage_queue and other list_* tools by specifying 'simple queues'.
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 manage_queue or other list tools. The description does not include any context about usage conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_routersList RoutersARead-onlyIdempotent
List the routers configured in the registry (routers.yaml): id, host, port, TLS status, tags, ROS version, and which is the default. Read-only reflection of local config โ no RouterOS API call, no credentials in the response. rosVersion is what routers.yaml states and may lag a router upgrade โ ask get_system_status for the live version. Use it to discover valid routerId values and tags for targeting other tools (including bulk_read and bulk_execute).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only return routers having any of these tags (e.g. ["edge", "prod"]) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses the data source (routers.yaml), that no RouterOS API call is made, that no credentials appear in the response, and the key caveat that rosVersion may lag a router upgrade. These are exactly the behavioral facts an agent needs and the annotations cannot express.
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 tight sentences: what it returns, its read-only nature, then the staleness caveat and discovery use case. Front-loaded with the payload fields and free of repetition 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?
No output schema exists, and the description compensates by enumerating the returned fields and clarifying the semantics of the one ambiguous field (rosVersion). Nothing an agent needs to call or interpret this tool 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% and the single 'tags' filter is fully documented in the schema. The description reinforces the tags concept in the context of targeting other tools but adds no format or matching semantics (e.g. OR vs AND) beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List the routers configured in the registry') plus an explicit enumeration of returned fields (id, host, port, TLS, tags, ROS version, default). An agent can distinguish this from list_neighbors or list_interfaces without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names its downstream purpose ('discover valid routerId values and tags for targeting other tools, including bulk_read and bulk_execute') and routes the agent elsewhere for a related need ('ask get_system_status for the live version'). Both when-to-use and an alternative are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_routesList Static RoutesARead-onlyIdempotent
List static routes on a MikroTik router with optional filtering by active status and dynamic status. Supports pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. | |
| activeOnly | No | Return only active routes | |
| staticOnly | No | Return only non-dynamic routes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false. The description adds filtering and pagination behavior, which is useful but not critical given the annotations cover safety.
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 with no wasted words. The first sentence states the primary purpose and filtering options; the second adds pagination. Front-loaded and 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 list operation with good annotations and schema coverage, the description is nearly complete. It mentions filtering and pagination. No output schema, but not necessary for a straightforward list 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 input schema has 100% description coverage for all 5 parameters. The tool description does not add extra meaning beyond the schema, 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 states the tool lists static routes on a MikroTik router, specifies optional filtering by active/dynamic status, and mentions pagination. This differentiates it from many sibling list_* tools.
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 clear context for using this tool (listing static routes with filtering and pagination) but does not explicitly state when not to use it or mention alternatives like list_routing_rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_routing_rulesList Routing RulesARead-onlyIdempotent
List policy routing rules on a MikroTik router in evaluation order. Supports filtering by table and disabled state.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | Filter by routing table name | |
| disabled | No | Filter by disabled state | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds the behavioral detail that results are returned 'in evaluation order,' which is beyond what annotations provide. No contradictions.
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 with no wasted words. The action is front-loaded and the filtering support is immediately stated.
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 tool, the description covers purpose and filtering. It lacks details about the output structure (e.g., fields of each rule), but since annotations cover safety and there is no output schema, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not add new information about parameters beyond restating 'table' and 'disabled' filters. 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 (list), resource (policy routing rules), scope (MikroTik router), and ordering (evaluation order). It distinguishes from sibling tools like list_routes or list_routing_tables by specifying 'policy routing rules' and 'evaluation order'.
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 for listing routing rules with optional filtering, but does not explicitly state when to use this tool versus alternatives (e.g., list_routes, list_routing_tables) 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.
list_routing_tablesList Routing TablesARead-onlyIdempotent
List custom routing tables on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds the nuance that only 'custom' routing tables are listed, which is beyond annotations but still minimal.
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 unnecessary words, efficiently 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?
For a simple read-only list tool with one optional parameter, the description is mostly complete. It lacks details about the return format but is adequate given the simplicity.
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% coverage with a clear description for the 'routerId' parameter. The tool description adds no additional parameter 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 ('List') and resource ('custom routing tables on a MikroTik router'), clearly distinguishing it from sibling tools like 'list_routes' and 'list_routing_rules'.
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 vs alternatives like 'list_routes' or 'list_routing_rules', nor about the optional 'routerId' parameter or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_jobsList Scheduled JobsARead-onlyIdempotent
List RouterOS scheduler entries on a MikroTik router with next-run time, interval, and disabled state.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by job name (exact match) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds detail about returned fields but does not disclose default router behavior, pagination, or error states. Adequate given 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?
Single sentence, front-loaded with verb and resource, no 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?
Tool is simple with optional parameters and no output schema. Description sufficiently covers purpose and output fields, though it omits mention of default router behavior 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% for both parameters (routerId and name). The description adds no additional meaning beyond the schema's parameter descriptions.
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 'List', the resource 'RouterOS scheduler entries', and the specific fields returned (next-run time, interval, disabled state). It distinguishes from sibling tools like list_scripts or list_bridges.
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 on when to use this tool versus alternatives such as manage_scheduled_job. No mention of when not to use or prerequisites like router connection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scriptsList ScriptsARead-onlyIdempotent
List RouterOS scripts on a MikroTik router. Supports optional name filter.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by script name (substring match) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering safety and idempotency. The description adds the name filter behavior, which is consistent but not a major addition beyond what annotations 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 concise sentence that is front-loaded with the key action. It is efficient but could be slightly more informative about the return format.
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 low parameter count, zero required parameters, and strong annotations, the description is largely complete. It does not detail return values, but the absence of an output schema and the simplicity of listing mitigate this.
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 parameters have clear descriptions in the schema. The description merely restates the name filter, adding no extra 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 clearly states the verb 'list', the resource 'RouterOS scripts', and the entity 'MikroTik router', making the tool's purpose immediately obvious. It distinguishes from sibling tools like run_script and manage_script by focusing on 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 provides no guidance on when to use this tool versus alternatives such as run_script or manage_script. It lacks explicit context for choosing this tool over similar list_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_swos_endpointsList SwOS EndpointsARead-onlyIdempotent
List the SwOS/SwOS Lite '.b' API endpoints supported by this server, with the decoded field names per endpoint. Read-only schema introspection โ no device call.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds valuable context beyond these flags by specifying that it is introspection of the server's endpoint schema and that it will not perform a device call, which prevents misuse.
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, immediately front-loaded with the main purpose, no filler. Every clause adds meaningful information: the endpoint scope, the decoded field names, the read-only nature, and the absence of device calls.
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 introspection tool with one optional parameter, strong annotations, and a clear description. The description fully explains what the user will get and what will not happen, making the tool well-specified for an 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?
The single parameter routerId is fully described in the schema (100% coverage), including the default behavior when omitted. The description does not add parameter details, but it doesn't need to because the schema already carries the semantic weight.
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 'List' and the resource ('SwOS/SwOS Lite .b API endpoints') along with the specific output ('decoded field names per endpoint'). It explicitly positions itself as read-only schema introspection, distinguishing it from sibling tools like get_swos_endpoint and write_swos_blob.
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 conveys a clear context: use this tool to inspect supported endpoints and field names rather than making a device call. It does not explicitly name alternatives, but the 'read-only schema introspection โ no device call' phrasing gives enough guidance for selecting this tool over device-interaction tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_groupsList User GroupsARead-onlyIdempotent
List local user groups on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds no behavioral details beyond stating 'list', which is consistent with annotations. No contradictions, but no added value 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 succinct sentence that wastes no words and immediately conveys the tool's purpose. It is front-loaded and appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (list operation with only 2 params, no output schema). The description covers the basic purpose but does not explain the return format or any caveats. Given the lack of output schema, some additional context about the response would improve completeness, but the description is 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% for both parameters (routerId, limit). The description does not add any parameter semantics beyond what the schema provides, so 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 the verb 'list' and the resource 'local user groups on a MikroTik router', distinguishing it from sibling tools like list_users (lists users) and manage_user_group (manages 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 does not provide guidance on when to use this tool versus alternatives like list_users or manage_user_group. Usage is implied only by the name and context, lacking explicit when-to or when-not-to instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersList UsersARead-onlyIdempotent
List local users on a MikroTik router. Passwords are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Filter by group name (exact match) | |
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent behavior. The description adds the important behavioral detail that passwords are never returned, which is beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first states the primary purpose, and the second delivers a key behavioral constraint. No wasted words, and the information 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?
The description covers the core purpose and a security detail. However, without an output schema, mentioning the shape of the returned list (e.g., fields like username, group) would improve completeness.
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 fully documents parameters. The description does not add additional parameter-level information; 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 the action ('List') and the resource ('local users on a MikroTik router'). It also adds a critical behavioral note about password security ('Passwords are never returned'), which distinguishes it from similar tools.
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 like manage_user or list_user_groups. Given the large number of sibling list tools, explicit context would be beneficial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_vrrp_instancesList VRRP InstancesARead-onlyIdempotent
List VRRP instances on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by master interface name (exact match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds no extra behavioral context beyond the name. It is adequate but does not enhance understanding of return format or edge cases.
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, concise and front-loaded. However, it could include a bit more context 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?
For a standard list tool with complete annotations and schema, the description is sufficient. It lacks mention of pagination or default router behavior, but the schema covers limit and routerId defaults.
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 parameter descriptions are clear. The tool description adds no additional meaning beyond what the schema already provides, meeting the baseline but not exceeding 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 'List VRRP instances on a MikroTik router' clearly states the verb (List) and resource (VRRP instances), distinguishing it from other list_* tools that list different resources and from manage_vrrp_instance which handles mutations.
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 on when to use this tool versus alternatives. While the name implies read-only use, the description does not contrast with manage_vrrp_instance or other list tools, leaving context implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wifi_clientsList WiFi ClientsARead-onlyIdempotent
List currently connected WiFi clients (stations) with signal strength and transfer rates.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by WiFi interface name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds value by specifying that it lists 'currently connected' clients and includes signal strength and transfer rates, providing real-time behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the key purpose. No unnecessary words or details, achieving high efficiency.
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 tool with comprehensive annotations and schema, the description covers the essential information: what it lists and what data fields are returned. Although there is no output schema, the description sufficiently communicates the return content.
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 parameters well. The description adds minor value by explaining that routerId can be omitted for default router, but this is not a significant addition 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 ('WiFi clients'), and adds detail about the data returned ('signal strength and transfer rates'). This clearly distinguishes it from sibling tools like list_dhcp_clients or list_connections.
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 (listing connected WiFi clients) but does not explicitly state when to use this tool over alternatives. No exclusions or alternative suggestions are provided, which would be helpful given the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wifi_interfacesList WiFi InterfacesARead-onlyIdempotent
List WiFi/wireless interfaces on a MikroTik router. Uses /interface/wifi on ROS 7.x, /interface/wireless on older versions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, and idempotent behavior. The description adds one behavioral detail (version-dependent commands) but does not cover auth needs or rate limits, 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?
Two precise sentences with no wasted words. Purpose comes first, version detail second. Excellent 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 list tool with optional params and no output schema, the description covers the essential version-dependent behavior. Lacks explicit mention of return format, but the schema implies pagination. Nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with well-described parameters (routerId, limit, offset). The description adds no additional parameter meaning beyond the schema, earning the baseline score.
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 tool lists WiFi/wireless interfaces on MikroTik routers, distinguishing it from sibling tools like list_interfaces (general) and list_wifi_clients (clients).
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?
While it does not explicitly list when to use or avoid this tool, the description implies it is for WiFi interfaces only and provides version-specific command differences, which guides usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wireguard_interfacesList WireGuard InterfacesARead-onlyIdempotent
List WireGuard interfaces and their status on a MikroTik router.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent; description adds 'status' but little extra behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single concise sentence with no extraneous 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?
Sufficient for a simple listing tool with schema, but lacks additional context like default behavior or pagination 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 covers all 3 parameters with descriptions; description does not add new parameter 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?
Clearly states it lists WireGuard interfaces with their status, distinguishing it from generic list_interfaces and list_wireguard_peers.
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 on when to use versus alternatives; context is implied but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wireguard_peersList WireGuard PeersARead-onlyIdempotent
List WireGuard peers with last handshake time and transfer statistics.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. | |
| offset | No | Pagination offset. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Filter by WireGuard interface name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior. The description adds value by specifying the output includes handshake time and transfer statistics, though it doesn't detail pagination or filtering behavior beyond 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?
Single sentence, 10 words, no redundancy. Front-loaded with the action and essential 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 no output schema, the description partially explains what the tool returns but lacks detail on structure (e.g., array of objects). Also doesn't mention pagination behavior. Adequate but not fully comprehensive.
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 covers 100% of parameter descriptions, so the tool description adds no new information about parameters. 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 'List', the resource 'WireGuard peers', and includes output details ('last handshake time and transfer statistics'). This distinguishes it from sibling tools like list_wireguard_interfaces.
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 on when to use this tool versus alternatives. While it's implied for reading peer statistics, there's no mention of prerequisites 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.
manage_address_list_entryManage Address List EntryADestructiveIdempotent
Add or remove a firewall address list entry. Idempotent by list name + address. Supports dry-run mode.
| Name | Required | Description | Default |
|---|---|---|---|
| list | Yes | Address list name | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| address | Yes | IP address or CIDR to add/remove | |
| comment | No | Optional comment for the entry | |
| timeout | No | Expiry timeout (e.g. 1d, 2h30m) โ omit for permanent | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true and idempotentHint=true. Description reinforces idempotency and adds dry-run capability, providing useful behavioral context 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?
Extremely concise: two sentences with no redundant information. Front-loaded with the core purpose, then key extras.
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?
Covers essential aspects: operation, idempotency, dry-run. Does not explain return values (no output schema) or confirmation token logic in detail, but schema handles that. Adequate for a management tool with 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 coverage is 100% so baseline is 3. Description mentions idempotency by list+address, which adds meaning to list and address parameters, but overall adds limited new parameter-level insight beyond 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?
Description clearly states verb (add/remove) and resource (firewall address list entry). It distinguishes from sibling list_address_list_entries and mentions key features (idempotency, dry-run).
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?
Description implies usage for adding/removing entries but does not explicitly state when to use vs alternatives or when not to use. No when-not-to or alternative tool names are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_bridgeManage Bridge InterfaceADestructiveIdempotent
Create or remove a bridge interface on a MikroTik router. Idempotent: create returns already_exists if bridge with same name exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Bridge interface name, taken verbatim for remove; create accepts letters, digits, dot, hyphen, underscore, up to 64 chars | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| disabled | No | Whether the bridge should be disabled | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful idempotency detail: create returns already_exists when the bridge name already exists. Annotations already declare destructive and idempotent behavior, but the description does not mention the destructive confirmation/approval flow or dry-run 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?
Two short sentences, with the core purpose front-loaded and the idempotency caveat immediately following. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an annotated, fully described schema, the description covers the operation and the key idempotency behavior. It omits the confirmation-token workflow for destructive actions, but that is documented in the schema 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?
Schema description coverage is 100%, so all seven parameters are already well documented in the schema. The description only reinforces the name-based idempotency behavior and does not add syntax 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 states a specific verb pair and resource: create or remove a bridge interface on a MikroTik router. It is clearly distinguishable from sibling tools like list_bridges and manage_bridge_port.
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 indicates the available actions but does not explain when to choose this tool versus alternatives such as list_bridges or manage_bridge_port, nor does it describe any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_bridge_portManage Bridge PortADestructiveIdempotent
Add or remove an interface from a bridge on a MikroTik router. Idempotent: add returns already_exists if the port assignment already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform | |
| bridge | Yes | Bridge interface name | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | Yes | Interface to add or remove as a bridge port | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds idempotency information beyond annotations, stating 'Idempotent: add returns already_exists if the port assignment already exists.' This is valuable. Annotations already provide destructiveHint and idempotentHint, so the description complements them without 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 extremely concise at two sentences, front-loading the core action and adding the idempotency detail. Every word serves a purpose with no 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?
No output schema exists, and the description does not explain return values or error conditions beyond the idempotency note. For a destructive tool (destructiveHint true), more details on confirmationToken usage or removal behavior would improve completeness. It is adequate but not comprehensive.
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 description does not elaborate on parameters beyond their basic schema definitions. Parameters like dryRun and confirmationToken are described in the schema but not in the description; the description meets the baseline but adds no extra semantic 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 the verb and resource: 'Add or remove an interface from a bridge on a MikroTik router.' It distinguishes this tool from siblings like manage_bridge (which manages the bridge itself) and list_bridges, as it specifically deals with port 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 for adding or removing bridge ports but does not explicitly state when to use this tool versus alternatives like manage_bridge or list_bridges. However, the context signals show many sibling tools, and the purpose is clear enough to infer appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_certificateManage CertificateCDestructive
Remove, trust, or untrust a certificate. Idempotent: trust/untrust return early if already in the target state.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Certificate name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims idempotent behavior for trust/untrust, but the annotations explicitly set idempotentHint to false, creating a contradiction. Additionally, it does not disclose other important behaviors like the need for a confirmation token for destructive actions or the effects of dryRun.
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 concise with two sentences covering the core purpose and a key behavioral trait. However, it could be slightly more structured or include critical information like parameter roles 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 tool has 5 parameters, is destructive, and lacks an output schema, the description is incomplete. It omits essential context such as the confirmation token flow, dry-run behavior, and effects of the remove action, leaving agents underinformed 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%, so the baseline is 3. The description does not add any additional meaning beyond the schema; it merely restates the action enum and idempotency, which is already implicit in the parameter descriptions.
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 tool manages certificates by removing, trusting, or untrusting. It uses specific verbs and specifies the resource (certificate), and distinguishes it from sibling tools like list_certificates or manage_user.
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 (e.g., other manage_* tools). It only mentions idempotency for trust/untrust but does not specify prerequisites, exclusions, or context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_containerManage ContainerADestructiveIdempotent
Create, start, stop, or remove a RouterOS container. create needs a pre-configured veth interface; start/stop are no-ops when already in the target state; remove throws NOT_FOUND when absent. Supports dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Container name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| envlist | No | RouterOS environment list name for container env vars | |
| rootDir | No | Root directory for container files | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | veth interface name to attach the container to (required on create โ must be pre-configured in RouterOS) | |
| remoteImage | No | Docker image to pull (required on create, e.g. alpine:latest) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint, idempotentHint), the description adds specific behaviors: start/stop idempotency details, remove error handling, and the prerequisite for create. It also mentions dry-run support, enhancing 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 highly concise: two sentences covering all actions and key constraints. Every sentence adds new information without 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?
Given the tool's complexity (4 actions, 10 params, no output schema), the description covers the main behaviors well but does not describe return values or success indicators. It is almost complete for the agent's needs.
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 each parameter is already documented. The description adds value by linking parameters to actions (e.g., interface and remoteImage needed on create). This provides relational context beyond individual descriptions.
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 it manages containers by creating, starting, stopping, or removing them. It distinguishes itself from sibling tools like list_containers (read-only) and manage_container_config by focusing on lifecycle actions.
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 usage context: create requires a pre-configured veth interface, start/stop are idempotent (no-ops in target state), remove throws NOT_FOUND if absent. It doesn't explicitly name alternatives but gives practical guidelines.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_container_configManage Container ConfigBDestructiveIdempotent
Update global container settings. Idempotent: returns no_change if nothing differs.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| ramHighMb | No | RAM high-water mark in MB | |
| registryUrl | No | Container registry URL | |
| vethInterface | No | Veth interface name for container networking | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
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 description's 'Idempotent' claim largely restates structured data. It does add one behavioral fact beyond the annotations โ the no_change return value when nothing differs โ which is genuinely useful, but it omits what the destructive write actually changes and that confirmation via token is required.
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 action, with no filler or repetition. It is arguably under-sized for a destructive six-parameter mutation, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-ended mutation with no output schema, the description is thin: it never explains the approval/confirmation flow that the confirmationToken parameter implies, nor the scope of 'global' versus router-specific (routerId). The schema carries that load, so the definition is functional but not 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%, so the six parameters (including dryRun and confirmationToken) are already fully documented in the schema; baseline 3 applies. The description adds no syntax, default, or interaction detail about any 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?
States a specific verb+resource: 'Update global container settings', which is clear enough to separate it from get_container_config and the per-container manage_container_env/manage_container_mount siblings. It does not, however, name any sibling or explain the 'global vs per-container' split explicitly, so the differentiation is inferential rather than stated.
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 versus get_container_config (read) or the other container settings tools, and no mention of prerequisites such as needing a prior APPROVAL_REQUIRED token before the destructive apply. The dryRun parameter exists in the schema but the description never tells the agent to use it first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_container_envManage Container EnvADestructiveIdempotent
Add or remove a container environment variable. Idempotent by name+key. add returns already_exists if the entry exists with the same value; throws CONFLICT if the value differs.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Environment variable name โ part of idempotency key | |
| name | Yes | Container name | |
| value | No | Environment variable value (required for add) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=true, and the description genuinely adds beyond them: it explains the idempotency key composition (name+key), the already_exists success path, and the CONFLICT failure when the same key carries a different value. It does not, however, address the destructive remove path or the APPROVAL_REQUIRED confirmation workflow.
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 short sentences, front-loaded with the operation and scope, followed by the idempotency and error semantics. No filler; every sentence carries actionable 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?
For a destructive, 7-parameter mutation tool with no output schema, the description covers the core operation, idempotency contract, and two error outcomes, and annotations cover the safety profile. It leaves the approval/confirmation flow and dryRun behavior to the schema, which is a minor gap but not a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description reinforces the name+key idempotency relationship that the schema only partially gestures at. It adds little else about the remaining parameters (dryRun, routerId, confirmationToken), which are already documented in 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?
States a specific verb pair (add/remove) and a precise resource (container environment variable), which cleanly separates it from siblings like list_container_envs, manage_container_mount, and manage_container_config. An agent can identify the tool's job 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?
Usage is only implied through the action enum inside the schema; the description never states when to reach for this tool versus list_container_envs or get_container_config, nor when add vs remove applies. It also says nothing about when dryRun or the confirmation-token approval flow is warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_container_mountManage Container MountADestructiveIdempotent
Add or remove a container volume mount. Idempotent by name: add returns already_exists if the mount exists with matching src/dst; throws CONFLICT if name exists with different paths.
| Name | Required | Description | Default |
|---|---|---|---|
| dst | No | Container destination path (required for add) | |
| src | No | Host source path (required for add) | |
| name | Yes | Mount name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes further by concretizing what idempotency means: already_exists on matching src/dst, CONFLICT on name collision with different paths. That is genuine added value beyond the bare hints, though it omits the confirmation flow and dryRun semantics.
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 tight sentences with zero filler; the operation is front-loaded and the idempotency rule follows 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?
For a destructive mutation tool whose safety profile is carried by annotations, the description supplies the key idempotency/conflict contract. It stops short of noting the two-step confirmation token flow, though that is documented in 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%, so the schema already documents all 7 parameters. The description only references src/dst indirectly ('matching src/dst') and adds no syntax or format guidance, 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 pair (add/remove) and resource (container volume mount), which cleanly separates it from siblings like list_container_mounts, manage_container_config, and manage_container_env. An agent can identify the operation 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 via 'Add or remove' but never states when to pick add vs remove, when to prefer list_container_mounts first, or any prerequisites. No alternatives are named or excluded, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_dhcp_clientManage DHCP ClientADestructiveIdempotent
Add, remove, enable, or disable a DHCP client on an interface. Idempotent by interface name: add returns already_exists if a DHCP client is already configured on the same interface.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment (add only) | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | Yes | Interface name โ idempotency key (e.g. ether1); for remove/enable/disable a client's display name also matches | |
| usePeerDns | No | Use DNS servers provided by DHCP server (add only) | |
| usePeerNtp | No | Use NTP servers provided by DHCP server (add only) | |
| addDefaultRoute | No | Add default route from DHCP (add only) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint, idempotentHint, and non-readOnly, so the bar is lower. The description adds real value beyond them: it names the idempotency key (interface name) and discloses the already_exists return on duplicate add, which the annotations only imply abstractly.
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, zero waste. The action scope is front-loaded and the idempotency caveat follows immediately as the secondary point an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 9-parameter tool with no output schema, the description plus annotations and a fully documented schema cover what an agent needs to call it. It does not mention the APPROVAL_REQUIRED/confirmationToken flow, but the schema parameter description carries that detail adequately.
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 every parameter including the interface idempotency key, dryRun, and confirmationToken. The description restates the interface-key semantics rather than adding new meaning, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set (add, remove, enable, disable) against a specific resource (DHCP client on an interface). This is clearly distinguishable from siblings like manage_dhcp_server, manage_dhcp_lease, and list_dhcp_clients 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?
Use is implied by the enumerated actions, but there is no explicit guidance on when to choose this over siblings (e.g., manage_dhcp_server, manage_dhcp_lease) or when to pair it with plan_changes/dryRun. The already_exists note is a behavioral hint rather than a usage rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_dhcp_leaseManage DHCP LeaseADestructiveIdempotent
Convert a dynamic DHCP lease to static (make-static) or remove a lease. Idempotent by MAC address.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform: make-static converts a dynamic lease to static; remove deletes the lease | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| macAddress | Yes | MAC address of the lease โ idempotency key (case-insensitive) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The description adds one useful detail beyond them โ idempotency is keyed specifically to MAC address โ but omits the two-step APPROVAL_REQUIRED/confirmationToken workflow and any note that 'remove' is irreversible.
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 compact sentences with zero filler; the primary operation is front-loaded, and the second sentence delivers the key operational invariant 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?
For a 5-parameter mutation tool with full schema coverage, no output schema, and annotations carrying the safety profile, the description is largely sufficient. It is slightly thin on the confirmation/approval flow and dryRun interplay, though those are spelled out in 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%, so all five parameters (action, dryRun, routerId, macAddress, confirmationToken) are already documented in the schema; baseline 3 applies. The description's 'idempotent by MAC address' marginally reinforces macAddress semantics but adds no new syntax or format 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 names the resource (DHCP lease) and the two concrete operations (convert dynamicโstatic, remove), matching the enum values exactly. An agent can distinguish it from sibling list_dhcp_leases, manage_dhcp_server, and manage_dhcp_client without opening any 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?
Usage is implied by the action names, but there is no explicit when-to-use or when-not-to-use guidance, nor any pointer to alternatives (e.g. list_dhcp_leases for discovery before mutating). The destructive path and its confirmation requirement are left entirely to the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_dhcp_serverManage DHCP ServerADestructiveIdempotent
Add, remove, enable, or disable a DHCP server. Idempotent by name: add returns already_exists if a server with the same name, interface, and address pool already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Server name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Interface to serve DHCP on (required for add) | |
| leaseTime | No | Lease duration (e.g. '1d', '12h') | |
| addressPool | No | IP pool name (required for add) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint and destructiveHint. The description adds value by specifying idempotency by name and the 'already_exists' return on duplicate add, which is beyond what annotations provide. 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?
Two succinct sentences: first states the purpose precisely, second explains key behavioral nuance. No extraneous 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 description covers purpose and idempotency but omits return format or structure, which is relevant since there is no output schema. Other aspects like prerequisites or confirmationToken usage are not mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, baseline is 3. The description adds context for the name parameter as an idempotency key and relates it to interface and addressPool in the idempotency rule, enhancing 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 clearly states the tool manages DHCP server lifecycle with specific verbs (add, remove, enable, disable). It distinguishes itself from siblings like manage_dhcp_lease by focusing on server-level operations.
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 for DHCP server management but does not explicitly state when to use versus alternatives. It lacks guidance on when not to use or which sibling tool to prefer for similar tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_dns_entryManage DNS EntryADestructiveIdempotent
Add or remove a static DNS entry, found by name (case-insensitive) and type. add returns already_exists if such a record already has the requested value and disabled state (and ttl/comment, when given), and throws CONFLICT if it differs; add never creates a second record with the same name and type. remove deletes the one matching record; when several share the name (round-robin), pass address/cname/text to pick one.
| Name | Required | Description | Default |
|---|---|---|---|
| ttl | No | TTL value (e.g. 1d, 00:05:00) | |
| name | Yes | Hostname for the DNS record (e.g. server.example.com); matched case-insensitively | |
| text | No | Text value (required for TXT records; on remove, picks the record when several share the name) | |
| type | No | DNS record type | A |
| cname | No | Target hostname (required for CNAME records; on remove, picks the record when several share the name) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| address | No | IP address (required for A records; on remove, picks the record when several share the name) | |
| comment | No | Optional comment | |
| disabled | No | Whether the entry should be disabled | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: add returns already_exists, throws CONFLICT on differing values, and never creates a duplicate name+type, corroborating idempotentHint=true. It does not mention the destructive-confirmation/APPROVAL_REQUIRED flow implied by confirmationToken, nor scope effects of remove, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then dense add/remove behavior in two sentences with zero filler; every clause carries a rule the agent needs (return values, conflict behavior, disambiguation).
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 12-parameter destructive mutation tool with no output schema, the description covers add/remove outcomes and disambiguation well. It leaves the dryRun preview, routerId defaulting, and confirmationToken approval flow to the schema, so it is not fully self-contained.
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 goes beyond it by clarifying the overloaded role of address/cname/text as record selectors on remove, which the schema only states tersely. ttl/comment semantics are noted only in passing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb pair (add/remove) and resource (static DNS entry), plus the lookup keys (name, type). It is unambiguous what the tool does, though it never names or contrasts with the obvious siblings (list_dns_entries, manage_dns_settings) to route the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains within-tool selection well: add vs remove semantics, and explicitly says when to pass address/cname/text (round-robin disambiguation on remove). It stops short of stating when to reach for this tool over sibling DNS tools, so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_dns_settingsManage DNS SettingsBDestructiveIdempotent
Update DNS resolver settings (upstream servers, cache size, cache TTL, allow-remote-requests). Idempotent: returns no_change if nothing differs.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview changes without applying. | |
| servers | No | Comma-separated upstream DNS server IPs (e.g. '8.8.8.8,1.1.1.1') | |
| routerId | No | Router ID; omit to use the default router. | |
| cacheSize | No | DNS cache size in KiB | |
| cacheMaxTtl | No | Maximum cache TTL (e.g. '1d', '00:30:00') | |
| maxUdpPacketSize | No | Maximum UDP packet size in bytes | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. | |
| allowRemoteRequests | No | Allow router to answer DNS queries from the network |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true and destructiveHint=true. The description adds context by explaining idempotency ('returns no_change if nothing differs') and listing what settings are updated. However, it doesn't elaborate on authorization needs, side effects, or the destructive nature beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. First sentence clearly states purpose and scope; second adds valuable idempotency behavior. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters (all documented in schema), annotations, and no output schema, the description covers purpose and idempotency but lacks usage guidelines and behavioral details (e.g., confirmation token requirement, destructive action). Adequate but not comprehensive.
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 baseline is 3. The description summarizes key parameters (upstream servers, cache size, cache TTL, allow-remote-requests) but does not add meaning beyond the schema. No additional parameter semantics 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 states the verb ('Update'), the resource ('DNS resolver settings'), and lists specific settings (upstream servers, cache size, cache TTL, allow-remote-requests). It distinguishes from siblings like 'get_dns_settings' by being a write operation, though not 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 on when to use vs alternatives. Does not mention when not to use, prerequisites, or context for choosing this tool over related tools like 'manage_dns_entry' or 'get_dns_settings'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_firewall_ruleManage Firewall RuleADestructiveIdempotent
Add, remove, disable, or enable a firewall rule on a MikroTik router. Matches addresses, ports, protocol, interfaces, interface lists, and connection/NAT state; nat rules take toAddresses/toPorts (e.g. a dst-nat port forward). Uses comment as idempotency key for deduplication and identification: a repeated add returns already_exists only when the match, NAT targets, and disabled state agree, otherwise CONFLICT (use enable/disable when only the disabled state differs). Supports dry-run mode.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | Yes | Firewall chain (e.g. forward, input, output, srcnat, dstnat) | |
| table | No | Firewall table to manage: filter or nat | filter |
| action | Yes | Action to perform: add, remove, disable, or enable a firewall rule | |
| dryRun | No | If true, validate and return planned changes without applying | |
| comment | No | Comment to identify the rule (used as idempotency key); omit for none | |
| dstPort | No | Destination port or range | |
| srcPort | No | Source port or range | |
| toPorts | No | NAT target port or range (nat table only) | |
| disabled | No | Whether the rule should be disabled | |
| protocol | No | Protocol to match | |
| routerId | No | Router ID; omit to use the default router. | |
| dstAddress | No | Destination address or network | |
| ruleAction | Yes | RouterOS rule action (e.g. accept, drop, reject, masquerade) | |
| srcAddress | No | Source address or network | |
| inInterface | No | Incoming interface | |
| placeBefore | No | Place the new rule before this rule ID | |
| toAddresses | No | NAT target address or range (nat table only, e.g. dst-nat) | |
| outInterface | No | Outgoing interface | |
| connectionState | No | Connection-tracking states, comma-separated, optionally negated: established,related or !invalid | |
| inInterfaceList | No | Incoming interface list, e.g. WAN or !LAN | |
| outInterfaceList | No | Outgoing interface list, e.g. WAN or !LAN | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. | |
| connectionNatState | No | Connection NAT state to match, e.g. dstnat or !dstnat |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=true, but the description adds genuine depth: the comment-as-idempotency-key mechanism, the already_exists vs CONFLICT return semantics, and dry-run support. It omits the APPROVAL_REQUIRED/confirmationToken flow that the schema exposes, which is a notable gap for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action verbs, then layers behavior in a compact paragraph appropriate to a 23-parameter tool. Dense but every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-param destructive mutation with no output schema, the description covers purpose, idempotency, NAT behavior, and dry-run adequately. The main missing piece is any mention of the two-step approval/confirmation flow that the schema's confirmationToken implies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful grouping and relationships beyond the schema: which params apply to nat (toAddresses/toPorts), and the set of match dimensions (addresses, ports, protocol, interfaces, connection/NAT state). This helps an agent reason about parameter interactions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (add, remove, disable, enable) plus the resource (firewall rule) and the platform (MikroTik router), and enumerates the match dimensions it manages. This clearly distinguishes it from siblings like manage_mangle_rule and manage_routing_rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: nat rules take toAddresses/toPorts, comment is the idempotency key, and enable/disable is the correct path when only disabled state differs. It stops short of naming sibling tools or stating when to prefer this over manage_mangle_rule, so it's strong context rather than explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_interface_listManage Interface ListADestructiveIdempotent
Add or remove an interface list. Idempotent by name. Removing a list that has members is blocked by RouterOS โ the error is surfaced as-is.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Interface list name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and idempotent. The description adds context beyond that: idempotency is achieved 'by name', and removing a list with members is blocked, with the error surfaced as-is. This provides helpful behavioral 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 two sentences long, front-loaded with the core action, and every sentence adds unique value: the first defines the purpose, the second explains idempotency and a key constraint.
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 tool with no output schema, the description covers the essential behavior: adding/removing lists, idempotency, and the error case for removal of non-empty lists. It assumes some user knowledge (e.g., what an interface list is) but is otherwise complete for its 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?
All six parameters are described in the schema with 100% coverage. The description adds only the 'idempotent by name' note for the 'name' parameter, which is a minor addition. 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 tool adds or removes an interface list, with a specific verb and resource. It distinguishes from siblings like 'manage_interface_list_member' which handles list members, and 'list_interface_lists' which lists 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 indicates the tool is for adding or removing interface lists, which implies when to use it, but it does not explicitly state when not to use it or mention alternatives like 'manage_interface_list_member' for member management.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_interface_list_memberManage Interface List MemberADestructiveIdempotent
Add or remove an interface from an interface list. Idempotent by list+interface composite key. add returns already_exists if the membership exists. remove returns not_found gracefully.
| Name | Required | Description | Default |
|---|---|---|---|
| list | Yes | Interface list name โ part of composite idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | Yes | Interface name to add/remove โ part of composite idempotency key | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds idempotency details and specific error returns (already_exists, not_found) beyond the annotations (idempotentHint=true, destructiveHint=true). No contradictions; the description enriches behavioral understanding.
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: first states the action, second covers idempotency and return behaviors. No wasted words, front-loaded with key 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?
While basic behavior is covered, the description omits important context for parameters like dryRun, comment, routerId, and confirmationToken. Given the destructive action and lack of output schema, these missing details reduce completeness.
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 parameters. The description reinforces the composite key (list+interface) but does not add new semantic details for other parameters like dryRun, comment, or confirmationToken.
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 tool adds or removes an interface from an interface list, with specific idempotency and return behaviors. This distinguishes it from sibling tools like manage_interface_list (which likely manages the list itself) and other management tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-to-avoid guidance is provided. While the action is clear, no distinction is made between using this tool versus other membership management tools. Usage is implied but not detailed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ip_addressManage IP AddressADestructiveIdempotent
Add, update, or remove an IP address on a MikroTik router interface. Performs idempotency checks for add operations and supports dry-run mode for all actions.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform: add, update, or remove an IP address | |
| dryRun | No | If true, validate and return planned changes without applying | |
| address | Yes | IP address with optional prefix length in CIDR notation (e.g., 192.168.1.1/24). Defaults to /32 if prefix is omitted. | |
| comment | No | Optional comment for the IP address entry | |
| network | No | Network address (auto-calculated from address if omitted) | |
| disabled | No | Whether the IP address should be disabled | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | Yes | Interface to assign the IP address to | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructive and idempotent hints. The description adds specifics: idempotency for add operations, dry-run mode, and the need for a confirmation token for destructive actions. This goes beyond annotations by detailing the expected 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?
Two concise sentences: first states the core purpose, second adds key behaviors (idempotency, dry-run). No redundant words; every sentence provides value. Ideals for front-loading.
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 9 parameters, no output schema, and decent annotations, the description covers idempotency, dry-run, and confirmation token. It could explain return values or side effects more, but given the annotations and schema richness, it is fairly 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 the description adds no new parameter information. It does conceptually link parameters like dryRun and confirmationToken to the behavior mentioned, but does not elaborate on their meaning beyond the schema. 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?
Description clearly states the tool adds, updates, or removes an IP address on a MikroTik router interface. It specifies a concrete action and resource, and the title 'Manage IP Address' aligns perfectly. Among many manage_ siblings, this is distinct for IP address management.
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 mentions idempotency checks and dry-run mode but does not explicitly guide when to use this tool over alternatives. It implicitly contrasts with other manage_ tools by focusing on IP addresses, but lacks explicit use-case conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ip_poolManage IP PoolADestructiveIdempotent
Add or remove an IP address pool. Idempotent by name: add returns already_exists if a pool with the same name and ranges already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Pool name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| ranges | No | IP range (e.g. '192.168.1.100-192.168.1.200'; required for add) | |
| nextPool | No | Next pool name for overflow | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so those traits are covered. The description adds real value beyond them by pinning down the idempotency key ('by name') and the concrete error outcome ('already_exists' when name and ranges match), which the agent cannot get from the hints. It stops short of describing the approval/confirmation flow for remove, though the confirmationToken schema description covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core capability and followed immediately by the idempotency contract. Every clause carries information, though the second sentence packs several facts into one dense line.
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 destructive two-action tool with no output schema, the annotations plus schema already carry the safety profile, the dryRun preview, and the confirmation-token flow. The description supplies the mutation semantics and one return case, leaving little an agent needs that 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 all seven parameters are already documented, including name as the idempotency key and ranges as required for add. The description restates the name idempotency without adding new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair ('Add or remove') and resource ('IP address pool'), which clearly separates it from the read-only sibling list_ip_pools by implication. It does not, however, name the sibling or otherwise differentiate explicitly in text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no when-not-to-use, and no routing to alternatives such as list_ip_pools for inspection. The only usage signal is the verb choice itself, which the agent could infer 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.
manage_ipsec_peerManage IPSec PeerADestructiveIdempotent
Add, remove, enable, or disable an IPSec peer. Idempotent by name: add returns already_exists if a peer with the same name and address already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Peer name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| address | No | Remote gateway address (required for add) | |
| comment | No | Optional comment | |
| profile | No | IKE profile name | |
| exchange | No | IKE exchange mode | ike2 |
| routerId | No | Router ID; omit to use the default router. | |
| localAddress | No | Local address | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds context by explaining the idempotency behavior for add operations and the 'already_exists' response, which goes beyond annotations. However, details about other actions (remove, enable, disable) are not 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?
Two efficient sentences that convey essential information without waste. The description is front-loaded with actions and then idempotency 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?
Given the high parameter count (10) and no output schema, the description is too terse. It lacks action-specific parameter guidance (e.g., which params are needed for add vs remove) and return value details for actions other than add.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3. The description does not add meaning beyond what the schema already provides (e.g., 'Peer name โ idempotency key' in schema, and description repeats idempotency).
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 actions (add, remove, enable, disable) and the resource (IPSec peer), distinguishing it from sibling tools like list_ipsec_peers and manage_ipsec_policy. The mention of idempotency adds specificity.
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 (e.g., other manage_* tools). The description only states what it does, not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ipsec_policyManage IPSec PolicyADestructiveIdempotent
Add, remove, enable, or disable an IPSec policy. Idempotent by composite key (srcAddress + dstAddress + tunnel).
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | SA level | require |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| tunnel | No | Tunnel mode โ part of composite idempotency key | |
| routerId | No | Router ID; omit to use the default router. | |
| dstAddress | Yes | Destination CIDR โ part of composite idempotency key | |
| srcAddress | Yes | Source CIDR โ part of composite idempotency key | |
| ipsecAction | No | IPSec action (required for add) | |
| saDstAddress | No | SA destination IP for tunnel mode | |
| saSourceAddress | No | SA source IP for tunnel mode | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. The description adds valuable context about the composite idempotency key (srcAddress + dstAddress + tunnel) and the range of actions (add/remove/enable/disable), which helps the agent understand safety and repeatability 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?
Two sentences, front-loaded with action and resource, then idempotency detail. No wasted words; 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?
Given the complexity (11 parameters, 3 required, no output schema), the description is brief. It covers core behavior but omits return values, error handling, or interaction with confirmationToken. For a mutation tool, additional context on expected outputs would improve completeness.
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 all parameters have descriptions. The description adds meaning by highlighting the idempotency key (srcAddress, dstAddress, tunnel) as composite, but does not elaborate on other parameters like routerId or dryRun. This is baseline adequate given schema richness.
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 tool can add, remove, enable, or disable an IPSec policy, with a specific verb and resource. It distinguishes itself from siblings like list_ipsec_policies (read-only) and manage_ipsec_peer (different resource) by specifying the exact actions and the idempotency key.
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 for managing IPSec policies but does not explicitly state when to use this tool versus alternatives like manage_ipsec_peer or other routing tools. No exclusions or context is provided, leaving the agent to infer from the tool name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ip_serviceManage IP ServiceADestructiveIdempotent
Enable or disable a RouterOS IP service (api, api-ssl, ssh, telnet, www, www-ssl, winbox, ftp). Port number changes are intentionally not supported to prevent accidental lockout. MikroMCP reaches RouterOS through the REST API on www-ssl (or www for plaintext): disabling the service its connection uses cuts MikroMCP off from the router, including any later call to re-enable it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Service name to manage (api, api-ssl, ssh, telnet, www, www-ssl, winbox, ftp) | |
| action | Yes | Action to perform โ only enable/disable to prevent accidental lockout from changing ports | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered, but the description goes well beyond: it explains that port changes are deliberately unsupported to prevent lockout and warns that disabling www-ssl/www severs MikroMCP's own REST connection, preventing even a later re-enable. That self-lockout warning is critical behavioral context not carried by structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place, with the core enable/disable purpose front-loaded and the lockout caveat following logically. No filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies everything an agent needs: valid services, the mutation model, the confirmation-token workflow is covered by the schema, and the dangerous self-lockout scenario is spelled out. Nothing material 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 name/action enums and the dryRun/confirmationToken semantics are already documented. The description reinforces why only enable/disable is allowed but adds little syntax or format detail beyond the schema, matching the baseline-3 expectation when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (enable/disable) and resource (RouterOS IP service) and enumerates the valid service set, which clearly separates it from the sibling list_ip_services read tool. An agent knows exactly what it mutates 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?
Gives clear context for when to use it and a strong caution about the consequences of use (disabling the connection service locks out MikroMCP). It does not explicitly name an alternative tool, but the only near-sibling is list_ip_services, which serves a different purpose, so the routing guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_log_actionManage Log ActionADestructiveIdempotent
Add or remove a RouterOS logging action target. Idempotent by name. add throws VALIDATION if type is missing; returns already_exists if name found. remove returns not_found gracefully. Supports dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Log action name โ idempotency key | |
| type | No | Action type: memory, disk, remote, echo, email (required on add) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| remote | No | Remote syslog server address (for type=remote) | |
| routerId | No | Router ID; omit to use the default router. | |
| remotePort | No | Remote syslog server port (for type=remote) | |
| diskFileName | No | Disk log file name without extension (for type=disk) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: idempotency semantics, VALIDATION error on missing type, already_exists return, not_found graceful handling for remove, and dry-run support. Annotations already flag destructiveHint and idempotentHint, but the description clarifies the exact failure/success modes.
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?
Tight, front-loaded phrasing. The first sentence states purpose; subsequent clauses deliver error/idempotency/dry-run facts with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no output schema, the description covers the key behavioral gaps (error modes, idempotency, dry-run). The confirmationToken/APPROVAL_REQUIRED flow is only documented in the schema, not the description, but that is adequately covered there.
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 all parameters including type requirements and dryRun. The description reinforces that type is required on add, but adds little 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?
Clear specific verb pair (add/remove) and resource (RouterOS logging action target), immediately distinguishable from siblings like manage_log_rule and list_log_actions.
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?
Describes internal behavior branches (add vs remove) but gives no explicit guidance on when to prefer this over manage_log_rule or how it relates to the listing sibling. Usage context is implied by the action parameter, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_log_ruleManage Log RuleADestructiveIdempotent
Add, remove, enable, or disable a RouterOS logging rule. Idempotent by topics+logAction (add โ already_exists on match; remove โ not_found handled gracefully; enable/disable throw NOT_FOUND when absent). Supports dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| prefix | No | Optional prefix to prepend to log messages | |
| topics | Yes | Log topics (e.g. firewall, system, info) โ idempotency key | |
| routerId | No | Router ID; omit to use the default router. | |
| logAction | Yes | Log action target name (RouterOS action field) โ idempotency key | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=true, and readOnlyHint=false, but the description adds real value beyond them: it pins the idempotency key to topics+logAction and specifies per-action failure semantics for each mutation. It omits the approval/confirmation flow that the confirmationToken parameter implies, which is the main remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the operation list front-loaded and no pad. The parenthetical is information-packed rather than wasteful, though its density slightly reduces scannability.
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 mutation tool with no output schema, the description covers the essential behavioral profile: what it changes, idempotency keys, and per-action error handling. It stops short of explaining the destructive-action approval flow (confirmationToken) or default-router targeting, which the schema partially carries.
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 all seven parameters including the topics/logAction idempotency keys and dryRun. The description restates the idempotency-key concept but adds no syntax, format, or constraint detail beyond what the schema 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 names a precise resource (RouterOS logging rule) and enumerates the four concrete operations (add, remove, enable, disable), so an agent knows exactly what the tool mutates. It does not, however, explicitly distinguish itself from the nearby sibling manage_log_action, leaving the rule-vs-action boundary to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical outcomes (already_exists on add, not_found handled on remove, NOT_FOUND on enable/disable) imply when each action path is appropriate, but the description never states when to reach for this tool over siblings like manage_log_action or list_log_rules. 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.
manage_mangle_ruleManage Mangle RuleADestructiveIdempotent
Add, remove, enable, or disable a firewall mangle rule. ruleAction sets the action; when it is omitted, a new* value implies its own (newRoutingMark โ mark-routing), otherwise accept. Each new* value is accepted only under its action. Uses comment as idempotency key: a repeated add returns already_exists only when the chain, match fields, marks, DSCP, MSS, passthrough, and the given or implied action agree, otherwise CONFLICT. Supports dry-run mode.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Mangle chain (required on add): prerouting, input, forward, output, postrouting | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| newMss | No | MSS to set: a number or clamp-to-pmtu (ruleAction change-mss, with protocol tcp and tcpFlags syn) | |
| comment | Yes | Idempotency key โ uniquely identifies this mangle rule | |
| dstPort | No | Destination port or range | |
| srcPort | No | Source port or range | |
| protocol | No | Protocol to match (e.g. tcp, udp) | |
| routerId | No | Router ID; omit to use the default router. | |
| tcpFlags | No | TCP flags to match, comma-separated, ! negates one (e.g. "syn"); needs protocol tcp | |
| dstAddress | No | Destination IP/CIDR to match | |
| ruleAction | No | Mangle action, add only. Omitted: the action of the new* value given (newRoutingMark โ mark-routing, newConnectionMark โ mark-connection, newPacketMark โ mark-packet, newDscpValue โ change-dscp, newMss โ change-mss), else accept, the RouterOS default | |
| srcAddress | No | Source IP/CIDR to match | |
| inInterface | No | Incoming interface to match | |
| passthrough | No | Whether to continue matching subsequent rules | |
| newDscpValue | No | DSCP value to set, 0โ63 (ruleAction change-dscp) | |
| outInterface | No | Outgoing interface to match | |
| newPacketMark | No | Packet mark to set (ruleAction mark-packet) | |
| dstAddressList | No | Destination address list name to match | |
| newRoutingMark | No | Routing mark to set (ruleAction mark-routing, chain prerouting or output) | |
| srcAddressList | No | Source address list name to match | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. | |
| newConnectionMark | No | Connection mark to set (ruleAction mark-connection) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnly=false, idempotent=true, destructive=true) by disclosing the idempotency-key mechanism, the already_exists vs CONFLICT outcome on repeated adds, the exact set of fields that must agree, the implied ruleAction fallback, and the per-action acceptance constraint on new* values. This is exactly the extra behavioral context a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the remaining sentences each carry distinct semantic content (implied action, per-action constraint, idempotency/CONFLICT, dry-run). It is dense but no sentence is filler; a light trim would make it a 5.
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 23-parameter tool with no output schema, the description covers actions, implied rules, idempotency, conflict behavior, and dry-run well. It omits the destructive-action confirmation/APPROVAL_REQUIRED flow, which is only surfaced via the confirmationToken parameter and the destructiveHint annotation, so a small gap remains.
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, but the description adds a genuine cross-parameter validation rule absent from the schema: each new* value is accepted only under its matching action. It also restates the implied ruleAction mapping, which the schema already covers, capping it below 5.
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?
Starts with a specific set of verbs (Add, remove, enable, disable) applied to a precise resource (firewall mangle rule), which distinguishes it from the sibling manage_firewall_rule and complements list_mangle_rules. An agent can tell what domain this operates in 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?
Usage is implicit: the semantics of add/remove/enable/disable and dry-run imply when to call it, but there is no explicit when-to-use, when-not, or named alternative against siblings like manage_firewall_rule or manage_routing_rule. Adequate but leaves routing decisions to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_netwatch_entryManage Netwatch EntryADestructiveIdempotent
Add, remove, enable, or disable a Netwatch monitoring entry. Idempotent by host+port: add returns already_exists if an entry with the same host and port already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Host to monitor โ idempotency key | |
| port | No | TCP port (optional; ICMP if omitted) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| timeout | No | Probe timeout (e.g. '500ms') | |
| interval | No | Check interval (e.g. '1m'; default '1m') | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
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 goes beyond that by naming the idempotency key (host+port) and the concrete return contract (already_exists on duplicate add), which is genuinely useful extra context. It does not, however, surface the confirmation-token/APPROVAL_REQUIRED flow that governs destructive actions, which lives only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the action list is front-loaded and the idempotency constraint follows immediately. Every clause carries 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?
With no output schema, the description helpfully discloses the return semantics for the add case (already_exists). For a destructive 9-parameter management tool it is nearly complete, though the destructive-confirmation behavior is only discoverable via the schema parameter rather than 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%, so all 9 parameters are already documented in the schema. The description only reinforces the host+port idempotency relationship, matching the baseline for a fully documented schema rather than adding meaning beyond 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 set of verbs (add, remove, enable, disable) applied to a specific resource (a Netwatch monitoring entry), which cleanly separates it from the read-only sibling list_netwatch_entries. An agent can identify the tool's scope 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?
Usage is implied by the enumerated action values and the idempotency note, but the description never explicitly states when to reach for this tool versus alternatives (e.g., use list_netwatch_entries to inspect, or apply_plan/bulk_execute for batched changes). Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ntp_clientManage NTP ClientBDestructiveIdempotent
Update NTP client settings on a MikroTik router. Idempotent: returns already_set if no changes are needed.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | NTP client mode | |
| dryRun | No | Preview changes without applying. | |
| enabled | No | Enable or disable the NTP client | |
| servers | No | Comma-separated NTP server addresses | |
| routerId | No | Router ID; omit to use the default router. | |
| vlanInterface | No | VLAN interface for NTP communication | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is carried structurally. The description adds one genuinely useful behavior (returning 'already_set' when no changes are needed), but for a destructive tool it stays silent on which changes are dangerous or that an APPROVAL_REQUIRED round-trip may be triggered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action front-loaded and the idempotency behavior placed second. Nothing needs trimming and nothing 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?
For a 7-parameter destructive mutation with a confirmation-token workflow and no output schema, the description is minimally adequate: schema and annotations cover the mechanics, but the destructive-approval path and the effect of each setting are never surfaced in prose. An agent can call it, but not confidently reason about consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the enum options for 'mode' and the purpose of dryRun and confirmationToken, so the schema does the heavy lifting. The description adds no parameter syntax, defaults, or interactions (e.g., VLAN interface vs routerId) beyond what is already documented.
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 NTP client settings') scoped to a MikroTik router, which distinguishes it from the read-only sibling get_ntp_settings. It does not name that sibling explicitly, so differentiation is inferred from the verb rather than spelled out.
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 get_ntp_settings (read the current config first) or set_system_clock. Nothing explains the approval/confirmation flow that the confirmationToken parameter implies, leaving the agent to discover the two-step write path on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ovpn_clientManage OpenVPN ClientADestructiveIdempotent
Add, update, or remove an OpenVPN client interface. Idempotent by name (already_exists on matching name+connectTo; CONFLICT on differing connectTo; no_change when an update differs in nothing). Password is always written when provided since RouterOS does not return it on GET.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Tunnel mode | |
| name | Yes | OpenVPN client interface name โ idempotency key | |
| port | No | Remote port number | |
| user | No | VPN username | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| password | No | VPN password (never logged) | |
| protocol | No | Transport protocol | |
| routerId | No | Router ID; omit to use the default router. | |
| connectTo | No | Remote server address (required for add) | |
| certificate | No | Client certificate name | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details behavioral nuances beyond annotations: idempotency by name, specific conflict responses (already_exists, CONFLICT, no_change), and password handling (always written because RouterOS doesn't return it). This adds significant context to 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 concise (3 sentences) and front-loaded: first sentence states purpose, second explains idempotency/conflict, third covers password behavior. No 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 tool with 12 parameters, no output schema, and important behavioral details, the description covers key aspects (idempotency, conflict, password). It could mention error responses or success indicators, but is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying that 'name' serves as idempotency key and explaining password behavior, which is not fully covered in schema descriptions.
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 tool's purpose: 'Add, update, or remove an OpenVPN client interface.' It also differentiates from siblings like manage_ovpn_server by specifying it's for client interfaces.
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 implicitly guides usage via the action parameter (add/update/remove) and explains idempotency behavior, but does not explicitly state when to use this tool versus alternatives like manage_ovpn_server.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ovpn_serverManage OpenVPN ServerADestructiveIdempotent
Enable, disable, or configure the OpenVPN server (a per-router singleton). Throws NOT_FOUND if the OpenVPN package is not installed. The set action requires at least one configuration field.
| Name | Required | Description | Default |
|---|---|---|---|
| auth | No | Authentication algorithm (set action only) | |
| mode | No | Tunnel mode (set action only) | |
| port | No | Listening port (set action only) | |
| action | Yes | Action to perform | |
| cipher | No | Encryption cipher (set action only) | |
| dryRun | No | Preview changes without applying. | |
| protocol | No | Transport protocol (set action only) | |
| routerId | No | Router ID; omit to use the default router. | |
| certificate | No | Server certificate name (set action only) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as destructive and idempotent. The description adds value by disclosing the NOT_FOUND error condition and the singleton nature. It does not elaborate on what exactly gets destroyed or authorization needs, but with annotations, the description provides adequate additional context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences, each earning its place: purpose, error condition, and constraint. No fluff, and the key information 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 tool's complexity (10 parameters, multiple actions, error states), the description covers the basics but lacks details like the effects of enable/disable, whether set modifies or overwrites, and what the return value is (no output schema). The dryRun and confirmationToken parameters are not mentioned, though they appear in 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 coverage is 100%, so the baseline is 3. The description mentions that the 'set' action requires at least one configuration field, but this is already implied by the schema. It does not add further semantics beyond what the schema provides, such as format constraints or dependencies between 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 clearly states the tool enables, disables, or configures the OpenVPN server, specifying it is a per-router singleton. It distinguishes from sibling tools like get_ovpn_server (read-only) and manage_ovpn_client (client management).
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 clear guidance: it mentions the possible actions and that 'set' requires at least one configuration field. It also warns of a NOT_FOUND error if the package is not installed. However, it does not explicitly suggest using list_packages or get_ovpn_server first, nor does it describe when to use enable/disable versus set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_packageManage PackageADestructiveIdempotent
Enable or disable a RouterOS package. Changes take effect only after a router reboot โ use the reboot tool to apply. Idempotent: no-op if already in the target state.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Package name | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true and destructiveHint=true. The description adds valuable context: changes only take effect after rebooting, and idempotency means no-op if already in target state. This goes beyond what annotations offer.
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, front-loading the core action, then adding critical behavior (reboot, idempotency). No wasted words; every sentence adds value.
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 no output schema, the description sufficiently covers the tool's behavior (enable/disable, reboot needed, idempotent). It could mention what state the package transitions to (enabled/disabled) but the action parameter makes that clear.
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 clear parameter descriptions. The tool description does not add additional semantics beyond the schema, meeting the baseline. No extra explanation is needed for basic fields like name and action.
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 tool enables or disables a RouterOS package, with specific verb and resource. It also mentions the reboot requirement, distinguishing it from listing tools like list_packages.
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 indicates when to use this tool (to enable/disable a package) and the prerequisite of a reboot, pointing to the reboot tool. It lacks explicit 'when not to use' but is clear enough for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_pppoe_clientManage PPPoE ClientADestructiveIdempotent
Add, update, or remove a PPPoE client interface. Idempotent by name (already_exists on matching name+interface+user; CONFLICT on differing config; no_change when an update differs in nothing). Password is always written when provided since RouterOS does not return it on GET.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | PPPoE client interface name โ idempotency key (e.g. pppoe-wan) | |
| user | No | PPPoE username (required for add) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| password | No | PPPoE password (never logged) | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Parent interface (required for add) | |
| serviceName | No | PPPoE service name filter (leave empty to match any) | |
| dialOnDemand | No | Dial on demand instead of always-on (yes/no) | |
| addDefaultRoute | No | Add default route via PPPoE (yes/no) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and idempotent behavior. The description adds valuable details: idempotency by name with specific outcomes (already_exists, CONFLICT, no_change), and password handling (always written, not returned). This enriches behavioral understanding 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 two sentences, front-loaded with purpose, and every sentence adds value. No wasted words; idempotency and password behavior are explained efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, no output schema), the description covers idempotency, password handling, and basic CRUD. However, it lacks details on removal behavior, error responses, or prerequisite conditions. Still, it provides sufficient context 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 coverage is 100%, so all parameters have descriptions. The description does not add per-parameter semantics beyond the password note, but it explains the password behavior globally. Baseline 3 is appropriate given 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 clearly states the tool adds, updates, or removes a PPPoE client interface, with specific verb (manage) and resource (PPPoE client). It distinguishes itself from sibling manage_* tools by naming the specific resource, and from list_pppoe_clients by indicating CRUD operations.
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 (e.g., when to use manage_bridge vs manage_pppoe_client, or when to use list_pppoe_clients for listing). It does not mention prerequisites or context, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_ppp_profileManage PPP ProfileADestructiveIdempotent
Add, update, or remove a PPP profile. Idempotent by name. update returns no_change when requested values match. Built-in profiles (default, default-encryption) cannot be removed โ RouterOS blocks this and the error is surfaced.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Profile name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| routerId | No | Router ID; omit to use the default router. | |
| dnsServer | No | DNS server IP pushed to client | |
| rateLimit | No | Rate limit string (e.g. '10M/10M') | |
| localAddress | No | Local IP assigned to router end of PPP link | |
| remoteAddress | No | IP or pool name assigned to client | |
| sessionTimeout | No | Session timeout duration string (e.g. '1h') | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive and idempotent behavior, so the bar is lower, but the description still adds value: idempotency is keyed on name, update returns a no_change signal when values already match, and removal of built-in profiles fails with a surfaced RouterOS error. It stops short of describing the APPROVAL_REQUIRED/confirmationToken flow, though the schema documents 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?
Three tight sentences, front-loaded with the action set and then the two behavioral caveats. No filler and every sentence adds information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action mutation tool with no output schema, it covers actions, idempotency, and the key failure mode. The main omission is the confirmation/approval workflow, which is only discoverable by reading the confirmationToken parameter 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?
With 100% schema description coverage, the schema already documents all 11 parameters, so a 3 is the baseline. The description reinforces that name is the idempotency key but adds no syntax or constraint detail 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?
States a specific verb set (add/update/remove) and resource (PPP profile) in the first sentence, clearly distinguishing it from the sibling list_ppp_profiles and the pppoe/ovpn client managers. An agent can tell at a glance this is the CRUD tool for PPP profiles.
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?
Conveys what each action does and gives a precondition (built-in profiles cannot be removed), but never says when to prefer this tool over alternatives or what the general call context is. Usage is implied by the enumerated actions rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_queueManage QueueADestructiveIdempotent
Add, remove, enable, or disable a simple queue. Idempotent by name: add returns already_exists if a queue with the same name and target already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Queue name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| target | No | Target address (required for add; e.g. '192.168.1.0/24') | |
| comment | No | Optional comment | |
| limitAt | No | Guaranteed rate (e.g. '1M/1M') | |
| maxLimit | No | Max upload/download limit (e.g. '10M/10M') | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=true, so the safety profile is covered. The description adds the concrete already_exists return on duplicate add, but does not disclose the destructive confirmation flow (confirmationToken / APPROVAL_REQUIRED) or what removal actually destroys. It slightly restates the idempotency annotation rather than extending it.
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 operation list, with zero filler. The idempotency caveat is correctly placed as the second sentence because it refines behavior rather than redefining 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 9-parameter tool with no output schema, the description is minimally adequate; the schema covers per-parameter meaning, so return values need not be explained. It stops short of describing the multi-step destructive confirmation flow and dryRun preview that an agent invoking remove/disable would benefit from understanding.
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 carries the heavy lifting for all 9 parameters. The description reinforces the 'idempotency key' role of name, but adds no syntax or format detail beyond what the schema already documents. 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 names a specific resource ('simple queue') and enumerates the exact operations (add, remove, enable, disable), which cleanly separates it from the read-only sibling list_queues. An agent can identify this as the mutation counterpart 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?
Usage is implied by the action set; an agent knows this is the tool for mutating queues. However, it never states when to choose this over list_queues, nor gives guidance on which action fits which scenario (e.g., remove vs disable), leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_routeManage Static RouteBDestructiveIdempotent
Add or remove a static route on a MikroTik router. Performs idempotency checks for add operations and supports dry-run mode for all actions.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform: add or remove a route | |
| dryRun | No | If true, validate and return planned changes without applying | |
| comment | No | Optional comment for the route | |
| gateway | Yes | Gateway IP address | |
| disabled | No | Whether the route should be disabled | |
| distance | No | Route distance/metric (1-255) | |
| routerId | No | Router ID; omit to use the default router. | |
| dstAddress | Yes | Destination address in CIDR notation or plain IP (auto-converted to /32), e.g. 10.0.0.0/8 or 10.77.0.4 | |
| routingTable | No | Routing table name (default: main). Use for policy routing with separate tables. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include destructiveHint=true and idempotentHint=true. The description adds value by specifying that idempotency checks apply only to add operations and that dry-run mode is supported. However, it fails to mention the confirmationToken parameter's critical role for destructive actions or what happens on idempotent add (e.g., no change). The description partially complements annotations but misses key behavioral 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 consists of exactly two sentences: the first clearly states the core purpose, and the second highlights two important features (idempotency checks and dry-run). There is no redundant or extraneous information. Every word serves a purpose, 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?
Despite detailed parameter schema, the description lacks essential context for a tool with 10 parameters and no output schema. It does not explain the confirmationToken parameter's purpose, the return value, error conditions, or the fact that remove operations are destructive. While the schema covers individual parameters, the tool's overall behavior and workflow remain underdocumented.
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 parameters are already documented. The description does not add any new meaning beyond what the schema provides. It mentions dry-run and idempotency, which relate to parameters (dryRun and idempotent add behavior), but these are not directly tied to specific parameter usage. With full schema coverage, 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 clearly states the tool's purpose: 'Add or remove a static route on a MikroTik router.' It specifies the verb (add/remove) and resource (static route), and distinguishes from sibling tools like list_routes or manage_routing_rule by explicitly targeting static route management.
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 that list_routes is for viewing existing routes, nor does it explain scenarios where manage_routing_rule or manage_routing_table might be more appropriate. There is no explicit 'when-to-use' or 'when-not-to-use' advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_routing_ruleManage Routing RuleADestructiveIdempotent
Add, remove, enable, or disable a policy routing rule. Idempotent by srcAddress+dstAddress+interface+table composite key; a repeated add with an explicit, different ruleAction is a CONFLICT. Supports dry-run mode.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Routing table name โ part of the composite idempotency key; required for all actions | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| priority | No | Unsupported: RouterOS 7 /routing/rule has no priority (rules apply in list order); add rejects it | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Incoming interface to match | |
| dstAddress | No | Destination CIDR to match | |
| ruleAction | No | Rule action, add only: lookup (default; when the table has no route, later rules and main still apply) or lookup-only-in-table (no fallback) | |
| srcAddress | No | Source CIDR to match | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=true; the description goes further by defining the composite idempotency key (srcAddress+dstAddress+interface+table), the CONFLICT condition, and dry-run support. It does not spell out what remove/disable tear down, but adds genuine context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: actions first, then idempotency/conflict, then dry-run. No filler, and the core 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?
For a 10-param mutation tool with no output schema but rich annotations, the description covers actions, identity, conflict, and dry-run. It omits the confirmation/approval flow, but the schema's confirmationToken description covers that, so the definition is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description usefully ties four separate parameters together into one composite identity key and clarifies the conflict behavior around ruleAction โ relationships the schema only documents piecemeal. That is meaningful added value over the schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (add, remove, enable, disable) against a precise resource ('policy routing rule'), which separates it from generic route/firewall/mangle tools. It is clear, though it never explicitly names or contrasts with siblings like manage_route or list_routing_rules.
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 four enumerated actions imply the usage surface, and the idempotency/conflict note hints at add semantics. However, there is no explicit when-to-use-vs-alternative guidance (e.g., when this beats manage_route or list_routing_rules), so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_routing_tableManage Routing TableADestructiveIdempotent
Create or remove a custom routing table. Idempotent by table name. Supports dry-run mode.
| Name | Required | Description | Default |
|---|---|---|---|
| fib | No | Whether to sync this table with the FIB | |
| name | Yes | Routing table name (idempotency key) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotent and destructive. Description adds idempotency by table name and dry-run mode, but does not disclose that destructive actions may require a confirmation token (though the schema's confirmationToken description covers this).
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 core action and key characteristics. No unnecessary 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 create/remove tool with well-documented schema, the description is mostly complete. It lacks mention of confirmation flow for destructive actions, but that is covered by the schema parameter. No output schema, but return is straightforward.
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 descriptions cover all 6 parameters (100% coverage). The description adds context that name is an idempotency key and dryRun enables preview, but the schema already provides adequate meanings.
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 it creates or removes a custom routing table, with idempotency and dry-run support. This distinguishes it from sibling tools like list_routing_tables.
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 for creating or removing routing tables, but does not explicitly state when to use add vs remove or provide alternatives. However, the sibling list makes it clear when to use list_routing_tables instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_scheduled_jobManage Scheduled JobADestructiveIdempotent
Add, update, remove, enable, or disable a RouterOS scheduler entry. onEvent is arbitrary RouterOS script run with the router user's policies, so this tool is destructive. Idempotent by name. add throws CONFLICT if name exists; update throws NOT_FOUND if it does not. Supports dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Job name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| onEvent | No | Script name or inline command to run (required on add) | |
| interval | No | Run interval (e.g. 00:05:00 for every 5 minutes) | |
| routerId | No | Router ID; omit to use the default router. | |
| startDate | No | Start date (e.g. jan/01/2000) | |
| startTime | No | Start time (e.g. 00:00:00) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description explains WHY: onEvent is arbitrary RouterOS script executed with the router user's policies, which is the concrete blast radius. It also discloses per-action error contracts and dry-run support, adding real value beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, no filler, and the destructive-risk rationale plus error semantics are front-loaded right after the verb list. Every sentence carries distinct 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?
No output schema exists, and the description covers the mutation's risks, idempotency model, error cases, and dry-run. It leaves partial-update behavior on 'update' (whether omitted fields are preserved) and the enable/disable preconditions unstated, which is a modest gap for a 10-parameter destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, action enum, dryRun, confirmationToken, and timing fields; baseline is 3. The description's semantic additions ('idempotent by name', onEvent policy context) largely restate or slightly extend what the schema already says, especially since 'Job name โ idempotency key' is already in 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?
Opens with a specific multi-verb statement of the resource acted upon: 'Add, update, remove, enable, or disable a RouterOS scheduler entry.' The agent can immediately separate this mutating tool from the read-only sibling list_scheduled_jobs without opening a 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?
Gives clear operational conditions: idempotency by name, add throws CONFLICT on existing names, update throws NOT_FOUND on missing ones, and dry-run is supported. It never explicitly routes the agent to list_scheduled_jobs for reads or states when-not-to-use, so it stops short of full when/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_scriptManage ScriptADestructiveIdempotent
Add, update, or remove a RouterOS script. Idempotent by name. add throws CONFLICT if the name already exists; update throws NOT_FOUND if it does not. Supports dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Script name โ idempotency key | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| source | No | Script body (required for add and update) | |
| comment | No | Optional comment | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. | |
| dontRequirePermissions | No | Allow script to run without elevated permissions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses idempotency (matches idempotentHint), dry-run capability, and error throwing (CONFLICT, NOT_FOUND). ConfirmationToken description highlights destructive nature (matches destructiveHint). Adds nuance 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?
Two sentences plus compact points. No wasted words. Information 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?
Covers core operations, error handling, idempotency, dry-run, and destructive confirmation. With 8 parameters and no output schema, explanation is sufficient for an agent to use 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 coverage is 100%, so baseline 3. Description adds meaning by linking name parameter to idempotency and dryRun to preview, but does not explain all parameters. Still adds 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?
Clearly states the tool adds, updates, or removes RouterOS scripts. Distinct from siblings like run_script or list_scripts. Specific verb+resource with error 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?
Describes idempotency by name and error behavior for add/update. Supports dry-run for preview. Could mention when to use alternatives like run_script, but the scope is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_upgradeManage UpgradeADestructive
Trigger a RouterOS package update check or install. 'check' queries the update server for new packages. 'install' downloads and applies the update โ the router will reboot automatically. Supports dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | check โ trigger a check for available updates; install โ download and install the latest update (triggers reboot) | |
| dryRun | No | Preview the action without executing | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true, and the description adds critical behavior: 'the router will reboot automatically' and 'Supports dry-run.' This goes beyond annotations to clarify real-world effects.
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 three concise sentences, front-loaded with purpose, then action details, then dry-run. Every word adds value.
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 destructive tool with reboot, the description covers all behavioral aspects (check vs install, reboot, dry-run). No output schema is needed; description is sufficient 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% with clear parameter descriptions. The description adds minimal extra: it mentions dry-run support, but the schema already defines dryRun. No significant 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 clearly states 'Trigger a RouterOS package update check or install.' It specifies two distinct actions (check and install) and notes the reboot consequence for install. This differentiates it from siblings like get_upgrade_status (status query) and manage_package (package management).
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 explains the tool's actions but does not explicitly compare to alternatives. It implies usage context via action descriptions, but lacks explicit 'when to use vs get_upgrade_status' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_userManage UserADestructiveIdempotent
Add, remove, enable, disable, or set the password for a local RouterOS user. Idempotent by name: add returns already_exists if a user with the same name and group already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Username โ idempotency key | |
| group | No | Group name (required for add; e.g. 'read', 'write', 'full') | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| address | No | Allowed source address or range | |
| comment | No | Optional comment | |
| password | No | Password (required for add and set-password) | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutability and destructiveness. The description adds valuable context about idempotency (by name) and the specific return behavior for add ('already_exists'). This goes beyond what annotations provide, though it could mention behavior for other actions (e.g., enabling an already enabled user).
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 with no extraneous information. Front-loaded with the list of actions and idempotency behavior. 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 mutation tool with 9 parameters and no output schema, the description covers the core functionality and key behavioral trait (idempotency). However, it lacks explanation of return values for other actions and error scenarios, which would be helpful given the tool's complexity and destructive hint.
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 all parameters. The description adds the idempotency key concept for the 'name' parameter, but otherwise adds little meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the actions (add, remove, enable, disable, set-password) on a specific resource (local RouterOS user). It distinguishes from siblings like list_users and manage_user_group by focusing on CRUD-like management of individual users.
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 mention when to use this tool versus alternatives (e.g., list_users for listing, manage_user_group for group changes). Usage is implied by the action parameter but lacks explicit when-to-use or when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_user_groupManage User GroupADestructiveIdempotent
Add, update, or remove a local RouterOS user group. Idempotent by name: add returns already_exists if a group with the same name and policy already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Group name โ idempotency key | |
| skin | No | Optional skin name for the group | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| policy | No | Comma-separated policy list (e.g. 'read,write,ftp') | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotency and destructiveness. The description adds the idempotency detail (already_exists response) but doesn't disclose prerequisites for removal or the need for confirmation tokens, which are implied by the schema but not explained.
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 cover purpose and key behavioral trait. No redundant information. Front-loaded with the main action.
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 covers CRUD and idempotency but omits details about the confirmationToken parameter and explicit side effects of removal. With an output schema absent, the return behavior for actions other than add is unclear.
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 documents all parameters. The description reinforces idempotency by name but adds minimal extra meaning beyond parameter names and types.
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 (add/update/remove) and resource (local RouterOS user group), and distinguishes from siblings like list_user_groups by specifying CRUD operations and idempotency behavior.
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 for managing user groups, and the sibling list_user_groups provides an alternative for listing. However, it doesn't explicitly state when not to use or compare to other manage tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_vlanManage VLAN InterfaceADestructiveIdempotent
Add, remove, enable, or disable a VLAN interface. Idempotent by name: add returns already_exists when a VLAN with matching name, vlan-id, and parent interface exists. Supports dry-run mode.
| Name | Required | Description | Default |
|---|---|---|---|
| mtu | No | MTU size (add only) | |
| name | Yes | VLAN interface name โ idempotency key, taken verbatim for remove/enable/disable; add accepts letters, digits, dot, hyphen, underscore, up to 64 chars | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| vlanId | No | VLAN ID (1-4094; required for add) | |
| comment | No | Optional comment (add only) | |
| disabled | No | Whether to create the VLAN disabled (add only) | |
| routerId | No | Router ID; omit to use the default router. | |
| parentInterface | No | Parent interface name (e.g., ether1, bridge1; required for add) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true; the description adds genuine value beyond them by defining the idempotency key precisely (name + vlan-id + parent interface) and the already_exists outcome, plus dry-run support. It omits the APPROVAL_REQUIRED/confirmationToken flow and that remove is irreversible, which the schema only hints at.
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 tight sentences with the action set front-loaded, followed by the idempotency contract and dry-run flag. No repetition 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 10-parameter destructive mutation with no output schema, the description covers the action set, idempotency semantics, and dry-run behavior. Return shape and the confirmation/approval flow are left to the schema, which is a minor gap given annotations already signal destructiveness.
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 every parameter thoroughly, including the confirmationToken flow. The description reinforces name as the idempotency key but adds no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (add, remove, enable, disable) against a specific resource (VLAN interface), so the agent can identify the operation without opening the schema. It does not explicitly contrast with siblings like manage_bridge or manage_interface_list, but the resource is 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 four supported actions and the dry-run mention imply when the tool applies, but there is no explicit guidance on prerequisites, when to prefer it over alternatives, or what happens with partial matches. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_vrrp_instanceManage VRRP InstanceADestructiveIdempotent
Add, remove, enable, or disable a VRRP instance. Idempotent by name: add returns already_exists if an instance with the same name, interface, and VRID already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | VRRP interface name โ idempotency key | |
| vrid | No | Virtual router ID (required for add) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| version | No | VRRP protocol version | 3 |
| interval | No | Advertisement interval in seconds | |
| priority | No | Router priority (1โ254) | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | No | Master interface (required for add) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey destructiveHint and idempotentHint. The description adds value by explaining the idempotency behavior for 'add' (returns already_exists). However, it does not disclose other behavioral traits such as how enable/disable work, whether they are idempotent, or side effects 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 two concise sentences: the first lists all actions, the second explains idempotency behavior. It is front-loaded and contains no superfluous 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 the tool has 11 parameters, destructive behavior, and no output schema, the description is incomplete. It does not cover expected return values, error scenarios (e.g., what happens if remove is called on a non-existent instance), or when the confirmationToken is needed. The agent lacks enough context to use the tool correctly in all scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add additional semantic meaning to parameters beyond what is in the schema. It mentions 'name' as idempotency key but that is already in 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 tool handles four specific actions (add, remove, enable, disable) on a VRRP instance and distinguishes it from siblings like list_vrrp_instances. The idempotency behavior for 'add' is explicitly described.
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 hints at usage by listing actions but does not explicitly guide the agent on when to use this tool versus alternatives. For example, it does not mention that 'list_vrrp_instances' should be used for listing. The idempotency note provides some context but no overall usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_wifi_interfaceManage WiFi InterfaceADestructiveIdempotent
Enable, disable, or update SSID settings on a WiFi interface. At least one of disabled or ssid must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | WiFi interface name (e.g. wifi1, wlan1) | |
| ssid | No | New SSID to set | |
| dryRun | No | Preview changes without applying. | |
| disabled | No | Set to true to disable, false to enable | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true. Description adds 'Enable, disable, or update' which aligns but doesn't elaborate on side effects or consequences. Acceptable given 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, front-loaded with action, no wasted words. Constraint stated concisely.
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 6 parameters and destructive+idempotent annotations, description covers core actions and constraint but lacks details on return values or errors. 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?
Schema descriptions cover all parameters, but the tool description adds the valuable constraint that at least one of disabled or ssid is required, which is not in the schema itself. This compensates for baseline.
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 clearly states it enables, disables, or updates SSID on a WiFi interface, distinguishing it from read-only list tools like list_wifi_interfaces. The resource and actions are specific.
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 a clear constraint ('at least one of disabled or ssid must be provided') implying when to use (modify settings). Does not explicitly mention when not to use or compare to siblings, but context with sibling list_wifi_interfaces is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_wireguard_interfaceManage WireGuard InterfaceADestructiveIdempotent
Add, remove, enable, or disable a WireGuard interface. Idempotent by name. RouterOS generates the private key on create โ it is never passed in. The public key is returned after creation.
| Name | Required | Description | Default |
|---|---|---|---|
| mtu | No | MTU (default 1420) | |
| name | Yes | Interface name โ idempotency key (e.g. wg0) | |
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| routerId | No | Router ID; omit to use the default router. | |
| listenPort | No | UDP listen port (RouterOS picks one if omitted) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true and destructiveHint=true. The description adds useful context: idempotency by name, private key generation on create (never passed in), and public key return after creation. However, it does not elaborate on the consequences of destructive actions (remove/disable) beyond the annotation hint.
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 concise sentences, front-loaded with the primary action, followed by idempotency and key behavior. Every sentence adds value without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers idempotency and key generation adequately, but for a destructive tool with no output schema, it lacks details on return format for actions other than create and does not provide cautionary notes about destructive operations.
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% coverage with clear descriptions for all 8 parameters. The description does not add extra meaning beyond the schema, so it meets the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs add, remove, enable, or disable actions on a WireGuard interface. It distinguishes from sibling tools like list_wireguard_interfaces (listing) and manage_wireguard_peer (peer management) by specifying the resource and verbs.
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 on when to use this tool vs alternatives. The description does not mention prerequisites, fallback tools, or scenarios where this tool should not be used. It only states the actions, leaving the agent to infer usage from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_wireguard_peerManage WireGuard PeerADestructiveIdempotent
Add or remove a WireGuard peer. Add returns already_exists when the public key and explicitly requested endpoint/allowed addresses match; different settings produce CONFLICT without changing the peer. Omitted settings are left unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform | |
| dryRun | No | Preview changes without applying. | |
| comment | No | Optional comment | |
| endpoint | No | Add only: IPv4:port, hostname:port or [IPv6]:port (port 1โ65535); hostname labels may contain underscores. Address-only IPv4/hostname/IPv6 (bare or bracketed) leaves the RouterOS port default unchanged, which may not allow initiation. Ignored for remove; omit for a roaming peer. | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | Yes | WireGuard interface name (e.g. wg0) | |
| publicKey | Yes | Peer public key in base64 format (44 characters) | |
| allowedAddress | No | Allowed IP address/CIDR for this peer (e.g. 10.0.0.2/32) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
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 goes beyond that by explaining the add-time idempotency contract (matching settings return already_exists, differing settings return CONFLICT with no mutation) and the partial-update rule that omitted settings are left unchanged โ genuinely useful behavior not encoded in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the core action, then the add-result contract, then the update semantics. Every sentence carries information an agent needs; no boilerplate or repetition of the title.
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 9-parameter destructive mutation with no output schema, the description covers the main behavioral contract, and the confirmationToken/APPROVAL_REQUIRED workflow plus parameter details live in the schema. What is missing is an explicit note that 'remove' is the destructive path requiring confirmation, but the annotations and schema together make the tool callable 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 baseline is 3; the description adds semantics the schema cannot: which parameters only apply to add ('omitted settings are left unchanged', endpoint vs allowedAddress acting as the match key), plus the add/remove asymmetry. That is a modest but real value-add above 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 opens with a specific verb pair and resource: 'Add or remove a WireGuard peer.' That cleanly separates it from list_wireguard_peers (read-only listing) and manage_wireguard_interface (a different resource), so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It outlines add-time behavior (already_exists vs CONFLICT, omitted settings unchanged), which implies the tool is for mutation rather than inspection, but never states when to choose this over siblings like manage_wireguard_interface or list_wireguard_peers, and never mentions the APPROVAL_REQUIRED/confirmationToken flow needed for removal. Usage is inferable, not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingPingARead-onlyIdempotent
Send ICMP echo requests from the router to a target address. Returns per-packet RTT and summary statistics. 100% packet loss is a valid result, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Packet size in bytes (14โ65535) | |
| count | No | Number of ICMP echo requests (1โ20) | |
| address | Yes | Target IP address or hostname to ping | |
| routerId | No | Router ID; omit to use the default router. | |
| routingTable | No | Routing table to use for the ping |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable behavioral context by stating that 100% packet loss is a valid result, not an error, and by describing the return of per-packet RTT and summary statistics.
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, front-loaded with the core action and followed by return behavior and an important error-handling note. No wasted words or redundant restatement.
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 schema and annotations, the description covers the essential return format and packet-loss semantics. It is nearly complete, though it omits minor operational details such as timeout or DNS failure behavior.
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 five parameters are documented in the schema. The description adds no parameter-specific semantics beyond what the schema already provides, making a baseline score appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: sending ICMP echo requests from the router to a target address. The use of 'ICMP echo requests' clearly separates it from siblings like traceroute and bandwidth_test.
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 connectivity diagnostic use case but gives no explicit when-to-use guidance, nor does it name alternatives such as traceroute. The context is clear enough for an agent to infer its purpose, but routing guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_changesPlan ChangesAIdempotent
Preview a sequence of write operations: each step runs with dryRun=true against live state, returning affected paths and the predicted action per step. Use apply_plan to execute the same steps for real.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Ordered list of write operations to preview (up to 10) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by revealing that each step runs with dryRun=true against live state, returning affected paths and predicted actions. This complements the idempotentHint and clarifies the non-destructive nature, adding significant value.
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, front-loading the core purpose. Every sentence adds value: the first defines the action, the second links to the sibling tool. No unnecessary 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 description explains the dry-run behavior and what is returned (affected paths, predicted action), which is sufficient given no output schema. However, it does not detail the exact return format, leaving a minor gap for agent completeness.
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 baseline is 3. The description does not add extra meaning to parameters beyond what the schema provides; it only mentions 'dryRun is injected automatically', which is helpful but not about parameter semantics per se.
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 'Preview' and clearly identifies the resource as 'a sequence of write operations'. It distinguishes itself from the sibling tool 'apply_plan' by mentioning that the latter executes the same steps for real, making 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 explicitly states when to use this tool (to preview) and points to the sibling tool 'apply_plan' for execution. However, it does not explicitly state when not to use it, though the context is clear enough for an agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rebootRebootADestructive
Trigger a controlled router reboot with an optional delay. Supports dry-run. Use this tool instead of run_command for reboots โ run_command's deny list blocks /system reboot*.
| Name | Required | Description | Default |
|---|---|---|---|
| delay | No | Seconds before rebooting (0โ3600) | |
| dryRun | No | Preview the reboot without executing | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, so the description's burden is lower. It adds meaningful behavioral context: controlled reboot with optional delay and dry-run capability. No contradictions with annotations. Slightly higher than baseline due to added value.
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, no wasted words, and the most critical information (purpose and sibling differentiation) is front-loaded. 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 simple action tool with no output schema and well-handled parameters, the description covers the key behavioral aspects (delay, dry-run, confirmation token via schema). Annotations signal destruction. Could mention network interruption but still 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 schema already documents parameters well. The description mentions delay and dry-run but does not add significant semantics beyond what the schema provides. 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 'Trigger a controlled router reboot with an optional delay' and distinguishes from sibling tools by explicitly recommending this over run_command due to the deny list. This meets the 'specific verb+resource, distinguishes from siblings' criterion.
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 provides when-to-use and when-not-to-use guidance: 'Use this tool instead of run_command for reboots โ run_command's deny list blocks /system reboot*'. It also mentions dry-run support, which clarifies safe testing usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_swos_backupRestore SwOS BackupADestructive
Restore a backup.swb file from the server's SwOS folder onto the switch, as the web UI's Restore Backup does. The switch replaces its whole configuration and reboots, so it is unreachable for a while, and its address may change to the one in the backup. By default the current configuration is saved first. dryRun defaults to true.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Backup file in the server's SwOS folder (from save_swos_backup). | |
| force | No | Restore a backup that came from another switch or model, or whose origin cannot be told (no sidecar from save_swos_backup and not named by it). | |
| dryRun | No | Check the file and the switch without restoring. | |
| routerId | No | Router ID; omit to use the default router. | |
| saveCurrentFirst | No | Save the switch's current backup before restoring, so the restore can be undone. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well beyond them: the whole configuration is replaced, the switch reboots and is unreachable for a while, and its address may change to the backup's. It also discloses mitigation (current config saved first by default) and the non-destructive default of dryRun=true.
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?
Four tight sentences, front-loaded with the action, then the operational consequences, then the safe defaults. No redundancy and every clause conveys decision-relevant 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?
For a destructive, rebooting restore with no output schema, the description covers the blast radius, downtime, address change, and default safeguards. The confirmation/approval mechanics are fully specified in the schema's confirmationToken parameter, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents file, force, dryRun, routerId, saveCurrentFirst, and the confirmationToken flow. The description reinforces that dryRun defaults to true and that the current config is saved first, but adds no syntax or meaning beyond the schema, 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?
States a specific verb+resource (restore a backup.swb onto the switch) and anchors it to a familiar reference point ('as the web UI's Restore Backup does'). This is clearly distinguishable from save_swos_backup and apply_swos_config without opening any 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?
Usage is implied by the scenario (restoring a stored backup), and it flags the destructive/reboot nature and the dryRun default, which is helpful context for deciding to call it. However, it never explicitly names the alternatives (apply_swos_config, upgrade_swos_firmware, save_swos_backup) or states when-not to use it, leaving routing 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.
rollback_changeRollback ChangeADestructive
Restore device state to before a write, identified by its journal ID. RouterOS: reads the before-snapshot, diffs against live state, and applies the reverse. SwOS: re-POSTs the exact pre-write '.b' blob. Use dryRun=true to preview. Requires MIKROMCP_DATA_DIR (defaults to data/).
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview the restore plan without applying changes | |
| routerId | No | Router ID; omit to use the default router. | |
| journalId | Yes | Journal entry ID from write-journal.ndjson to roll back | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=false, and the description adds specifics: the exact rollback mechanisms for RouterOS (diff and reverse apply) and SwOS (re-POST the '.b' blob). It also mentions dryRun=true for preview and the data directory requirement, which goes beyond annotations. 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?
The description is two sentences, with the core action in the first and key usage hints (dryRun, requirement) in the second. Every sentence adds value, no redundancy, and the structure is front-loaded with the primary 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 destructive rollback tool with no output schema, the description covers the essential behaviors: how the rollback works on both platforms, the dryRun preview option, and the environment requirement. It doesn't mention potential failure modes (e.g., missing journal ID) but these are not required. Overall, it's sufficiently complete for the tool's 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%, so each parameter (journalId, dryRun, routerId, confirmationToken) is already documented in the schema. The description adds context for journalId (from write-journal.ndjson) and mentions dryRun preview, but it doesn't explain routerId or confirmationToken beyond the schema. Since the schema covers basics, baseline is 3; the description adds marginal 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 the action: 'Restore device state to before a write, identified by its journal ID.' It specifies the resource (device state), the identifier (journal ID), and distinguishes from sibling tools like write_swos_blob and apply_plan by focusing on rollback. The RouterOS/SwOS mechanism descriptions further clarify 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 advises using dryRun=true to preview, which is a clear usage guideline for safe verification. It also mentions a prerequisite (MIKROMCP_DATA_DIR) and implies that this tool is for undoing writes, which distinguishes it from alternatives. However, it doesn't explicitly name alternative tools for rollback or when not to use it, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_commandRun CommandADestructive
Execute an arbitrary RouterOS console command via SSH. Guarded by an allow/deny policy (built-in deny list blocks destructive commands; tighten via cmdAllow in routers.yaml or MIKROMCP_CMD_ALLOW). Prefer dedicated tools (reboot, etc.) where available. Output capped at 4000 characters. Journaled for audit like every write (see list_journal), but never snapshotted: arbitrary commands touch unknown config sections, so it cannot be rolled back via rollback_change โ prefer a dedicated tool when one exists, and note the manual undo command in your own records.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview the command without executing (validates allow/deny policy only) | |
| command | Yes | RouterOS console command to execute | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds substantial behavioral context: allow/deny policy enforcement, cmdAllow/MIKROMCP_CMD_ALLOW tightening, 4000-character output cap, journaling, no snapshot, and no rollback support. These details directly shape how an agent should treat the 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 front-loaded with the core action, then layers policy, preferred alternatives, output limits, and rollback implications in a compact form. Every sentence carries operational value for a dangerous general-purpose 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 high-risk arbitrary-command tool with no output schema, the description covers the essential safety, audit, output, and rollback context. It is complete enough for an agent to invoke it correctly and cautiously.
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 command, dryRun, routerId, and confirmationToken are already documented in the schema. The description does not add parameter-specific syntax or semantics 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 states a specific verb and resource: execute an arbitrary RouterOS console command via SSH. It also distinguishes this general escape hatch from dedicated tools such as reboot, so an agent can tell when this tool is the right 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?
It gives explicit guidance: prefer dedicated tools where available, and use this only when no dedicated tool exists. It also explains that commands are journaled but never snapshotted, so rollback_change cannot undo them, which is a critical usage constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scriptRun ScriptADestructive
Execute a named RouterOS script. Fire-and-forget โ the script runs asynchronously and its output is written to the router system log. Use get_log after calling this tool to see results.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the script to execute | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the script runs asynchronously and output goes to system log, adding value beyond annotations which only indicate destructive hint.
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 essential information. No redundant words, front-loaded with action.
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?
Describes the async behavior, output location, and how to retrieve results (get_log). No output schema, but this is sufficient for a simple execution 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 already covers all parameters with descriptions (100% coverage). Description does not add extra parameter details beyond what is in 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?
Clearly states it executes a named RouterOS script. The verb 'execute' and resource 'named RouterOS script' are specific. Distinguishes from sibling tools like run_command and manage_script.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says it's fire-and-forget and asynchronous, and directs the agent to use get_log to see results. No explicit exclusions or alternatives, but 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.
save_swos_backupSave SwOS BackupA
Download the switch's own configuration backup (backup.swb, the file the web UI's Save Backup produces) into the server's SwOS folder. The file is MikroTik's opaque format: it restores only through restore_swos_backup or the web UI, on the same model. A switch on factory defaults has nothing to save. Writes a file on the server (owner-only), so it is audited like a write.
| Name | Required | Description | Default |
|---|---|---|---|
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnlyHint=false and idempotentHint=false, but the description adds genuinely new behavioral context: the file is an opaque MikroTik format restorable only on the same model, a server-side file is written owner-only, and the action is audited like a write. That is meaningful disclosure beyond the structured hints, though it does not cover failure modes or overwrite behavior of an existing backup file.
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?
Four compact sentences, each load-bearing: purpose, format/restore constraint, the factory-default caveat, and the write/audit side effect. The core action is front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a single optional parameter, the description covers what the tool produces, what the artifact can and cannot be used for, and its side effects. An agent has everything needed to decide whether to 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% for the single routerId parameter, so the schema already documents its meaning and the default-router fallback. The description adds nothing about the parameter, 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?
Names a specific verb (download) and resource (the switch's own configuration backup / backup.swb) and identifies the exact file the web UI produces. It is clearly distinguishable from restore_swos_backup, which the description explicitly names as the counterpart 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?
Gives a concrete exclusion ('a switch on factory defaults has nothing to save') and routes the agent to restore_swos_backup / web UI for the reverse operation. It does not state general preconditions (e.g. whether the switch must be reachable or a password set), so it falls short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_swos_passwordSet SwOS PasswordADestructive
Change a SwOS switch's admin password, as the web UI's Password Change does. The new password comes from the server secret MIKROMCP_PASSWORD_, never from the conversation; the current one is the router's configured credential. Passwords are ASCII, at most 15 characters. After the change this call's client keeps working with the new password, but the server rebuilds the client from the router's configured credential ({PREFIX}_PASS) after any authentication failure or restart, so that variable must be updated right away. On SwOS Lite the switch does not answer the change; the result is confirmed by logging in with the new password. dryRun defaults to true.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Check the secret and the switch without changing the password. | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. | |
| newPasswordSecret | Yes | Name of the server secret holding the new password: NAME for MIKROMCP_PASSWORD_<NAME>. The password itself never passes through the conversation, and a switch config cannot reference it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (destructiveHint=true, readOnlyHint=false). It discloses that the client keeps working after the change, that the server rebuilds the client from {PREFIX}_PASS on auth failure or restart (a real footgun), and that SwOS Lite gives no change confirmation so success must be verified by logging in with the new password. This is exactly the hidden-behavior disclosure that matters for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then layers caveats in a dense but information-bearing sequence with no filler sentences. It is long and semicolon-heavy, but nearly every clause carries a distinct operational fact, so the length is justified.
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 destructive credential-changing tool with no output schema, the description covers the confirmation workflow, the dryRun default, secret resolution, the post-change client-rebuild hazard, and how to verify success on SwOS Lite. An agent has everything needed to call it safely.
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 dryRun, routerId, confirmationToken, and newPasswordSecret, including the MIKROMCP_PASSWORD_<NAME> convention. The description largely restates the schema's secret-name semantics rather than adding new per-parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a SwOS switch's admin password') and anchors it to a known reference point ('as the web UI's Password Change does'), which cleanly separates it from the broader SwOS config siblings like apply_swos_config or write_swos_blob.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational context: the password must be supplied via a server secret, dryRun defaults to true (so the agent must explicitly opt into the mutation), and it explains the follow-up requirement of updating {PREFIX}_PASS. It does not name any sibling alternative to prefer, so it stops short of explicit when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_system_clockSet System ClockADestructiveIdempotent
Set the system date, time, and/or timezone on a MikroTik router. Idempotent: returns already_set if the values already match. Supports dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date in RouterOS format: mon/dd/yyyy (e.g. jan/02/2006) | |
| time | No | Time in RouterOS format: hh:mm:ss (e.g. 15:04:05) | |
| dryRun | No | Preview changes without applying. | |
| routerId | No | Router ID; omit to use the default router. | |
| timeZoneName | No | IANA timezone name (e.g. Europe/London, UTC) | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds return behavior not present in structured fields โ it returns 'already_set' when values already match โ which usefully tells the agent the call can short-circuit. It doesn't explain the APPROVAL_REQUIRED/confirmationToken gating or the blast radius of a clock change.
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 compact sentences with the core purpose front-loaded, followed by the two behaviors an agent most needs to know. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema but full schema coverage on six parameters, the description plus schema give an agent what it needs to call correctly. It is nearly complete, though for a destructive tool it could say more about the approval workflow and what a clock/timezone change actually affects.
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 (including formats, dryRun default, and the confirmationToken semantics) is already documented. The description names the fields being set but adds no format or interaction detail beyond what the schema provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and resource (system date, time, and/or timezone) scoped to a MikroTik router. The 'set' framing cleanly distinguishes it from the read counterpart get_system_clock without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by noting idempotency and dry-run support, which tells an agent it is safe to re-invoke and previewable, but it never states when to reach for this tool versus get_system_clock or how the confirmation/approval flow gates invocation. Usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
torchTorchARead-onlyIdempotent
Capture a real-time traffic snapshot on a router interface. RouterOS runs the capture for duration seconds; the tool returns the flows of the final update with their TX/RX rates in bits per second and packets per second. Not auto-retried.
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Capture duration in seconds (1โ30) | |
| routerId | No | Router ID; omit to use the default router. | |
| interface | Yes | Interface name to monitor (e.g. ether1, bridge1) | |
| dstAddress | No | Filter by destination IP address | |
| srcAddress | No | Filter by source IP address |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/destructive=false, so the safety profile is covered. The description adds value beyond that: it discloses that RouterOS runs the capture for `duration` seconds, that the return is the flows from the final update with TX/RX rates in bps and pps, and the key operational trait that the call is not auto-retried.
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 tight sentences, front-loaded with the core action, followed by duration behavior and return format. No filler or repetition of the name/title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully explains what comes back (per-flow TX/RX rates) and how long the capture runs, which is the main thing an agent needs before calling. Minor gaps remain around default-router resolution and how the address filters shape results, but the schema carries those parameters.
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 interface, duration, routerId, and the address filters are already documented. The description's mention of `duration` seconds only restates the schema's own wording, so this is the baseline 3 rather than added semantic 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 gives a specific verb+resource ('Capture a real-time traffic snapshot on a router interface') and unpacks the jargon term 'torch' that the tool name alone would not convey. It is clearly distinct from familial siblings like bandwidth_test, ping, or list_connections, so an agent can select 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?
Usage is implied by the description of what a capture does, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g. bandwidth_test for throughput measurement). The operational note 'Not auto-retried' implies the caller must decide about retries, which is helpful but indirect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tracerouteTracerouteARead-onlyIdempotent
Trace the network path from the router to a target address. Returns an ordered hop list with RTT per hop. Timeouts and partial results are valid responses. Not auto-retried.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Probes per hop (1โ5) | |
| address | Yes | Target IP address or hostname to trace | |
| maxHops | No | Maximum number of hops (1โ30) | |
| routerId | No | Router ID; omit to use the default router. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description adds genuinely useful operational context beyond them: timeouts and partial results are valid outcomes and the operation is not auto-retried. It doesn't discuss the per-hop latency ranges or which router is used beyond 'the router', but the timeout/retry guidance is exactly the kind of behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action followed by return format and behavioral caveats. Every sentence carries information an agent needs; nothing is redundant or padded.
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 diagnostic with a fully described schema and no output schema, the description covers the return shape ('ordered hop list with RTT') and the key edge case (timeouts/partial results). It could note the default-router behavior for routerId more explicitly, but it is essentially 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 count, maxHops and routerId all documented in the schema, so the baseline of 3 applies. The description adds no further meaning about probe counts, hop limits, or routerId selection, but the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Trace the network path from the router to a target address,' and the mention of an 'ordered hop list with RTT per hop' clearly differentiates it from a simple reachability tool like ping. It does not name a sibling tool explicitly, so it falls just short of the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the diagnostic verb 'trace' and the presence of ping among siblings; the description never states when to prefer traceroute over ping or run_command, nor any prerequisites. It is adequate but leaves routing decisions 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.
upgrade_swos_firmwareUpgrade SwOS FirmwareADestructiveIdempotent
Upgrade a SwOS switch's firmware the way the web UI's Upgrade tab does. Resolves the latest stable version for the model from MikroTik's download server (or takes version), downloads swos--.bin over HTTPS into the server's SwOS folder (or uses file), checks it, then flashes it; the switch reboots. Refuses release candidates unless allowPrerelease is true. A switch still on its preinstalled backup firmware (a version ending in 'p', which cannot save configuration) counts as needing the upgrade. dryRun defaults to true.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Use this firmware file from the server's SwOS folder instead of downloading one (offline upgrade). | |
| board | No | Firmware board name, e.g. css318g. Derived from the model when omitted. | |
| force | No | Flash a `board` that differs from the one derived from the switch's model. | |
| dryRun | No | Resolve, download and check the firmware without flashing it. | |
| version | No | Target version. Defaults to the latest stable release for this model. | |
| routerId | No | Router ID; omit to use the default router. | |
| allowPrerelease | No | Allow a release candidate or beta version. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent, openWorld, so the bar is lower, yet the description adds real behavior: HTTPS download into the SwOS folder, integrity check, flash, and an explicit switch reboot. RC refusal and dryRun-default are also disclosed. Minor gaps (rate limits, rollback of a failed flash) remain.
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 dense single paragraph that front-loads the primary purpose and then the resolution/flash sequence. Every sentence carries information; slightly long but not padded.
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 destructive, no-output-schema, 8-parameter tool the description covers the workflow, defaults, and safety conditions well. The confirmationToken/APPROVAL_REQUIRED flow is left to the schema, which is acceptable since the schema documents 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 coverage is 100% (baseline 3), and the description adds meaning beyond the schema by explaining the interplay: version/file/board resolution, download-vs-offline alternatives, and prerelease gating. It clarifies mutual exclusivity that the flat schema does not.
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 (Upgrade) and resource (SwOS switch firmware) and adds scope detail (resolves latest stable, downloads, flashes). It is clearly distinguishable from siblings like manage_upgrade (RouterOS), get_upgrade_status, and the swOS config/blob tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable conditions: refuses release candidates unless allowPrerelease, dryRun defaults to true, and preinstalled backup firmware (version ending in 'p') counts as needing upgrade. It does not explicitly name alternatives like get_upgrade_status or manage_upgrade, so routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileUpload FileADestructiveIdempotent
Upload a text file to a router, overwriting any existing file of the same name. Prefers SFTP (encrypted, over SSH) and falls back to plaintext FTP if SFTP is unavailable. Requires SSH (or FTP) access for the router user. RouterOS runs a file named *.auto.rsc as a script when it arrives over FTP. Dry-run tests connectivity only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Target filename on the router (e.g. flash/my-script.rsc) | |
| dryRun | No | Validate SFTP or FTP connectivity without writing the target file | |
| content | Yes | File content to upload (text) | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true and idempotent=true, and the description materially extends them: it names the overwrite behavior, the auth prerequisite, the SFTP-to-FTP fallback, and the important gotcha that RouterOS auto-executes an uploaded *.auto.rsc over FTP. That last point is safety-critical context an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each carrying distinct information, with the primary action and its destructive nature front-loaded. No filler or restatement of the tool name.
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?
Covers the mutation risk, auth needs, fallback transport, and dry-run semantics well for a tool with no output schema. It stops short of describing success/failure feedback or how partial-transfer errors surface, which is a modest gap for an upload 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%, so all five parameters are already documented in the schema; the description's dry-run explanation duplicates the schema text rather than adding to it. It says nothing extra about routerId or the confirmationToken approval flow beyond what the schema already states, 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 (upload), resource (text file), and the critical side effect (overwriting an existing file of the same name), which separates it from read-only siblings like list_files and get_file_content. The transfer-mechanism detail further pins down what the tool actually 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?
Gives concrete operating context: SFTP is preferred with plaintext FTP fallback, SSH/FTP access is required, and dry-run tests connectivity only. It does not, however, name a sibling alternative or state when a caller should choose this over run_command or manage_script, leaving the routing decision partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_swos_blobWrite SwOS BlobADestructiveIdempotent
Mutate a SwOS '.b' endpoint on a MikroTik switch. The full endpoint blob is read, the given fields are merged in, and the entire blob is written back (the firmware only accepts whole-blob writes); untouched fields are re-sent byte-for-byte, and a field this firmware does not expose is refused rather than injected. dryRun defaults to true โ preview first. Every result reports whether the schema has been verified against the switch's firmware. The pre-write blob is snapshotted, so the change can be undone with rollback_change. Returns no_change when the values already match.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview the resulting blob without writing to the switch. | |
| fields | Yes | Values to set, keyed by decoded field name (from list_swos_endpoints) or by a raw wire key already present in the blob โ anything else is rejected. Option fields take the enum name (e.g. 'auto'); IP fields take a dotted quad (192.168.88.1) and MAC fields six hex pairs (64:d1:54:00:00:01); other text becomes a UTF-8 hex string; numbers and '0x...' strings are written as hex, padded to the width of the value they replace. A per-port field given a single value applies it to EVERY port. | |
| endpoint | Yes | '.b' endpoint to write | |
| routerId | No | Router ID; omit to use the default router. | |
| confirmationToken | No | Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond the annotations: whole-blob write with byte-for-byte re-send of untouched fields, refusal of fields the firmware does not expose, the snapshot/rollback guarantee, and a no_change return when values already match. This is exactly the context a mutation tool with destructiveHint=true needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The mutation and its mechanism are front-loaded, then safety (dryRun, rollback, refusal), then result reporting. Nearly every clause carries information an agent needs; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers return semantics (schema-verification status, no_change). Combined with annotations that already declare destructiveness and idempotency, an agent has everything needed to call this correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: that 'fields' are merged into the read blob rather than replacing it, and that dryRun previews rather than writes. It does not restate the field encoding rules the schema already covers, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Mutate a SwOS .b endpoint on a MikroTik switch') and immediately describes the read-modify-write mechanism. It clearly differentiates from read-side siblings like get_swos_endpoint, get_swos_config and list_swos_endpoints, and from apply_swos_config, so an agent can place it without opening a 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?
Gives concrete operational guidance ('dryRun defaults to true โ preview first') and names the recovery path ('the change can be undone with rollback_change'). It lacks an explicit statement of when to prefer this over apply_swos_config, so it falls short of full when/when-not coverage.
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.
6 tool updates
v1.16.0- Changed
create_backup2 fields changed- changed
Input schema / properties / password / descriptionPrevious value: -"Password to encrypt the backup file"New value: +"Literal password to encrypt the backup. It stays in the conversation history; prefer passwordSecret" - added
Input schema / properties / passwordSecretAdded value: +{ + "description": "Encrypt with the server's MIKROMCP_SECRET_<NAME> value, bound to this router by its secrets list in routers.yaml. The value never reaches the conversation", + "pattern": "^[A-Z0-9_]+$", + "type": "string" +}
- Changed
list_dhcp_clients1 field changed- changed
Input schema / properties / interface / descriptionPrevious value: -"Filter by interface name (exact match)"New value: +"Filter by interface or display name (exact match)"
- Added
list_journal - Changed
manage_bridge4 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Bridge interface name"New value: +"Bridge interface name, taken verbatim for remove; create accepts letters, digits, dot, hyphen, underscore, up to 64 chars" - removed
Input schema / properties / name / maxLengthRemoved value: -15 - added
Input schema / properties / name / minLengthAdded value: +1 - removed
Input schema / properties / name / patternRemoved value: -"^[a-zA-Z0-9_-]+$"
- Changed
manage_dhcp_client1 field changed- changed
Input schema / properties / interface / descriptionPrevious value: -"Interface name โ idempotency key (e.g. ether1, ether2)"New value: +"Interface name โ idempotency key (e.g. ether1); for remove/enable/disable a client's display name also matches"
- Changed
manage_vlan4 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"VLAN interface name โ idempotency key (alphanumeric, hyphens, underscores, max 15 chars)"New value: +"VLAN interface name โ idempotency key, taken verbatim for remove/enable/disable; add accepts letters, digits, dot, hyphen, underscore, up to 64 chars" - removed
Input schema / properties / name / maxLengthRemoved value: -15 - added
Input schema / properties / name / minLengthAdded value: +1 - removed
Input schema / properties / name / patternRemoved value: -"^[a-zA-Z0-9_-]+$"
36 tool updates
v1.14.1- Changed
apply_plan1 field changed- removed
Input schema / properties / confirmationToken / descriptionRemoved value: -"Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action."
- Added
apply_swos_config - Changed
bulk_execute1 field changed- changed
Input schema / properties / confirmationToken / descriptionPrevious value: -"Fleet confirmation token from a prior APPROVAL_REQUIRED response. Required to fan out a destructive tool."New value: +"Fleet confirmation token from a prior APPROVAL_REQUIRED response. Required to fan out any write tool."
- Added
bulk_read - Changed
create_backup1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
export_config1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
fetch_url1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Added
get_swos_config - Changed
get_swos_endpoint1 field changed- changed
Input schema / properties / endpoint / enumPrevious value: -[ - "!aclstats.b", - "!dhost.b", - "!igmp.b", - "!stats.b", - "acl.b", - "fwd.b", - "host.b", - "lacp.b", - "link.b", - "poe.b", - "rstp.b", - "sfp.b", - "snmp.b", - "sys.b", - "vlan.b" -]New value: +[ + "!aclstats.b", + "!dhost.b", + "!igmp.b", + "!stats.b", + "acl.b", + "fwd.b", + "host.b", + "lacp.b", + "link.b", + "poe.b", + "rstp.b", + "sfp.b", + "snmp.b", + "stats.b", + "sys.b", + "vlan.b" +]
- Added
list_bridge_ports - Added
list_interface_list_members - Added
list_ip_addresses - Changed
manage_container_config1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_container_env1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_container_mount1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_dhcp_lease1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_dns_entry4 fields changed- changed
Input schema / properties / address / descriptionPrevious value: -"IP address (required for A records)"New value: +"IP address (required for A records; on remove, picks the record when several share the name)" - changed
Input schema / properties / cname / descriptionPrevious value: -"Target hostname (required for CNAME records)"New value: +"Target hostname (required for CNAME records; on remove, picks the record when several share the name)" - changed
Input schema / properties / name / descriptionPrevious value: -"Hostname for the DNS record (e.g. server.example.com)"New value: +"Hostname for the DNS record (e.g. server.example.com); matched case-insensitively" - changed
Input schema / properties / text / descriptionPrevious value: -"Text value (required for TXT records)"New value: +"Text value (required for TXT records; on remove, picks the record when several share the name)"
- Changed
manage_firewall_rule14 fields changed- changed
Input schema / properties / comment / descriptionPrevious value: -"Comment to identify the rule (used as idempotency key)"New value: +"Comment to identify the rule (used as idempotency key); omit for none" - added
Input schema / properties / comment / minLengthAdded value: +1 - added
Input schema / properties / connectionNatStateAdded value: +{ + "description": "Connection NAT state to match, e.g. dstnat or !dstnat", + "pattern": "^!?(srcnat|dstnat|srcnat,dstnat|dstnat,srcnat)$", + "type": "string" +} - added
Input schema / properties / connectionStateAdded value: +{ + "description": "Connection-tracking states, comma-separated, optionally negated: established,related or !invalid", + "pattern": "^!?(established|related|new|invalid|untracked)(,(established|related|new|invalid|untracked))*$", + "type": "string" +} - added
Input schema / properties / dstAddress / minLengthAdded value: +1 - added
Input schema / properties / dstPort / minLengthAdded value: +1 - added
Input schema / properties / inInterface / minLengthAdded value: +1 - added
Input schema / properties / inInterfaceListAdded value: +{ + "description": "Incoming interface list, e.g. WAN or !LAN", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / outInterface / minLengthAdded value: +1 - added
Input schema / properties / outInterfaceListAdded value: +{ + "description": "Outgoing interface list, e.g. WAN or !LAN", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / srcAddress / minLengthAdded value: +1 - added
Input schema / properties / srcPort / minLengthAdded value: +1 - added
Input schema / properties / toAddressesAdded value: +{ + "description": "NAT target address or range (nat table only, e.g. dst-nat)", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / toPortsAdded value: +{ + "description": "NAT target port or range (nat table only)", + "pattern": "^\\d{1,5}(-\\d{1,5})?$", + "type": "string" +}
- Changed
manage_ip_pool1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_log_action1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_log_rule1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_mangle_rule10 fields changed- added
Input schema / properties / comment / minLengthAdded value: +1 - changed
Input schema / properties / newConnectionMark / descriptionPrevious value: -"Connection mark to set"New value: +"Connection mark to set (ruleAction mark-connection)" - added
Input schema / properties / newConnectionMark / minLengthAdded value: +1 - changed
Input schema / properties / newDscpValue / descriptionPrevious value: -"DSCP value to set (0โ63)"New value: +"DSCP value to set, 0โ63 (ruleAction change-dscp)" - added
Input schema / properties / newMssAdded value: +{ + "anyOf": [ + { + "maximum": 65535, + "minimum": 0, + "type": "integer" + }, + { + "const": "clamp-to-pmtu", + "type": "string" + } + ], + "description": "MSS to set: a number or clamp-to-pmtu (ruleAction change-mss, with protocol tcp and tcpFlags syn)" +} - added
Input schema / properties / newPacketMarkAdded value: +{ + "description": "Packet mark to set (ruleAction mark-packet)", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / newRoutingMark / descriptionPrevious value: -"Routing mark to set"New value: +"Routing mark to set (ruleAction mark-routing, chain prerouting or output)" - added
Input schema / properties / newRoutingMark / minLengthAdded value: +1 - added
Input schema / properties / ruleActionAdded value: +{ + "description": "Mangle action, add only. Omitted: the action of the new* value given (newRoutingMark โ mark-routing, newConnectionMark โ mark-connection, newPacketMark โ mark-packet, newDscpValue โ change-dscp, newMss โ change-mss), else accept, the RouterOS default", + "enum": [ + "accept", + "passthrough", + "mark-routing", + "mark-connection", + "mark-packet", + "change-dscp", + "change-mss" + ], + "type": "string" +} - added
Input schema / properties / tcpFlagsAdded value: +{ + "description": "TCP flags to match, comma-separated, ! negates one (e.g. \"syn\"); needs protocol tcp", + "minLength": 1, + "type": "string" +}
- Changed
manage_netwatch_entry1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_ntp_client1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_ppp_profile1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_queue1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_routing_rule2 fields changed- changed
Input schema / properties / priority / descriptionPrevious value: -"Rule priority (0โ4294967295)"New value: +"Unsupported: RouterOS 7 /routing/rule has no priority (rules apply in list order); add rejects it" - added
Input schema / properties / ruleActionAdded value: +{ + "description": "Rule action, add only: lookup (default; when the table has no route, later rules and main still apply) or lookup-only-in-table (no fallback)", + "enum": [ + "lookup", + "lookup-only-in-table" + ], + "type": "string" +}
- Changed
manage_scheduled_job1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_wireguard_peer1 field changed- changed
Input schema / properties / endpoint / descriptionPrevious value: -"Peer endpoint as IP:port (e.g. 1.2.3.4:51820)"New value: +"Add only: IPv4:port, hostname:port or [IPv6]:port (port 1โ65535); hostname labels may contain underscores. Address-only IPv4/hostname/IPv6 (bare or bracketed) leaves the RouterOS port default unchanged, which may not allow initiation. Ignored for remove; omit for a roaming peer."
- Added
restore_swos_backup - Added
save_swos_backup - Added
set_swos_password - Changed
set_system_clock1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Added
upgrade_swos_firmware - Changed
upload_file1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
write_swos_blob1 field changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Values to set, keyed by decoded field name (from list_swos_endpoints) or by a raw wire key already present in the blob โ anything else is rejected. Option fields take the enum name (e.g. 'auto'); text becomes a UTF-8 hex string; numbers and '0x...' strings are written as hex, padded to the width of the value they replace. A per-port field given a single value applies it to EVERY port."New value: +"Values to set, keyed by decoded field name (from list_swos_endpoints) or by a raw wire key already present in the blob โ anything else is rejected. Option fields take the enum name (e.g. 'auto'); IP fields take a dotted quad (192.168.88.1) and MAC fields six hex pairs (64:d1:54:00:00:01); other text becomes a UTF-8 hex string; numbers and '0x...' strings are written as hex, padded to the width of the value they replace. A per-port field given a single value applies it to EVERY port."
3 tool updates
v1.11.0- Changed
ping2 fields changed- added
Input schema / properties / routingTable / $refAdded value: +"#/properties/address" - removed
Input schema / properties / routingTable / typeRemoved value: -"string"
- Changed
torch4 fields changed- added
Input schema / properties / dstAddress / $refAdded value: +"#/properties/srcAddress" - removed
Input schema / properties / dstAddress / typeRemoved value: -"string" - added
Input schema / properties / srcAddress / $refAdded value: +"#/properties/interface" - removed
Input schema / properties / srcAddress / typeRemoved value: -"string"
- Changed
upload_file1 field changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Validate FTP connectivity without writing the file"New value: +"Validate SFTP or FTP connectivity without writing the target file"
4 tool updates
v1.9.0- Added
get_swos_endpoint - Added
get_swos_status - Added
list_swos_endpoints - Added
write_swos_blob
19 tool updates
v1.8.0- Changed
bandwidth_test2 fields changed- changed
Input schema / properties / duration / descriptionPrevious value: -"Test duration in seconds (max 30)"New value: +"Test duration in seconds (max 20)" - changed
Input schema / properties / duration / maximumPrevious value: -30New value: +20
- Changed
manage_address_list_entry1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_container1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_dhcp_server1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_dns_settings1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_interface_list1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_interface_list_member1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_ipsec_policy1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_mangle_rule1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_package1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_routing_rule1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_routing_table1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_script1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_user1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_user_group1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_vrrp_instance1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_wifi_interface1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
manage_wireguard_interface1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
- Changed
run_script1 field changed- added
Input schema / properties / confirmationTokenAdded value: +{ + "description": "Token from a prior APPROVAL_REQUIRED response. Re-submit the identical call with this token to confirm the destructive action.", + "type": "string" +}
1 tool update
v1.7.0- Added
list_routers
1 tool update
v1.6.1- Changed
get_log1 field changed- changed
Input schema / properties / sinceMinutes / descriptionPrevious value: -"Only return entries from the last N minutes (1โ1440)"New value: +"Only return entries from the last N minutes (1โ1440), measured against the router's clock"
116 tool updates
v1.6.0- Changed
apply_plan2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "steps" -]New value: +[ + "steps" +]
- Changed
bandwidth_test2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "address" -]New value: +[ + "address" +]
- Changed
check_router_health2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router to health-check"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
create_backup2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
delete_file2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "name" -]New value: +[ + "name" +]
- Changed
export_config2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
fetch_url2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "url" -]New value: +[ + "url" +]
- Changed
get_container_config2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_dns_settings2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_file_content2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "name" -]New value: +[ + "name" +]
- Changed
get_log4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum entries to return (1โ500)"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_ntp_settings2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_ovpn_server2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_snmp_settings2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_system_clock2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_system_status2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
get_upgrade_status2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_address_list_entries2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_arp_entries3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of ARP entries to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_bgp_peers2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_bridges4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of bridges to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_certificates3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of certificates to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_connections3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum connections to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_container_envs3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum entries to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_container_mounts3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum entries to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_containers2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_dhcp_clients4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of clients to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_dhcp_leases4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of leases to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_dhcp_servers4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of DHCP servers to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_dns_entries4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of entries to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_files2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_firewall_rules4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of rules to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_interface_lists3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum lists to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_interfaces4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of interfaces to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_ip_pools4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of pools to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_ip_services2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_ipsec_peers3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of peers to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_ipsec_policies3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of policies to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_log_actions3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of actions to return (1-500, default 100)"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_log_rules3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of rules to return (1-500, default 100)"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_mangle_rules2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_neighbors3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of neighbors to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_netwatch_entries3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of entries to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_ospf_neighbors2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_ovpn_clients4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of clients to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_packages2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_ppp_profiles3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum profiles to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_pppoe_clients4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of clients to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_queues3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of queues to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_routes4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of routes to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_routing_rules2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_routing_tables2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_scheduled_jobs2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_scripts2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_user_groups3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of groups to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_users3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of users to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_vrrp_instances3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of instances to return"New value: +"Max results to return." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_wifi_clients4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of clients to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_wifi_interfaces4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of interfaces to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_wireguard_interfaces4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of interfaces to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
list_wireguard_peers4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of peers to return"New value: +"Max results to return." - changed
Input schema / properties / offset / descriptionPrevious value: -"Offset for pagination"New value: +"Pagination offset." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
manage_address_list_entry3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "list", - "address" -]New value: +[ + "action", + "list", + "address" +]
- Changed
manage_bridge3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_bridge_port3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "bridge", - "interface" -]New value: +[ + "action", + "bridge", + "interface" +]
- Changed
manage_certificate3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_container3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_container_config3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
manage_container_env3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name", - "key" -]New value: +[ + "action", + "name", + "key" +]
- Changed
manage_container_mount3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_dhcp_client3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "interface" -]New value: +[ + "action", + "interface" +]
- Changed
manage_dhcp_lease3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "macAddress" -]New value: +[ + "action", + "macAddress" +]
- Changed
manage_dhcp_server3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_dns_entry3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_dns_settings3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
manage_firewall_rule2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "chain", - "ruleAction" -]New value: +[ + "action", + "chain", + "ruleAction" +]
- Changed
manage_interface_list3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_interface_list_member3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "list", - "interface" -]New value: +[ + "action", + "list", + "interface" +]
- Changed
manage_ip_address2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "address", - "interface" -]New value: +[ + "action", + "address", + "interface" +]
- Changed
manage_ip_pool3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_ip_service3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_ipsec_peer3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_ipsec_policy3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "srcAddress", - "dstAddress" -]New value: +[ + "action", + "srcAddress", + "dstAddress" +]
- Changed
manage_log_action3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_log_rule3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "topics", - "logAction" -]New value: +[ + "action", + "topics", + "logAction" +]
- Changed
manage_mangle_rule3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "comment" -]New value: +[ + "action", + "comment" +]
- Changed
manage_netwatch_entry3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "host" -]New value: +[ + "action", + "host" +]
- Changed
manage_ntp_client3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
manage_ovpn_client3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_ovpn_server3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action" -]New value: +[ + "action" +]
- Changed
manage_package3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_ppp_profile3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_pppoe_client3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_queue3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_route2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "dstAddress", - "gateway" -]New value: +[ + "action", + "dstAddress", + "gateway" +]
- Changed
manage_routing_rule3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "table" -]New value: +[ + "action", + "table" +]
- Changed
manage_routing_table3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_scheduled_job3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_script3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_upgrade2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action" -]New value: +[ + "action" +]
- Changed
manage_user3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_user_group3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_vlan3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_vrrp_instance3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_wifi_interface3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "name" -]New value: +[ + "name" +]
- Changed
manage_wireguard_interface3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "name" -]New value: +[ + "action", + "name" +]
- Changed
manage_wireguard_peer3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "action", - "interface", - "publicKey" -]New value: +[ + "action", + "interface", + "publicKey" +]
- Changed
ping2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "address" -]New value: +[ + "address" +]
- Changed
plan_changes2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "steps" -]New value: +[ + "steps" +]
- Changed
reboot2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
rollback_change2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "journalId" -]New value: +[ + "journalId" +]
- Changed
run_command2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "command" -]New value: +[ + "command" +]
- Changed
run_script2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "name" -]New value: +[ + "name" +]
- Changed
set_system_clock3 fields changed- changed
Input schema / properties / dryRun / descriptionPrevious value: -"Preview changes without applying"New value: +"Preview changes without applying." - changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - removed
Input schema / requiredRemoved value: -[ - "routerId" -]
- Changed
torch2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "interface" -]New value: +[ + "interface" +]
- Changed
traceroute2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "address" -]New value: +[ + "address" +]
- Changed
upload_file2 fields changed- changed
Input schema / properties / routerId / descriptionPrevious value: -"Target router identifier from the router registry"New value: +"Router ID; omit to use the default router." - changed
Input schema / requiredPrevious value: -[ - "routerId", - "name", - "content" -]New value: +[ + "name", + "content" +]
117 tool updates
v1.5.0- Added
apply_plan - Added
bandwidth_test - Added
bulk_execute - Added
check_router_health - Added
create_backup - Added
delete_file - Added
export_config - Added
fetch_url - Added
get_container_config - Added
get_dns_settings - Added
get_file_content - Added
get_log - Added
get_ntp_settings - Added
get_ovpn_server - Added
get_snmp_settings - Added
get_system_clock - Added
get_system_status - Added
get_upgrade_status - Added
list_address_list_entries - Added
list_arp_entries - Added
list_bgp_peers - Added
list_bridges - Added
list_certificates - Added
list_connections - Added
list_container_envs - Added
list_container_mounts - Added
list_containers - Added
list_dhcp_clients - Added
list_dhcp_leases - Added
list_dhcp_servers - Added
list_dns_entries - Added
list_files - Added
list_firewall_rules - Added
list_interface_lists - Added
list_interfaces - Added
list_ip_pools - Added
list_ip_services - Added
list_ipsec_peers - Added
list_ipsec_policies - Added
list_log_actions - Added
list_log_rules - Added
list_mangle_rules - Added
list_neighbors - Added
list_netwatch_entries - Added
list_ospf_neighbors - Added
list_ovpn_clients - Added
list_packages - Added
list_ppp_profiles - Added
list_pppoe_clients - Added
list_queues - Added
list_routes - Added
list_routing_rules - Added
list_routing_tables - Added
list_scheduled_jobs - Added
list_scripts - Added
list_user_groups - Added
list_users - Added
list_vrrp_instances - Added
list_wifi_clients - Added
list_wifi_interfaces - Added
list_wireguard_interfaces - Added
list_wireguard_peers - Added
manage_address_list_entry - Added
manage_bridge - Added
manage_bridge_port - Added
manage_certificate - Added
manage_container - Added
manage_container_config - Added
manage_container_env - Added
manage_container_mount - Added
manage_dhcp_client - Added
manage_dhcp_lease - Added
manage_dhcp_server - Added
manage_dns_entry - Added
manage_dns_settings - Added
manage_firewall_rule - Added
manage_interface_list - Added
manage_interface_list_member - Added
manage_ip_address - Added
manage_ip_pool - Added
manage_ip_service - Added
manage_ipsec_peer - Added
manage_ipsec_policy - Added
manage_log_action - Added
manage_log_rule - Added
manage_mangle_rule - Added
manage_netwatch_entry - Added
manage_ntp_client - Added
manage_ovpn_client - Added
manage_ovpn_server - Added
manage_package - Added
manage_ppp_profile - Added
manage_pppoe_client - Added
manage_queue - Added
manage_route - Added
manage_routing_rule - Added
manage_routing_table - Added
manage_scheduled_job - Added
manage_script - Added
manage_upgrade - Added
manage_user - Added
manage_user_group - Added
manage_vlan - Added
manage_vrrp_instance - Added
manage_wifi_interface - Added
manage_wireguard_interface - Added
manage_wireguard_peer - Added
ping - Added
plan_changes - Added
reboot - Added
rollback_change - Added
run_command - Added
run_script - Added
set_system_clock - Added
torch - Added
traceroute - Added
upload_file
77 tool updates
v1.1.0- Removed
apply_plan - Removed
bulk_execute - Removed
check_router_health - Removed
create_vlan - Removed
get_dns_settings - Removed
get_file_content - Removed
get_log - Removed
get_ntp_settings - Removed
get_snmp_settings - Removed
get_system_clock - Removed
get_system_status - Removed
list_address_list_entries - Removed
list_arp_entries - Removed
list_bgp_peers - Removed
list_bridges - Removed
list_certificates - Removed
list_containers - Removed
list_dhcp_leases - Removed
list_dhcp_pools - Removed
list_dhcp_servers - Removed
list_dns_entries - Removed
list_files - Removed
list_firewall_rules - Removed
list_interfaces - Removed
list_ipsec_peers - Removed
list_ipsec_policies - Removed
list_mangle_rules - Removed
list_neighbors - Removed
list_netwatch_entries - Removed
list_ospf_neighbors - Removed
list_packages - Removed
list_queues - Removed
list_routes - Removed
list_routing_rules - Removed
list_routing_tables - Removed
list_scheduled_jobs - Removed
list_scripts - Removed
list_users - Removed
list_vrrp_instances - Removed
list_wifi_clients - Removed
list_wifi_interfaces - Removed
list_wireguard_interfaces - Removed
list_wireguard_peers - Removed
manage_address_list_entry - Removed
manage_bridge - Removed
manage_bridge_port - Removed
manage_certificate - Removed
manage_container - Removed
manage_dhcp_pool - Removed
manage_dhcp_server - Removed
manage_dns_entry - Removed
manage_firewall_rule - Removed
manage_ip_address - Removed
manage_ipsec_peer - Removed
manage_mangle_rule - Removed
manage_netwatch_entry - Removed
manage_package - Removed
manage_queue - Removed
manage_route - Removed
manage_routing_rule - Removed
manage_routing_table - Removed
manage_scheduled_job - Removed
manage_script - Removed
manage_user - Removed
manage_vrrp_instance - Removed
manage_wifi_interface - Removed
manage_wireguard_peer - Removed
ping - Removed
plan_changes - Removed
reboot - Removed
rollback_change - Removed
run_command - Removed
run_script - Removed
set_system_clock - Removed
torch - Removed
traceroute - Removed
upload_file
77 tool updates
v0.1.0- First observed
apply_plan - First observed
bulk_execute - First observed
check_router_health - First observed
create_vlan - First observed
get_dns_settings - First observed
get_file_content - First observed
get_log - First observed
get_ntp_settings - First observed
get_snmp_settings - First observed
get_system_clock - First observed
get_system_status - First observed
list_address_list_entries - First observed
list_arp_entries - First observed
list_bgp_peers - First observed
list_bridges - First observed
list_certificates - First observed
list_containers - First observed
list_dhcp_leases - First observed
list_dhcp_pools - First observed
list_dhcp_servers - First observed
list_dns_entries - First observed
list_files - First observed
list_firewall_rules - First observed
list_interfaces - First observed
list_ipsec_peers - First observed
list_ipsec_policies - First observed
list_mangle_rules - First observed
list_neighbors - First observed
list_netwatch_entries - First observed
list_ospf_neighbors - First observed
list_packages - First observed
list_queues - First observed
list_routes - First observed
list_routing_rules - First observed
list_routing_tables - First observed
list_scheduled_jobs - First observed
list_scripts - First observed
list_users - First observed
list_vrrp_instances - First observed
list_wifi_clients - First observed
list_wifi_interfaces - First observed
list_wireguard_interfaces - First observed
list_wireguard_peers - First observed
manage_address_list_entry - First observed
manage_bridge - First observed
manage_bridge_port - First observed
manage_certificate - First observed
manage_container - First observed
manage_dhcp_pool - First observed
manage_dhcp_server - First observed
manage_dns_entry - First observed
manage_firewall_rule - First observed
manage_ip_address - First observed
manage_ipsec_peer - First observed
manage_mangle_rule - First observed
manage_netwatch_entry - First observed
manage_package - First observed
manage_queue - First observed
manage_route - First observed
manage_routing_rule - First observed
manage_routing_table - First observed
manage_scheduled_job - First observed
manage_script - First observed
manage_user - First observed
manage_vrrp_instance - First observed
manage_wifi_interface - First observed
manage_wireguard_peer - First observed
ping - First observed
plan_changes - First observed
reboot - First observed
rollback_change - First observed
run_command - First observed
run_script - First observed
set_system_clock - First observed
torch - First observed
traceroute - First observed
upload_file
TDQS
Scored across 133 tools
Most tools are distinguishable by resource and action, but the sheer number of list_/get_/manage_ pairs creates several easily confused boundaries, such as get_system_status vs get_system_clock, get_ntp_settings vs manage_ntp_client, and write_swos_blob vs apply_swos_config. The bulk_execute vs bulk_read distinction is explicitly clarified, but many high-level and low-level SwOS and container tools still require careful reading to choose correctly.
The dominant pattern is consistent snake_case verb_noun, with list_*, get_*, manage_*, bulk_*, and apply_* families used predictably across most resources. There are some deviations such as reboot, ping, traceroute, torch, bandwidth_test, and fetch_url, but they are domain-specific and still readable.
133 tools is an extreme count for a single MCP server, far beyond the 50+ threshold associated with severe mismatch. Even for a broad MikroTik management domain, this creates substantial selection and cognitive-load problems for an agent.
The surface is broad and covers many RouterOS and SwOS workflows with list/manage pairs, but notable gaps remain: BGP and OSPF are list-only, IPv6 is essentially absent, certificate management cannot import/create, and several advanced RouterOS areas such as hotspot and RADIUS are not represented. Agents can fall back to run_command for some missing operations, but that is less safe and not equivalent to proper tool coverage.
Maintenance
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP server connecting AI agents to non-custodial staking data across 130+ networks.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA bridge between AI assistants and MikroTik RouterOS devices, allowing natural language interaction to manage network configurations including VLANs, firewalls, DNS settings, and more.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with MikroTik RouterOS devices through API and SSH connections, supporting network monitoring, configuration management, and diagnostics across multiple routers with automatic connection fallback.3MIT
- AlicenseNot gradedqualityDmaintenanceHigh-performance TypeScript MCP server for MikroTik RouterOS management, enabling Claude, GPT-4, or any MCP-compatible AI to manage routers through natural language with dynamic API discovery, VPN management, and configuration backup.14 npm4MIT
- AlicenseAqualityDmaintenanceA comprehensive MCP server for network device management via SSH/Telnet. Supports multiple vendors such as Cisco IOS and BDCOM, enabling AI assistants to execute commands and manage routers, switches, and firewalls.4MIT