Skip to main content
Glama

idm-mcp

MCP server for an ISOTEL IDM smart gateway. It exposes the gateway's devices, parameters, records, protocol stacks, streams and connections to an MCP client (Claude Desktop, Chatbox, an agent, anything speaking MCP).

Read-only by default - 14 tools that only GET. Writing is opt-in: --allow-write registers the write tools, IDM_WRITABLE names the parameters that may be changed, and every value is validated against the gateway's own options (read-only flag, allowed values, numeric range) before anything is sent.

Built on isotel-idm and fastmcp; target gateway API 1.3.845.

Workflow

  1. idm_list_devices — what is attached.

  2. idm_get_device_html for any device you are about to read or change. It is the description layer: sections (System, Acquire, Trigger, Channels, ...), units, live values and free-text diagnostics, with every value tagged by its parameter name. It honours the access level, so it grows from 140 to 195 parameters with --enable-devel --enable-hidden.

  3. Then the value tools.

Skip step 2 only when the user has already named a specific parameter and value — the intent is unambiguous then. Otherwise describe first and let the sections inform which parameters matter; don't infer meaning from a parameter name alone. The write tools return device_described and a hint when it is false.

Related MCP server: Technitium DNS MCP

Tools

Tool

Returns

idm_gateway_info()

host, API version, mode, group, active and known device counts

idm_list_devices(include_inactive=False, brand_filter=None)

[{name, device, root, status}]

idm_device_status(device)

state, port, endpoints, time, recording, counters

idm_get_protocols(device, full=False)

protocol stack layers, plus streams with tcp_port / gateway_host

idm_get_streams(device=None)

every TCP stream with its name, port, clients, rx/tx

idm_list_connections()

every PHY connection with state and link counters, including one with no device

idm_get_device_html(device, max_bytes=8192)

the gateway's own HTML page for a device — the description step; honours the access level

idm_get_activity(limit=20)

recent gateway activity log — the receipt for a write

idm_list_parameters(device, prefix=None)

parameter paths only — for discovery

idm_get_parameters(device, prefix=None, names=None, fresh=False)

flattened {"ec/E": {"value", "unit"}}

idm_get_structure(device, path="", options=False)

a whole substructure in one request, e.g. cfg or ch/PGA_in

idm_get_value(device, parameter, fresh=False, options=False)

one parameter: value, unit, accuracy, timestamp; with options=True also type / allowedValues / readOnly

idm_get_history(device, parameter, time_from, time_to, max_points, scale, average, calc, interpolate)

recorded samples, aggregated by the gateway

device accepts the root (device0), the full name (spaces or underscores) or an unambiguous substring. Ambiguity is refused with the candidate list rather than silently picking the first device. Parameter paths use slashes (ec/E); dots (ec.E) are accepted too.

idm_list_parameters reports variables of a device that wraps them in a data container as data/ch/PGA_in/PGA_in0, but the gateway addresses that variable as ch/PGA_in/PGA_in0. The tools accept either and strip the container, so paths from idm_list_parameters can be used as-is.

History modes

The gateway does the aggregation, so a month or a day costs one call:

Arguments

Mode

Result

max_points=N

regular

N samples (limit): first N after time_from, or last N before time_to; gateway default 100

scale=N

scale

N points spanning the span, each with m = records in its interval

scale=N, average=3600

average

N points averaged over 3600 s intervals, with n and sd

calc=avg

calc

one aggregate over the whole record set (n_sum = inputs)

average is an interval duration in seconds — the Python library's docstring calls it a record count, which is wrong. max_points and scale are mutually exclusive; average and interpolate require scale.

Streams

idm_get_protocols flattens the protocol stack of the port a device sits on: PHYSICAL -> VIRTUALPHY -> MESSAGE -> CUSTOM, with each layer's rx/tx counters. A layer that carries a tcp_port is a stream served by the gateway — connect to <gateway_host>:<tcp_port> for the raw byte stream:

"streams": [{"name": "UART 115200-8E1 to Amplifier", "layer": "CUSTOM",
             "tcp_port": 33100, "gateway_host": "gateway", "clients": []}]

Only active devices have a connection port, so this needs one. full=True returns the tree exactly as the gateway sends it.

Write mode

Read-only is the default and the write tools are then not registered at all. Enable them with --allow-write (alias --allow-post) or IDM_ALLOW_WRITE=1:

python -m idm_mcp.server --transport http --port 8003 --allow-write

Tool

Effect

idm_command(command, parameters)

sends a terminal command (POST /api/v1/terminal/commands)

idm_open_stream(device, stream)

gateway dials the stream: openTCPConnection(host, port)

idm_close_stream(device, stream)

closes it: closeConnection("host:port")

idm_open_serial(target, preset=None)

opens a serial port or preset (openSerialPort)

idm_close_serial(connection_id)

