Skip to main content
Glama
ratoshniuk

Growatt MCP Server

by ratoshniuk

Growatt MCP Server

CI Python 3.11+ License: MIT MCP

An MCP server that lets AI assistants (Claude Code, Claude Desktop, Cursor, VS Code, Codex, Gemini CLI and any other MCP client) read and control a Growatt solar installation through the official Growatt ShineServer Public API.

Ask things like "how much did my panels generate today?", "what is the battery SOC?", "compare today with yesterday hour by hour", or "set the discharge cut-off to 15%", and the assistant calls the right endpoint for you.

  • Complete API coverage. All 27 documented endpoints are implemented and exposed as 26 tools.

  • Contract-tested. Every request is verified against a pinned endpoint contract, so upstream changes are caught by CI, not by users.

  • Typed, tested, linted. mypy --strict, 130+ tests, ruff, pip-audit, and a server start-up smoke test on Python 3.11 to 3.13.

  • Safe by design. State-changing tools carry MCP readOnlyHint=false / destructiveHint=true annotations and can be disabled with GROWATT_READ_ONLY=1. Errors from Growatt come back as structured JSON the assistant can read.

Table of contents

Related MCP server: Fronius MCP Server

Tools

Tools marked writes change state on Growatt's side. They are annotated as non-read-only so MCP clients can ask for confirmation, and they disappear entirely when the server runs with GROWATT_READ_ONLY=1.

Plants (power stations)

Tool

Endpoint

Description

get_plants

GET /v1/plant/list

Plants visible to the account

get_plant_details

POST /v1/plant/details

Name, location, peak power, timezone

get_plant_data

GET /v1/plant/data

Today's / monthly / yearly / total energy, current power

get_plant_energy

GET /v1/plant/energy

Daily, monthly or yearly history (max 7 days per call)

get_user_plants

POST /v1/plant/user_plant_list

Plants of a specific end user

add_plant writes

POST /v1/plant/add

Create a plant for an end user

modify_plant writes

POST /v1/plant/modify

Rename a plant or change its currency

Devices

Tool

Endpoint

Description

get_devices

GET /v1/device/list, POST /v4/new-api/queryDeviceList

Devices of a plant, or all devices paginated

get_device_info

POST /v4/new-api/queryDeviceInfo

Model, firmware, configured settings

get_device_last_data

POST /v4/new-api/queryLastData

Real-time PV, load, grid, battery SOC, temperatures, faults

get_device_history

POST /v4/new-api/queryHistoricalData

Five-minute readings for one day

check_device_sn

GET /v1/device/check/sn

Device type and registration status of a serial

get_dataloggers

GET /v1/device/datalogger/list

ShineWiFi / ShineLAN sticks on a plant

add_datalogger writes

POST /v1/device/datalogger/add

Attach a datalogger to a plant

add_storage_device writes

POST /v1/device/storage/add

Attach a storage device to a plant

Control

Tool

Endpoint

Description

set_device_on_off writes

POST /v4/new-api/setOnOrOff

Switch a device on or off

set_device_power writes

POST /v4/new-api/setPower

Active power limit (percent, or watts for NOAH/NEXA)

read_device_parameter

POST /v4/new-api/readVppParameter

Read a VPP parameter, e.g. discharge cut-off SOC

set_device_parameter writes

POST /v4/new-api/setVppParameter

Write a VPP parameter or time schedule

MAX-series inverters

Tool

Endpoint

Description

get_max_data

GET /v1/device/max/max_data_info

Latest data for one MAX inverter

get_max_batch_data

POST /v1/device/max/maxs_data

Latest data for several MAX inverters

set_max_parameter writes

POST /v1/maxSet

Write a register on a MAX inverter

Users (installer / distributor accounts)

Tool

Endpoint

Description

list_users

GET /v1/user/c_user_list

End-user accounts managed by this account

check_user

POST /v1/user/check_user

Whether a user name exists

register_user writes

POST /v1/user/user_register

Create an end-user account

modify_user writes

POST /v1/user/modify

Update an end-user's mobile number

Requirements

  • Python 3.11 or newer

  • uv (recommended) or pip

  • A Growatt account with at least one plant, and an API token

Getting a Growatt API token

The token is issued in the ShinePhone mobile app (the same app you use to monitor the plant). No developer registration is needed.

  1. Open ShinePhone, log in with your Growatt account and tap Me in the bottom bar.

  2. On the Me screen, tap your username at the top.

  3. In the profile, tap API Token (last row).

  4. Tap the copy icon next to the token value.

  5. Make sure Use Status is switched on, otherwise the API rejects the token.

Step 1

Step 2

Step 3

Steps 4–5

Dashboard

Me screen

Profile

API Token

Screenshots show Growatt's ShinePhone app and are used for illustration only.

Keep the token private: it grants full read and write access to your installation, including inverter settings. If it leaks, open the same screen and tap Reopen to issue a new one.

Installation

git clone https://github.com/ratoshniuk/growatt-mcp-server.git growatt-mcp
cd growatt-mcp
uv sync

Quick check that the server starts (it speaks MCP over stdio, so it waits for input; press Ctrl+C to exit):

GROWATT_TOKEN=your_token uv run growatt-mcp
uv run growatt-mcp --version

If the token is missing the server exits with code 2 and explains where to get one.

Without uv:

python -m venv .venv
source .venv/bin/activate
pip install -e .
GROWATT_TOKEN=your_token growatt-mcp

Connecting to an MCP client

The server speaks MCP over stdio, so it works with any MCP-capable client. There are two ways to launch it:

  • From a local clone (recommended if you want to edit the code): uv --directory /absolute/path/to/growatt-mcp run growatt-mcp

  • Straight from GitHub, no clone (uvx downloads and caches it): uvx --from git+https://github.com/ratoshniuk/growatt-mcp-server growatt-mcp

The examples below use the local-clone form. To use the no-clone form, replace "command": "uv" with "command": "uvx" and the args with ["--from", "git+https://github.com/ratoshniuk/growatt-mcp-server", "growatt-mcp"]. Some GUI clients don't inherit your shell PATH; if the server fails to start, use the full path from which uv or which uvx.

Restart the client after saving its configuration.

Claude Code

claude mcp add growatt \
  -e GROWATT_TOKEN=your_token \
  -- uv --directory /absolute/path/to/growatt-mcp run growatt-mcp

Add -s user to make it available in every project instead of only the current one.

Claude Desktop

Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):

{
  "mcpServers": {
    "growatt": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "env": {
        "GROWATT_TOKEN": "your_token"
      }
    }
  }
}

Cursor

Settings → MCP → Add new global MCP server, or edit ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project). Same format as Claude Desktop:

{
  "mcpServers": {
    "growatt": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "env": { "GROWATT_TOKEN": "your_token" }
    }
  }
}

VS Code (GitHub Copilot agent mode)

Create .vscode/mcp.json in your workspace, or run MCP: Add Server from the command palette. VS Code can prompt for the token so it is not stored in plain text:

