Skip to main content
Glama

tplink-easysmart-mcp

A local, browser-free MCP server for the TP-Link Easy Smart family of managed PoE switches (developed against the TL-SG1016PE). It speaks the switch's HTML/*.cgi web protocol directly — no headless browser at runtime — so an MCP client (Claude, or any MCP host) can read port, statistics and PoE status and power-cycle a wedged PoE camera without anyone opening the switch's web UI.

It is read-first, write-gated and lockout-aware: it never retries a failed login, gates every write behind two independent keys, restores power on every failure path, and refuses to act when the switch is in factory-reset mode.

Status: 0.1.0. The authenticated client, the typed read tools and the write / PoE power-cycle tools are implemented and covered by an offline test suite against synthetic fixtures. Live on-device verification (phase S4) is the last step before a tagged release; see docs/specs/.

Why

The Easy Smart line has no JSON API. Each page is HTML with an inline var NAME = VALUE; state block, and changes are made with *.cgi form posts over a cleartext HTTP login on port 80 — there is no TLS on the device. This server re-implements that protocol as a set of typed, safety-gated MCP tools, so an agent can answer "is the gate camera drawing power?" or "the hallway camera is frozen, power-cycle it" over the LAN.

Related MCP server: mcp-omada

Supported hardware

Hardware

Status

TL-SG1016PE V1 / V3 (16-port, PoE+ on 1–8)

Primary target. Protocol logic matches the MIT reference client, which lists V1 and V3 as fully supported including PoE. Live capture (S0) pending.

Other Easy Smart models (SG108E, SG105E, SG1016PE siblings, SG1428PE, …)

Likely to work — they share the page names, inline-variable layout and PoE encodings — but each needs an S0 live capture to confirm array padding, the auto power-limit field and the VLAN page names before it is called "tested".

Newer encrypted-login firmware (salted-XOR password + g_tid token)

Refused, fail-closed. The login probe detects the encrypted variant and raises AUTH_VARIANT_UNSUPPORTED before any POST. Port it if a firmware update brings it; the markers are already detected.

The switch's hardware revision and firmware are only readable after login, so for an unknown unit run tplink-easysmart-mcp check-auth --login once and compare.

Features

Thirteen tools, all prefixed switch_, all returning the same {success, data, error} envelope and never raising:

  • System info — model, hardware revision, firmware, MAC, IP, netmask, gateway.

  • Ports — per-port admin state, link, speed, flow control, LAG, name, protected flag.

  • Statistics — tx/rx good/bad packet counters, with derived error_ports.

  • PoE — budget totals and per-port state/priority/limit/class/W/mA/V/status, with derived fault_ports and unpowered_enabled_ports.

  • VLANs — the 802.1Q table and per-port PVIDs (or NOT_SUPPORTED).

  • Resolve port — preview how a name or number maps to a physical port.

  • Writes (gated): switch_set_poe, switch_set_port, and switch_poe_cycle (power-cycle a PoE camera off → wait → on → confirm power).

Install

Requires Python 3.11+.

pip install git+https://github.com/ebenezer-isaac/tplink-easysmart-mcp
# or, from a clone:
pip install .

Register it with your MCP client (stdio transport) — for example in a Claude Desktop / Claude Code config:

{
  "mcpServers": {
    "tplink-switch": {
      "command": "tplink-easysmart-mcp",
      "env": {
        "EASYSMART_HOST": "192.0.2.10",
        "EASYSMART_PASSWORD": "your-switch-password",
        "EASYSMART_PORT_MAP": "cam_hall=1;cam_gate=2"
      }
    }
  }
}

Leave EASYSMART_ALLOW_WRITES unset (the default) to run read-only. See the next section for every variable.

Configuration

Copy .env.example and fill it in, or pass the variables through your MCP client's env. The switch address, password and port map live only in that file — never in the repo.

Variable

Default

Meaning

EASYSMART_HOST

— (required)

Switch IP or hostname. Scheme is always http.

EASYSMART_PORT

80

HTTP port.

EASYSMART_USERNAME

admin

1–16 printable-ASCII chars.

EASYSMART_PASSWORD

— (required)