closes a serial connection by id (closeConnection)

idm_set_value(device, parameter, value)

writes one parameter — only if allow-listed (see below)

idm_set_structure(device, values, path="")

writes several parameters in one POST — the struct idm_get_structure returns, minus status/time

Opening a stream makes the gateway connect to it. idm_open_stream sends openTCPConnection(host, port); the gateway dials its own endpoint and creates a PHY connection named <host>:<port>. If a device stack sits behind that stream, it loads as a new device — the stacking case: opening TestPort's UART 115200-8E1 to Amplifier brings up a second IOLite-4CFB- (same serial) over that UART, and idm_close_stream (closeConnection("host:port")) unloads it again. The host defaults to localhost because the gateway dials itself; override with IDM_STREAM_HOST. idm_read_stream is the different operation: it attaches from this host to read raw bytes, and detaches afterwards.

Every write returns its activity entries. The gateway's response body is just {"result": "OK"|"Error"|"null"}, so a command's real outcome comes from GET /me/activity: the client snapshots the newest log timestamp before the POST and returns entries logged after it. A Command not found or Exception while executing entry makes the stream/connection tools raise instead of reporting a silent no-op.

Command names carry no $ prefix on the wire — help, not $help.

Device parameter writes are deliberately not implemented: they need an explicit allowlist of parameters and are not part of this surface yet.

Access level

The gateway hides whole sections behind three access flags, and the client passes your setting both when it opens the device and on every read, so the level can never differ between one call and the next:

python -m idm_mcp.server --enable-advanced --enable-hidden --enable-devel

Flag

Env

Reveals

--enable-advanced

IDM_ADVANCED

advanced sections

--enable-hidden

IDM_HIDDEN

hidden sections — cfg (rsv, release) needs this

--enable-devel (alias --enable-development)

IDM_DEVELOPMENT

development sections — a substructure GET like /ch.json is refused without it

All three are off by default, which is the gateway's own narrow view. On device4 the default shows 142 parameters and cfg comes back empty; with all three it shows 195 and cfg returns {"rsv": "0x28", "release": "2"}.

Parameter writes

Two write paths, same allowlist and same validation: idm_set_value for one variable, idm_set_structure for a whole section in a single POST.

Substructures keep their wrapper key. get("") on ch/PGA_in answers {"status", "PGA_in": {...}, "time"}. Send that back minus status and time, wrapper included. An unwrapped payload is accepted and wrapped automatically, because the gateway otherwise applies the first value to every sibling — all four channels took the same gain when I tried it. After the POST the tool re-reads the section and returns verified plus mismatch, so a write that did not take is visible rather than assumed.

idm_set_value refuses everything unless the parameter is on an allowlist you define, and the allowlist lives outside the code:

IDM_WRITABLE="device4:ch/PGA_in/PGA_in0,device4:ch/ADC/ADC0,*:ch/range/*" \
IDM_ALLOW_WRITE=1 pm2 restart idm-mcp --update-env

Each entry is device:parameter where device is a root (device4), a full name, or *; parameter is a path, optionally ending in * for a prefix. An empty allowlist means nothing is writable.

Validation before the POST uses the gateway's own options for that parameter (read them with idm_get_value(..., options=True)):

  • readOnly: true → refused;

  • enum → the value must be in allowedValues, matched case-insensitively and sent in canonical spelling (vin → Vin);

  • numeric → must parse, and respect min/max when the gateway reports them.

The payload is the gateway's own shape, {"<variable>": {"value": "..."}}, POSTed to the parameter's URL.

Freshness

idm_get_value and idm_get_parameters return the gateway's last stored sample unless fresh=True, which sends after=now and forces a query to the device (one round-trip over USB/Bluetooth, so slower).

Install

pip install -e . --no-deps

--no-deps because isotel-idm and fastmcp are already in that venv.

Run

stdio — the client spawns the process:

~/.venv/bin/idm-mcp                      # or: python -m idm_mcp.server

HTTP — long-running, e.g. under pm2:

python -m idm_mcp.server --transport http --host 127.0.0.1 --port 8003 --path /mcp

Ends up at http://127.0.0.1:8003/mcp.

Environment

Variable

Default

Meaning

IDM_GATEWAY

http://localhost:33000

gateway base URL

IDM_GROUP

me

group (me = local devices)

IDM_TIMEOUT

60

request timeout, seconds

IDM_USERNAME / IDM_PASSWORD

unset

basic auth, if the gateway needs it

IDM_ALLOW_WRITE

unset (off)

register the write tools (1/true/yes/on)

IDM_WRITABLE

unset (nothing)

allowlist of device:parameter entries for the write tools

IDM_ADVANCED / IDM_HIDDEN / IDM_DEVELOPMENT

unset (off)

access level; same as --enable-*

IDM_STREAM_HOST

localhost

host the gateway dials for idm_open_stream (it connects to its own endpoint)