{
  "inputs": [
    { "id": "growatt-token", "type": "promptString", "description": "Growatt API token", "password": true }
  ],
  "servers": {
    "growatt": {
      "type": "stdio",
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "env": { "GROWATT_TOKEN": "${input:growatt-token}" }
    }
  }
}

Windsurf

Edit ~/.codeium/windsurf/mcp_config.json (or Settings → Cascade → MCP Servers → Manage):

{
  "mcpServers": {
    "growatt": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "env": { "GROWATT_TOKEN": "your_token" }
    }
  }
}

Cline (VS Code extension)

Open the MCP Servers panel → Configure MCP Servers, which opens cline_mcp_settings.json:

{
  "mcpServers": {
    "growatt": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "env": { "GROWATT_TOKEN": "your_token" },
      "disabled": false
    }
  }
}

Zed

Add to ~/.config/zed/settings.json:

{
  "context_servers": {
    "growatt": {
      "source": "custom",
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "env": { "GROWATT_TOKEN": "your_token" }
    }
  }
}

OpenAI Codex CLI

Codex uses TOML. Add to ~/.codex/config.toml:

[mcp_servers.growatt]
command = "uv"
args = ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"]
env = { GROWATT_TOKEN = "your_token" }

Gemini CLI

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "growatt": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "env": { "GROWATT_TOKEN": "your_token" }
    }
  }
}

OpenCode

This repository ships an opencode.json, so launching opencode from a clone picks the server up automatically. It reads the token from the GROWATT_TOKEN environment variable. For a global setup, add the same block to ~/.config/opencode/opencode.json:

{
  "mcp": {
    "growatt": {
      "type": "local",
      "command": ["uv", "--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"],
      "environment": { "GROWATT_TOKEN": "your_token" }
    }
  }
}

Continue

Add to ~/.continue/config.yaml:

mcpServers:
  - name: growatt
    command: uv
    args: ["--directory", "/absolute/path/to/growatt-mcp", "run", "growatt-mcp"]
    env:
      GROWATT_TOKEN: your_token

Any other client, or testing without a client

Point the client at the stdio command above. To poke at the tools interactively, use the MCP Inspector:

GROWATT_TOKEN=your_token npx @modelcontextprotocol/inspector \
  uv --directory /absolute/path/to/growatt-mcp run growatt-mcp

Configuration

Variable

Required

Default

Description

GROWATT_TOKEN

yes

ShinePhone API token

GROWATT_REGION

no

global

Picks the regional API host: global / eu (openapi.growatt.com), cn (openapi-cn.growatt.com), us (openapi-us.growatt.com)

GROWATT_BASE_URL

no

Explicit API host (https only); overrides GROWATT_REGION

GROWATT_TIMEOUT

no

30

HTTP timeout in seconds

GROWATT_READ_ONLY

no

0

Set to 1 to register only the read tools; the ten state-changing tools are not exposed at all

Example prompts

  • "List my plants and show today's generation."

  • "Get the latest data from inverter YOUR_DEVICE_SN (type min) and tell me the battery SOC and grid import."

  • "Fetch the 5-minute history for today and yesterday and compare hourly PV, load and battery charge."

  • "Read set_param_23 on my inverter." (discharge cut-off SOC)

  • "Which dataloggers are attached to plant 123?"

Notes and gotchas

  • Device types. Most tools need a device_type such as min, sph, spa, max, inv, wit, tlx. get_devices returns the right value for each device.

  • Timestamps in history data. The calendar field is a Unix epoch built from the plant's local wall-clock interpreted as UTC+8. To get local time, treat the epoch as UTC and add 8 hours.

  • "Today" counters undercount at night. Fields like etoUserToday only accumulate while the inverter is running. On hybrid systems that idle overnight at the battery cut-off SOC, grid import from the meter is still visible in pacToUserTotal of the 5-minute history, so integrate that series for a true figure.

  • Errors are data. When a call fails, the tool returns {"error": {"type": "api" | "http" | "transport" | "client", ...}} instead of raising, so the assistant can explain what went wrong. Non-JSON HTTP error bodies are not forwarded.

  • Rate limits. The Growatt API throttles aggressive polling. Prefer get_device_history (one call per day) over repeated get_device_last_data.

  • Date ranges. get_plant_energy accepts at most 7 days per request; page through for longer periods.

API version and contract testing

Growatt does not publish version numbers for the ShineServer Public API, and there is no endpoint that reports which revision a server runs. This project pins the contract instead:

API

Growatt ShineServer Public API (v1 and v4 "new-api" endpoints)

Documented by

community-maintained Postman collection ShineServer Public (workspace gold-water-163355, id bcc659f1-4ba7-4c5d-a7ad-526d3c8c8fd9), which links Growatt's own API documentation

Captured

2026-09-21

Fixture

tests/fixtures/shineserver_public_endpoints.json: methods, paths and parameter names only, derived from the collection. No example values, credentials or identifiers

Pinned in

src/growatt_mcp/api/contract.py: source, capture date, SHA-256 of the fixture

Coverage

27 endpoints in the contract, 27 implemented, exposed as 26 tools

tests/contract/test_api_contract.py sends every client method through a mock transport and checks that its HTTP method, path, and parameter names and placement (query string vs form body) exist in the contract. It also fails if the contract contains an endpoint the client does not implement, if the client has a method the test table does not cover, or if the fixture changes without the pin being updated.

To adopt a newer collection, follow CONTRIBUTING.md; the failing tests report exactly which endpoints or parameters changed.

Official Growatt resources

Project layout

src/growatt_mcp/
  __init__.py        package version and public exports
  __main__.py        python -m growatt_mcp
  config.py          Settings from GROWATT_* environment variables
  server.py          create_app(), CLI entry point
  api/               async client for the Growatt API
    http.py          auth header, JSON decoding, error translation
    errors.py        GrowattError, GrowattHTTPError, GrowattAPIError
    client.py        GrowattClient facade: .users .plants .devices .control .max
    users.py, plants.py, devices.py, control.py, max_inverters.py   one class per endpoint group
    contract.py      pinned API contract (Postman id, date, SHA-256)
  tools/             MCP tools, one module per endpoint group
    _common.py       Registrar (read/write annotations, read-only mode), shared parameter types, error-to-JSON wrapper
    plants.py, devices.py, control.py, max_inverters.py, users.py
