IoTaWatt MCP Server
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., "@IoTaWatt MCP Serverwhat is the house drawing right now, by circuit?"
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.
IoTaWatt MCP Server
A Model Context Protocol server for the IoTaWatt open-source energy monitor. It lets an MCP client such as Claude Code or Claude Desktop read live power, query the on-device history log, inspect the device configuration, and look at the shape of the current on a circuit.
All tools are read-only. The server talks to the IoTaWatt's local HTTP API and needs no cloud account.
This project is not affiliated with or endorsed by IoTaWatt, Inc.
Requirements
Node.js 18 or newer
An IoTaWatt reachable over HTTP from the machine running the server
Related MCP server: Network Monitor MCP Server
Install
git clone https://github.com/519Green/IotaWattMCP.git
cd IotaWattMCP
npm installConfigure
The device address is given with --host or the IOTAWATT_HOST environment
variable. Use an IP address or hostname, for example 192.168.1.50 or
iotawatt.local. A full URL such as https://iotawatt.example.net also
works if the device sits behind a proxy.
Claude Code
Add to .mcp.json in your project, or to your user configuration:
{
"mcpServers": {
"iotawatt": {
"command": "node",
"args": ["/path/to/IotaWattMCP/index.js", "--host", "192.168.1.50"]
}
}
}Claude Desktop
Add the same iotawatt block under mcpServers in
claude_desktop_config.json.
Password-protected devices
If the IoTaWatt has passwords set, give the server one through the environment:
{
"mcpServers": {
"iotawatt": {
"command": "node",
"args": ["/path/to/IotaWattMCP/index.js", "--host", "192.168.1.50"],
"env": { "IOTAWATT_PASSWORD": "your-admin-password" }
}
}
}The account defaults to
admin. SetIOTAWATT_USERtouserto use the device's restricted account instead. That account can do everything exceptsample_waveform.--userand--passwordflags also work, but command-line arguments are visible to other processes on the machine. Prefer the environment.The device uses HTTP Digest authentication, so the password is not sent in the clear. The data itself still travels over plain HTTP.
Tools
Tool | What it does |
| Lists input channels (CTs and VTs) and calculated outputs with their units. Call this first. |
| Device status: firmware version, uptime, Wi-Fi, per-input readings, and data log ranges. |
| Returns the device's |
| Average power over the last 5 minutes for all outputs or for named channels. |
| Time-series query against the on-device log. |
| Energy in Wh per interval for all outputs or for named channels. |
| Live readings once a second for up to two minutes, for catching something as it switches. |
| One AC cycle of raw voltage and current from a CT, with harmonics, distortion and phase lag. |
Query notes
query passes its arguments to the IoTaWatt
query API.
selectis a list of series. Puttime.local.isofirst to get timestamps.Add a unit suffix to a channel name to change what is returned:
.watts,.wh,.amps,.va,.var,.varhor.pffor power channels,.voltsor.hzfor voltage. Add.d2for two decimal places.beginandendaccept relative times (dfor today at midnight,sfor now,d-7d,s-3600s) or absolute times such as2026-02-17T06:00. Leave the seconds off absolute times.groupis the aggregation interval. Seconds must be a multiple of 5 (5s,10s,30s); then1m,1h,1dand so on, orallfor one row.The device returns at most 1,000 rows unless you pass
limit. When a result is cut short, the tool adds a note saying where the data stops.Results come back one row per line.
format: "csv"is the more compact of the two.
Waveform notes
sample_waveform describes the shape of the current, which says what kind of
load is running:
A heater or kettle draws a clean sine wave in step with the voltage: low distortion, crest factor near 1.4, lag near zero.
A motor or compressor lags the voltage.
Electronics draw a narrow, peaky current: high crest factor and a large 3rd harmonic.
The numbers are raw ADC counts, not amps, and the capture is everything on that CT at that instant, not a single appliance. Compare a capture with the appliance on against one with it off.
Example prompts
Once the server is connected, ask in plain language. The assistant picks the tools. It helps to tell it what you already know, for example which appliances are on which circuit.
Getting oriented
"What channels does my IoTaWatt have, and what does each one measure?"
"Is the device healthy? Check the firmware version, uptime, Wi-Fi signal and how far back the logs go."
"What is the house drawing right now, by circuit?"
Energy use
"How many kWh did each circuit use yesterday? Rank them."
"Show hourly energy for the water heater over the last 7 days. When does it run most?"
"Compare this week with last week, circuit by circuit."
"What is my always-on load? Find the quietest hour of the past week and break it down by circuit."
Finding appliances
"Did the dryer run today? Look for a 240 V load of about 5 kW that cycles on and off."
"Find the fridge's defrost cycles on the kitchen circuit over the last 3 days. How often do they happen and how long do they last?"
"Something drew about 1.5 kW for a few minutes around 3 pm. Which circuit was it on, and does the power factor look like a heater or a motor?"
"How many times did the well pump run today, and how long was each run?"
"Watch all circuits for the next 60 seconds. I am going to switch the space heater on, then off. Tell me which circuit it is on and how much it draws."
"Sample the waveform on the office circuit. Is that load mostly electronics, motors or heating?"
Checking the installation
"Compare each subpanel's total against the mains that feed it. Do any CTs look reversed, mislabelled or on the wrong leg?"
"Read my output formulas. Does anything get counted twice or left out?"
Tips
For short events, ask for fine resolution over a short window, such as 5 second data for one hour. The device keeps 5 second data for about a year and 1 minute data for longer.
A 240 V appliance shows up on two CTs at once, one per leg. A 120 V appliance shows up on one.
Ask for a summary, not the raw rows. Long, fine-grained queries return a lot of data.
Things to know
get_configreturns the whole config file. If you have uploaders configured (InfluxDB, Emoncms, PVoutput), that file can contain their URLs and credentials, and they will be passed to the MCP client.Queries pause sampling. The IoTaWatt documentation notes that the device does not sample power while it is answering a query. Prefer a few well-scoped queries over many large ones.
watchis light by comparison: one small request a second.Channel names are cached. Call
discoverafter changing inputs or outputs on the device.Password support is tested against a mock, built from the IoTaWatt firmware source, not against a real password-protected unit. Please open an issue if it fails on yours.
Development
npm testThe tests start the server over stdio against a small mock IoTaWatt in
test/mock-iotawatt.js, so they need no device.
License
ISC. See LICENSE.
Available Tools
8 toolsdiscoverARead-only
List all IoTaWatt inputs (physical CTs/VTs) and calculated outputs with their units. Always call this first to learn what channels are available before querying.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that results carry units and that this is a prerequisite step, but says nothing about ordering, size, or failure modes when no CTs are configured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the what-it-returns statement is front-loaded ahead of the call-ordering advice. 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?
With no output schema, the description carries the return-value burden and does name the returned content (inputs, outputs, units). It could note the likely key/name field an agent needs to feed into 'query', but for a simple discovery call it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no argument semantics to explain and no schema text needed. Baseline for a parameterless tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'List' plus a precise resource ('IoTaWatt inputs (physical CTs/VTs) and calculated outputs with their units') tells the agent exactly what comes back. It implicitly separates itself from 'query' by being the channel-enumeration step, though it never names a sibling 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?
'Always call this first ... before querying' gives clear sequencing and the condition that selects this tool over the query/energy tools. It stops short of stating exclusions versus get_config, which could plausibly overlap in exposing configuration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
energy_by_intervalBRead-only
Energy consumption (Wh) broken down by interval for all or selected output channels. Use for today's hourly breakdown, daily totals, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | s | |
| begin | No | Start time: d=today, d-30d=30 days ago, d-7d=last week | d |
| group | No | Interval: 15m, 30m, 1h, 1d, 1w | 1h |
| channels | No | Channels to include (without .wh, which is appended automatically). Defaults to all discovered outputs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description usefully adds the unit (Wh) and that output channels default to all discovered outputs, but says nothing about return shape, pagination, or data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the resource and its unit, with the usage hint placed after. No filler, though the trailing 'etc.' is slightly loose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 4-parameter, zero-required read-only tool with no output schema, the description covers intent and units but omits the meaning of the 'end' default ('s') and any indication of return format or time-range limits. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already documents begin, group, and channels. The description reinforces interval grouping and channel selection but adds no syntax or default behavior beyond the schema, and the undocumented 'end' parameter (default 's') is left unaddressed. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Energy consumption (Wh) broken down by interval') and names the scoping option (all or selected output channels), so an agent knows exactly what it retrieves. It does not explicitly contrast itself with siblings like query or snapshot, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for today's hourly breakdown, daily totals, etc.' provides concrete usage examples that imply when the tool fits. However, it gives no exclusions and never names an alternative (e.g., query or sample_waveform) for cases where interval energy isn't the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_configBRead-only
Get the full IoTaWatt device configuration from /config.txt: input channel definitions (names, CT models, calibration factors) and output scripts showing how calculated values are derived.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds that the data comes from /config.txt, which tells the agent this is a local static-file read rather than a live device probe. It says nothing about freshness, whether the config is cached, or error behavior when the file is missing.
Agents need to know what a tool does to the 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 dense sentence that front-loads the verb and resource before listing the returned contents. Every clause earns its place by describing the payload. It is slightly list-heavy, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully compensates by enumerating what the configuration contains (input channels, CT models, calibration factors, output scripts). With zero parameters and read-only annotations, there is little else an agent needs before calling it; only the missing sibling-routing guidance keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description cannot add parameter meaning because there is nothing to parameterize, and it correctly avoids inventing any.
Input schemas describe structure but not intent. Descriptions should explain 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 (Get) and resource (full IoTaWatt device configuration), then enumerates the concrete payload: input channel definitions with names, CT models and calibration factors, plus output scripts. That is far more than a restatement of the name. It stops short of naming which sibling to use instead (e.g. discover or status), so it is clear but not explicitly differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to reach for this tool versus status, discover, snapshot or query. There is no mention of prerequisites or exclusions, so the agent must infer usage from the resource name alone. The source path (/config.txt) hints at a static-config read, but that is inference, not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryARead-only
Flexible IoTaWatt time-series query against the on-device log. Use discover first to know valid channel names. Results come back one row per line. The device stops sampling while it answers, so prefer a few well-scoped queries.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End time: s=now, d+1d=end of today | s |
| begin | No | Start time: d=today midnight, d-7d=7 days ago, s-3600s=1hr ago, 2026-02-17T06:00 (no seconds: firmware bug) | d |
| group | No | Aggregation interval: seconds in multiples of 5 (5s, 10s, 30s), then 1m, 5m, 15m, 1h, 1d, 1w, 1M, 1y, "auto", or "all" for a single row. 5 second data is kept for about a year, 1 minute data for longer. | 1h |
| limit | No | Maximum rows. The device default is 1000. A result cut short at the limit is flagged with a note. | |
| format | No | csv is more compact for long results. | json |
| select | Yes | Series to return. Put "time.local.iso" first for timestamps. A bare channel name returns its default unit (Watts for power channels, Volts for voltage). Append a unit to change it: .watts .wh .amps .va .var .varh .pf for power channels, .volts .hz for voltage. Append .d2 (or another digit) to set decimal places, e.g. Mains.pf.d3. | |
| missing | No | null |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond that: the device stops sampling while it answers, and results are one row per line. This is exactly the kind of side-effect disclosure annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, purpose front-loaded, then prerequisite, then output shape and performance caveat. Every sentence carries information; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description partially compensates by noting the one-row-per-line result shape and the sampling stall. Combined with a high-coverage input schema, an agent has enough to call this correctly, though return fields beyond row structure are unspecified.
Complex tools with many parameters or behaviors need more documentation. 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 86%, so the schema already documents begin/end/group/limit/select/format/missing in detail, including units, ranges and defaults. The description adds no parameter-level information, 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 ("time-series query against the on-device log") and names the device, which is unambiguous. It does not, however, differentiate itself from the sibling energy_by_interval, which is also a time-series retrieval tool, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite ("Use discover first to know valid channel names") and practical guidance ("prefer a few well-scoped queries"). No explicit when-not condition or direct comparison to alternative retrieval siblings, 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.
sample_waveformARead-only
Capture one AC cycle of raw voltage and current samples (about 640 pairs) from a single CT input and describe the shape of the current: crest factor, 3rd/5th/7th harmonics, distortion and phase lag. This shows what kind of load is on the circuit right now: a heater draws a clean sine in phase with voltage, a motor lags, electronics draw a peaky current rich in harmonics. It is a snapshot of everything on that CT, not of one appliance. Values are raw ADC counts, not amps or volts, and have no CT/VT phase correction, so angles are approximate. Needs the admin user on a password-protected device.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | Input name from discover, or the input's channel number. | |
| include_samples | No | Include the raw V,I sample pairs after the summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, non-destructive), but the description adds substantial context beyond them: values are raw ADC counts not engineering units, there is no CT/VT phase correction so angles are approximate, and it requires the admin user on a password-protected device. The auth requirement and data caveats are exactly the behavioral disclosures annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and scope are front-loaded in the first sentence, with interpretation and caveats following. It runs to several sentences, and the load-interpretation examples are somewhat illustrative padding, but each sentence still contributes practical context for reading the output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing the return, and it does list the returned shape metrics (crest factor, harmonics, distortion, phase lag) plus the optional raw sample pairs. It stops short of stating framing, ordering, or an example envelope, but it is largely sufficient for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. 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 parameters are already documented in the schema. The description reinforces the 'single CT input' notion and the pair count (~640) that maps loosely to include_samples, but adds little syntax or format detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Capture one AC cycle of raw voltage and current samples... from a single CT input' and enumerates the derived metrics. It sharply distinguishes this from siblings like snapshot by clarifying it is 'a snapshot of everything on that CT, not of one appliance.' An agent can identify what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the readings reveal (heater vs motor vs electronics) and tacitly implies when it is useful, but it never explicitly names when to use it versus siblings (snapshot, query, watch). Usage is inferable rather than stated, and no alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshotARead-only
Latest instantaneous power: a single averaged value over the last 5 minutes. Defaults to all discovered output channels. Optionally restrict to specific channels.
| Name | Required | Description | Default |
|---|---|---|---|
| channels | No | Specific channel names to include. If omitted, all calculated outputs are returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false and a closed-world scope, so the safety profile is covered. The description adds useful temporal context (a 5-minute averaging window, default to all discovered outputs) beyond the annotations, but says nothing about refresh cadence, staleness guarantees, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two terse sentences that front-load the core semantic (what value is returned) before the optional filtering behavior. No filler wording; slightly clipped grammar but nothing wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with annotations covering safety and no output schema required, the description supplies what an agent needs: the value definition, the time window, and the default scope. Only unit/return-format detail is absent, which is acceptable given the schema coverage.
Complex tools with many parameters or behaviors need more documentation. 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 'channels' parameter and its omission default are already documented. The description restates the default behavior and adds the nuance that outputs are 'discovered', which is marginal added value on top of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource and semantics ('latest instantaneous power, a single averaged value over the last 5 minutes'), which clarifies the otherwise opaque tool name 'snapshot'. It does not, however, explicitly distinguish itself from siblings like energy_by_interval, query, or watch, so an agent must infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied ('latest instantaneous power') and the optional channel restriction is described, but there is no explicit when-to-use guidance or exclusion relative to query, energy_by_interval, or sample_waveform. The agent must infer that this is the lightweight current-reading tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusARead-only
IoTaWatt device status: firmware version, uptime, WiFi SSID/RSSI/IP, heap memory, AC frequency, and data log ranges.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds substantive behavioral context by listing exactly what status information is returned (firmware version, uptime, WiFi SSID/RSSI/IP, heap memory, AC frequency, data log ranges), which is valuable because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every phrase names a concrete piece of status information, so no words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only status tool with no output schema, the description provides the necessary return-value detail by listing the status fields. Annotations cover the safety profile, and no parameter or return explanation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline of 4 applies per the scoring rules. The description does not need to explain parameter semantics, and it correctly avoids irrelevant parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain 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 identifies a specific resource (IoTaWatt device status) and enumerates the exact fields returned (firmware, uptime, WiFi, heap, AC frequency, log ranges), making the purpose clear. However, it uses a noun phrase without an explicit verb and does not differentiate itself from siblings like get_config or snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 guidance on when to use this tool versus alternatives such as get_config, snapshot, or query. The usage is implied by the name and field list (check device health/status), but no conditions or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watchARead-only
Live view at 1 second resolution, finer than the stored log. Polls the device once a second for the given number of seconds and returns one CSV row per second with the watts on each input (volts for a voltage input). Use it to catch an appliance being switched on or off right now. The call takes as long as the duration asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| pf | No | Also return the power factor of each power input, as <name>.pf columns. | |
| seconds | No | How long to watch, 1 to 120 seconds. | |
| channels | No | Input names to include. Defaults to all inputs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/non-destructive safety; the description adds substantial non-obvious behavior: poll rate (once per second), output shape (one CSV row per second with watts/volts), and critically that 'the call takes as long as the duration asked for' — a blocking-duration characteristic an agent must know before invoking. This is genuine value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core capability and resolution, then output, then use case, then the duration caveat. Efficient with little waste, though the output and use-case sentences could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 3-param, no-output-schema read tool, the description covers resolution, output format, blocking duration, and intent. It omits error/limit handling and interaction with the 'channels' default, but is largely complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents pf, seconds, and channels thoroughly. The description nonetheless reinforces the time semantics ('given number of seconds', 1s resolution) and the watts-vs-volts per input type, adding light value without redundancy.
Input schemas describe structure but not intent. Descriptions should explain 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 (live view/polling) and resource (device inputs over a duration), and crisply differentiates from the stored-log sibling 'query' by noting it is 'finer than the stored log' at 1-second resolution. An agent can distinguish it from snapshot or energy_by_interval without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case ('catch an appliance being switched on or off right now') that tells the agent when this tool is appropriate. It does not explicitly name when to avoid it or which sibling to prefer for historical data, so it stops short of the top band.
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.
8 tool updates
v1.3.0- First observed
discover - First observed
energy_by_interval - First observed
get_config - First observed
query - First observed
sample_waveform - First observed
snapshot - First observed
status - First observed
watch
TDQS
Scored across 8 tools
Each tool targets a distinct access mode or temporal resolution: device status, channel discovery, configuration, instantaneous snapshot, flexible historical query, aggregated energy, live 1-second polling, and raw waveform capture. Although all are read operations, the scopes are clearly differentiated in the descriptions.
Mixed conventions are present: single-word nouns/verbs (status, discover, snapshot, query, watch) alongside verb_noun (get_config, sample_waveform) and noun_prep_noun (energy_by_interval). All names are lowercase snake_case and readable, but there is no single predictable pattern.
Eight tools is well-scoped for an IoTaWatt device monitoring server. Each tool covers a distinct access pattern—status/config discovery, historical query, aggregated energy, live monitoring, and waveform analysis—with no obvious filler.
The surface covers device status, channel discovery, configuration read, raw and aggregated historical queries, live monitoring, and detailed waveform analysis, which is strong for a monitoring-oriented server. Minor gap: there are no tools to modify configuration, reboot the device, or manage firmware/logs, though these may be intentionally out of scope.
Maintenance
Related MCP Connectors
Free, read-only MCP subset of x402 Toolbox's cheap data endpoints, free via MCP.
Scans remote MCP servers for protocol, security, and TLS issues; exposes scan tools via MCP.
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
2,000+ MCP servers read at source level. Know what one does before you connect. Free, no key.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceExposes the UniFi Network Integration API as MCP tools, dynamically loaded from JSON manifests, with read-only mode by default.MIT
- FlicenseNot gradedqualityDmaintenanceProvides network monitoring capabilities including real-time latency measurement, ping sweeps, and subnet scanning via MCP tools, with a companion web dashboard for live visualization.-
- FlicenseNot gradedqualityCmaintenanceLocal MCP server for reading temperature/humidity sensors from Tuya/SmartLife devices, exposing tools to list devices, get capabilities, and read sensor data.-
- FlicenseAqualityCmaintenanceRead-only MCP server for querying solar generation, consumption, and DER telemetry from SolarNetwork via the SolarQuery API. Zero-config against a public demo node.5-