IDM_OPEN_SERIAL_CMD / IDM_CLOSE_SERIAL_CMD

openSerialPort / closeConnection

command names used by idm_open_serial / idm_close_serial, for firmware that spells them differently

IDM_MCP_TRANSPORT / IDM_MCP_HOST / IDM_MCP_PORT / IDM_MCP_PATH

stdio / 127.0.0.1 / 8003 / /mcp

transport defaults

IDM_PYTHON

python3

interpreter used by ecosystem.config.cjs (pm2 only)

IDM_LIVE

unset

1 runs the live tests against IDM_GATEWAY

Command line

Every setting can also be given as a flag; a flag wins over its environment variable.

Flag

Equivalent

--gateway URL

IDM_GATEWAY

--group NAME

IDM_GROUP

--timeout SEC

IDM_TIMEOUT

--username / --password

IDM_USERNAME / IDM_PASSWORD

--allow-write (alias --allow-post)

IDM_ALLOW_WRITE=1

--enable-advanced

IDM_ADVANCED=1

--enable-hidden

IDM_HIDDEN=1

--enable-devel (alias --enable-development)

IDM_DEVELOPMENT=1

--transport stdio|http

IDM_MCP_TRANSPORT

--host / --port / --path

IDM_MCP_HOST / IDM_MCP_PORT / IDM_MCP_PATH

IDM_WRITABLE deliberately has no flag: an allowlist belongs in one place, not on a command line where it can be mistyped or silently lost from the pm2 environment.

CLI flags override the environment.

Client configuration (stdio)

{
  "mcpServers": {
    "isotel-idm": {
      "command": "/path/to/venv/bin/idm-mcp",
      "env": { "IDM_GATEWAY": "http://localhost:33000", "IDM_GROUP": "me" }
    }
  }
}

pm2

pm2 start ecosystem.config.cjs
pm2 logs idm-mcp
pm2 restart idm-mcp
pm2 delete idm-mcp
IDM_ALLOW_WRITE=1 IDM_GATEWAY=http://gateway:33000 pm2 restart idm-mcp --update-env

ecosystem.config.cjs runs the HTTP transport on 127.0.0.1:8003/mcp with autorestart. It uses __dirname for its working directory and takes the interpreter from IDM_PYTHON (default python3 on PATH), so start it with the environment that has isotel-idm and fastmcp installed:

IDM_PYTHON=/path/to/venv/bin/python pm2 start ecosystem.config.cjs

Test

~/.venv/bin/python -m pytest              # 111 unit tests, no gateway needed
IDM_LIVE=1 ~/.venv/bin/python -m pytest   # + 6 tests against the real gateway
~/.venv/bin/python scripts/smoke_http.py  # exercises a running HTTP server

tests/test_server.py fails if any write operation (set, post, delete, user/group management, scripts) appears in the package source, and if the tool set changes — read-only is a tested property, not a promise.

Behaviour worth knowing

  • Only active devices serve live telemetry. idm_get_history also accepts inactive devices, because the gateway keeps their records. A gateway lists inactive entries for devices it knows but is not running (they have no root), and those entries mirror active devices, so active always wins in resolution.

  • Device objects are cached per name, and one Group keeps a keep-alive connection; the client is thread-safe. Device construction redirects stdout, because isotel.idm prints an inactive-device warning that would corrupt the JSON-RPC stream on the stdio transport.

  • isotel-idm pins the exact API revision (1.3.845). A gateway firmware update that bumps the revision makes the library refuse to connect; upgrading isotel-idm is then required.

  • Not included: service/user/group management, script execution, virtual devices, firmware upgrade and show/aggr group-link vertical aggregation.

Requirements

Python 3.10+, fastmcp, and isotel-idm 1.3 for a gateway running API 1.3. The library enforces an API major-version match when it opens the group, so isotel-idm 1.2 installs fine but refuses to connect to a 1.3 gateway (Major API versions not compatible, gateway: 1.3 library: 1.2).

PyPI currently publishes up to 1.2, so the dependency is declared >=1.2: that keeps pip install -e . valid while 1.3 is distributed privately — an existing 1.3 install already satisfies the requirement and pip will not downgrade it. The pin moves to >=1.3 once 1.3 is on PyPI.

License

LGPL-3.0-only, matching isotel-idm. See LICENSE.

Available Tools

14 tools
idm_device_statusIdm Device StatusC

Connection state of one device: state, port, endpoints, last update time.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes returned fields but never states that this is a read-only/status operation, nor does it cover auth needs, freshness, rate limits, 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.

Conciseness4/5

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

One compact sentence, front-loaded with the resource and the returned fields. It contains no filler and is appropriately sized for a simple status lookup, though it reads as a terse fragment rather than a fully structured usage statement.

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

Completeness3/5

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

