idm-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@idm-mcplist the devices connected to my ISOTEL IDM gateway"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
idm_list_devices— what is attached.idm_get_device_htmlfor 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.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 |
| host, API version, mode, group, active and known device counts |
|
|
|
|
| protocol stack layers, plus streams with |
| every TCP stream with its name, port, clients, rx/tx |
| every PHY connection with state and link counters, including one with no device |
| the gateway's own HTML page for a device — the description step; honours the access level |
| recent gateway activity log — the receipt for a write |
| parameter paths only — for discovery |
| flattened |
| a whole substructure in one request, e.g. |
| one parameter: value, unit, accuracy, timestamp; with |
| 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 |
| regular | N samples ( |
| scale | N points spanning the span, each with |
| average | N points averaged over 3600 s intervals, with |
| calc | one aggregate over the whole record set ( |
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-writeTool | Effect |
| sends a terminal command ( |
| gateway dials the stream: |
| closes it: |
| opens a serial port or preset ( |
| closes a serial connection by id ( |
| writes one parameter — only if allow-listed (see below) |
| writes several parameters in one POST — the struct |
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-develFlag | Env | Reveals |
|
| advanced sections |
|
| hidden sections — |
|
| development sections — a substructure GET like |
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-envEach 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.serverHTTP — long-running, e.g. under pm2:
python -m idm_mcp.server --transport http --host 127.0.0.1 --port 8003 --path /mcpEnds up at http://127.0.0.1:8003/mcp.
Environment
Variable | Default | Meaning |
|
| gateway base URL |
|
| group ( |
|
| request timeout, seconds |
| unset | basic auth, if the gateway needs it |
| unset (off) | register the write tools ( |
| unset (nothing) | allowlist of |
| unset (off) | access level; same as |
|
| host the gateway dials for |
|
| command names used by |
|
| transport defaults |
|
| interpreter used by |
| unset |
|
Command line
Every setting can also be given as a flag; a flag wins over its environment variable.
Flag | Equivalent |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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-mcpIDM_ALLOW_WRITE=1 IDM_GATEWAY=http://gateway:33000 pm2 restart idm-mcp --update-envecosystem.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.cjsTest
~/.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 servertests/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_historyalso accepts inactive devices, because the gateway keeps their records. A gateway lists inactive entries for devices it knows but is not running (they have noroot), and those entries mirror active devices, so active always wins in resolution.Deviceobjects are cached per name, and oneGroupkeeps a keep-alive connection; the client is thread-safe. Device construction redirects stdout, becauseisotel.idmprints an inactive-device warning that would corrupt the JSON-RPC stream on the stdio transport.isotel-idmpins the exact API revision (1.3.845). A gateway firmware update that bumps the revision makes the library refuse to connect; upgradingisotel-idmis then required.Not included: service/user/group management, script execution, virtual devices, firmware upgrade and
show/aggrgroup-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 toolsidm_device_statusIdm Device StatusC
Connection state of one device: state, port, endpoints, last update time.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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: ...".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | how many recent entries to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | root, full name or unambiguous substring. | |
| max_bytes | No | page size cap; `truncated` says whether it was hit. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| calc | No | aggregate function over the record set, e.g. "avg", "sum". | |
| scale | No | number of evenly spaced points across the span. | |
| device | Yes | root, full name or unambiguous substring (inactive allowed). | |
| average | No | interval duration in seconds; requires `scale`. | |
| time_to | No | UTC timestamp, or "last"/"end". | last |
| parameter | Yes | parameter path, e.g. "ec/E". | |
| time_from | No | UTC timestamp, or "first"/"start" for the oldest record. | |
| max_points | No | regular 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`. | |
| interpolate | No | with `scale`, fill intervals that hold no records. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | force a new query to the device instead of returning the gateway's last stored sample (costs a device round-trip). | |
| names | No | explicit parameter names; a bare name matches any path ending in it (so "E" returns both "ec/E" and "ec/Ea"). | |
| device | Yes | root, full name or unambiguous substring. | |
| prefix | No | restrict to paths starting with this prefix, e.g. "ecl". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | include the unflattened tree exactly as the gateway returns it. | |
| device | Yes | root, full name or unambiguous substring (must be active, since only an active device has a connection port). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | restrict to one device (root, name or substring); omit for all. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | substructure path; empty for the whole device. | |
| device | Yes | root, full name or unambiguous substring. | |
| options | No | include each variable's options (type, allowedValues, readOnly, min/max) and a flat `values` map. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | force a new query to the device instead of returning the gateway's last stored sample (costs a device round-trip). | |
| device | Yes | root, full name or unambiguous substring. | |
| options | No | also return the gateway's options for the parameter - `type` (enum/numeric), `allowedValues`, `readOnly`, min/max. | |
| parameter | Yes | parameter path. The `data/` container that `idm_list_parameters` may show is accepted and stripped. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| brand_filter | No | keep only devices whose name contains this substring (e.g. "EC-D16" or "ECL"). | |
| include_inactive | No | also list devices that are not currently active. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | root, full name or unambiguous substring. | |
| prefix | No | restrict to paths starting with this prefix, e.g. "ec/ChA". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| device | Yes | root, name or substring identifying the device. | |
| stream | Yes | stream name (or unambiguous substring). | |
| seconds | No | how long to listen. | |
| max_bytes | No | stop after this many bytes. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
14 tool updates
v0.1.0- First observed
idm_device_status - First observed
idm_gateway_info - First observed
idm_get_activity - First observed
idm_get_device_html - First observed
idm_get_history - First observed
idm_get_parameters - First observed
idm_get_protocols - First observed
idm_get_streams - First observed
idm_get_structure - First observed
idm_get_value - First observed
idm_list_connections - First observed
idm_list_devices - First observed
idm_list_parameters - First observed
idm_read_stream
TDQS
Scored across 14 tools
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.
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.
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.
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
Related MCP Connectors
Managed MCP gateway with OAuth, per-agent permissions, shared accounts and activity logs.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Single-connection MCP gateway discovering and executing 490+ verified MCP & A2A tools.
41Unified gateway exposing 150+ tools across all NexGenData MCP servers via one endpoint.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables 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.10MIT
- AlicenseNot gradedqualityAmaintenanceEnables 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
- AlicenseAqualityBmaintenanceEnables MCP clients to access a local computer through a controlled, permission-based tool surface for read-only or developer-mode file, process, and terminal operations.6MIT

@nexalware/mcpofficial
AlicenseAqualityAmaintenanceEnables 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.1717 npmMIT