tests/
  conftest.py        recording mock transport, client and app fixtures
  unit/              config, server, api/*, tools/*
  contract/          client requests vs the pinned Postman collection
  fixtures/          endpoint contract (methods, paths, parameter names)
scripts/
  derive_contract.py regenerates the fixture from a Postman export

The client is usable on its own, without MCP:

from growatt_mcp import GrowattClient

async with GrowattClient(token) as client:
    plants = await client.plants.list()
    latest = await client.devices.last_data("YOUR_DEVICE_SN", "min")

Development

uv sync --group dev
uv run growatt-mcp        # run the server
uv run ruff check .       # lint
uv run ruff format .      # format
uv run mypy               # type check (strict)
uv run pytest             # tests

CI runs lint, format check, mypy, tests, a server start-up smoke test on Python 3.11, 3.12 and 3.13, and pip-audit for every push and pull request. GitHub Actions are pinned to commit SHAs and Dependabot keeps them and the lockfile current. See CONTRIBUTING.md and CHANGELOG.md.

Disclaimer

This is an independent, community project. It is not affiliated with, endorsed by, or supported by Growatt. Growatt, ShineServer and ShinePhone are trademarks of Shenzhen Growatt New Energy Co., Ltd. Use of the Growatt Public API is subject to Growatt's terms. Commands that change inverter settings are executed at your own risk. See SECURITY.md for the threat model and how to report issues.

License

MIT © Maksym Ratoshniuk

Available Tools

26 tools
add_dataloggerA
Destructive

Attach a datalogger to a plant. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
snYesDatalogger serial number.
plant_idYesPlant ID, as returned by get_plants.
c_user_idYesEnd-user ID (c_user_id) as returned by list_users.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

The description adds a small amount of behavioral context by stating that the operation changes state on Growatt's side, which aligns with annotations readOnlyHint=false and destructiveHint=true. However, it does not elaborate on irreversibility, permissions, or exact side effects, so the added value beyond the annotations is limited.

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

Conciseness5/5

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

The description is two short sentences with no filler. The primary action is front-loaded, and the second sentence efficiently conveys the state-changing nature of the tool.

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

Completeness4/5

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

For a straightforward three-parameter mutation tool with a full input schema, output schema, and annotations covering safety traits, the description is mostly complete. It could mention prerequisites or consequences, but the annotations and schema already supply critical operational context.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains all three parameters (sn, plant_id, c_user_id). The description does not add parameter-level meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Attach') with a clear resource ('datalogger to a plant'), and the second sentence reinforces that it is a state-changing operation. This distinguishes it from sibling tools like get_dataloggers (read-only listing) and add_storage_device (a different device type).

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

Usage Guidelines3/5

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

The intended use is implied by the action statement, but the description gives no explicit guidance on when to choose this tool over alternatives, nor does it mention exclusions or prerequisites. There is no comparison to sibling tools or conditions for use.

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

add_plantA
Destructive

Create a new plant for an end user. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPlant name.
c_user_idYesEnd-user ID (c_user_id) as returned by list_users.
peak_powerYesInstalled peak power in kWp.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover readOnly=false, destructive=true, and idempotent=false. The description adds value by stating that the operation changes state on Growatt's side, clarifying the external effect of the call. It does not contradict the annotations.

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

Conciseness5/5

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

Two short sentences with no filler. The action is front-loaded, and the second sentence adds a meaningful behavioral note rather than repeating the schema.

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

Completeness5/5

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

With three fully documented required parameters, a rich annotation set, and an output schema, the description provides everything an agent needs to decide and invoke the tool. Return-value details are unnecessary because the output schema exists.

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

Parameters3/5

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

Schema description coverage is 100%, with all three parameters including units and source context already documented (e.g., c_user_id returned by list_users, peak_power in kWp). The description adds no parameter-level meaning beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States the exact operation (create), the resource (a new plant), and the target (an end user). This clearly distinguishes it from retrieval siblings like get_plants and the mutation sibling modify_plant.

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

Usage Guidelines4/5

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

The description makes the intended use case clear: creating a new plant for an end user. It does not explicitly name alternatives or exclusion conditions, but the 'Create' verb and mention of end-user scope provide sufficient context against the sibling tools.

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

add_storage_deviceA
Destructive

Attach a storage (battery) device to a plant. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
snYesStorage device serial number.
plant_idYesPlant ID, as returned by get_plants.
c_user_idYesEnd-user ID (c_user_id) as returned by list_users.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

The phrase 'Changes state on Growatt's side' adds meaningful behavioral context beyond the annotations by clarifying that the effect is external and server-side. It aligns with destructiveHint=true and readOnlyHint=false, and adds useful context about where the mutation occurs.

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

Conciseness5/5

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

The description is a single, focused sentence that states the action, target, and side effect with no wasted words. It is front-loaded and easy to parse.

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

Completeness3/5

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

The description is adequate for a simple three-parameter tool with a full schema and output schema, but it omits usage context such as when to use it, whether the operation is idempotent, or what prerequisites must be met. The annotations cover safety, but the description alone does not fully prepare an agent for correct invocation in ambiguous situations.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already fully documented in the schema. The description adds no additional meaning to c_user_id, plant_id, or sn beyond what the schema provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Attach') and resource ('storage (battery) device to a plant'), making the operation's intent immediately clear. It is naturally distinguishable from sibling tools like add_plant and add_datalogger because it names a different resource.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus alternatives such as add_plant or add_datalogger. There is no mention of prerequisites, exclusions, or conditions that would route an agent to this tool.

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

check_device_snA
Read-onlyIdempotent

Look up a serial number to learn its device type and whether it is already registered.

ParametersJSON Schema
NameRequiredDescriptionDefault
snYesDevice serial number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the lookup/result context (device type and registration status), which is useful, but it does not disclose any behavior beyond what the annotations plus basic lookup semantics imply.

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

Conciseness5/5

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

One sentence conveys the action, input, and result with no filler. It is front-loaded with the verb and uses a compact 'to learn X and Y' structure, making it easy for an agent to parse quickly.

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

Completeness5/5

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

For a single-parameter, read-only lookup with annotations and an output schema present, the description is complete. An agent knows what to pass, what to expect conceptually, and that the call is safe and idempotent.

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

Parameters3/5

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

Schema coverage is 100% for the single 'sn' parameter, and the schema already describes it as 'Device serial number.' The description essentially restates this and adds no new parameter-level details, so the baseline of 3 applies.

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

Purpose5/5

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

The description uses a specific verb ('Look up'), identifies the resource ('a serial number'), and states the two concrete outcomes ('device type' and 'whether it is already registered'). This clearly distinguishes it from device-list and device-detail siblings by focusing on SN-based lookup and registration status.

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

Usage Guidelines4/5

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

The description makes the invocation context clear: an agent should call this when it has a serial number and needs to know the device type or registration state. It does not explicitly name alternative tools or exclusions, so it stops short of a 5, but the intended usage is unambiguous.

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

check_userB
Read-onlyIdempotent

Check whether a Growatt user name exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_nameYesGrowatt login name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

The description adds no behavioral detail beyond what annotations provide. With readOnlyHint, idempotentHint, and destructiveHint all present, the description merely confirms an existence check but adds no nuance (e.g., case sensitivity, exact-match behavior, or response shape). The annotations carry the full burden.

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

Conciseness4/5

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

The description is a single concise sentence with no redundant words and effectively front-loads the action. It loses one point because it does not use the sentence to convey any usage context or limitations that could have enriched it.

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

Completeness3/5

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

The tool is simple, has one well-documented parameter, and annotations cover read-only and idempotent behavior. However, the description does not mention what response the agent can expect (e.g., a boolean), which could be easily added to eliminate ambiguity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the single parameter with 'Growatt login name.' The description adds no additional semantic detail, but with only one well-documented parameter, the baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a clear verb ('Check') and a specific resource ('whether a Growatt user name exists'), which distinguishes it from siblings like list_users or register_user. It could be slightly more explicit by naming the alternative (e.g., check_device_sn), but the purpose is unambiguous.

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

Usage Guidelines3/5

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

The description implies this is a lightweight existence pre-check, useful before registration or login, but it does not explicitly state when to use it over list_users or when not to use it. The context is implied rather than stated.

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

get_dataloggersA
Read-onlyIdempotent

List the dataloggers (ShineWiFi / ShineLAN sticks) attached to a plant.

ParametersJSON Schema
NameRequiredDescriptionDefault
plant_idYesPlant ID, as returned by get_plants.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description's 'List' wording is consistent with those annotations but adds no additional behavioral context beyond what the annotations and purpose statement already convey.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the core action and resource while adding a concise parenthetical definition of the datalogger types. Every word earns its place and there is no redundancy.

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

Completeness5/5

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

This is a simple, one-parameter read-only tool with a rich annotation set and an output schema present. The description plus ready parameter guidance is sufficient for an agent to invoke it correctly; nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the plant_id parameter already has a clear description ('Plant ID, as returned by get_plants'). The tool description adds little beyond confirming the dataloggers are plant-scoped, so it does not substantially improve on the schema's parameter documentation.

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

Purpose5/5

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

The description uses a specific verb ('List') and resource ('dataloggers ... attached to a plant'), and explicitly clarifies what those dataloggers are (ShineWiFi / ShineLAN sticks). This makes the tool's scope clear and distinguishes it from broader sibling tools like get_devices or write-oriented tools like add_datalogger.

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

Usage Guidelines3/5

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

The description implies the tool is for retrieving dataloggers tied to a plant, and the schema reinforces that plant_id is required and sourced from get_plants. However, it does not explicitly name alternatives or state when not to use this tool versus, for example, get_devices or get_plant_details.

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

get_device_historyA
Read-onlyIdempotent

Get five-minute readings for a single device for one day.

The "calendar" field is an epoch built from the plant's local wall-clock interpreted as UTC+8; treat it as UTC and add 8 hours to get local time.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDay to query, YYYY-MM-DD.
device_snYesDevice serial number.
device_typeYesDevice type such as "min", "sph", "spa", "max", "inv", "wit", "tlx". get_devices returns it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, non-destructive), and the description adds real behavioral value by disclosing the non-obvious calendar field timezone quirk (epoch interpreted as UTC+8 local wall-clock). This is exactly the kind of behavioral trap that would cause incorrect timestamp handling if undocumented.

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

Conciseness5/5

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

Two sentences with zero filler: the first states the core operation and scope, the second delivers the critical timezone gotcha. Purpose is front-loaded and every sentence earns its place.

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

Completeness4/5

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

Given full schema parameter documentation, an output schema, and annotations covering the read-only/idempotent profile, the description plus structured data is nearly complete. The one conceivable gap is pagination or response size for a full day of five-minute readings, but that is minor and the timezone note addresses the trickiest operational detail.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all three parameters (date, device_sn, device_type) with formats and examples. The description adds no parameter-level meaning beyond the schema; the baseline of 3 is appropriate since the schema carries the load.

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

Purpose5/5

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

The description states a specific verb ('Get'), a precise resource ('five-minute readings'), and clear scope ('single device for one day'). This distinguishes it from siblings like get_device_last_data (latest reading only) and get_device_info (device metadata), so an agent can route correctly without opening the schema.

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

Usage Guidelines3/5

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

Usage is implied by the phrase 'for a single device for one day,' which signals a historical-retrieval context, but there is no explicit when-to-use versus alternatives, no exclusions, and no named sibling tool. An agent must infer that this is the right choice for time-series history rather than being told.

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

get_device_infoA
Read-onlyIdempotent

Get static information for a device: model, firmware, configured settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_snYesDevice serial number.
device_typeYesDevice type such as "min", "sph", "spa", "max", "inv", "wit", "tlx". get_devices returns it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate safety. It adds the useful context that the data is static, but does not disclose other behavior such as authorization needs or error conditions.

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

Conciseness5/5

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

The description is one tight sentence that front-loads the operation and the returned information categories. Every word earns its place.

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

Completeness5/5

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

The tool has a simple two-parameter contract, complete schema descriptions, rich annotations, and an output schema. The description is sufficient for an agent to select and invoke the tool correctly without further context.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters. The description adds no parameter-specific meaning beyond what the schema already provides, which meets the baseline for full coverage.

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

Purpose5/5

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

The description names a specific verb and resource ('Get static information for a device') and enumerates the kind of data returned: model, firmware, and configured settings. The word 'static' differentiates it from sibling tools that return live data or history.

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

Usage Guidelines3/5

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

The description implies use when static device metadata is needed, but it does not explicitly say when to prefer this over siblings like get_device_last_data, get_device_history, or read_device_parameter. Usage context is present but left to inference.

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

get_device_last_dataA
Read-onlyIdempotent

Get the latest real-time reading: PV power, load, grid import/export, battery SOC, temperatures, faults.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_snYesDevice serial number.
device_typeYesDevice type such as "min", "sph", "spa", "max", "inv", "wit", "tlx". get_devices returns it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate safety. It adds a temporal scoping detail ('latest real-time') and lists return signal families, but with an output schema present this is complementary rather than substantial new behavioral disclosure. It also does not describe behavior for missing or offline devices.

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

Conciseness5/5

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

A single sentence front-loads the action and uses a colon to introduce a compact list of signal categories. There is no filler, repetition, or unnecessary elaboration.

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

Completeness4/5

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

For a low-parameter, read-only tool with full schema coverage, strong annotations, and an output schema, the definition is mostly complete. The only notable gaps are the lack of explicit routing to historical-data alternatives and any caveat about data freshness or latency, but these are minor for an agent making a basic data-fetch call.

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

Parameters3/5

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

Schema description coverage is 100%: both required parameters, device_sn and device_type, have clear descriptions including the allowed device-type values. The tool description adds no parameter-level detail beyond what the schema already provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

Description opens with a specific verb and object, 'Get the latest real-time reading', and enumerates the key data categories returned: PV power, load, grid import/export, battery SOC, temperatures, faults. This clearly distinguishes it from siblings like get_device_history (history vs latest) and get_device_info (metadata vs readings).

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

Usage Guidelines4/5

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

The phrase 'latest real-time reading' clearly signals a current-snapshot use case, implying that historical data belongs to get_device_history. However, it does not explicitly name alternatives or state when not to use this tool, so it stops short of providing full routing guidance.

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

get_devicesA
Read-onlyIdempotent

List devices with their type ("min", "sph", "max", ...), which the other tools need.

With a plant_id, returns every device of that plant (page is ignored). Without it, returns all devices on the account, paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
plant_idNoPlant ID, as returned by get_plants. Empty means all plants.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already mark the call read-only, idempotent, and non-destructive. The text adds concrete behavior: device type values, plant scoping, pagination only when no plant_id is provided, and the fact that page is ignored in the plant-scoped branch.

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

Conciseness5/5

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

Three short sentences, each carrying information: what is returned, the plant-scoped behavior, and the unscoped paginated behavior. No filler or repetition.

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

Completeness5/5

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

With only two optional parameters, strong annotations, and an output schema, no critical invocation details are missing. The description covers scope, pagination, and type output, which is sufficient for correct use.

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

Parameters4/5

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

The schema already documents both parameters at 100% coverage, so the baseline is 3. The description adds the non-obvious relationship that page is ignored when plant_id is supplied and defines the scope of the unfiltered call, which meaningfully improves invocation correctness.

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

Purpose4/5

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

The first sentence names a specific verb and resource ('List devices') and states that the output includes the device type needed by other tools. This makes the tool's role clear, though it does not explicitly contrast it with siblings like get_device_info.

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

Usage Guidelines4/5

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

The description gives explicit conditional guidance: with plant_id all devices for that plant are returned and page is ignored; without it the call is paginated over the account. This tells the agent how to vary arguments, though it does not name alternatives such as get_device_info for detail lookups.

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

get_max_batch_dataA
Read-onlyIdempotent

Get the latest data for several MAX-series inverters in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_numNoPage number, starting at 1.
device_snsYesSerial numbers of the MAX inverters.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so safety is well covered. The description adds the 'latest data' and 'one call' semantics, but does not disclose pagination behavior or response characteristics. No contradiction with annotations.

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

Conciseness5/5

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

A single, front-loaded sentence with no filler. Every word earns its place: the verb, the resource, the scope, and the batching benefit are all present.

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

Completeness4/5

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

The tool has only two parameters, one required, a full schema, and a strong annotation set, so the minimal description is mostly sufficient. However, the relationship between page_num and the batch request is not clarified, leaving a minor ambiguity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents both device_sns and page_num. The description only loosely maps to device_sns via 'MAX-series inverters' and does not add meaning for page_num beyond what the schema already provides.

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

Purpose5/5

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

The description uses a specific verb ('Get') with a specific resource ('latest data'), a clear scope ('several MAX-series inverters'), and a distinguishing mode ('in one call'). This makes it easy to tell apart from single-device tools like get_max_data and historical-data tools like get_device_history.

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

Usage Guidelines3/5

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

The phrase 'several MAX-series inverters in one call' implies it is for batch reads, but the description never explicitly states when to use this tool instead of get_max_data or get_device_last_data, nor does it mention exclusions or alternatives.

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

get_max_dataA
Read-onlyIdempotent

Get the latest data for one MAX-series inverter.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_snYesMAX inverter serial number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, non-destructive, openWorld). The description adds the temporal scope ('latest') and cardinality ('one'), which is useful context, but it does not disclose operational behavior such as missing-device handling or data freshness guarantees.

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

Conciseness5/5

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

The description is one short, front-loaded sentence with no filler. Every word contributes meaning, and key scope information ('latest', 'one', 'MAX-series') is included efficiently.

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

Completeness4/5

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

For a tool with one required parameter, a rich annotation set, and an output schema, the description is nearly sufficient. It could clarify what 'latest data' includes, but the output schema likely covers return structure, so this is a minor gap.

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

Parameters3/5

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

Schema coverage is 100%, with device_sn already described as 'MAX inverter serial number.' The description reinforces this by referring to a single MAX-series inverter but adds no new parameter-level meaning beyond the schema.

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

Purpose4/5

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

The description uses a clear verb ('Get') with a specific resource ('latest data for one MAX-series inverter') and cardinality ('one'). It is unambiguous enough to be useful, though it does not explicitly distinguish itself from siblings like get_max_batch_data or get_device_last_data.

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

Usage Guidelines4/5

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

The wording suggests this tool is for a single MAX inverter's latest data snapshot, which gives clear context. However, it does not explicitly state when not to use it or name alternatives such as get_max_batch_data for multiple devices.

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

get_plant_dataA
Read-onlyIdempotent

Get the current energy overview for a plant: today's, monthly, yearly and total energy, current power.

ParametersJSON Schema
NameRequiredDescriptionDefault
plant_idYesPlant ID, as returned by get_plants.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the tool read-only, idempotent, open-world, and non-destructive, so the description does not need to repeat those. It adds value by specifying the energy time ranges returned, but it does not describe any other behavioral traits such as response shape or data availability caveats. No contradiction with annotations.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that states the verb, resource, and the exact data scope without any filler. Every word earns its place, and the colon list is an efficient way to enumerate outputs.

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

Completeness4/5

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

For a simple read-only tool with one required parameter, rich annotations, and an output schema, the description is nearly complete: it tells the agent exactly what data will be retrieved. Minor gaps like error behavior or timezone handling are not critical for tool selection and invocation at this complexity level.

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

Parameters3/5

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

Schema description coverage is 100%, with plant_id explained as 'Plant ID, as returned by get_plants.' The tool description only says 'for a plant,' adding no meaningful parameter semantics beyond what the schema already provides. Baseline 3 is appropriate because the schema carries the documentation burden.

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

Purpose4/5

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

The description clearly states the action ('Get') and the resource ('current energy overview for a plant'), and enumerates the exact data included: today's, monthly, yearly, total energy, and current power. However, it does not explicitly differentiate itself from the closely named sibling get_plant_energy, so it stops short of full sibling differentiation.

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

Usage Guidelines3/5

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

The intended use case is implied by the description: if an agent needs a plant's current energy overview, this is the tool. However, the description gives no explicit guidance on when to choose this over alternatives like get_plant_energy or get_plant_details, and names no exclusions.

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

get_plant_detailsA
Read-onlyIdempotent

Get basic information about a plant: name, location, peak power, timezone.

ParametersJSON Schema
NameRequiredDescriptionDefault
plant_idNoPlant ID, as returned by get_plants. Empty means all plants.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description need not repeat those. It does add the list of specific fields returned, which is a behavioral trait beyond annotations. However, it omits the noteworthy behavior that an empty plant_id yields all plants, potentially misleading an agent into assuming a single-plant result. This is a meaningful gap given the description is the primary behavioral disclosure.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no fluff. It leads with the verb and resource, then enumerates the fields. Every word earns its place, and it is optimally sized for its purpose.

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

Completeness4/5

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

Given that an output schema exists (so return values need not be described) and the parameter schema covers the all-plants behavior, the description is largely complete for a simple get-details tool. The only minor omission is that the description does not cross-reference the multiple-plant scenario, but since the schema explicitly documents it, the agent will see it. The description is adequate for the tool's complexity.

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

Parameters3/5

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

Schema description coverage is 100%, with the parameter 'plant_id' fully described including the 'Empty means all plants' behavior. The tool description adds no additional meaning beyond the schema, so the baseline of 3 is appropriate when the schema does the heavy lifting for parameters.

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

Purpose5/5

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

The description states a specific verb ('Get') and resource ('basic information about a plant'), and explicitly lists the returned fields (name, location, peak power, timezone). This clearly distinguishes it from sibling tools like get_plant_data (likely time-series) and get_plant_energy (metrics), and even from get_plants (list of plants) by focusing on details.

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

Usage Guidelines3/5

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

The description implies its usage niche (e.g., when you need basic plant info), but it does not explicitly state when to use this tool versus alternatives or when not to use it. It also does not mention that an empty plant_id returns all plants, which is a key usage nuance, though it is present in the schema parameter description. No exclusions or alternative routing is provided.

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

get_plant_energyA
Read-onlyIdempotent

Get historical energy generation for a plant.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
perpageNoResults per page, max 100.
end_dateYesEnd date, YYYY-MM-DD.
plant_idYesPlant ID, as returned by get_plants.
time_unitNoGranularity: "day", "month" or "year".day
start_dateYesStart date, YYYY-MM-DD. The interval may not exceed 7 days.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already cover the safety profile with readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, and the description is consistent with these. However, the description adds no extra behavioral context such as pagination or date-range constraints beyond what the schema provides.

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

Conciseness5/5

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

The description is a single concise sentence with no filler. It front-loads the core purpose and every word contributes to understanding what the tool does.

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

Completeness4/5

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

Given the rich input schema, output schema, and annotations, the minimal description is largely sufficient. The main gap is the lack of explicit routing among sibling plant-data tools, but nothing essential for calling the tool correctly is missing.

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

Parameters3/5

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

The input schema provides descriptions for all 6 parameters, so schema coverage is 100%. The description adds no additional parameter meaning beyond 'for a plant', which is acceptable given the schema's completeness.

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

Purpose4/5

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

The description uses a specific verb ('Get') and identifies a precise resource ('historical energy generation for a plant'). It is clear and distinguishable in focus from siblings like get_plant_details or get_max_data, though it does not explicitly contrast with get_plant_data.

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

Usage Guidelines3/5

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

The phrase 'historical energy generation' gives a clear implied context for when to use the tool, but the description does not state alternatives, exclusions, or prerequisites. An agent has to infer the intended choice among several plant-related siblings.

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

get_plantsA
Read-onlyIdempotent

List all plants (solar installations) visible to this Growatt account.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds the account-visibility scoping and clarifies the domain term, but does not mention pagination, ordering, or output size behavior. With strong existing annotations, this is acceptable but not extensive.

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

Conciseness5/5

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

A single, front-loaded sentence states the action, resource, domain clarification, and scope. Every word earns its place with no repetition or filler.

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

Completeness5/5

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

For a zero-parameter list operation with robust annotations and an output schema present, the description is complete. It tells the agent what result to expect in general terms, and the output schema covers return-value detail.

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

Parameters4/5

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

The tool has zero parameters and the schema coverage is effectively complete, so there are no parameter semantics to document. The baseline for a zero-parameter tool is 4, and the description offers no misleading or missing parameter information.

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

Purpose5/5

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

The description uses a specific verb ('List'), identifies the resource ('plants'), clarifies that plants are solar installations, and scopes the result to those visible to the current Growatt account. This clearly distinguishes it from sibling tools like get_plant_details or get_plant_data, which are entry-specific rather than list-oriented.

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

Usage Guidelines4/5

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

The description gives clear context: use this to list all plants visible to the account. It does not explicitly name when not to use it or point to alternatives such as get_user_plants, but the account-wide 'all plants' phrasing makes the intended use fairly unambiguous.

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

get_user_plantsA
Read-onlyIdempotent

List the plants that belong to a specific end user (installer / distributor accounts).

ParametersJSON Schema
NameRequiredDescriptionDefault
user_nameYesGrowatt user name of the end user.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds only a minor contextual detail about user types (installer/distributor). It does not disclose potential behaviors like pagination, empty results for invalid users, or response format, but given the annotations carry the main safety traits, a score of 3 is appropriate.

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

Conciseness5/5

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

The description is a single, concise sentence that front-loads the action ('List the plants') and the scope ('belong to a specific end user'). It contains no extraneous words and is easy to parse quickly.

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

Completeness5/5

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

For a simple read-only tool with one well-documented parameter, an output schema, and annotations covering safety, the description is complete. An agent has everything needed to call it correctly: the operation, the parameter, and the safety profile. No missing information affects invocation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already fully documents the single parameter user_name. The description adds no additional parameter semantics beyond what the schema provides (it merely references 'a specific end user' without adding format or constraints). Baseline 3 is correct when the schema handles parameter documentation.

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

Purpose5/5

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

The description clearly states the verb 'List' and the resource 'plants', and specifies the scope: 'belong to a specific end user'. It also clarifies the user type (installer/distributor accounts), distinguishing it from the sibling get_plants which presumably lists all plants without a user filter. This gives an agent unambiguous understanding of the tool's function.

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

Usage Guidelines4/5

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

The description implies usage context: use this when you need plants for a specific user, as opposed to get_plants for all plants. However, it does not explicitly say 'use this when you have a user_name and want their plants, otherwise use get_plants'. There is no explicit exclusion or mention of alternatives, but the context is clear enough for an agent to infer the right scenario.

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

list_usersA
Read-onlyIdempotent

List end-user accounts managed by this Growatt account.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
perpageNoResults per page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, so the description need not repeat those. It adds the scoping detail 'managed by this Growatt account' but does not disclose additional behavioral traits such as pagination behavior or response limits, which are partially covered by the schema and 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.

Conciseness5/5

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

The description is a single well-formed sentence with no filler. It front-loads the purpose ('List end-user accounts') and immediately provides the scope ('managed by this Growatt account').

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

Completeness5/5

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

For a simple read-only list operation with two optional, fully documented parameters and an output schema, the description provides sufficient context. The annotations cover safety properties, and the schema covers pagination inputs, so nothing essential is missing for an agent to invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100% for both parameters (page and perpage), including defaults and minimums, so the description does not need to add parameter details. It adds no new semantics beyond the schema, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('List') and resource ('end-user accounts managed by this Growatt account'), clearly distinguishing it from siblings like get_plants or register_user. It states exactly what the tool returns and the scope of those accounts.

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

Usage Guidelines4/5

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

The description names the resource and scope, making it evident this is the list operation for end-user accounts in contrast to user-management siblings like register_user, modify_user, and check_user. It does not explicitly state alternatives or exclusions, but the context is clear enough for an agent to select it correctly.

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

modify_plantA
Destructive

Rename a plant and/or change its currency. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew plant name. Empty keeps the current one.
currencyNoCurrency code as used by Growatt. Empty keeps the current one.
plant_idYesPlant ID, as returned by get_plants.
c_user_idYesEnd-user ID (c_user_id) as returned by list_users.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a write operation. The description adds 'Changes state on Growatt's side,' which is a minor clarification that the mutation affects a remote system. However, it does not disclose further side effects, reversibility, or prerequisites beyond what annotations and schema already convey. Given the annotation coverage, the description's extra contribution is modest.

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

Conciseness5/5

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

The description is two short sentences with no redundant phrases. It leads with the primary action and follows with a clarifying side-effect note. Every word earns its place, and it is front-loaded for quick comprehension.

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

Completeness4/5

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

The tool has a relatively simple function (rename/change currency), and both the input schema and an output schema exist. The description covers the core action and side effect, while the schema provides parameter details and references. There is no missing critical information for an agent to invoke the tool correctly, though it could have briefly noted that empty values keep current settings (already in the schema). Overall, it is complete for the tool's complexity.

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

Parameters3/5

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

The input schema has 100% coverage with descriptions for every parameter, including cross-references like 'as returned by get_plants' and 'as returned by list_users.' The description's mention of 'Rename a plant and/or change its currency' aligns with the name and currency parameters but adds no additional semantic detail beyond what the schema provides. Since the schema does the heavy lifting, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description states a clear verb ('Rename') and resource ('plant') plus the optional secondary action ('change its currency'). It immediately distinguishes itself from sibling tools like get_plants, add_plant, and modify_user by specifying exactly what it modifies. The phrase 'Changes state on Growatt's side' further clarifies the side effect, leaving no doubt about the tool's purpose.

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

Usage Guidelines3/5

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

The description implies that this tool is for modifying an existing plant's name or currency, which is clear from the wording. However, it does not explicitly state when to use this tool versus alternatives (e.g., 'Use add_plant to create a new plant, use modify_user for user changes'). No exclusions or alternative routing is provided, so the guidance is implied rather than explicit.

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

modify_userA
Destructive

Update an end-user's mobile number. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
mobileYesNew mobile number.
c_user_idYesEnd-user ID (c_user_id) as returned by list_users.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already convey that this is a destructive, non-idempotent mutation (readOnlyHint=false, destructiveHint=true). The phrase 'Changes state on Growatt's side' adds only modest context about external persistence; it does not describe specific consequences such as overwriting the old number or downstream effects.

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

Conciseness5/5

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

Two short sentences with no filler. The primary purpose is front-loaded, and the second sentence adds a meaningful behavioral note about external state changes without redundancy.

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

Completeness4/5

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

For a simple two-parameter update with a clear schema, an output schema, and annotations covering mutability, the description is largely sufficient. It could be improved by stating that the target user must already exist, but the c_user_id schema description referencing list_users already hints at this.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters. The tool description adds no additional meaning about c_user_id or mobile beyond what the schema already provides, so the baseline score of 3 applies.

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

Purpose5/5

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

The description states a specific action ('Update') and a specific resource ('end-user's mobile number'), which clearly distinguishes it from sibling tools like register_user, check_user, and list_users. Although the tool name is generic, the description narrows the scope to a single field update.

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

Usage Guidelines3/5

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

The description implies usage: use it when you need to change an end-user's mobile number. However, it does not explicitly state when not to use it or name alternatives such as register_user for creating users, leaving the routing decision to inference.

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

read_device_parameterB
Read-onlyIdempotent

Read a VPP (Virtual Power Plant) parameter from a device.

ParametersJSON Schema
NameRequiredDescriptionDefault
set_typeYesVPP parameter name, e.g. "set_param_1" or "set_param_23" (discharge cut-off SOC).
device_snYesDevice serial number.
device_typeYesDevice type such as "min", "sph", "spa", "max", "inv", "wit", "tlx". get_devices returns it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description only restates the read action and provides no additional behavioral context such as auth needs, rate limits, response behavior, or side effects, so it adds no value beyond the annotations.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. The acronym expansion is useful and every word earns its place.

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

Completeness4/5

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

Given the schema fully documents all three required parameters)Skip the response and the annotations cover safety and idempotency, the description is adequately complete for a simple read operation. The only notable gap is sibling usage guidance, which is already penalized under usage_guidelines.

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

Parameters3/5

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

The input schema has 100% coverage, including useful examples for set_type and device_type. The description itself does not add parameter-level meaning beyond the schema, so it meets the baseline but does not enhance it.

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

Purpose4/5

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

The description specifies a concrete action ('Read') and a concrete resource ('VPP parameter from a device'), and expands the VPP acronym. It is clear, but it does not explicitly differentiate itself from sibling tools such as set_device_parameter or get_device_last_data, so it relies on the tool name for sibling distinction.

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

Usage Guidelines2/5

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

There is no mention of when to use this tool versus alternatives like set_device_parameter or other read tools. The intended use is only implied by the verb 'Read'; no exclusions or alternative routing are provided.

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

register_userA
Destructive

Create an end-user account under this Growatt account. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_nameYesGrowatt login name.
user_typeYesGrowatt user type code.
user_emailYesEmail address of the new user.
user_countryYesCountry name as used by Growatt.
user_passwordYesPassword for the new user. Passes through the assistant.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, and the description adds only 'Changes state on Growatt's side.' This gives minor external-context but no additional detail about side effects, permissions, or irreversibility beyond what annotations already imply.

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

Conciseness5/5

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

Two short sentences with the action front-loaded ('Create an end-user account') followed by a brief state-change note. Zero filler, no redundancy with the schema.

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

Completeness3/5

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

With full schema descriptions, an output schema, and annotations, the mechanical details are covered. However, the description omits any contextual guidance such as checking for existing users or potential failure modes, making it adequate but not comprehensive for a mutation tool.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter has its own description in the schema. The tool description adds no parameter-specific meaning, so the baseline of 3 applies without further compensation.

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

Purpose5/5

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

States a specific action ('Create an end-user account') with a clear resource and scope ('under this Growatt account'), and the naming distinguishes it from siblings like modify_user, check_user, and list_users. The verb and resource are explicit and unambiguous.

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

Usage Guidelines2/5

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

Provides no guidance on when to use this tool versus alternatives such as check_user or modify_user. No mention of prerequisites, exclusions, or selection criteria; the description simply states the action without any routing context.

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

set_device_on_offA
Destructive

Turn a device on or off. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
turn_onYesTrue to turn on, False to shut down.
device_snYesDevice serial number.
device_typeYesDevice type such as "min", "sph", "spa", "max", "inv", "wit", "tlx". get_devices returns it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation risk is covered. The description adds a useful detail that the state change happens on Growatt's side, reinforcing the remote side effect, but it does not explain consequences like device downtime or whether the action is reversible.

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

Conciseness5/5

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

The description is two short, front-loaded sentences with no filler. The primary action comes first, and the remote-effect clarification earns its place by adding behavioral context.

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

Completeness4/5

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

For a simple 3-parameter toggle operation, the description plus full schema, annotations, and output schema provide enough to invoke it correctly. It loses one point because it gives no guidance about related tools or device availability, but these are minor given the tool's simplicity.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains turn_on, device_sn, and device_type with examples. The description adds no additional parameter meaning, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Turn'), names the resource ('a device'), and specifies the two modes ('on or off'). It also clarifies the effect is a remote state change on Growatt's side, distinguishing it from read-only sibling tools and from set_device_power, which adjusts power rather than toggling state.

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

Usage Guidelines2/5

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

No explicit guidance is given for when to use this tool versus alternatives such as set_device_power or read_device_parameter. The description implies the use case from the name, but it does not state exclusions, prerequisites, or when another tool should be preferred.

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

set_device_parameterB
Destructive

Write a VPP (Virtual Power Plant) parameter on a device. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesParameter value. Time schedules take a JSON array such as [{"percentage":0,"startTime":120,"endTime":179}].
plant_idNoPlant ID, as returned by get_plants. Empty means all plants.
set_typeYesVPP parameter name, e.g. "set_param_1" or "set_param_23" (discharge cut-off SOC).
device_snYesDevice serial number.
device_typeYesDevice type such as "min", "sph", "spa", "max", "inv", "wit", "tlx". get_devices returns it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare the tool as destructive and not read-only; the description's 'changes state on Growatt's side' adds a remote-side-effect note but little detail about reversibility, failure modes, or consequences of broad plant_id matching. It does not contradict the annotations.

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

Conciseness5/5

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

Two short sentences front-load the action and include a brief side-effect note. No filler or repetition.

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

Completeness4/5

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

The schema and annotations carry the required parameter details and safety profile; output schema is present, so return values are not the description's burden. Missing when-to-use/alternative context is the main gap, but for a well-schema-covered tool the definition is otherwise complete.

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

Parameters3/5

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

Input schema covers 100% of parameters, including examples for set_type and value and the 'empty means all plants' behavior for plant_id. The description itself adds no parameter-level meaning, so it stays at the baseline.

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

Purpose4/5

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

States a specific action—'Write a VPP parameter on a device'—and notes a state change on Growatt's side. The purpose is clear and distinct from read_device_parameter, but it does not explicitly distinguish itself from sibling setters like set_device_power or set_max_parameter.

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

Usage Guidelines2/5

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

No guidance on when this tool should be chosen over siblings such as read_device_parameter, set_device_power, set_max_parameter, or add_plant. The description does not mention prerequisites like get_devices/get_plants or state what types of parameter changes are appropriate.

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

set_device_powerA
Destructive

Set the active power limit of a device. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesInverters: percent 0-100. NOAH devices: watts 0-800. NEXA devices: watts 0-1000.
device_snYesDevice serial number.
device_typeYesDevice type such as "min", "sph", "spa", "max", "inv", "wit", "tlx". get_devices returns it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already carry the destructive and non-read-only safety profile, so the description does not need to restate mutation. It adds 'Changes state on Growatt's side,' clarifying the change is server-side, but it does not describe reversibility, side effects, 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.

Conciseness5/5

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

Two sentences with no filler. The core purpose is front-loaded, and the second sentence adds useful state-change context without unnecessary elaboration.

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

Completeness4/5

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

For a three-parameter mutation with full schema coverage and an output schema, the functional information needed to invoke the tool correctly is present. The only gap is explicit usage routing among sibling device commands, but the purpose line and annotations largely compensate.

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

Parameters3/5

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

Schema description coverage is 100%, with detailed parameter descriptions including device-type-specific units for value and the source of device_type. The description itself adds no parameter-specific detail, so it stays at the baseline for a fully documented schema.

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

Purpose5/5

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

The description starts with a specific verb and object: 'Set the active power limit of a device.' This names the resource and the exact aspect being changed, which clearly distinguishes it from siblings like set_device_on_off and set_device_parameter.

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

Usage Guidelines3/5

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

The description implies when to use the tool through its purpose line, but it does not explicitly state alternatives or exclusions. An agent must infer that this is for power-limit changes rather than toggling power state or writing generic parameters.

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

set_max_parameterB
Destructive

Write a setting on a MAX-series inverter. Changes state on Growatt's side.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYesValues for param1..param19 in order, as many as the setting needs.
device_snYesMAX inverter serial number.
setting_typeYesGrowatt register name, e.g. "pv_active_p_rate".

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this is a mutating operation. The description adds the useful detail that the change happens 'on Growatt's side,' indicating an external state change, but it does not disclose side effects, permissions, or irreversibility beyond that. It is consistent with the annotations, not contradictory.

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

Conciseness5/5

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

The description is two short sentences with no filler. The primary purpose is front-loaded, and the second sentence adds relevant side-effect context rather than repeating schema information.

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

Completeness4/5

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

For a three-parameter write operation, the description plus the fully documented schema and annotations is largely sufficient for an agent to invoke it correctly. The output schema exists, so return-value explanation is unnecessary. The main gap is the lack of routing guidance between set_max_parameter and set_device_parameter, but that is more a usage-guideline concern than an invocation-completeness gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (device_sn, setting_type, values) are already documented with meaningful descriptions. The tool description itself adds no parameter-specific detail beyond the general 'setting' framing, which is fine given the schema already carries the semantic weight.

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

Purpose4/5

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

The description clearly identifies a specific action, 'Write a setting,' and a specific resource, 'a MAX-series inverter.' It also adds that the operation changes state on Growatt's side, which helps an agent understand the real-world effect. It does not explicitly differentiate from sibling tools like set_device_parameter, so it stops short of a 5.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as set_device_parameter or read_device_parameter. The only implied context is the 'MAX-series inverter' qualifier, but there are no explicit conditions, exclusions, or recommended alternatives.

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

Tool Schema Changelog

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

  1. 26 tool updatesv0.2.0
    • First observedadd_datalogger
    • First observedadd_plant
    • First observedadd_storage_device
    • First observedcheck_device_sn
    • First observedcheck_user
    • First observedget_dataloggers
    • First observedget_device_history
    • First observedget_device_info
    • First observedget_device_last_data
    • First observedget_devices
    • First observedget_max_batch_data
    • First observedget_max_data
    • First observedget_plant_data
    • First observedget_plant_details
    • First observedget_plant_energy
    • First observedget_plants
    • First observedget_user_plants
    • First observedlist_users
    • First observedmodify_plant
    • First observedmodify_user
    • First observedread_device_parameter
    • First observedregister_user
    • First observedset_device_on_off
    • First observedset_device_parameter
    • First observedset_device_power
    • First observedset_max_parameter

TDQS

B3.4/5.0

Scored across 26 tools

Disambiguation4/5

Most tools have distinct targets: plant details, plant data, plant energy, device info, dataloggers, users, and MAX-series inverters are clearly separated. A few pairs like get_plant_details vs get_plant_data and get_device_last_data vs get_max_data could be confused, but the descriptions disambiguate them well enough.

Naming Consistency3/5

The dominant get_* pattern is clear, but there is a mix of list_users, check_user, read_device_parameter, add_*, set_*, modify_*, and register_user. The inconsistent use of list vs get for listing resources and get vs read vs check makes the naming readable but not fully predictable.

Tool Count2/5

At 26 tools, the server is beyond the 25-tool threshold for a heavy surface. It covers many subdomains, but the count is high enough that agents will need to filter through many similar-looking operations.

Completeness3/5

The server covers plant creation/modification, device monitoring and control, user management, and MAX-specific operations. Notable lifecycle gaps exist: there are no remove/delete operations for plants, users, dataloggers, or storage devices, and some user update coverage is minimal.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables real-time solar data from Fronius inverters via Claude, allowing natural language queries about solar production, battery, and grid exchange.
    5
    1
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Enables access to Fronius solar inverter data via the MCP protocol, allowing real-time monitoring of energy production, consumption, and battery storage through natural language.
    14
    8 npm
    4
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables LLM agents to query live data from Anker Solix solar systems (Solarbank, expansion batteries, Smartmeter) via natural language, such as current solar production or battery state of charge.
    12
    1
    MIT