For a simple one-device status getter with an output schema, the description adequately covers the return shape. However, with no annotations, 0% schema coverage, and no usage routing, the agent still lacks parameter format guidance and clear conditions for selecting this tool.

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

Parameters2/5

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

Schema description coverage is 0% and the single required 'device' parameter has no schema description. The description says 'one device' but does not define the identifier format (ID, name, MAC), so it adds little beyond the schema property name.

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 that the tool returns the connection state for one device and enumerates the returned fields (state, port, endpoints, last update time). The purpose and resource are clear, but it does not explicitly differentiate itself from sibling tools such as idm_list_connections or idm_get_activity.

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

Usage Guidelines2/5

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

Provides no guidance on when to choose this tool over sibling status/list tools, no prerequisites, and no exclusions. The phrase 'one device' implies a single-device lookup, but the agent must infer when that is preferable.

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

idm_gateway_infoIdm Gateway InfoA

Describe the gateway: host, API version, mode, group and device count.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. The verb 'Describe' implies a read-only operation with no side effects, and the output schema covers return values. However, the description does not explicitly state that it is safe, requires no auth, or has no side effects, leaving a gap in 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?

The description is a single, front-loaded sentence with no wasted words. It efficiently communicates the purpose and the fields returned.

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

Completeness4/5

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

Given the tool's simplicity (zero parameters, output schema exists), the description is nearly complete. It states what the tool does and what it returns, but it lacks any usage context or explicit behavioral note, which keeps it from a perfect score.

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 are no parameter semantics to document. Per the rubric, a zero-parameter tool earns a baseline of 4.

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

Purpose5/5

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

The description states a specific verb and resource ('Describe the gateway') and enumerates the exact fields returned (host, API version, mode, group, device count). This clearly distinguishes it from sibling tools that focus on devices, protocols, streams, etc.

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

Usage Guidelines3/5

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

The description implies usage (call it to retrieve gateway information) but offers no explicit when-to-use guidance, no alternatives, and no exclusions. For a zero-parameter info tool the implied usage is somewhat evident, but the description does not actively route the agent against siblings.

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

idm_get_activityIdm Get ActivityA

Read the gateway's recent activity log.

This is the real receipt for a write: the gateway reports rejected commands here as "Command not found: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNohow many recent entries to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/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 a non-obvious behavior: rejected writes surface here as 'Command not found: ...'. That is exactly the kind of trait an agent needs to diagnose silently failing writes. It omits other traits such as auth requirements, read-only status, or whether the log is bounded/rotating.

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

Conciseness5/5

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

Two short sentences, purpose front-loaded and the diagnostic behavior immediately after. No filler; every sentence earns its place.

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

Completeness4/5

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

An output schema exists, so return format needn't be explained, and with one optional parameter the description only needs to convey purpose and key behavior — which it does. The remaining gap is the absence of any safety/read-only statement, minor for a log read but not nothing given no annotations.

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

Parameters3/5

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

Only one parameter, 'limit', and the schema already documents it at 100% coverage ('how many recent entries to return'). The description adds no semantics beyond the schema, so the baseline of 3 applies.

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

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 the gateway's recent activity log.' That is unambiguous and distinct from most siblings (device/stream/parameter lookups). It does not, however, distinguish itself from the similarly named idm_get_history, which an agent could easily confuse it with.

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?

Provides a concrete use context: this is the 'real receipt for a write,' implying it should be consulted after a write to confirm the command was accepted. It does not state when not to use it or name an alternative (e.g. idm_get_history), so it stops short of a full routing directive.

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

idm_get_device_htmlIdm Get Device HtmlA

Start here: fetch the gateway's own HTML page for a device.

This is the description layer. It groups parameters into sections (System, Acquire, Trigger, Channels, ...), shows units, live values and free-text diagnostics (status, message, error number), and every value carries its parameter name - so it is how you learn what a device is and what its parameters mean before reading or writing them.

It honours the server's access level: with development/hidden enabled the page grows (140 -> 195 parameters on this gateway). Fetching it marks the device as described, which the write tools report back.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYesroot, full name or unambiguous substring.
max_bytesNopage size cap; `truncated` says whether it was hit.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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 does disclose non-obvious traits: the page grows with server access level (140 -> 195 parameters), and fetching has a side effect (marks the device as described, which write tools report back). It omits error/failure behavior and does not restate read-only safety, so not 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.

Conciseness4/5

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

Front-loads the imperative ('Start here: fetch...') and each subsequent sentence adds a distinct piece of value (page contents, access-level behavior, side effect). Slightly verbose in enumerating page sections, but no wasted filler.

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?

An output schema exists, so return formatting need not be explained, and the description still usefully characterizes what the page contains and how access level changes it. A brief note on failure/not-found behavior would complete the picture.

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

Parameters3/5

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

