MCP server for reading, querying, and editing a Node-RED flows.json
Eight tools with complete input schemas and descriptions. Naming follows verb_noun pattern (nodered_query, nodered_edit, nodered_group, etc.). Descriptions are substantive (100-250 chars) and explain WHAT, WHEN, and state mutability. Parameters are typed with enums where appropriate (op fields use Literal unions). Output schemas are documented in code (e.g., _node_summary returns dict with id, type, name, tab, group, x, y, entity). However, output schemas lack formal JSON Schema documentation in tool definitions, LLMs must infer structure from code. Error handling is minimal: only ValueError for missing required args and node not found; no recovery guidance or error categorization. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear read/write distinction. Composition is strong: tools chain well (find_nodes → edit, query → inspect). Parameter descriptions are clear but lack format/range constraints (e.g., max_depth defaults to 20 but no bounds stated). Security: no secrets in params, but no permission gates or audit trail declarations.
Create, update, delete, wire, and replace nodes. Edits accumulate in memory until nodered_session(op='save') or op='deploy'.
Find nodes matching criteria. Returns structured records, not text. Use this when you need node ids to feed into nodered_edit / nodered_group.
One node's complete raw JSON, plus its tab, group, and wiring context.
Create, populate, rename, restyle, and delete groups. Edits accumulate in memory until nodered_session(op='save') or op='deploy'.
Canvas geometry: lint for overlaps, claim free space, arrange nodes, repair group boxes. Edits accumulate in memory until nodered_session(op='save') or op='deploy'.
Read-only reports over the current flows, as human-readable text. Reflects pending in-memory edits, not just what is on disk.
Output schemas not formally documented in tool definitions. LLMs must infer return structure from code (e.g., nodered_find_nodes returns dict with 'count', 'truncated', 'nodes' array, but this is not declared in the tool schema). Agents cannot plan downstream calls without explicit output documentation.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear semantic distinction. nodered_query, nodered_find_nodes, nodered_get_node are read-only; nodered_edit, nodered_group, nodered_tab, nodered_layout, nodered_session are write/destructive. Agents cannot distinguish safe from risky calls without annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Session lifecycle: status, diff, undo, save, deploy, reload. Manages the in-memory edit buffer and persistence.
Create, rename, delete, reorder, and enable/disable tabs. Edits accumulate in memory until nodered_session(op='save') or op='deploy'.
Error handling lacks recovery guidance and categorization. Only ValueError for missing args and node not found; no guidance on retryability, user-fixable errors, or next steps. E.g., 'Node X not found' should suggest 'Try nodered_find_nodes() to search for the node.'
Parameter constraints lack explicit bounds and format specs. max_depth defaults to 20 but no min/max stated; limit defaults to 100 but no bounds documented. Descriptions should include ranges (e.g., 'max_depth: 1 - 50, default 20').
nodered_session(op='save') and op='deploy' are destructive but lack confirmation/dry-run pattern. Agents could accidentally overwrite flows.json or push untested changes to Node-RED without a safety gate.