A grid frequency monitoring and solar/battery agent orchestration system that monitors grid frequency and triggers curtailment or battery charging based on frequency thresholds
This server has severe definition quality issues. Tool definitions are inferred from Flask route handlers rather than explicitly registered via MCP protocol. No input schemas are visible in the source code, parameters are documented in descriptions only, not in structured JSON Schema. Descriptions are present but minimal (10-50 chars), below the 194-char baseline for production tools. Critical issues: (1) 15 tools but only ~6 unique endpoints (get_fgrid, inverter, meter, curtail, charge, should_curtail), the rest are duplicates with identical names ('inverter', 'meter', 'curtail', 'fgrid' appear 2-3 times each), creating ambiguity for LLM tool selection. (2) No explicit tool registration visible, tools appear to be inferred from Flask routes, not declared via MCP ToolDefinition messages. (3) Parameters lack type constraints (enums, ranges, patterns). (4) No output schemas documented. (5) Error handling is absent, no recovery guidance, no categorization of errors as retryable vs fatal.
Battery charge endpoint to absorb excess generation
Curtailment endpoint for Solar Agent 1 to shut down generation
Curtailment endpoint for Solar Agent 2 to shut down generation
Get current grid frequency set to a high value to simulate overgeneration
Get current grid frequency with dynamic toggling between high and low values
Simulate a high grid frequency to trigger curtailment and battery charge
Retrieve current grid frequency from the SolInteg API
Tool definitions are inferred from Flask routes, not explicitly registered via MCP ToolDefinition. No visible tool registration with schemas in MCP protocol format.
Duplicate tool names ('inverter', 'meter', 'curtail', 'fgrid' appear 2-3 times each). LLM cannot disambiguate which endpoint to call. Violates single-responsibility and naming clarity principles.
No input schemas visible in source code. Parameters documented only in descriptions (text), not in structured JSON Schema with types, enums, or constraints. Violates constrained-input pattern.
Descriptions are minimal (10-50 chars), below 194-char baseline. Examples: 'Get inverter generation data for Solar Agent 1' (47 chars), 'Get meter consumption data for Solar Agent 1' (44 chars). Insufficient context for LLM tool selection.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 27 | 2026-07-28+ | v2 |
Retrieve generation and consumption data from inverter and meter endpoints for a solar agent
Get inverter generation data for Solar Agent 2
Get inverter generation data for Solar Agent 1
Get meter consumption data for Solar Agent 2
Get meter consumption data for Solar Agent 1
Send a charge request to the battery agent to absorb excess generation
Send a curtailment request to a solar agent to shut down generation
Determine if curtailment should be applied based on excess generation and threshold
No output schemas documented. LLM cannot predict what fields to expect or plan downstream tool calls. No pagination, no result limits, no chaining IDs.