Schema coverage is 100% and both parameters (device, max_bytes) are fully documented in the schema, including the truncation flag. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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

Purpose4/5

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

States a concrete verb and resource ('fetch the gateway's own HTML page for a device') and frames its role as the description/discovery layer. It never names the closely-named siblings (idm_get_structure, idm_list_parameters, idm_get_parameters), so an agent must infer the distinction rather than being told it.

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?

'Start here' plus 'how you learn what a device is and what its parameters mean before reading or writing them' gives a clear when-to-use signal relative to the read/write tools. No explicit when-not-to-use or named alternative is provided, 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.

idm_get_historyIdm Get HistoryA

Read recorded samples of one parameter, aggregated by the gateway.

Four modes, chosen by which arguments are set: regular (default) - max_points samples from the span. scale - exactly scale points spanning the span, each with m records. average - scale plus average: interval duration in SECONDS; adds n, sd. calc - one aggregate over the whole record set, e.g. "avg".

Also works for inactive devices: the gateway keeps their records.

ParametersJSON Schema
NameRequiredDescriptionDefault
calcNoaggregate function over the record set, e.g. "avg", "sum".
scaleNonumber of evenly spaced points across the span.
deviceYesroot, full name or unambiguous substring (inactive allowed).
averageNointerval duration in seconds; requires `scale`.
time_toNoUTC timestamp, or "last"/"end".last
parameterYesparameter path, e.g. "ec/E".
time_fromNoUTC timestamp, or "first"/"start" for the oldest record.
max_pointsNoregular mode - number of samples (gateway default 100). With only time_from set this takes the first N after it; with time_to set, the last N before it. Exclusive with `scale`.
interpolateNowith `scale`, fill intervals that hold no records.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden and does meaningful work: it discloses gateway-side aggregation, that inactive devices still have records ('the gateway keeps their records'), that average intervals are in SECONDS, and that average mode adds 'n' and 'sd' to each returned point. It says nothing about permissions, result-size limits, 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.

Conciseness4/5

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

Front-loaded with the core action, then a compact mode list with aligned labels — efficient and scannable. Minor cost: identifiers like `m` in the scale line are never defined in the prose, so the reader has to infer what a returned point contains.

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?

An output schema exists, so return values need not be documented, yet the description helpfully hints at the extra `n`/`sd` fields in average mode. Combined with mode selection, units, defaults, and inactive-device support, an agent has enough to call it correctly for a 9-parameter, 4-mode tool; only error and permission behavior are absent.

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 description coverage is already 100%, so the baseline is 3. The description goes beyond it by defining the mode combinations that tie parameters together (average requires scale; calc collapses the whole record set) and by clarifying the unit of `average`. It adds cross-parameter semantics rather than just restating individual fields.

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: 'Read recorded samples of one parameter, aggregated by the gateway.' The four-mode framing (regular/scale/average/calc) makes it unmistakably the historical-samples tool rather than a live-value sibling like idm_get_value or a stream reader like idm_read_stream.

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

Usage Guidelines4/5

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

Explicitly tells the agent how to select behavior: 'Four modes, chosen by which arguments are set,' with each mode's argument combination spelled out (scale → average, calc → single aggregate). It also notes the inactive-device case. No sibling alternatives or when-not conditions are given, so it stops short of 5.

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

idm_get_parametersIdm Get ParametersB

Read current values of a device's parameters, flattened to path -> {value, unit}.

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNoforce a new query to the device instead of returning the gateway's last stored sample (costs a device round-trip).
namesNoexplicit parameter names; a bare name matches any path ending in it (so "E" returns both "ec/E" and "ec/Ea").
deviceYesroot, full name or unambiguous substring.
prefixNorestrict to paths starting with this prefix, e.g. "ecl".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden: 'Read' does correctly convey a read-only, non-destructive operation, and the flattening note describes the output shape. It does not disclose the caching/staleness nuance (fresh=false may return a stored sample rather than a live value), error behavior, or authorization needs — though the schema's `fresh` description partly covers the caching point.

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

Conciseness5/5

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

A single front-loaded sentence with no filler; the read action and the flattened return shape are stated in the first half. Every word earns its place.

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

Completeness3/5

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

An output schema exists, so return values need not be re-explained, and all four parameters are fully documented in the schema. However, with no annotations and six-plus closely named siblings, the description is thin on disambiguation, staleness semantics, and failure modes — gaps that matter for a device-query tool.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3; the `names` matching semantics, `prefix` filtering, and `fresh` round-trip cost are all documented in the schema. The description mentions no parameter semantics of its own beyond the output-path naming.

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 current values of a device's parameters') and even sketches the return shape ('flattened to path -> {value, unit}'). It does not, however, distinguish itself from close siblings like idm_list_parameters, idm_get_value, or idm_get_structure, which an agent must disambiguate by name alone.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance, no statement of when to prefer this over idm_list_parameters or idm_get_value, and no prerequisites or exclusions. The only usage-relevant hint (device round-trip cost) is buried in the schema, not the description.

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