6–16 chars, no spaces (the switch's own limit). Validated at startup so a bad value never reaches the device and trips its lockout.

EASYSMART_TIMEOUT_S

5

Per-request timeout (1–120). The web server is single-threaded; keep it short.

EASYSMART_ALLOW_WRITES

false

Master write switch. Half of the write gate.

EASYSMART_DRY_RUN

false

A write reads the live page and returns the exact form it would send, sending nothing.

EASYSMART_LOGIN_DISABLED

false

Freezes authentication: no login attempt is ever made.

EASYSMART_STATE_DIR

~/.local/state/tplink-easysmart-mcp

Where the breaker, cooldown and cycle-reservation files live.

EASYSMART_POE_PORTS

1-8

PoE-capable ports (ranges and commas, e.g. 1,2,5-8). A PoE write requires the port to be here and ≤ the live poe_port_num.

EASYSMART_PROTECTED_PORTS

—

Ports no write may ever touch: the uplink and the server's own port. Required and non-empty whenever ALLOW_WRITES=true (startup fails otherwise). E.g. 16,15.

EASYSMART_PORT_MAP

—

Friendly names: name=port;name=port. A name must start with a letter and match [A-Za-z][A-Za-z0-9 _.-]{0,31}; purely numeric names are refused so a name can never shadow a port number. Case-insensitive, must be unique.

EASYSMART_LOGIN_COOLDOWN_S

300

Minimum gap between a failed/unconfirmed login and the next attempt.

EASYSMART_CYCLE_OFF_MIN_S / EASYSMART_CYCLE_OFF_MAX_S

5 / 120

Bounds for a power-cycle's off_seconds (an out-of-range value is refused, not clamped).

EASYSMART_CYCLE_POWER_TIMEOUT_S

60

How long to wait for powerstatus == on after re-enabling a port.

EASYSMART_LOGOUT_AFTER_READS

false

If true, read tools also log out. Use it when a human works in the switch web UI often (see session eviction below).

EASYSMART_MCP_TRANSPORT

stdio

stdio or streamable-http.

EASYSMART_MCP_HOST / EASYSMART_MCP_PORT

127.0.0.1 / 8766

HTTP transport bind. Keep it on loopback; the server has no auth of its own.

VERIFY_TLS / TLS_FINGERPRINT_SHA256 are rejected if set — the device is HTTP-only, so they could do nothing but mislead.

Running

tplink-easysmart-mcp                      # serve over EASYSMART_MCP_TRANSPORT
tplink-easysmart-mcp --list-tools         # print the 13 tool names; no device I/O
tplink-easysmart-mcp check-auth           # probe only (one GET, no login)
tplink-easysmart-mcp check-auth --login   # exactly one login, confirm, then log out
tplink-easysmart-mcp breaker --show       # print the persistent breaker state
tplink-easysmart-mcp breaker --clear      # clear the breaker after fixing the cause

Safety model

This device makes safety the whole point of the project. See SECURITY.md for the full threat model.

  • Cleartext login → LAN host only. The password crosses the wire in cleartext on every login. Run this server on the wired LAN host that reaches the switch — never across WiFi or a Tailscale/SSH hop. The HTTP transport binds to loopback; reach the MCP over Tailscale/SSH, but keep the switch traffic local.

  • Writes are double-gated. A mutating tool acts only when EASYSMART_ALLOW_WRITES=true on the server and confirm_write=true on the call. Miss either and the tool returns a refusal before any network call.

  • Dry-run. EASYSMART_DRY_RUN=true makes a write read the live page and return the exact bytes it would send, sending nothing.

  • Read-modify-write + verify. Every write reads the current page, changes only the one field, re-sends the rest verbatim, then re-reads to confirm — so a PoE on/off never silently resets priority or limit (WRITE_VERIFY_FAILED if it did).

  • Protected ports. EASYSMART_PROTECTED_PORTS (required when writes are on) names the uplink and the server's own port; no write or power-cycle touches them.

  • Single-session eviction. The switch is effectively single-session: logging in evicts a human's web-UI session and vice versa. The server logs in lazily, re-logs in at most once per read, and logs out after every write.

  • Restored-account / factory-reset refusal. In factory-reset mode a login POST would set the admin password. The server detects the "New Password / Confirm" page, refuses to POST, and trips the breaker.

  • Lockout breaker + cooldown. A failed login (bad credentials, locked account, restored mode) trips a persistent breaker that blocks further logins until a human runs breaker --clear; session-busy / timeout responses set a cooldown instead. The login is never retried automatically.

  • One cycle per port, crash-visible. Only one power-cycle runs per port at a time, reserved through a cross-process state file so a crashed cycle stays visible. Once the port is off, every failure path still tries to turn it back on and reports both outcomes; power is restored on every path.

  • Exit codes (for check-auth / breaker in scripts): 0 success · 1 auth failed · 2 config error · 3 breaker open / cooldown / login disabled / state unavailable · 4 transport error.

Tools

A port argument is an int or a case-insensitive EASYSMART_PORT_MAP name (switch_resolve_port previews the mapping; resolution is type-stable, so 3 and "3" are always the same physical port).

Tool

R/W

What it does / refuses

switch_status

R

Healthcheck: config summary, one credential-free reachability probe, breaker/cooldown/cycle state. Never logs in.

switch_check_auth

R

Probe only (one GET): session model, auth variant, login mode.

switch_login

R

Exactly one login, confirm, then logout. Returns hw/fw; never cookies.

switch_logout

R

End any lingering session (no-op if not logged in).

switch_get_system_info

R

Model, hw revision, firmware, MAC, IP, netmask, gateway, session model.

switch_get_ports

R

Per-port state, link, speed, flow control, LAG, name, protected. only_linked filters.

switch_get_port_stats

R

tx/rx good/bad counters for one port or all, plus error_ports.

switch_get_poe

R

Budget totals + per-port state/priority/limit/class/W/mA/V/status, plus fault_ports and unpowered_enabled_ports.

switch_get_vlans

R

802.1Q table + per-port PVIDs, or NOT_SUPPORTED on firmware without it.

switch_resolve_port

R

Resolve a name/number to {port, name, is_poe, protected, max_port}.

switch_set_poe

W

Enable/disable PoE on one port (RMW; verifies priority/limit survive). Refuses NOT_POE_PORT, PROTECTED_PORT.

switch_set_port

W

Enable/disable one port's link (RMW; verifies speed/flow-control survive). Refuses PROTECTED_PORT.

switch_poe_cycle

W

Power-cycle a PoE camera: off → wait off_seconds → on → wait for power. Refuses NOT_POE_PORT, PROTECTED_PORT, ALREADY_OFF, CYCLE_IN_PROGRESS; reports CYCLE_INCOMPLETE/POWER_NOT_RESTORED naming any port left UNPOWERED.

Recipes

Power-cycle a wedged camera by name. With writes enabled and the camera in EASYSMART_PORT_MAP:

switch_poe_cycle(port_or_name="cam_hall", off_seconds=10, confirm_write=true)

It turns PoE off, waits, turns it back on, and polls until the camera draws power again — restoring power and reporting the outcome even if a step fails. Dry-run it first (EASYSMART_DRY_RUN=true) to see the exact off/on forms.

Check the PoE budget.

switch_get_poe()

Returns the system budget (limit / consumption / remaining) and every port's draw, plus fault_ports (overload/short/voltage/thermal) and unpowered_enabled_ports (PoE enabled but no power — often a dead or unplugged PD).

Limitations

  • Live verification pending. The protocol is implemented from the MIT reference client and synthetic fixtures; the on-device S0 capture and S4 cycle test have not been run. Items a live unit must confirm are tagged # S0: confirm in switch/constants.py (the auto power-limit wire value, the per-port array padding, the disabled-PoE read value, whether Logout.htm ends the session, and whether the 802.1Q pages exist under these names).

  • VLAN writes are not exposed. The VLAN read layout is inferred from sibling models; VLAN writes have two incompatible firmware shapes and are intentionally not implemented.

  • Cable diagnostics are unknown. No reference client implements the cable-test page; it is not a tool.

  • Hardware revision needs a login. It is only on SystemInfoRpm.htm.

Troubleshooting

  • AUTH_FAILED / LOCKED_OUT and the breaker is now open. A login was rejected (errType 1/2). The server will not retry. Fix the credentials, then tplink-easysmart-mcp breaker --clear. Do not loop on login — the switch locks the admin account.

  • LOGIN_NOT_ACCEPTED. The login POST returned errType 0 but the confirming GET came back as the login page (a known silent-ignore on cookie firmware). The credentials may be fine; a cooldown is recorded rather than tripping the breaker.

  • SESSION_BUSY. Another process on your IP (usually a browser tab on the switch) already holds the session. Close it and retry.

  • RESTORED_ACCOUNT_MODE. The switch is in factory-reset "set a new password" mode. Set the admin password in the web UI first; the server will not do it.

  • AUTH_VARIANT_UNSUPPORTED. The firmware uses the encrypted login variant, which is not yet supported.

  • OUTCOME_UNKNOWN. A write's connection was reset. The server re-reads rather than resending; check switch_get_poe / switch_get_ports for the real state.

  • CYCLE_IN_PROGRESS that never clears. A previous cycle crashed and left a reservation. A marker older than its window is reported stale and overwritten; if it persists, remove the cycle marker under EASYSMART_STATE_DIR.

  • errType meanings: 0 ok/silently-ignored · 1 bad credentials · 2 user blocked · 3/4 session slots full · 5 session timeout · 6 restored-account mode.

Prior art and credits

  • vmakeev/hass_tplink_easy_smart (MIT, © 2022 Vladimir Makeev) — the request flow and the inline-variable / PoE / port parsing logic are ported from this Home Assistant integration (logic re-implemented, no files copied). See NOTICE.

  • t0mer/SwitchDeck (Apache-2.0) — read for SG108E page/field names and connection-reset behaviour.

  • pklaus/smrt — reference for the Easy Smart web protocol and page conventions.

Development

python -m venv .venv && .venv/Scripts/python.exe -m pip install -e ".[dev]"   # Windows
# or: python -m venv .venv && source .venv/bin/activate && pip install -e ".[dev]"
python scripts/gate.py   # ruff + pytest (coverage) + secret scan + stub scan + --list-tools

scripts/gate.py must print PASS before any commit. See CONTRIBUTING.md for the workflow, the breaker protocol, and the core-identity rule (core/ is canonical in vigi-nvr-mcp and copied verbatim). Protocol notes live in docs/protocol/easysmart-switch.md; the full specs and endpoint map are in docs/specs/.

License

MIT. See NOTICE for third-party attribution.

Available Tools

13 tools
switch_check_authA

Probe the switch without logging in: report the session model, auth variant and login mode plus breaker/cooldown state. Makes one GET, no POST.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the key trait: a single GET, no POST, i.e. non-mutating and safe to call unauthenticated. It also names the diagnostic state it surfaces, but omits any note on rate limits, error behavior, or possible failure modes from a probing request.

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

Conciseness5/5

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

Two tight sentences with zero filler. The scope-defining clause ('without logging in') is front-loaded and the behavior ('Makes one GET, no POST') is stated compactly at the end.

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

Completeness4/5

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

For a zero-param, no-annotation, no-output-schema tool the description covers purpose and the key safety/behavior trait, which is enough to call it correctly. Minor gap: no indication of what the reported values look like or what happens if the probe fails.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to clarify; baseline for a no-param schema is 4. The description correctly implies no input is needed.

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

Purpose5/5

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

States a specific verb (probe) and resource (switch auth) and enumerates exactly what is reported: session model, auth variant, login mode, breaker/cooldown state. This clearly separates it from siblings like switch_login, switch_logout, and the several switch_get_* readers, which do not probe auth state.

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

Usage Guidelines4/5

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

The phrase 'without logging in' implies the use case — determine the auth/login model before authenticating — and rules out the login flow, but it never names an alternative tool or states an explicit precondition/dependency on switch_login. Clear context, no explicit when-not routing.

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

switch_get_poeA

Read-only: PoE budget totals and per-port state, priority, power limit, PD class ("--" when none), watts, milliamps, volts and status, plus derived fault_ports and unpowered_enabled_ports. Does not mutate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the safety burden itself, explicitly declaring 'Read-only' and 'Does not mutate' and disclosing derived output fields (fault_ports, unpowered_enabled_ports) and the '--' sentinel for missing PD class. It stops short of auth requirements or rate/scale notes.

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

Conciseness4/5

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

Front-loaded with the read-only guarantee, then a compact enumeration of returned fields. Dense but every clause carries field-level information; no filler sentences.

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

Completeness4/5

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

With no output schema present, the description compensates well by naming the returned fields and derived values, including edge-case semantics. Only missing auth/permission context relative to siblings like switch_check_auth.

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

Parameters4/5

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

The tool takes no parameters, so the 4 baseline applies; there is no argument semantics for the description to add.

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

Purpose5/5

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

States a specific read verb and resource (PoE budget/port state) and enumerates the exact fields returned, so it is clearly distinguishable from the write-side siblings switch_set_poe and switch_poe_cycle.

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

Usage Guidelines3/5

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

The read-only framing implicitly positions it against switch_set_poe, but no sibling is named and no condition for choosing it over switch_get_ports or switch_get_port_stats is given. 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.

switch_get_portsA

Read-only: per-port admin state, link, configured/actual speed, flow control, LAG id, friendly name and whether the port is protected. Set only_linked=true to list only ports with a live link. Does not mutate.

ParametersJSON Schema
NameRequiredDescriptionDefault
only_linkedNo

TDQS

A4/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full burden, and it does so well for the safety profile: 'Read-only' and 'Does not mutate' explicitly declare the operation is non-destructive. It also discloses what the call returns. It omits auth requirements, rate limits, and pagination behavior, which keeps it from 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.

Conciseness5/5

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

Three short sentences, zero filler. The read-only nature and returned fields are front-loaded, and the only_linked hint follows logically after the reader knows what a port record contains.

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

Completeness5/5

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

With no annotations and no output schema, the description covers the gaps that matter: it declares the operation non-mutating and enumerates the returned fields, so an agent knows both the safety profile and the response shape. Nothing essential for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 0% and the single parameter has no schema description, so the description must compensate, and it does: 'Set only_linked=true to list only ports with a live link' fully explains the flag's effect. It does not restate the default of false, a minor omission.

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

Purpose4/5

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

States a specific verb and resource (read per-port state) and enumerates the exact fields returned: admin state, link, configured/actual speed, flow control, LAG id, friendly name, protection status. That field list implicitly separates it from siblings like switch_get_port_stats and switch_get_vlans, but no sibling is named explicitly, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description tells you to set only_linked=true for a live-link filter, but gives no guidance on when this tool should be chosen over switch_get_port_stats, switch_get_poe, or switch_get_vlans. Usage is only implied by the field list, with no exclusions or alternatives.

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

switch_get_port_statsA

Read-only: tx/rx good/bad packet counters. Pass a port number or a PORT_MAP name for one port, or omit it for all ports plus error_ports (any port with rx_bad+tx_bad > 0). Does not mutate.

ParametersJSON Schema
NameRequiredDescriptionDefault
portNo

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose the safety profile ('Read-only', 'Does not mutate') and the derived semantics of error_ports (rx_bad+tx_bad > 0), which is genuinely useful. However, it omits permission/auth requirements (relevant given sibling switch_login/switch_check_auth) and any error or rate-limit behavior.

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

Conciseness5/5

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

Three short sentences, front-loaded with the read-only safety statement, then the return content, then the argument contract. No filler; every clause carries information.

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

Completeness4/5

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

For a one-parameter read tool with no output schema and no annotations, the description covers purpose, argument contract, return content summary, and non-mutation. It is nearly complete, missing only auth/permission prerequisites that siblings imply may exist.

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

Parameters4/5

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

The single parameter has 0% schema description coverage, so the description must compensate. It does so well: it maps the anyOf integer|string|null to 'port number' / 'PORT_MAP name' / omit-for-all. The only gap is that 'PORT_MAP name' is not defined and its source (possibly switch_resolve_port) is left implicit.

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

Purpose5/5

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

States a precise verb+resource combination ('tx/rx good/bad packet counters' for switch ports) and defines the scope (one port vs. all ports plus error_ports). This is clearly distinguishable from siblings like switch_get_ports, switch_get_poe, or switch_status.

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

Usage Guidelines3/5

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

The description explains how to invoke it (pass a port number, a PORT_MAP name, or omit for all) and what the omission yields, but gives no guidance on when to choose this tool over siblings such as switch_get_ports or switch_status. Usage context is implied rather than stated.

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

switch_get_system_infoA

Read-only: model, hardware revision, firmware, MAC, IP, netmask, gateway and the session model. Logs in lazily; does not mutate anything.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it delivers two non-obvious facts: the operation is non-mutating and it 'logs in lazily', which tells the agent it need not call switch_login first. It does not cover auth failure behavior, error modes, or rate limits, so it is not complete.

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

Conciseness5/5

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

Two sentences, zero filler, with the safety profile front-loaded and the returned fields listed compactly. Every clause earns its place.

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

Completeness4/5

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

Because there is no output schema and no annotations, the description must supply both the return contents and the safety profile, and it does both. It stops short of describing failure or timeout behavior, but for a zero-parameter read tool this is nearly sufficient.

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

Parameters4/5

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

The tool takes zero parameters, so the schema cannot be improved by parameter documentation and the baseline is 4. The description instead documents the return surface, which is a reasonable substitute given there is no output schema.

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

Purpose4/5

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

The description enumerates exactly what is returned (model, hardware revision, firmware, MAC, IP, netmask, gateway, session model), which makes the tool's purpose unambiguous and clearly separates it from siblings like switch_get_ports or switch_get_vlans. It lacks an explicit verb framing ('returns switch system information'), but the field list communicates the same thing.

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

Usage Guidelines3/5

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

The 'Read-only' and 'does not mutate anything' notes imply this is a safe introspection call, but there is no explicit statement of when to reach for it versus switch_status or switch_check_auth. Usage is inferable rather than stated.

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

switch_get_vlansA

Read-only: the 802.1Q VLAN table and per-port PVIDs. Returns NOT_SUPPORTED if this firmware does not serve a VLAN page. Does not mutate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it declares the operation read-only and non-mutating, and discloses a concrete failure mode (NOT_SUPPORTED on firmware without a VLAN page). It stops short of stating authentication requirements, which matters given the switch_login/switch_check_auth siblings.

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

Conciseness4/5

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

Three tight, front-loaded sentences that lead with the safety profile and then the failure mode. Minor redundancy between 'Read-only' and 'Does not mutate' costs a point but nothing is wasted otherwise.

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

Completeness4/5

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

For a zero-parameter, no-output-schema read tool this is nearly complete: purpose, safety profile, and a known error condition are all covered. The only real gap is whether prior authentication is required, which the presence of login/auth siblings makes relevant.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter syntax or format details are needed here.

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

Purpose5/5

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

States a specific read verb and the exact resource: the 802.1Q VLAN table plus per-port PVIDs. This clearly separates it from siblings such as switch_get_ports, switch_get_port_stats, and switch_get_poe, so an agent can pick it 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.

Usage Guidelines3/5

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

Usage is only implied - an agent infers it should call this to inspect VLAN membership and PVIDs. There is no explicit when-to-use, no statement of prerequisites (e.g. whether switch_login is required first), and no routing to alternatives, though the resource is narrow enough that alternatives are unlikely.

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

switch_loginA

Perform exactly one login, confirm it with a data GET, then log out. Returns the session model and hardware/firmware. Never returns cookies. Refuses (no POST) in restored-account or encrypted-variant modes, and the breaker blocks it after a prior failure until a human clears it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses the exact side-effect sequence, what is returned (session model, hardware/firmware), what is deliberately withheld (cookies), and two refusal/blocking conditions including the circuit breaker needing human reset. This is unusually rich behavioral disclosure.

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

Conciseness5/5

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

Three tight sentences with the action sequence front-loaded, then returns, then refusal conditions. Every clause carries operational information; nothing is padded or redundant.

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

Completeness5/5

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

No output schema exists, yet the description explains the return payload (session model, hardware/firmware, no cookies) and the failure modes. For a 0-param, no-annotation tool this covers everything an agent needs before invoking.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing to disambiguate; baseline for a 0-param tool is 4. The description adds no parameter detail, which is appropriate here.

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

Purpose5/5

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

States a specific verb and resource ('Perform exactly one login') plus the full composite sequence (confirm via data GET, then log out). It is clearly distinguishable from siblings like switch_logout and switch_check_auth, which do only one of those steps.

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

Usage Guidelines4/5

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

Gives concrete conditions under which the tool will not act ('Refuses (no POST) in restored-account or encrypted-variant modes') and notes the breaker blocks it after a prior failure until a human clears it. It does not explicitly contrast with switch_check_auth or switch_status, but the precondition context is clear.

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

switch_logoutA

End any lingering session with GET /Logout.htm. A no-op (no network) if not currently logged in. Does not mutate switch settings.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and delivers real behavioral facts: the HTTP method used (GET /Logout.htm), idempotent behavior when unauthenticated, and explicit non-mutation of switch settings. It omits auth prerequisites and error/failure behavior, which keeps it from 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.

Conciseness5/5

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

Three tight sentences, front-loaded with the action, followed by the idempotency caveat and the mutation disclaimer. Every sentence earns its place; none restates the name or schema.

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

Completeness4/5

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

For a zero-arg, no-output-schema lifecycle tool, the description covers action, idempotency, and side-effect profile adequately. Remaining gaps (auth requirement, behavior on failure) are minor but real for a session-management operation.

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

Parameters4/5

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

Zero parameters, so the baseline is 4 and there is no parameter semantics to add or omit. The description correctly introduces no phantom arguments.

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

Purpose5/5

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

Specific verb+resource ("End any lingering session") with the underlying endpoint named, making it trivially distinguishable from switch_login and switch_check_auth. An agent knows exactly what this 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.

Usage Guidelines4/5

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

The description gives a clear behavioral condition for use ("no-op if not currently logged in"), which is effectively guidance on when calling it is meaningful. It does not explicitly name a sibling alternative or an exclusion, so it stops short of the full when/when-not/alternatives bar.

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

switch_poe_cycleA

MUTATES: power-cycle one PoE camera (off, wait off_seconds, on, wait for power). Resolve a PORT_MAP camera name or port number. Refuses non-PoE (NOT_POE_PORT), protected (PROTECTED_PORT), an already-off port (ALREADY_OFF) and a second concurrent cycle (CYCLE_IN_PROGRESS). If it cannot restore power it reports CYCLE_INCOMPLETE/POWER_NOT_RESTORED naming the port that may be UNPOWERED. Requires both write gates; honours EASYSMART_DRY_RUN (returns both planned forms, sends nothing).

ParametersJSON Schema
NameRequiredDescriptionDefault
off_secondsNo
port_or_nameYes
confirm_writeNoMust be the JSON boolean true to authorise this mutating write. A string such as "true"/"1"/"yes" does NOT count and the write is refused with no network call; re-send with the boolean confirm_write=true after confirming the change with the operator.

TDQS

A4.1/5.0
Behavior5/5

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

With no annotations present, the description carries the full burden and does so well: it declares the write nature up front, enumerates the exact refusal conditions by error code, describes the partial-failure mode and its safety warning (naming the port that may be UNPOWERED), and discloses the dry-run gate and the dual write-gate requirement. This is behavior an agent could not derive from the schema alone.

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

Conciseness4/5

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

The mutation warning is front-loaded in the first word and the sentence ordering follows the operation's lifecycle (what it does, what it accepts, what it refuses, how it fails, what gates it needs). It is dense and error-code heavy, but essentially every clause carries information an agent needs, so little is wasted.

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

Completeness5/5

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

For a three-parameter mutation tool with no output schema and no annotations, this covers the critical ground: operation semantics, input resolution, authorization gates, dry-run behavior, and the concrete failure outcomes an agent must handle. Nothing needed to call it correctly appears to be missing.

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

Parameters4/5

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

Schema coverage is only 33% (confirm_write is the sole documented parameter), so the description must compensate. It does: "wait off_seconds" defines the timing parameter's role and "Resolve a PORT_MAP camera name or port number" defines the required identifier's accepted forms, adding real meaning beyond the bare anyOf integer|string schema.

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

Purpose4/5

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

The description opens with an explicit verb and resource ("MUTATES: power-cycle one PoE camera") and spells out the exact sequence off/wait/on/wait. It is unambiguous what the tool does, though it never names the neighboring switch_set_poe to say how a power-cycle differs from a plain PoE state change, so sibling differentiation is left to inference.

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

Usage Guidelines3/5

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

Usage context is implied rather than stated: the refusal list (NOT_POE_PORT, PROTECTED_PORT, ALREADY_OFF, CYCLE_IN_PROGRESS) and the "requires both write gates" clause tell an agent the preconditions, and the PORT_MAP note tells it what input to resolve. However, there is no explicit statement of when to choose this over switch_set_poe or switch_resolve_port, which is the main routing decision an agent faces here.

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

switch_resolve_portA

Read-only helper: resolve a port number or PORT_MAP name to {port, name, is_poe, protected, max_port}. Resolution is type-stable: an integer or a string of digits is ALWAYS a port number (never a name), so 3 and "3" mean the same physical port and a numeric name can never shadow one. A non-digit string is a case-insensitive name. UNKNOWN_PORT lists the known names; AMBIGUOUS_NAME if a name maps to more than one port; an out-of-range number is INVALID_PORT. Does not mutate.

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_portYes

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations present, the description carries the full behavioral burden and does so well: it declares read-only, 'Does not mutate,' spells out type-stable resolution rules (integer/digit-string is always a port, never a shadowing name), and enumerates the failure modes UNKNOWN_PORT, AMBIGUOUS_NAME, and INVALID_PORT.

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

Conciseness4/5

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

Front-loaded with the purpose and return shape, then rules, then error codes, then the no-mutation guarantee. Every sentence carries information, though the middle passage on type-stability is dense and could be slightly tightened.

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

Completeness4/5

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

No output schema exists, but the description specifies the returned object fields and the error identifiers, covering both success and failure paths. Only auth requirements are unaddressed, which is minor for a read-only resolver.

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

Parameters5/5

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

Schema description coverage is 0% and the single parameter name_or_port has no inline documentation, so the description must compensate — and it does, explaining the anyOf(integer|string) semantics in detail, including case-insensitivity, digit-string equivalence, and that names cannot shadow numeric ports.

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

Purpose4/5

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

States a specific verb (resolve) and resource (port number or PORT_MAP name) plus the exact return shape {port, name, is_poe, protected, max_port}. It is clearly a distinct utility from the get_* siblings, though it does not name any sibling to differentiate itself explicitly.

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

Usage Guidelines3/5

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

Implies usage as a read-only resolution helper and usefully notes that UNKNOWN_PORT 'lists the known names,' which hints at a discovery workflow. However, it never states when to prefer this over switch_get_ports or switch_get_port_stats, nor any prerequisites, so the routing guidance is only implied.

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

switch_set_poeA

MUTATES PoE on one port. Reads the live PoE page, re-sends the port's current priority and power limit, and changes only on/off, then verifies (WRITE_VERIFY_FAILED if priority/limit were clobbered). Refuses a non-PoE port (NOT_POE_PORT) or a protected port (PROTECTED_PORT). Requires EASYSMART_ALLOW_WRITES=true and confirm_write=true; otherwise no network call. Honours EASYSMART_DRY_RUN (returns the exact form, sends nothing).

ParametersJSON Schema
NameRequiredDescriptionDefault
portYes
enabledYes
confirm_writeNoMust be the JSON boolean true to authorise this mutating write. A string such as "true"/"1"/"yes" does NOT count and the write is refused with no network call; re-send with the boolean confirm_write=true after confirming the change with the operator.

TDQS

A3.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it states the read-modify-write sequence, that only on/off changes while priority/limit are re-sent, the post-write verification, the WRITE_VERIFY_FAILED / NOT_POE_PORT / PROTECTED_PORT outcomes, the env-var gating that produces no network call, and dry-run behavior returning the exact form.

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

Conciseness4/5

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

The mutating nature and scope are front-loaded in the first clause, and every sentence adds operative detail (effects, error codes, gating, dry-run) rather than filler. It is dense flattened prose with several stacked clauses, so it is effective but not maximally scannable.

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

Completeness4/5

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

For a gated, no-annotation mutation tool with no output schema, it covers prerequisites, side effects, failure modes and dry-run semantics thoroughly. It stops short of describing the success return payload or pagination-style output expectations, which larger context would warrant.

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

Parameters3/5

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

Schema coverage is only 33% (port and enabled are undocumented in the schema), so the description must compensate. It clarifies that 'enabled' means on/off only and that confirm_write must be the JSON boolean true, but it leaves the port parameter's accepted formats (integer vs string/name) unexplained.

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

Purpose4/5

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

Opens with a specific verb+resource+scope: 'MUTATES PoE on one port.' The mutation framing and 'changes only on/off' clearly separate it from read siblings like switch_get_poe and from switch_poe_cycle, but no sibling is named explicitly, so it stops short of the top tier.

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

Usage Guidelines3/5

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

It gives real preconditions and refusal conditions (non-PoE port, protected port, EASYSMART_ALLOW_WRITES, confirm_write), which is useful context. However it never says when to prefer this over switch_poe_cycle or switch_set_port, so the when-to-use-vs-alternatives guidance is only implied.

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

switch_set_portA

MUTATES one port's admin state (enable/disable the link). Reads the live page, re-sends the port's current speed and flow control, changes only the state, then verifies. Refuses a protected port (PROTECTED_PORT). Requires both write gates; otherwise no network call. Honours EASYSMART_DRY_RUN.

ParametersJSON Schema
NameRequiredDescriptionDefault
portYes
enabledYes
confirm_writeNoMust be the JSON boolean true to authorise this mutating write. A string such as "true"/"1"/"yes" does NOT count and the write is refused with no network call; re-send with the boolean confirm_write=true after confirming the change with the operator.

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses the read-modify-write sequence, that speed and flow control are re-sent unchanged, that only state changes, that the result is verified afterwards, the PROTECTED_PORT refusal, the two-write-gate precondition, and EASYSMART_DRY_RUN support. These are exactly the traits an agent needs to predict side effects and failure modes.

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

Conciseness4/5

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

Front-loads the mutation and its scope, then sequences behaviour, refusals and gates in short clauses with no filler. Slightly telegraphic phrasing such as 'write gates' is undefined, but nothing is wasted.

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

Completeness4/5

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

For a mutation tool with no annotations and no output schema, it covers side effects, safety gates, refusal codes and dry-run behaviour. The main omission is not identifying what the second write gate is and not describing port-argument formats, but an agent could call this correctly from the description alone.

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

Parameters3/5

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

Schema coverage is only 33%: port and enabled carry no descriptions, and the description does not explain accepted port formats (integer vs string) or what enabled=false means operationally beyond 'disable the link'. The mention of 'both write gates' and dry-run partially compensates by signalling the confirm_write gate, but the gap is only partly closed.

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

Purpose5/5

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

States a specific verb (MUTATES) plus the exact resource and scope: one port's admin state, i.e. enable/disable the link. This cleanly separates it from switch_set_poe, switch_poe_cycle and the read-only switch_get_* siblings without needing their schemas.

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

Usage Guidelines4/5

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

Gives clear conditions for use (toggling a port's admin state) and for refusal (protected port returns PROTECTED_PORT; missing write gates means no network call), plus dry-run behaviour. It stops short of explicitly naming alternative sibling tools, so it is clear context without exclusions.

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

switch_statusA

Healthcheck: policy, one credential-free reachability GET, session-model guess and breaker state. Never logs in, never POSTs, never returns the password or cookies.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden well: it discloses side-effect freedom (never logs in, never POSTs), the single reachability GET it performs, and a privacy guarantee (never returns the password or cookies). It stops short of stating rate limits, mutation of breaker state, or failure behavior, so it's strong but not exhaustive.

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

Conciseness4/5

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

Very short and front-loaded with the operative label "Healthcheck" followed by the specifics. Terms like "session-model guess" and "breaker state" are terse jargon but compact rather than wasteful.

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

Completeness4/5

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

There is no output schema, so the description must convey the return content, and it lists the four things the healthcheck reports. That covers the essentials for a zero-arg diagnostic, though the exact shape/values of each field remain unspecified.

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

Parameters4/5

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

The tool takes zero parameters, so no parameter meaning is required and the baseline of 4 applies; the description correctly implies a no-argument call.

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

Purpose4/5

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

States a specific purpose ("Healthcheck") and enumerates what it probes/returns: policy, a credential-free reachability GET, session-model guess, and breaker state. This is distinct from data-retrieval siblings like switch_get_ports, but the boundary against switch_check_auth and switch_get_system_info is not drawn, so an agent can't fully disambiguate.

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

Usage Guidelines3/5

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

Usage is only implied: the emphasis on "credential-free" and "never logs in" suggests this is safe to call before authentication or when diagnosing connectivity, but no explicit when-to-use or when-not-to-use versus switch_check_auth is stated.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.0
    • First observedswitch_check_auth
    • First observedswitch_get_poe
    • First observedswitch_get_port_stats
    • First observedswitch_get_ports
    • First observedswitch_get_system_info
    • First observedswitch_get_vlans
    • First observedswitch_login
    • First observedswitch_logout
    • First observedswitch_poe_cycle
    • First observedswitch_resolve_port
    • First observedswitch_set_poe
    • First observedswitch_set_port
    • First observedswitch_status

TDQS

A4.1/5.0

Scored across 13 tools

Disambiguation4/5

Most tools target distinct resources or actions, but switch_status and switch_check_auth both perform a credential-free probe and report session/auth/breaker state, creating one confusing pair. switch_login and switch_get_system_info also overlap in session handling, though their descriptions clarify the difference.

Naming Consistency5/5

All tools use snake_case with a consistent switch_ prefix. Verbs like get_, set_, resolve_, check_, login, and logout are conventional and readable throughout, with no mixed conventions.

Tool Count5/5

The 13 tools are well-scoped for a switch management server. They cover status, authentication, read operations, safe writes, a helper, and a specialized PoE cycle without excessive bloat.

Completeness3/5

The surface covers read-heavy diagnostics and limited safe mutations, but it lacks VLAN configuration, port speed/flow-control changes, LAG management, and a way to clear the auth breaker. These are notable gaps for full switch management, though core read and safe write workflows exist.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers