mc3000-mcp
This server lets an AI agent safely inspect and control SKYRC MC3000-compatible chargers over local BLE, with dry-run profile handling and explicit confirmation for live writes/starts.
Scan for, connect to, and disconnect from supported BLE chargers; fake backend available for hardware-free use.
Read charger status, per-slot details, firmware/version, basic settings, and read-only MC5000 slot status.
Read and export charger-stored voltage curves as JSON or CSV.
List and validate battery profiles against enforced chemistry/device safety limits.
Build profile frames, apply profiles, and start prepared slots; live writes default to dry-run and require confirmation tokens.
Perform immediate emergency slot/all-slot stops.
Set basic device settings, use raw/debug tools for protocol experiments, and export a bounded redacted session log.
Provides tools for monitoring and controlling SKYRC MC3000-compatible battery chargers over Bluetooth Low Energy.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mc3000-mcpscan for nearby MC3000 chargers"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mc3000-mcp
Safe local MCP control for SKYRC MC3000-compatible chargers.
mc3000-mcp connects an AI agent to a battery charger without handing it an unsupervised
hardware API. BLE control is local. Charging is dry-run by default. Live writes and starts need
explicit per-slot confirmation. Emergency stop is always one call away.
Agent ──MCP stdio── mc3000-mcp ──BLE FFE0/FFE1── SKYRC MC3000
│
├─ profile validation and chemistry limits
├─ dry-run profile rendering
├─ confirmation tokens for live writes/starts
└─ bounded, redacted audit logImplementation | Rust binary; no Python runtime |
MCP | stdio, 27 tools, resources and prompts |
Safety | code-enforced validation, dry-run first, explicit confirmation |
Hardware | MC3000 read/write; MC5000 read-only |
Live-tested | MC3000 firmware |
Registry | crates.io, MCP Registry MCPB, AUR |
Hardware warning. Wrong chemistry, current, voltage, slot, or unsupervised charging can damage cells or start a fire. The MCP server is the safety boundary, not the LLM. Keep the charger in sight. See SECURITY.md.
Install
# crates.io
cargo install mc3000-mcp --locked
# Arch Linux
paru -S mc3000-mcp
# released tag, if you prefer installing from source
cargo install --git https://github.com/nietonchique/mc3000-mcp.git --tag v0.2.4 --lockedA Linux x86_64 MCPB bundle is attached to each release for MCPB-compatible clients.
Linux BLE requires BlueZ/D-Bus:
bluetoothctl show
# If the adapter is off:
sudo rfkill unblock bluetooth && bluetoothctl power onRelated MCP server: aranet4-mcp-server
Connect an MCP client
{
"mcpServers": {
"mc3000": {
"command": "mc3000-mcp",
"args": []
}
}
}Client-specific examples are in examples/.
Try it without hardware:
{
"mcpServers": {
"mc3000": {
"command": "mc3000-mcp",
"args": ["--backend", "fake"]
}
}
}Agent skill
charger-agent uses the portable Agent Skills layout: one folder with a
SKILL.md manifest. No vendor-specific installer is required.
Install it for Codex:
mkdir -p ~/.codex/skills
curl -fsSL https://github.com/nietonchique/mc3000-mcp/releases/download/v0.2.4/mc3000-mcp-skill-v0.2.4.tar.gz \
| tar -xz -C ~/.codex/skillsFor OMP, use ~/.omp/agent/skills as the destination. For Claude-compatible clients, use
~/.claude/skills. Hermes can also install the raw file, but it is just one compatible client—not
the distribution format.
The folder contains the charger workflow plus a pre-start checklist and example profile. It is guidance only; the Rust MCP server remains the enforced safety boundary.
CLI
The default command starts MCP stdio. Read-only diagnostics are also available directly:
mc3000-mcp --version
mc3000-mcp scan --timeout 8
mc3000-mcp status --address AA:BB:CC:DD:EE:FF
mc3000-mcp --backend fake scanThe CLI can scan and read slots. It cannot write profiles, change settings, or start charging.
Safe workflow
Read slot status.
Validate a battery profile.
Render it as a dry run.
Apply it with
confirmation_token=APPLY_PROFILE_SLOT_<slot>.Start it with a separate
confirmation_token=START_SLOT_<slot>.Monitor voltage, current, temperature, and status.
Use
charger.stop_slot/charger.stop_allimmediately if anything looks wrong.
Example dry run for physical slot 4 / API slot 3:
{
"name": "charger.apply_profile",
"arguments": {
"slot": 3,
"profile_id": "nimh-aa-conservative-charge"
}
}Start requires a second explicit confirmation:
{
"name": "charger.start",
"arguments": {
"slot": 3,
"confirmation_token": "START_SLOT_3"
}
}Emergency stop is deliberately tokenless:
{"name": "charger.stop_all", "arguments": {}}Tools
Production surface is namespaced as charger.*:
Tool | Purpose |
| Read-only BLE scan. |
| Manage the charger connection. |
| Slot chemistry, mode, voltage/current, temperature, state. |
| Charger-stored voltage series as JSON/CSV. |
| Bundled profiles and enforced safety checks. |
| Dry-run by default; live write requires its slot token. |
| Start a prepared slot; requires a separate token. |
| Immediate emergency stop. |
| Bounded, redacted audit log. |
Fourteen legacy mc3000_* tools remain for protocol/debugging work. They use the same
confirmation policy for non-emergency writes. Raw writes cannot implicitly start slots and always
block factory/calibration restore opcodes.
Safety model
API slots are zero-based
0..3; physical slots are1..4.apply_profiledefaults todry_run=true.Live profile writes require exactly
APPLY_PROFILE_SLOT_<slot>.Starts require exactly
START_SLOT_<slot>.Safety checks run before any backend call; unsupported chemistry fails closed.
NiMH/Eneloop/NiCd, LiIon, and LiFe have enforced limits.
Unknown charger models and MC5000 connections are read-only.
Session logs redact addresses and confirmation tokens and are bounded in memory.
Full model: docs/safety-model.md.
Profile schema and bundled examples: docs/profile-schema.md.
Compatibility
Confirmed live: SKYRC MC3000 firmware 1.23, hardware 2.20.
Protocol details are documented from the official Android app and hardware testing in
docs/ble-protocol-notes.md and
docs/reverse-notes.md. MC5000 support is intentionally read-only until
writes are verified on real hardware.
Charger firmware behavior can differ. A profile write acknowledgement is not proof that the charger applied it—start the slot and verify mode/current/status.
Development
cargo fmt --all -- --check
cargo clippy --all-targets --all-features --locked -- -D warnings
cargo test --all-features --locked
cargo audit && cargo deny checkThe fake backend keeps hardware out of normal tests and CI. See
CONTRIBUTING.md for the full workflow and hardware-safety rule.
Documentation
Security and disclosure:
SECURITY.mdSafety model:
docs/safety-model.mdSupported devices:
docs/supported-devices.mdExamples:
docs/examples.mdRelease/publishing checklist:
docs/publishing.mdAgent skill:
skill/SKILL.md
License
Apache-2.0. See LICENSE.
Available Tools
27 toolscharger.apply_profileB
Validate and apply a profile to a slot. Dry-run is default; live write requires token.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | ||
| dry_run | No | ||
| profile | No | ||
| profile_id | No | ||
| confirmation_token | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It discloses that dry-run is default and live write requires a token, hinting at safety. However, it does not specify outcomes on validation failure, or any destructive aspects beyond 'apply'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences, but the structure could be improved by separating validation and application steps for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema is provided, and the description does not mention return values, error states, or post-conditions. The complex nested 'profile' object lacks behavioral hints, leaving the agent guessing about validation outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description should explain parameters beyond 'slot' and 'token'. It mentions 'dry-run' but not how it affects behavior, and does not clarify 'profile' vs 'profile_id' or the meaning of 'confirmation_token'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool validates and applies a profile to a slot. It distinguishes the action from validation-only tools like 'charger.validate_profile', but does not explicitly differentiate from 'mc3000_apply_profile' which may be related but in a different namespace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for dry-run by default and live write with a token, but does not provide explicit guidelines on when to use this tool versus siblings like 'charger.validate_profile' for validation-only scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.connectC
Connect to a selected charger. Prefer an explicit address from scan_devices.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose any behavioral traits such as whether the connection is stateful, what side effects occur, or authentication requirements. The description adds no value beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two short sentences, but the brevity comes at the cost of essential details. It is front-loaded but lacks structure to fully guide an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, and 2 parameters, the description is incomplete. It fails to explain return values, prerequisites, or connection behavior, leaving significant gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides only minimal context for the 'address' parameter (suggesting it comes from scan_devices). The 'timeout' parameter is not explained. The description adds some meaning but is insufficient for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Connect' and the resource 'charger', and adds context about using an address from scan_devices. It distinguishes from sibling tools like charger.start or charger.get_status by specifying the action, but does not explicitly differentiate from mc3000_connect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description hints at when to use the tool by suggesting an explicit address from scan_devices, but it does not state when not to use it or mention alternative tools. The guidance is minimal and 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.
charger.export_session_logA
Export in-memory session log with redacted device identifiers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavior. It mentions 'redacted device identifiers', adding transparency. However, it does not state if the operation is read-only, destructive, or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with key action and scope. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is simple with no parameters and no output schema. Description covers the core function and an important behavioral detail (redaction). Slightly incomplete due to lack of output format or permission hints, but adequate for a straightforward export.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. Baseline for 0 parameters is 4. Description adds no parameter-specific info, which is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'Export' and resource 'in-memory session log'. It distinguishes from siblings like 'export_voltage_curve' by specifying the log contents and redaction of identifiers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. No mention of prerequisites, context, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.export_voltage_curveC
Export the charger-stored voltage curve as JSON or CSV.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | ||
| format | No | json | |
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description does not disclose if the tool modifies state, whether it initiates a download or returns data inline, or potential side effects. The timeout parameter suggests a long operation but is not explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence is very concise, but may be overly terse given the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is severely incomplete: no explanation of what a voltage curve is, what slots represent, how the export works, or how it differs from similar sibling tools. With 3 parameters, no output schema, and no annotations, the description fails to provide adequate context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description adds no meaning to the parameters. The only hint is 'JSON or CSV' relating to format, but slot and timeout are not explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Export' and resource 'charger-stored voltage curve', and mentions output formats. However, it does not differentiate from sibling 'charger.get_voltage_curve' which likely returns similar data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use 'export' vs alternative tools like 'charger.get_voltage_curve' or 'charger.export_session_log'. No mention of prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.get_statusA
Read current charger status for all slots.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry full burden. It indicates a read-only operation, which is correct, but lacks details like whether a connection is required or how status is returned. Minimal but 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, efficient and front-loaded. Every word is necessary and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no parameters and no output schema, the description adequately states the action. However, it could hint at what 'status' includes or the return format to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and schema coverage is 100%. Baseline for 0 parameters is 4; description adds no param info because none exist, which is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states specific verb 'Read' and resource 'charger status for all slots', clearly distinguishing it from sibling tools like 'charger.start' or 'charger.read_slots'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as 'charger.get_voltage_curve' or 'charger.read_slots'. The description does not mention any conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.get_voltage_curveB
Read the charger-stored app-style voltage time-series for one slot. No polling.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It only states 'Read' (non-destructive) and 'No polling' (no repeated requests). It does not disclose response format, speed, error conditions, or slot availability requirements, leaving significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single 12-word sentence is concise and front-loaded. However, its brevity sacrifices necessary detail on parameters and output, making it less effective than a slightly longer, more informative description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 2 parameters, no output schema, and no annotations. The description does not explain what a 'voltage time-series' is, what the output resembles, or how parameters affect behavior. This leaves the agent with insufficient context to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description makes no mention of parameters. The input schema has 0% description coverage, so the agent must rely solely on schema constraints (e.g., slot range) without understanding parameter meaning (e.g., timeout unit or effect). Description adds zero value for parameter interpretation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Read') and resource ('charger-stored app-style voltage time-series for one slot'), effectively distinguishing from sibling tools like 'charger.export_voltage_curve' (export vs read) and 'charger.read_slots' (slot status vs curve).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'No polling' implies a one-shot read, but the description does not provide explicit guidance on when to use this tool versus alternatives (e.g., when to poll vs get a single point). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.list_profilesC
List bundled safe example profiles.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral transparency. It states the profiles are 'safe' and 'example', implying no destructive effects, but gives no details on connectivity requirements, speed, or side effects. The description is minimal and does not compensate for the lack of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently states the tool's action. It is concise but may be too brief for some contexts. However, for a simple list operation, it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description should explain what the output contains (e.g., list of profile names, descriptions) and any setup requirements. It lacks this information, leaving the agent unsure of the return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so schema coverage is 100%. The description adds no parameter information because there are none. Baseline score of 3 is appropriate since parameter semantics are adequately handled by the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'bundled safe example profiles'. It distinguishes this tool from siblings like apply_profile or validate_profile, which perform actions on profiles rather than listing them. However, it does not explicitly differentiate it from other list-type tools if any exist.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as charger.apply_profile or charger.validate_profile. It lacks context on prerequisites or typical workflow, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.read_slotsB
Read one slot or all slot statuses. Slot is zero-based 0..3.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides some behavioral info (slot is zero-based, range 0..3), but lacks disclosure on whether the operation is read-only, requires authorization, or has side effects. With no annotations, the description carries the full burden and is only partially adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no fluff. Information is front-loaded and each word adds value. Ideal for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema or annotations, the description is mostly adequate but lacks information about return values or possible errors. It leaves some gaps for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It explains the parameter 'slot' is zero-based with range 0..3, adding meaning beyond the schema's min/max constraints. However, it does not explain the behavior when omitted (all slots) or the output format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads slot statuses and specifies the slot range. It distinguishes from sibling tools like 'charger.get_status' by focusing on individual slot statuses, but does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'charger.get_status'. The description only states what it does, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.scan_devicesC
Read-only BLE scan for supported chargers.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations present, so description must fully disclose behavior. It mentions read-only, but does not explain timeout behavior, return format, or what happens on scan completion (e.g., how devices are returned). Inadequate for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely short (one phrase), which is concise, but omits critical details. Not structured for easy scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one optional parameter and no output schema, the description is still too sparse. It lacks information on error states, typical usage flow, and how it relates to other scan tools in the same domain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description does not mention the 'timeout' parameter at all. No units, default explanation, or purpose beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (scan), resource (devices for supported chargers), and nature (read-only, BLE). It distinguishes from siblings like charger.connect or charger.get_status, but 'supported chargers' is ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., mc3000_scan). No prerequisites or exclusions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.startC
Start the already-applied operation on a slot. Requires START_SLOT_ token.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | ||
| confirmation_token | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only discloses the token requirement, but does not specify if the operation is destructive, idempotent, or what side effects occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (two short sentences) and front-loaded, but the brevity sacrifices essential details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no annotations, and critical missing info on return values, errors, and prerequisites beyond token, the description is severely incomplete for a tool requiring two parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description adds no explanation of the 'slot' or 'confirmation_token' parameters beyond implying the token's format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Start' and the resource 'slot', and implies starting an operation that has been previously applied. This distinguishes it from siblings like 'apply_profile' and 'stop_slot'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a prerequisite token but does not specify when to use this tool versus alternatives, nor does it condition usage on prior application of a profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.stop_allA
Emergency stop for all slots; bypasses profile validation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes key behavior (stops all slots, bypasses validation) but lacks details on irreversibility, side effects, or safety implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no waste, with critical information front-loaded ('Emergency stop for all slots').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no params, no output schema), the description adequately covers its purpose and a key behavioral note (bypasses validation).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; baseline score of 4 applies as description adds no parameter info (not needed).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States it performs an emergency stop for all slots, clearly distinguishing it from sibling tools like charger.stop_slot which stops a single slot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Indicates emergency use and that it bypasses profile validation, suggesting it's for urgent scenarios. Could be more explicit about when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.stop_slotA
Emergency stop for one slot; bypasses profile validation.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the key behavior of bypassing profile validation, but does not cover other traits like potential destructive effects, reversibility, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at 6 words, front-loading the critical 'emergency stop' action. Every word earns its place, focusing on the unique aspect of bypassing validation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description is fairly complete. It conveys the purpose and the exceptional behavior (bypassing validation), though it lacks details about failure modes or slot numbering conventions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the 'slot' parameter. The tool description does not explain what the slot parameter represents beyond the integer range already in the schema. No additional semantic value is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states an 'emergency stop for one slot' and distinguishes itself by noting it 'bypasses profile validation.' This sets it apart from sibling tools like charger.stop_all, which stops all slots, and charger.start.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'emergency stop' implies urgent scenarios, but there is no explicit guidance on when to use this tool versus alternatives. It does not mention when not to use it or contrast with other stop operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
charger.validate_profileB
Validate a battery profile against enforced chemistry/device/safety limits.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | ||
| profile_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only says 'validate', implying a read-only operation. It does not disclose whether validation is synchronous, what happens on failure (error vs. boolean return), or any side effects. Minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that directly states the tool's purpose without any extraneous words. It is appropriately concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a complex nested object parameter (18+ properties in the profile) and no output schema or annotations, the description is severely lacking. It does not explain the validation output format, error behavior, or how to use the result. Very incomplete given the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not add meaning to the two parameters. It doesn't explain the 'profile' object's role or the 'profile_id' parameter beyond what names imply. The description fails to compensate for the lack of schema property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'validate' and the resource 'battery profile', and specifies the context 'enforced chemistry/device/safety limits', distinguishing it from sibling tools like apply_profile or build_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is provided. Usage is implied as a pre-check before applying a profile, but alternatives like apply_profile are not mentioned or differentiated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_apply_profileB
Apply a profile/program. Pass profile_hex from mc3000_build_profile or pass the same profile fields directly. Optionally start selected slots.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 0 charge, 1 refresh, 2 storage/break-in, 3 discharge, 4 cycle | |
| start | No | ||
| breakin | No | ||
| slot_mask | No | slot bitmask: slot1=1, slot2=2, slot3=4, slot4=8 | |
| cycle_mode | No | ||
| cycle_count | No | ||
| profile_hex | No | ||
| temp_cutoff | No | ||
| battery_type | No | 0 LiIon, 1 LiFe, 2 LiIo4.35, 3 NiMH, 4 NiCd, 5 NiZn, 6 Eneloop, 7 RAM, 8 LTO, 9 Na-Lion | |
| capacity_mah | No | ||
| keep_voltage_mv | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV. | |
| charge_current_ma | No | ||
| negative_delta_mv | No | ||
| time_limit_minutes | No | ||
| trickle_current_ma | No | ||
| charge_rest_minutes | No | ||
| discharge_current_ma | No | ||
| charge_stop_current_ma | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 50mA. | |
| charge_stop_voltage_mv | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 1650mV. | |
| discharge_rest_minutes | No | ||
| discharge_stop_current_ma | No | ||
| discharge_stop_voltage_mv | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It merely says 'Apply' without disclosing side effects, conflict resolution when both profile_hex and fields are provided, idempotency, or behavior when slots are already running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two short sentences that front-load the action and key options. No extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (22 parameters, no annotations, no output schema), the description is far from complete. It does not cover return values, error scenarios, prerequisites, or detailed parameter interactions, leaving significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (32%), yet the description adds minimal context beyond what the schema provides. It mentions profile_hex and slot_mask implicitly ('selected slots') but does not explain other 20 parameters, leaving most of the parameter semantics undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Apply a profile/program' and mentions two ways to provide the profile (hex from build_profile or direct fields). It is specific enough to distinguish from sibling tools like mc3000_build_profile and mc3000_start, though explicit differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives implicit guidance by offering two methods (profile_hex or direct fields) and mentions optional starting of slots. However, it lacks explicit when-to-use or when-not-to-use compared to siblings like mc3000_start or charger.apply_profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_build_profileA
Build a 40-byte MC3000 profile/program frame without sending it.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 0 charge, 1 refresh, 2 storage/break-in, 3 discharge, 4 cycle | |
| breakin | No | ||
| slot_mask | Yes | slot bitmask: slot1=1, slot2=2, slot3=4, slot4=8 | |
| cycle_mode | No | ||
| cycle_count | No | ||
| temp_cutoff | No | ||
| battery_type | No | 0 LiIon, 1 LiFe, 2 LiIo4.35, 3 NiMH, 4 NiCd, 5 NiZn, 6 Eneloop, 7 RAM, 8 LTO, 9 Na-Lion | |
| capacity_mah | No | ||
| keep_voltage_mv | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV. | |
| charge_current_ma | No | ||
| negative_delta_mv | No | ||
| time_limit_minutes | No | ||
| trickle_current_ma | No | ||
| charge_rest_minutes | No | ||
| discharge_current_ma | No | ||
| charge_stop_current_ma | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 50mA. | |
| charge_stop_voltage_mv | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 1650mV. | |
| discharge_rest_minutes | No | ||
| discharge_stop_current_ma | No | ||
| discharge_stop_voltage_mv | No | Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It indicates the tool is non-destructive (only builds a frame), but omits details on prerequisites (e.g., connection), error conditions, or whether the frame is stored or returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no redundancy, front-loads the core action and key constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 20 parameters and no output schema; the description is minimal and does not explain the built frame's structure or how to use it subsequently. Adequate but could benefit from more context about the frame format or next steps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (35%), and the description adds no parameter-level context. The many parameters (20) need additional explanation to guide the agent, but the description is generic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (build), the object (40-byte MC3000 profile/program frame), and a key qualifier (without sending it), differentiating it from sibling tools like mc3000_apply_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without sending it' implies a two-step process (build then apply), and sibling names like mc3000_apply_profile clarify when to use each. No explicit when-not-to-use or alternatives, but context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_connectC
Connect to MC3000 by BLE address, or scan and connect to the first matching charger if address is omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It mentions connection but doesn't describe blocking behavior, timeout effects, error handling, or side effects (e.g., connection state). The timeout parameter is present but not explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, which is efficient, but it lacks structure and could benefit from being split into separate statements for the two modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given numerous sibling tools and no output schema or parameter descriptions, the description is too brief. It doesn't address return values, errors, or important nuances like scanning behavior, leaving the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description does not explain the address format (e.g., MAC address) or the timeout parameter beyond its default. The description adds no value to parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool connects to an MC3000 via BLE address, with an option to scan if omitted. It distinguishes from sibling tools like mc3000_scan by including connection, but does not explicitly mention the BLE nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to omit the address (scan and connect to first matching charger) but does not provide explicit guidance on when to use this tool versus mc3000_scan or other tools, nor does it mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_disconnectA
Disconnect from charger.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, and the description only says 'Disconnect from charger.' It does not disclose any behavioral traits such as side effects, prerequisites (e.g., being connected), or state changes, leaving the agent without critical context for a potentially destructive action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with one sentence. While it is not verbose, it could benefit from a bit more structure or additional context. Nonetheless, it has no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity (no parameters, no output schema), the description is minimally complete. However, it lacks context about when disconnection is appropriate (e.g., after scanning or charging) and what the state becomes, which would be helpful for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters and schema coverage is 100%. The description adds no parameter info, which is acceptable since there are none. Baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('disconnect') and resource ('from charger'), distinguishing it from sibling tools like mc3000_connect and mc3000_start.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is provided. The context is implied but lacks exclusions or alternatives, which is acceptable given the tool's simplicity but not ideal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_get_basicB
Read basic device settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must disclose behavioral traits. It indicates a read operation but does not confirm it is side-effect-free, nor does it describe any required state (e.g., connection needed).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence is concise and front-loaded. It could benefit from additional context, but for a simple tool it is appropriately short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description should clarify what is returned. It does not explain the nature of 'basic settings' or the format of the output, leaving the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the baseline is 4. The description adds no parameter info, but none is needed as there are no parameters to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Read basic device settings' clearly specifies the verb (read) and resource (basic device settings), distinguishing it from sibling tools like get_version or get_voltage_curve. However, 'basic settings' is somewhat vague.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, nor any mention of prerequisites or context. The description simply states what it does without usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_get_versionB
Read firmware/hardware version.
| Name | Required | Description | Default |
|---|---|---|---|
| mac | No | Optional charger MAC to include exactly like the Android app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full burden. It only says 'Read' implying a safe operation, but fails to disclose any behavioral traits such as whether a connection is required, authentication needs, or if it's idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with a single 3-word sentence. No fluff, but it feels slightly under-specified. Front-loaded with the verb and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (reading version), the description is adequate. However, it omits any mention of return format or the effect of the optional MAC parameter. No output schema exists, so description could do more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'mac', which has a description. The tool description adds no additional meaning beyond the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Read' and resource 'firmware/hardware version', clearly defining the tool's action and output. It distinguishes from siblings like mc3000_get_basic, which likely reads other data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, nor any exclusions or prerequisites. The description only states what it does without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_get_voltage_curveB
Read voltage curve for a zero-based slot. Response is parsed into millivolt points.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It mentions response format (millivolt points), providing some transparency. However, it does not disclose that the operation is read-only, potential side effects, error conditions, or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no unnecessary words. Efficient, though adding structure (e.g., bullet points for parameters) could improve scannability without increasing verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with 2 parameters and no output schema, the description is partially complete. It covers the main action and output unit. Missing param descriptions, usage context, and error handling make it adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the description does not explain any parameters. The description omits details about the 'slot' parameter (0-3) and 'timeout' parameter (default 8). It adds no value beyond the schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Read voltage curve' for a specific resource (zero-based slot). The tool name and description align well. Among siblings, there is no similarly named tool, so it is distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like mc3000_get_basic or mc3000_status. The description lacks context for appropriate usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_mc5000_statusA
Read slot status using MC5000 frame layout (opcode 0x91).
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It states 'Read' indicating a non-destructive operation, but lacks details on permissions, response format, or potential errors. Adequate for a simple read, but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, concise sentence that front-loads the core purpose. Every word is necessary with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with one parameter, the description is under-specified. It omits what the response contains (e.g., status details) and lacks any error handling context, making it minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the single parameter 'slot', and the tool description does not explain it further. While the schema sets min/max (0-3), the description adds no semantic meaning about what slot numbers represent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read'), the resource ('slot status'), and specifies the technical context ('using MC5000 frame layout (opcode 0x91)'). This distinguishes it from sibling tools like 'mc3000_status' which likely pertain to MC3000 format.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for MC5000 format status reading, but does not explicitly state when to use this tool versus alternatives like 'mc3000_status' or 'charger.read_slots'. The guidance is implied through technical specificity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_scanC
Scan BLE devices and return devices whose advertised name matches the official MC3000 app filters.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits; it only states scanning and filtering, omitting whether scanning is continuous, what return format is, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence front-loaded with purpose, but misses crucial details; could be restructured to include parameter info and output description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, no output schema), the description should specify return structure, filter criteria, and potential error states; it provides none.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the tool description does not mention the timeout parameter, its units, or its effect on scanning behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Explicitly states the action (scan), resource (BLE devices), and a specific filter (official MC3000 app filters), distinguishing it from sibling tools like mc3000_connect or mc3000_apply_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, no prerequisites or constraints mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_send_rawC
Send a raw hex frame. Escape hatch for protocol experiments.
| Name | Required | Description | Default |
|---|---|---|---|
| hex | No | ||
| wait | No | ||
| start | No | ||
| timeout | No | ||
| frame_hex | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose safety or side effects. It only states the action without mentioning potential disruptions, required state (e.g., connected), 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
While concise (two sentences), the description is too brief for a tool with multiple parameters and no schema descriptions. It sacrifices essential information for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters with no descriptions, no output schema, and no annotations, the description is wholly inadequate. It fails to provide enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the 5 parameters (hex, wait, start, timeout, frame_hex). It adds no meaning beyond the schema field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Send a raw hex frame' clearly states the action and resource. It distinguishes from siblings like mc3000_apply_profile or mc3000_scan, which do not send raw frames.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Escape hatch for protocol experiments' hints at advanced/emergency use but provides no explicit guidance on when to use this tool versus alternatives, nor any conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_set_basicC
Set basic device settings.
| Name | Required | Description | Default |
|---|---|---|---|
| display | No | ||
| input_mv | No | ||
| temp_unit | No | 0=celsius, 1=fahrenheit | |
| cooling_fan | No | ||
| screensaver | No | ||
| system_beep | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must disclose behavioral traits. It only states 'Set basic device settings,' which implies a write operation, but does not mention idempotency, error conditions, required authentication, or side effects. The lack of detail leaves the agent without critical behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at 4 words, but it sacrifices informative content. While it is front-loaded and has no waste, it fails to earn its place by providing sufficient functional context. A more balanced description with additional key details would be appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters, no output schema, and no annotations, the description is severely incomplete. It does not mention device type, return values, error cases, or how parameters interact. The agent cannot reliably use this tool based solely on the provided description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17% (only temp_unit has a description). The description adds no parameter information beyond the parameter names. While names like 'display' and 'input_mv' are somewhat self-explanatory, the schema lacks ranges, units, or formats for most parameters. The description does not compensate for this gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Set basic device settings' clearly states the action (set) and resource (device settings). It is a specific verb+resource combination, but it does not differentiate from siblings like mc3000_apply_profile, which also sets settings but via a profile. The purpose is clear but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like mc3000_get_basic (reading settings) or mc3000_apply_profile (applying a profile). The description does not mention prerequisites, such as requiring a connection (via mc3000_connect), 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.
mc3000_startC
Start charging/program on a zero-based slot 0..3.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must fully disclose behavior. It only says 'start' without mentioning side effects, authentication needs, or what happens if the slot is already in use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short (one sentence) and front-loaded, but lacks structure. It is concise but at the expense of completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter, the description is insufficient. It fails to explain the outcome, return values, or any prerequisites, especially given the lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, requiring the description to clarify parameter meaning. The description merely restates the schema's 'zero-based slot 0..3', adding no additional value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Start charging/program') and the resource ('zero-based slot 0..3'), but does not differentiate it from sibling tools like stop or status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, nor any context about prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_statusA
Poll slot status. Slot is zero-based 0..3; omit slot to poll all four.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey all behavioral traits. It only mentions polling slot status and the slot parameter, but lacks disclosure of side effects, authentication requirements, rate limits, or what 'status' entails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the core action. Every word serves a purpose with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple polling tool with no output schema, the description covers the basic operation and parameter semantics. However, it lacks any information about the return value format or structure, which is a gap expected for the tool's complexity and lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'slot' is explained with range (0-3) and the meaning of omission (polls all four). This adds significant value beyond the schema's type/min/max, which is especially important given 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Poll slot status') and the resource ('slot status'). It distinguishes from siblings which have different actions like applying profiles or connecting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when slot status is needed but does not provide explicit when-to-use or when-not-to-use guidance relative to sibling tools. No exclusions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mc3000_stopC
Stop a zero-based slot 0..3.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description gives no behavioral information such as destruction, side effects, or required state. Completely opaque beyond the action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence. However, the extreme brevity sacrifices completeness. Earns its place but could include more without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description is still incomplete—missing behavioral context, usage hints, and any mention of related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description merely restates the schema constraints ('zero-based slot 0..3') without adding any meaning. Schema coverage is 0%, so the description fails to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Stop' and the resource 'zero-based slot', with range specification 0..3. It is distinct from sibling like mc3000_start, but lacks any additional context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, no prerequisites or conditions mentioned. The description only states what it does.
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.
16 tool updates
v0.1.1- Added
charger.apply_profile - Added
charger.connect - Added
charger.export_session_log - Added
charger.export_voltage_curve - Added
charger.get_status - Added
charger.get_voltage_curve - Added
charger.list_profiles - Added
charger.read_slots - Added
charger.scan_devices - Added
charger.start - Added
charger.stop_all - Added
charger.stop_slot - Added
charger.validate_profile - Changed
mc3000_apply_profile8 fields changed- removed
Input schema / properties / charge_stop_current_ma / defaultRemoved value: -100 - added
Input schema / properties / charge_stop_current_ma / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 50mA." - removed
Input schema / properties / charge_stop_voltage_mv / defaultRemoved value: -4200 - added
Input schema / properties / charge_stop_voltage_mv / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 1650mV." - removed
Input schema / properties / discharge_stop_voltage_mv / defaultRemoved value: -3000 - added
Input schema / properties / discharge_stop_voltage_mv / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV." - removed
Input schema / properties / keep_voltage_mv / defaultRemoved value: -4150 - added
Input schema / properties / keep_voltage_mv / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV."
- Changed
mc3000_build_profile8 fields changed- removed
Input schema / properties / charge_stop_current_ma / defaultRemoved value: -100 - added
Input schema / properties / charge_stop_current_ma / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 50mA." - removed
Input schema / properties / charge_stop_voltage_mv / defaultRemoved value: -4200 - added
Input schema / properties / charge_stop_voltage_mv / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 1650mV." - removed
Input schema / properties / discharge_stop_voltage_mv / defaultRemoved value: -3000 - added
Input schema / properties / discharge_stop_voltage_mv / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV." - removed
Input schema / properties / keep_voltage_mv / defaultRemoved value: -4150 - added
Input schema / properties / keep_voltage_mv / descriptionAdded value: +"Omit for chemistry default; NiMH/NiCd/Eneloop default is 1000mV."
- Added
mc3000_mc5000_status
13 tool updates
v0.1.0- First observed
mc3000_apply_profile - First observed
mc3000_build_profile - First observed
mc3000_connect - First observed
mc3000_disconnect - First observed
mc3000_get_basic - First observed
mc3000_get_version - First observed
mc3000_get_voltage_curve - First observed
mc3000_scan - First observed
mc3000_send_raw - First observed
mc3000_set_basic - First observed
mc3000_start - First observed
mc3000_status - First observed
mc3000_stop
TDQS
Scored across 27 tools
Many tools have overlapping purposes, e.g., charger.connect vs mc3000_connect, charger.get_status vs mc3000_status, charger.get_voltage_curve vs mc3000_get_voltage_curve. This duplication makes it difficult for agents to choose the correct tool.
Two inconsistent naming conventions are used: 'charger.' prefix with dot notation and 'mc3000_' prefix with underscore notation. Within each set, names are consistent, but mixing them is confusing. Also, 'mc3000_mc5000_status' is an outlier.
27 tools is excessive for a charger control server. Much of this is due to duplication between the two tool sets. The server would be better served with a single, streamlined set of around 10-15 tools.
Despite the duplication, the server covers most essential operations: connect, disconnect, scan, apply profiles, start/stop, get status, get voltage curve, and export logs. Minor gaps like firmware update are present but not critical.
Maintenance
Related MCP Connectors
MCP server wrapping the Tesla Fleet API and TeslaMate API
MCP server for Yoto: manage cards, tracks, icons and family devices from any MCP client.
MCP server for Klever blockchain smart contract development.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceBluetooth Low Energy (BLE) MCP server that allows AI agents to scan, connect to and communicated with BLE devices, as well as simulate BLE perhipherals.25BSD 2-Clause "Simplified"
- FlicenseNot gradedqualityCmaintenanceMCP server to manage your Aranet4 CO2 sensor, enabling scanning, data fetching, historical querying, and plotting.4-
- AlicenseNot gradedqualityDmaintenanceMCP server for controlling compatible boards over Bluetooth serial, including DC motors, servos, IO, and sensors.MIT
- AlicenseAqualityAmaintenanceMCP server that connects to Felicity Solar cloud battery data, allowing natural language queries about battery status, cell voltages, and charge state.17110 npm1MIT