idm_get_protocolsIdm Get ProtocolsA

Show the protocol and stream stack of the port a device is attached to.

The ISN stack is a compound object tree: MESSAGE / TRANSPORT / FRAME / USER / CUSTOM layers can nest to any depth, and new protocol types appear without notice. Layers are returned flattened, each with its path. A layer carrying a tcp_port is a stream: connect to <gateway_host>:<tcp_port> for the raw byte stream.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoinclude the unflattened tree exactly as the gateway returns it.
deviceYesroot, full name or unambiguous substring (must be active, since only an active device has a connection port).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that layers are returned flattened with a `path`, that a `tcp_port` marks a connectable stream at `<gateway_host>:<tcp_port>`, that nesting can be arbitrary depth, and that new protocol types appear without notice. It stops short of stating read-only/safety or error behavior explicitly, but 'Show' plus the rich structural context covers most of what 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.

Conciseness4/5

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

Front-loaded with the core purpose in the first sentence, followed by compact domain context. Four sentences, each earning its place, though the middle exposition on layer types is slightly dense.

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?

An output schema exists so return values need not be explained, yet the description usefully characterizes the compound stack structure and stream semantics. For a moderately complex domain object, this is nearly complete; the main missing piece is sibling differentiation and explicit read-only framing.

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

Parameters3/5

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

Schema coverage is 100%, so both `full` and `device` are already documented, making 3 the baseline. The description does add value by explaining that output is flattened by default (implying what `full` reverses) and what `path`/`tcp_port` mean, but it does not explain parameter formats or syntax beyond the schema.

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

Purpose4/5

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

States a specific verb ('Show') and resource ('the protocol and stream stack of the port a device is attached to'), which is clear and concrete. However, it does not differentiate itself from the overlapping sibling idm_get_streams, so an agent must infer which one returns the stack versus the stream list.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance, and no named alternatives. With siblings like idm_get_streams, idm_get_structure, and idm_read_stream that plausibly overlap, the absence of routing guidance is a real gap.

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

idm_get_streamsIdm Get StreamsB

List the TCP streams the gateway exposes, with their names.

De-duplicated across devices that share one connection port.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNorestrict to one device (root, name or substring); omit for all.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. 'List' implies a safe read and the de-duplication rule across devices sharing a connection port is a genuine behavioral disclosure beyond the schema. However, it says nothing about permissions, result size, or whether the listing is live or cached.

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

Conciseness5/5

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

Two short sentences with zero filler. The primary purpose is front-loaded and the de-duplication caveat follows it naturally.

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?

An output schema exists, so return values needn't be explained, and the one optional parameter is fully covered by the schema. The definition is nearly complete for a simple filtered list; only the relationship to idm_read_stream is left unstated.

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

Parameters3/5

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

Schema coverage is 100%, and the single optional 'device' parameter is fully documented in the schema (root, name or substring; omit for all). The description adds no parameter detail, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('List the TCP streams the gateway exposes') and adds the shape of the result ('with their names'). The de-duplication clause further defines scope, though it never names the confusable sibling idm_read_stream, which an agent must disambiguate on its own.

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

Usage Guidelines2/5

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

No when-to-use or when-not guidance. The agent is not told to call this instead of idm_read_stream when it wants metadata rather than stream content, nor when to prefer idm_get_protocols or idm_list_connections. Usage must be inferred 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.

idm_get_structureIdm Get StructureA

Fetch a whole sub-structure in one request (get("") on that path).

Use this instead of idm_get_parameters when you want the gateway's own nested JSON for one section, e.g. "cfg" or "ch/PGA_in", including hidden/development sections.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNosubstructure path; empty for the whole device.
deviceYesroot, full name or unambiguous substring.
optionsNoinclude each variable's options (type, allowedValues, readOnly, min/max) and a flat `values` map.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses that the response is the gateway's own nested JSON and that hidden/development sections are included, but says nothing about permissions, side effects, or error behavior. It adds real context yet leaves the safety/behavioral profile partly unstated.

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?

Two sentences, front-loaded with the verb+resource and followed immediately by the routing rule. The get("") reference is slightly technical but earns its place by clarifying the fetch semantics; no padding.

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?

An output schema exists, so return-value documentation is not required. The description covers what it fetches, how it differs from idm_get_parameters, and the section granularity. Only the permission/side-effect profile is thin, which is a minor gap for a read tool.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents path, device, and options in detail. The description only gestures at the underlying get("") mechanism and the 'whole sub-structure' scope, adding marginal meaning beyond the schema. Baseline 3 is correct.

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+resource ('Fetch a whole sub-structure') and explicitly distinguishes itself from the sibling idm_get_parameters. The example sections ("cfg", "ch/PGA_in") anchor the resource meaning concretely.

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

Usage Guidelines5/5

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

Directly names the alternative ('Use this instead of `idm_get_parameters`') and the condition that selects it (when you want the gateway's own nested JSON for one section). Explicit when/when-not routing to a sibling.

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

idm_get_valueIdm Get ValueC

Read a single parameter, e.g. device="device0", parameter="ec/E".

ParametersJSON Schema
NameRequiredDescriptionDefault
freshNoforce a new query to the device instead of returning the gateway's last stored sample (costs a device round-trip).
deviceYesroot, full name or unambiguous substring.
optionsNoalso return the gateway's options for the parameter - `type` (enum/numeric), `allowedValues`, `readOnly`, min/max.
parameterYesparameter path. The `data/` container that `idm_list_parameters` may show is accepted and stripped.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. 'Read' implies a non-mutating operation, but it says nothing about the stored-sample-vs-fresh-query behavior (left entirely to the schema), error handling when a parameter is missing, or required permissions.

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

Conciseness4/5

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

A single front-loaded sentence with no wasted words. It is efficient, though so terse that it edges toward under-specification rather than being genuinely complete.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. However, for a tool with 4 parameters and no annotations, the one-line description leaves the agent without selection guidance or behavioral context, which is a meaningful gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters are already documented, giving a baseline of 3. The description adds a useful worked example ('ec/E', 'device0') that illustrates path format, but does not explain fresh or options beyond what the schema says.

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 a single parameter', with a concrete example showing device/parameter usage. It implicitly contrasts with the plural siblings (idm_get_parameters, idm_list_parameters) by saying 'single', but never names them explicitly.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus idm_get_parameters, idm_list_parameters, or idm_get_history. The example hints at a single-value read, but the agent must infer the choice of tool 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.

idm_list_connectionsIdm List ConnectionsA

List the gateway's physical connections with link counters.

Shows every connection the gateway holds - USB, serial or a TCP client it dialled for a stream - including one with no device behind it, which the device and stream views cannot represent.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations exist, so the description carries the full disclosure burden, and it does well: it discloses the inclusion of connections with no device behind them and the presence of link counters, which are non-obvious behaviors. It stops short of stating the read-only nature, permission requirements, or whether results are paginated.

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

Conciseness5/5

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

Two short sentences with zero filler; the core capability is front-loaded and the differentiating caveat follows immediately. 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?

For a parameterless, read-only listing tool with an output schema already describing return values, the description covers purpose, scope and the key differentiator adequately. The only residual gap is the absence of any explicit read-only/auth statement, which annotations would normally provide.

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 per the rubric the baseline is 4. The description correctly implies no filtering options exist and that the call returns everything the gateway holds.

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+resource ('List the gateway's physical connections') and immediately scopes it ('with link counters'). It also distinguishes itself from the device/stream siblings by noting it surfaces connections that those views cannot represent, 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 Guidelines4/5

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

The description gives clear context for when this tool is the right choice: when a gateway-held connection has no device behind it, the device and stream views are insufficient. It does not explicitly state when not to use it or name the sibling tools by identifier, but the contextual contrast is strong enough to route correctly.

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

idm_list_devicesIdm List DevicesC

List the devices of this group.

ParametersJSON Schema
NameRequiredDescriptionDefault
brand_filterNokeep only devices whose name contains this substring (e.g. "EC-D16" or "ECL").
include_inactiveNoalso list devices that are not currently active.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden, and it discloses almost nothing: no pagination, no return shape, no note on whether inactive devices are excluded by default, and no explanation of the implicit 'group' context. Only the word 'list' weakly implies a read-only operation.

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

Conciseness4/5

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

One short, front-loaded sentence with no filler or repetition. It is efficient, though its brevity comes at the cost of substance rather than being tight-but-complete.

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

Completeness2/5

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

An output schema exists, so return values need not be explained, but the description still leaves a critical gap: it scopes results to 'this group' without any parameter or explanation of how the group is identified. For a list tool with no annotations, that omission makes correct invocation ambiguous.

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

Parameters3/5

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

Schema description coverage is 100%, with both brand_filter and include_inactive fully documented (including an example value), so the schema does the heavy lifting. The description adds no meaning beyond the schema, which is the baseline 3 case.

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

Purpose3/5

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

The description names a specific verb and resource ('list the devices'), which is better than a tautology. However, the scope qualifier 'of this group' is never defined — there is no group parameter in the schema — and it does nothing to distinguish this tool from siblings like idm_device_status or idm_list_connections.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of any alternative among the 14 sibling tools. An agent gets no signal about when this list is preferable to idm_device_status or the other idm_list_* tools.

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

idm_list_parametersIdm List ParametersA

List a device's parameter paths without their values.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYesroot, full name or unambiguous substring.
prefixNorestrict to paths starting with this prefix, e.g. "ec/ChA".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full disclosure burden. 'List ... without their values' usefully characterizes the payload as paths only and implies a read-only operation, but there is no statement about permissions, error behavior on ambiguous substrings, or result size/pagination limits.

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

Conciseness5/5

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

A single tight sentence with no filler, and the distinguishing qualifier ('without their values') is positioned at the end where it does the most differentiating work. Nothing needs trimming or front-loading.

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 two-parameter read-only listing tool with 100% schema coverage and an output schema (so return values need no explanation), the description is nearly sufficient. The remaining gap is routing guidance relative to idm_get_parameters/idm_get_value, which an agent must infer from the phrase 'without their values'.

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

Parameters3/5

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

Schema description coverage is 100%: `device` (root, full name, or unambiguous substring) and `prefix` (path-prefix restriction, with example) are both documented in the schema. The description adds nothing about either parameter, so the baseline of 3 applies.

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

Purpose4/5

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

States a specific verb ('List') and resource ('a device's parameter paths'), plus the key scope modifier 'without their values', which implicitly contrasts it with the sibling idm_get_parameters. It is clear what the tool returns, though it never names the sibling it differs from.

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 can infer this is the lightweight option when values are not needed, since 'without their values' contrasts with a values-returning sibling. There is no explicit when-to-use, when-not-to-use, or named alternative, and no mention of how ambiguity in the `device` substring is handled.

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

idm_read_streamIdm Read StreamA

Read raw bytes from a stream.

Attaches to the stream for the read and detaches again unless it was already opened with idm_open_stream. Returns the bytes as hex and text.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYesroot, name or substring identifying the device.
streamYesstream name (or unambiguous substring).
secondsNohow long to listen.
max_bytesNostop after this many bytes.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and discloses key traits: it attaches to the stream for the read, detaches unless already opened with idm_open_stream, and returns bytes as hex and text. This covers lifecycle side effects and output format, though it does not discuss permissions or concurrency.

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?

Front-loads the core purpose in one sentence, then efficiently adds attachment behavior and return format in a short paragraph. Every sentence earns its place with no wasted words.

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

Completeness4/5

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

For a simple read operation with a complete input schema and an output schema, the description is nearly complete: it explains what the tool does, its attach/detach behavior, and the return format. The main gap is absent guidance on when to choose it over sibling read tools.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds no parameter-specific meaning beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb and resource: 'Read raw bytes from a stream.' It clearly distinguishes from listing siblings like idm_get_streams, though it does not explicitly name an alternative or clarify when not to use it.

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

Usage Guidelines2/5

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

Offers no explicit when-to-use or when-not-to-use guidance versus alternatives such as idm_get_value or idm_get_streams. The attachment lifecycle detail is behavioral, not usage guidance.

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. 14 tool updatesv0.1.0
    • First observedidm_device_status
    • First observedidm_gateway_info
    • First observedidm_get_activity
    • First observedidm_get_device_html
    • First observedidm_get_history
    • First observedidm_get_parameters
    • First observedidm_get_protocols
    • First observedidm_get_streams
    • First observedidm_get_structure
    • First observedidm_get_value
    • First observedidm_list_connections
    • First observedidm_list_devices
    • First observedidm_list_parameters
    • First observedidm_read_stream

TDQS

B3.4/5.0

Scored across 14 tools

Disambiguation4/5

Most tools target distinct resources (devices, connections, streams, activity, history), and the parameter-reading family (list_parameters, get_parameters, get_value, get_structure) is differentiated by descriptions. However, the four parameter tools plus the topology trio (get_protocols, get_streams, list_connections) require careful reading to avoid misselection.

Naming Consistency4/5

All tools share the idm_ prefix and follow a mostly consistent verb_noun pattern (list_devices, get_parameters, read_stream, get_history). Minor deviations: idm_gateway_info and idm_device_status are noun-only, and get vs read both appear but are used sensibly.

Tool Count5/5

14 tools is well-scoped for a gateway/device management server, covering topology, parameters, streams, and history without obvious redundancy. Each tool earns its place.

Completeness3/5

The read surface is thorough (info, devices, connections, streams, parameters, history), but the descriptions reference write tools and idm_open_stream that are not present in the tool list, implying missing write capability. The surface is read-only despite describing a read/write parameter workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables MCP clients to manage a self-hosted RPort fleet by listing and inspecting connected devices, opening and closing SSH tunnels, and executing commands through RPort agents.
    10
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables managing and observing Technitium DNS Server through MCP, including read-only or read-write tool surfaces, scoped bearer authentication, audit logging, and confirmation gates for destructive operations.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables MCP-aware hosts to discover and call tools for listing authorized devices, sending commands, reading telemetry, managing sub-devices, and creating, updating, or deleting device schedules through the API.
    17
    17 npm
    MIT