uniwire
OfficialInteract with uniwire electrical diagrams as code: learn the format, validate/check, edit, render, and export.
Get a reference card, list node types/categories, and inspect all fields/enums of a type.
Validate a document and check it against rule profiles (NF C 15-100, IEC 60364, PLC), returning errors/warnings/info.
Describe a document as a text outline with stable node ids for review or patching.
Edit a document by node id: set, add, remove, move, rename, link/unlink nodes.
Render single-line or multi-line diagrams as SVG or PDF with color/conductor-color options.
Generate clickable viewer and PDF links for the user.
Export wiring data: wire markers, wire list, and cable schedule.
Generate a bill of materials grouped by manufacturer/part number.
List or fetch 52 example installations.
Normalize documents: apply templates, assign ids, canonical numbers.
uniwire
Electrical diagrams, as code.
An open standard to describe electrical installations, and the reference Python library that validates them, checks them against rules and draws their single-line and multi-line diagrams.
You describe the installation (sources, protective devices, cables, loads, PLCs) in a *.uniwire.json
file or in Python, and uniwire computes the drawings. No coordinates, no CAD file: a text file you can
review and diff.
Format:
*.uniwire.json, format 1.0, defined by the specification and validated by a published JSON Schema: https://uniwire.sh/schema/v1/uniwire.schema.json.Library:
pip install uniwire: Python API, code-first builder and theuniwirecommand line.Documentation: https://uniwire.sh/docs/
Web viewer: https://uniwire.sh/viewer/, paste a document to validate, check and draw it in the browser.
Features
Single-line and multi-line diagrams from the same document: the multi-line view derives every conductor (L1, L2, L3, N, PE, PEN) from the single-line data, with no extra input.
53 node types: utility grid, transformers, generators, UPS, PV, batteries, inverters; breakers, RCDs, RCBOs, fuses, switch-disconnectors, contactors, motor starters, transfer switches, SPDs, protection relays, instrument transformers, insulation monitors; busbars, boards, terminal blocks; lighting, sockets, heating, motors, EV chargers, modular PLCs and more.
Tree + links: the power tree is the backbone; transfers, bus ties, infeeds, earthing, control, interlocks, trips, measurements and data buses are links. A terminal / connectivity-node graph is derived automatically, with CIM, IFC and IEC 61850 SCL mappings.
Closed typing and unit-suffixed fields:
in_A,idn_mA,section_mm2,p_kW; unknown fields are errors (calibreinstead ofin_Ais caught), extensions live inext. Templates declare a device once.Rule profiles:
core(always),nfc15100(French dwellings),iec60364(cable current-carrying capacity),enedis(connection to the French public network), plus PLC consistency checks.Bill of materials: structured
productreferences (manufacturer, part number, range, accessories) on any node or PLC module, aggregated to CSV (uniwire bom).Wire and cable marking: marking rules per view (manual, sequential, per potential, pattern), marks drawn on the multi-line diagram, and CSV exports: wire list (
uniwire wires), wire marker list (uniwire markers), cable schedule (uniwire cables);uniwire marks --writefreezes the marks.Colour modes: conductors in their IEC 60445 or North-American colours, or colouring by phase, source, status or voltage level.
Sheets: paper size, sub-tree views, automatic sheet splitting with cross-references, circuit schedule, enclosure frames, title block, revisions and notes. SVG output is deterministic and diff-friendly; the multi-sheet PDF has clickable links between sheets.
English and French rendering, selected per document with
meta.lang.LLM tooling: a reference card generated from the model (
uniwire card), a text outline with stable ids (uniwire describe), id-based edits (uniwire patch), an MCP server (uniwire-mcp, stdio) and a hosted MCP endpoint at https://mcp.uniwire.sh/mcp, plus llms.txt for assistants (full reference card included). Setup for ChatGPT, Claude, Cursor and VS Code: uniwire in your assistant; details in LLM tools.
Related MCP server: dgmo-mcp
Gallery
All 52 examples are in examples/ and listed in the documentation; open any of them in the web viewer.
Install
pip install uniwire # validation, rules, SVG rendering, bill of materials, exports
pip install "uniwire[pdf]" # + PDF output (reportlab)
pip install "uniwire[mcp]" # + MCP server (uniwire-mcp)
pip install "uniwire[iec81346]" # + optional IEC 81346-2 class table (separate CC BY-SA 4.0 data package)Python 3.10 or later. The only required dependency is pydantic.
Quickstart
A document in JSON:
{
"$schema": "https://uniwire.sh/schema/v1/uniwire.schema.json",
"uniwire": "1.0.0",
"profiles": ["nfc15100"],
"meta": { "title": "Small house", "lang": "en" },
"installation": { "earthing": "TT", "system": "1P+N", "un_V": 230 },
"templates": { "C16": { "type": "breaker", "in_A": 16, "curve": "C" } },
"sources": [
{ "type": "grid", "label": "Utility", "children": [
{ "type": "main_breaker", "ref": "-Q0", "range_A": "15-45", "in_A": 45, "idn_mA": 500, "selective": true,
"children": [
{ "type": "rcd", "ref": "-Q1", "in_A": 40, "idn_mA": 30, "rcd_type": "A", "children": [
{ "type": "breaker", "ref": "-Q11", "use": "C16", "cable": { "cores": "3G", "section_mm2": 1.5 },
"children": [ { "type": "lighting", "label": "Lighting", "points": 6 } ] },
{ "type": "breaker", "ref": "-Q12", "in_A": 20, "curve": "C", "cable": { "cores": "3G", "section_mm2": 2.5 },
"children": [ { "type": "socket", "label": "Sockets", "points": 8 } ] }
] }
] }
] }
]
}The tree is the power flow (source, protective devices, loads); whatever falls outside the tree
(transfer switches, bus ties, control and data connections) goes in links.
uniwire validate house.uniwire.json # schema + integrity
uniwire check house.uniwire.json # rule profiles (exit code 1 on errors)
uniwire render house.uniwire.json # SVG sheets in out/house/
uniwire render house.uniwire.json -f pdf -o house.pdf
uniwire render house.uniwire.json --kind multi-line # multi-line power diagram
uniwire bom house.uniwire.json -o house.bom.csv # bill of materials
uniwire wires house.uniwire.json # wire list (also: markers, cables, marks)
uniwire card # reference card for assistantsThe same installation in Python:
from uniwire.build import *
with Installation("Small house", earthing="TT", system="1P+N", un="230 V", profiles=["nfc15100"]) as inst:
with Grid("Utility"), MainBreaker("-Q0", "15-45 A", idn="500 mA", selective=True):
with RCD("-Q1", "40 A", "30 mA", type="A"):
Breaker("-Q11", "C16", cable="3G1,5") >> Lighting("Lighting", points=6)
Breaker("-Q12", "C20", cable="3G2,5 18 m") >> Socket("Sockets", points=8)
for finding in inst.check():
print(finding)
inst.save("house.uniwire.json")
inst.render("house.pdf")with makes an element the parent of everything created inside it, >> chains elements, ratings and
cables are written the way they appear on drawings ("C16", "3G2,5 18 m"). See the
code-first API and the Python API and CLI.
Roadmap
Terminals, terminal strips and wires: UEP-0001, a draft for format 2.0 (named ports, terminal strips, wires and cables as objects, potentials).
Control schematics: coils, auxiliary contacts with cross-references, terminal plans and wire numbers, built on named ports.
Exports: DXF drawings, pandapower networks for load-flow and short-circuit studies.
Ideas and format proposals are welcome: see CONTRIBUTING.md.
Contributing
Bug reports, examples, rules, symbols and translations are welcome. Read CONTRIBUTING.md (development setup, tests, uniwire Enhancement Proposals) and the Code of Conduct. Report security issues privately, see SECURITY.md.
Licences
Code, CLI and JSON Schema: Apache License 2.0.
Specification text: CC BY 4.0: implement it freely, in any software.
Optional data package
uniwire-data-iec81346(IEC 81346-2 class table): CC BY-SA 4.0, distributed separately (pip install "uniwire[iec81346]").
See NOTICE for third-party notices.
Available Tools
14 toolsapply_patchEdit an electrical diagramARead-onlyIdempotentInspect
Edit an electrical diagram by node id (change a rating, add a circuit, move a load...) and return the new document. ops (applied in order): {"op":"set","id":ID,"path":"in_A","value":20} (null value removes; no id = document root, e.g. path "installation.earthing"); {"op":"add","parent":ID,"node":{...},"index":0} (or "at":"sources"); {"op":"remove","id":ID}; {"op":"move","id":ID,"parent":ID,"index":0}; {"op":"rename","id":ID,"new_id":NEW}; {"op":"link","link":{"kind":"control","from":ID,"to":ID}}; {"op":"unlink","id":LINK_ID} or {"op":"unlink","from":ID,"to":ID,"kind":K}. On failure returns ok=false and errors naming the failing op index (null = validation of the result).
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | The edit operations, applied in order (list, or its JSON text): see the description for the operation forms. | |
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). | |
| validate | No | Validate the resulting document (default true). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered; the description adds real value beyond that by disclosing that ops are applied in order and that failures return ok=false with errors naming the failing op index (null meaning result validation failed). It doesn't explicitly confirm that edits are non-persisting (returned rather than saved), which the readOnly annotation implies but the text never states outright.
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?
Purpose and return value are front-loaded in the first clause, and the dense op examples each carry required information rather than filler. The block is long and the inline JSON snippets are syntactically crowded, but every line earns its place given the schema defers op detail to the text.
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 an output schema present, return values need not be explained, yet the description still covers the failure shape, which is genuinely useful. The document and validate parameters are documented in-schema. A brief note on non-persistence/idempotency would round it out, but nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The ops parameter's own schema is an opaque array/string with additionalProperties:true and defers with 'see the description', so the description is the only source of the op grammar — set/add/remove/move/rename/link/unlink, their fields, ordering, and the null-value-removes and no-id-equals-root conventions. That is substantive semantics no structured field provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Edit an electrical diagram by node id'), enumerates representative edit kinds (rating, circuit, load), and says the new document is returned. This cleanly separates it from read-only siblings like normalize, validate, render and viewer_link without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the op grammar rather than stated: an agent can infer 'use this to make edits' but the description never says when to prefer apply_patch over normalize/render/validate, nor any ordering or prerequisite for getting a document first. Mentions get_example/apply_patch/normalize only as document sources, which is a weak routing hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bomBill of materialsARead-onlyIdempotentInspect
Compute the bill of materials (nomenclature) of an electrical installation from its document: one row per manufacturer / part number for the nodes with a product reference, then one row per kind of equipment without a reference (type and main characteristics in 'spec', e.g. 'C16 1P+N') and per kind of cable (total length in 'length_m'), with quantities and the reference designations involved. Use it to prepare a quote or an order; wiring gives the wire list and cable schedule.
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond that: what each output row represents and the special 'spec'/'length_m' fields, which is what an agent needs to interpret results. It does not mention performance or limits, but for a pure computation that is minor.
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?
Front-loaded with the verb and resource, then the output composition, then the routing sentence. The enumeration of row types is dense but each element carries information an agent needs; no filler sentences. Slightly long, but appropriately sized for the detail conveyed.
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 an output schema present, the description need not restate the full return contract, and it still explains the semantic meaning of the rows (manufacturer/part number, spec, length_m). Parameter, annotation, and output coverage are all adequate; only edge cases like malformed documents are unaddressed.
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% and the 'document' parameter is fully documented in the schema (JSON object or JSON text, as returned by get_example/apply_patch/normalize, file path accepted locally). The description only says 'from its document' and adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Compute the bill of materials ... of an electrical installation from its document') and describes the exact output shape in domain terms (one row per manufacturer/part number, spec, length_m). It also contrasts itself with the sibling 'wiring', so the agent can distinguish the two without opening schemas.
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?
Explicitly states the use case ('Use it to prepare a quote or an order') and names the alternative sibling ('wiring gives the wire list and cable schedule'), which tells the agent which tool produces what. It lacks an explicit when-not condition or prerequisites, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
checkCheck an electrical installation (NF C 15-100, IEC 60364)ARead-onlyIdempotentInspect
Check an electrical installation (single-line diagram, panel, schéma unifilaire, tableau électrique): validates the document, then applies the rule profiles (NF C 15-100 'nfc15100', French grid connection 'enedis', IEC 60364 'iec60364', PLC; default: the document's 'profiles'; 'core' always applies): breaker ratings against cable sections, RCDs, circuits per protection, selectivity... Returns findings (level error/warning/info, rule, node id, message, source), a summary, 'scope' (what the checks cover and do not cover: automatic checks of the document data, not a conformity certificate), viewer_url (the document in the uniwire web editor: drawing, findings, downloads) and pdf_url (the PDF drawn by uniwire).
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). | |
| profiles | No | Rule profiles to apply, e.g. ['nfc15100', 'enedis'] (France) or ['iec60364']; default: the 'profiles' of the document. 'core' always applies. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: the finding shape (level, rule, node id, message, source), the returned viewer_url/pdf_url, and the important caveat that 'scope' means automatic document-data checks, not a conformity certificate.
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?
Front-loaded with the verb and resource, then the rule application, then the return shape — a sensible order. It is somewhat dense with parenthetical enumerations ('schéma unifilaire, tableau électrique') and repeats the profile identifiers already in the schema, which costs a little efficiency but does not obscure the point.
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 an output schema exists, the description need not detail return values, yet it usefully characterises the findings, scope caveat, and URLs. It is complete enough to call correctly (accepted document forms, profile defaults), with the only real gap being no relationship to the sibling 'validate' tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description's profile details ('nfc15100', 'enedis', 'iec60364', default behaviour, 'core' always applies) largely duplicate the schema's own wording, so the added meaning over structured data is marginal — baseline 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?
States a concrete verb (check/validate) and resource (an electrical installation document: single-line diagram, panel, schéma unifilaire, tableau électrique) and names the rule profiles applied. It is clear what the tool does, but it never distinguishes itself from the sibling 'validate' tool, which sounds like an overlapping validation step.
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?
It explains profile defaults ('default: the document's profiles', 'core always applies') and clarifies scope, which implies the tool's place in the workflow after get_example/apply_patch/normalize. However, it gives no explicit when-to-use guidance or contrast with the sibling 'validate', so the choice between the two is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describeOutline of an electrical diagramARead-onlyIdempotentInspect
Return a text outline of an electrical diagram: installation, full tree of the panel with stable ids, ratings and cables, links, interlocks, boards and findings summary. Use it to read a document and find the node ids before apply_patch.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the returned texts: 'en' (English) or 'fr' (French). | en |
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds value by framing the tool as a read/inspect step that yields stable node ids needed for a later mutation, which is workflow context the annotations do not provide. No auth, rate-limit, or failure-mode detail is offered.
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, front-loaded with the return payload and followed by the usage rule. The content enumeration is dense but each item earns its place by telling the agent what the outline contains.
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 an output schema covering the return shape, full schema coverage for parameters, and annotations carrying the safety profile, the description supplies the one thing structured fields cannot: why and when to call it (node-id discovery before apply_patch). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (document, lang) are already fully documented in the schema, including accepted formats and language values. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return a text outline) and resource (electrical diagram), and enumerates the exact contents: installation, panel tree with stable ids, ratings, cables, links, interlocks, boards, findings. This distinguishes it from siblings like render, bom, or validate that operate on the same document.
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?
Explicitly names the workflow and the sibling: 'find the node ids before apply_patch', which tells the agent when this tool belongs in a sequence. It stops short of stating exclusions (e.g. when to prefer render or viewer_link instead), so it is clear context without full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exampleGet an example installationARead-onlyIdempotentInspect
Return an example installation document by name. Use it as a starting point for a similar installation, then edit it with apply_patch; list_examples gives the names.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Example name from list_examples, or its number prefix (e.g. '02'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful workflow behavior (the document is meant to be a template mutated via apply_patch), which is context annotations cannot express. It does not elaborate on document size or format, but the output schema presumably covers return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core action front-loaded and the workflow/alternative trailing. Every clause carries information an agent needs.
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 an output schema present, return values need no explanation, and annotations carry the safety profile. What remains — how to obtain a name, what to do with the result, what tool mutates it — is all stated, so nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents that the name comes from list_examples and may be a number prefix. The description's "by name" adds no format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return an example installation document") plus the lookup key ("by name"). An agent can distinguish it from list_examples, which is named as the source of names, without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ("as a starting point for a similar installation") and the follow-on action ("edit it with apply_patch"), and routes to the sibling that supplies valid names (list_examples). This is a complete workflow instruction, not vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reference_cardReference card of the uniwire formatARead-onlyIdempotentInspect
Return the reference card of the uniwire format for electrical diagrams: document skeleton, node types (breakers, RCDs, cables, loads, transformers, PV...) and their fields, enums, links, pitfalls, examples. Read it once before writing a document; type_info gives the fields of one type in detail.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the returned texts: 'en' (English) or 'fr' (French). | en |
| level | No | 'compact' (about 3k tokens) or 'full' (every field). | compact |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds the workflow signal that this is a one-time prerequisite read, but discloses nothing about cost, rate limits, or the practical weight of the call beyond what the schema's 'compact/full' level already implies. Adequate but not additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The purpose and content inventory come first and the sibling routing note is deferred to the end where it belongs.
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?
An output schema exists, so return-value documentation is unnecessary. Combined with complete schema coverage and full annotations, the description supplies everything an agent needs: what it returns, when to call it, and which sibling to use for a narrower question.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – both 'lang' (en/fr) and 'level' (compact ~3k tokens vs full every field) are fully documented in the schema with defaults. The description adds no parameter syntax or behavior beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Return the reference card of the uniwire format for electrical diagrams') followed by an enumeration of the actual contents: document skeleton, node types, fields, enums, links, pitfalls, examples. It explicitly contrasts itself with the sibling type_info, so an agent can route between the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States both the timing ('Read it once before writing a document') and the alternative with its distinguishing scope ('type_info gives the fields of one type in detail'). When-to-use and when-to-use-something-else are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_examplesList the example installationsARead-onlyIdempotentInspect
List the 52 example installations (dwellings, shops, offices, workshops, PV, EV charging, UPS, MV/LV substations, PLCs): name, title, language, profiles, earthing, system.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds the fixed cardinality (52) and the returned field list, but the field list largely restates what the output schema already provides, so incremental behavioral value is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the count and resource before the category enumeration. The parenthetical category list is long but earns its place by telling the agent what domains the 52 examples span; slightly dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not document return values, and it does not need to explain parameters. The domain coverage is stated, so an agent knows what it will get; only the relationship to get_example/list_types is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. Nothing about argument semantics is missing because there are no arguments to disambiguate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the 52 example installations') and even enumerates the domain categories covered (dwellings, shops, offices, PV, EV charging, substations, PLCs), which is far more than a tautology. The singular sibling get_example is not named, so differentiation is left to the reader, but the plural/discovery intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use statement, nor a pointer to get_example for fetching a single installation. The catalog-listing purpose implies this is the entry-point/discovery call, but the agent must infer that from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_typesList the node typesARead-onlyIdempotentInspect
List the node types of the format (type, category, label), optionally for one category. Use it to find the type name of a device or load before writing a node; type_info then gives its fields.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the returned texts: 'en' (English) or 'fr' (French). | en |
| category | No | Only the types of this category: source, measure, protection, switching, control, converter, conductor, container, connector or load; default: all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds value by disclosing the return tuple format and the role this call plays in the authoring workflow, though it says nothing about pagination or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with what the tool returns and followed by the usage rule. No filler and nothing redundant with the structured fields.
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?
Output schema exists, so return-value documentation is not required, and the annotations handle the safety profile. For a two-optional-parameter read-only list tool, the description plus schema plus output schema leaves nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — both lang and category (with its enumerated values) are fully documented in the schema. The description only paraphrases the category filter as "optionally for one category" and never mentions lang, so it adds little beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the node types") and even specifies the returned tuple shape (type, category, label). It distinguishes itself from the sibling type_info by assigning that tool the job of returning fields.
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?
Explicitly prescribes the when: use it to find a device's or load's type name before writing a node. It also names the follow-on alternative (type_info) and what that tool provides, leaving no routing ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
normalizeNormalized documentARead-onlyIdempotentInspect
Return the resolved form of a document: templates ('use') applied, every node and link id assigned, numbers in canonical form. Use it to read a document exactly as the rules and drawings see it, or to get stable ids before apply_patch; it does not apply the electrical rules (see check).
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds value beyond that by disclosing what the resolution actually does (templates via 'use', id assignment, canonical numbers) and by stating what it does NOT do (electrical rules). It doesn't mention determinism caveats or performance, but the annotation-covered safety plus the transformation semantics make this strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense clauses with zero filler; the transformation list is front-loaded, usage conditions follow, and the exclusion is last. Every phrase carries information.
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?
An output schema exists, so return values need not be explained, and the description appropriately focuses on behavior and usage instead. Combined with the annotations, an agent has everything needed to call this 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?
Only one parameter (document) and schema coverage is 100%, so the schema already documents accepted forms (JSON object, JSON text, file path when local). The description adds nothing about the input format beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return the resolved form) and enumerates the three transformations it performs: template expansion, id assignment, and number canonicalization. It clearly distinguishes itself from check (electrical rules) and apply_patch (which consumes the stable ids).
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?
Explicitly names two use cases ('read a document exactly as the rules and drawings see it' and 'get stable ids before apply_patch') and an exclusion ('it does not apply the electrical rules (see check)'). This routes the agent to the correct sibling without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renderDraw the single-line or multi-line diagramARead-onlyIdempotentInspect
Draw the electrical diagram (schéma unifilaire / multifilaire). kind: 'single-line' or 'multi-line'; view: a view id of the document (e.g. a wire-marking view). format 'svg' returns the SVG text of every sheet (or of 'sheet', numbered from 1); 'pdf' writes to 'path' if given, else returns base64 (requires the uniwire[pdf] extra); on the hosted server it returns pdf_url (the PDF drawn by uniwire) instead. color: 'none' | 'conductors' | 'phase' | 'source' | 'status' | 'voltage' (adds a legend); conductor_colors: 'iec' (IEC 60445) | 'us'.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 'single-line' or 'multi-line' (one line per conductor). | single-line |
| path | No | File to write the PDF to (local server only). | |
| view | No | Id of a view of the document (its 'views' list); default: the first view of the requested kind. | |
| color | No | Colouring: 'none', 'conductors', 'phase', 'source', 'status' or 'voltage' (adds a legend). | |
| sheet | No | Only this sheet (numbered from 1); default: all. | |
| format | No | 'svg' or 'pdf'. | svg |
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). | |
| conductor_colors | No | Conductor colour convention: 'iec' (IEC 60445) or 'us'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely useful operation context beyond that: the uniwire[pdf] extra requirement, the hosted-server pdf_url behavior, and that certain color modes add a legend.
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 purpose is front-loaded, but the body is a dense multi-clause run-on with embedded line breaks and a parenthetical example ('e.g. a wire-marking view') that adds little. Several clauses duplicate schema content rather than adding new information.
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?
An output schema exists, yet the description still usefully clarifies the return shape differences (SVG text vs written PDF vs base64 vs pdf_url), which is the main ambiguity for an 8-parameter render call. Combined with the annotations, an agent has what it needs to invoke 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?
Schema description coverage is 100%, so every parameter (kind, view, format, color, sheet, conductor_colors, path, document) is already documented in the schema. The description largely restates those definitions verbatim, adding only the legend note and the 'numbered from 1' sheet detail, so the baseline 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?
States a specific verb ('Draw') and resource ('the electrical diagram', with the domain terms schéma unifilaire/multifilaire), and immediately scopes it to the two variants via 'kind'. An agent can distinguish this rendering tool from siblings like viewer_link, wiring, or bom without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance for invocation: 'pdf' writes to 'path' if given, else returns base64, and on the hosted server returns pdf_url instead; 'svg' returns SVG text of every sheet or of 'sheet'. It never explicitly names an alternative sibling (e.g. viewer_link for interactive viewing), so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_infoFields of a node typeARead-onlyIdempotentInspect
Return every field of one node type with its description, unit and allowed values (enums). Use it before writing or editing a node of that type; list_types gives the type names.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the returned texts: 'en' (English) or 'fr' (French). | en |
| type | Yes | A node type name from list_types, e.g. 'breaker', 'rcd', 'socket'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds behaviorally relevant context the annotations do not: this is a schema-introspection call that should precede any write, and it discloses the shape of the returned data (fields, units, enums).
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 compact sentences with zero filler; the primary purpose is front-loaded and the usage cue plus sibling reference follow immediately.
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 an output schema present, the definition need not describe return values, and it already covers purpose, preconditions, and the content categories returned. Nothing an agent needs to invoke this two-parameter read tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (lang, type) are documented in the schema, including the en/fr values and example type names. The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Return every field of one node type') and even enumerates the payload ('description, unit and allowed values (enums)'). It names the sibling list_types as the source of type names, so an agent can separate it from other read tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use: call it before writing or editing a node of that type, and points to list_types for obtaining valid type names. There are no explicit exclusions or when-not-to-use notes, but the workflow context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateValidate an electrical diagramARead-onlyIdempotentInspect
Validate a uniwire document (electrical diagram as JSON) against the format only: structure, types, ids, references and links, without the electrical rules (use check for those). Returns valid + issues, each naming the node id and field when possible, plus viewer_url (the document in the uniwire web editor) and pdf_url (the PDF drawn by uniwire).
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description still adds real context: validation is format-only, each issue names the node id and field, and it returns viewer_url and pdf_url. It does not contradict any annotation, though the return details overlap with the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and scope, then the return contract. Slightly dense and the trailing URL descriptions overlap with the output schema, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An agent has everything needed to select and call it: scope boundary vs. 'check', accepted input forms via the schema, and an output schema covering return values. Complete, with the description's return-value exposition being mild redundancy rather than a gap.
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?
Only one parameter and schema description coverage is 100%; the schema already explains that 'document' accepts a JSON object, JSON text, or a file path and where such values come from. The description adds no additional parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (a uniwire document), and immediately narrows the scope to 'format only: structure, types, ids, references and links' while naming what it is not ('without the electrical rules'). This lets an agent distinguish it from the sibling 'check' without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use this for schema/format validation, use 'check' for electrical rules. That is an explicit when-to-use paired with a named alternative, which the calibration rubric reserves for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viewer_linkLinks to open the diagram and its PDFARead-onlyIdempotentInspect
Links to a document: viewer_url opens it in the uniwire web editor (drawing, single-line and multi-line, rule findings, PDF and SVG downloads, nothing to install); pdf_url is the PDF drawn by uniwire. On the hosted server the document is kept 30 days so that the short links open it (anyone with a link can open it); elsewhere it travels in the link (after '#') and is stored nowhere.
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description goes further with genuinely non-obvious context: on the hosted server documents are retained 30 days so short links resolve and anyone with a link can open them, whereas elsewhere the document travels in the link after '#' and is stored nowhere.
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?
Front-loaded with 'Links to a document' and each clause carries weight, covering viewer_url contents, pdf_url, and the storage/retention difference. It is dense and slightly run-on, but no sentence is redundant.
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?
An output schema exists, so return values need not be re-explained, and the description adds the retention and privacy context an agent would otherwise lack. For a simple read-only link generator with one fully documented parameter, this is nearly 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?
Schema description coverage is 100% and the single 'document' parameter is fully documented in the schema (accepts a JSON object, its JSON text, or a local file path). The description adds no syntax or format detail beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it produces links (viewer_url and pdf_url) to open a uniwire document in the web editor and as a PDF. This is clearly distinguishable from siblings like render, wiring, or bom, which perform different functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the returned links do and where the document is stored, which implies the use case (obtain openable/downloadable links). However, it never explicitly states when to prefer this over render, wiring, or bom, nor any prerequisites for calling it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wiringWire list, wire markers and cable scheduleARead-onlyIdempotentInspect
Wiring exports of an installation as rows with stable column names (repérage des fils, carnet de câbles): what='markers' (one row per wire end, for label printers), 'wires' (wire list) or 'cables' (cable schedule). Marks follow the wire_marking rules of the view (id), by default the first view that declares them.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Id of a view of the document (its 'views' list); default: the first view of the requested kind. | |
| what | No | 'markers' (one row per wire end, for label printers), 'wires' (wire list) or 'cables' (cable schedule). | markers |
| document | Yes | The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: marks follow the wire_marking rules of a view, and the view defaults to the first one that declares them. It also notes columns are stable, hinting at output stability. This is useful context on defaults and derivation rules.
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?
One compact paragraph that front-loads the core purpose and then the mode options, with no filler sentences. The awkward line breaks and inline French glosses cost a little readability but do not bloat the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param, read-only export tool with an output schema present and full annotation coverage, the description supplies the derivation rules and default-selector behavior an agent needs. Return-value format need not be explained given the output schema. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters, including the what enum values and the view default. The description largely restates the what semantics without adding format or syntax detail (e.g., how the view id is obtained). Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: exports an installation's wiring as rows with stable column names, and enumerates the three output kinds (markers, wires, cables). The mode enumeration clearly delineates what the tool produces. It does not, however, explicitly differentiate itself from siblings such as bom or render, which also derive outputs from a document.
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 what values ('markers' for label printers, 'wires', 'cables') imply which use case each selects, giving implied rather than explicit guidance. There is no statement of when to prefer this tool over siblings like bom or list_types, and no exclusions. Adequate but leaves selection largely to inference.
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.
13 tool updates
v0.1.3-dev- Changed
apply_patch3 fields changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)." - added
Input schema / properties / ops / descriptionAdded value: +"The edit operations, applied in order (list, or its JSON text): see the description for the operation forms." - added
Input schema / properties / validate / descriptionAdded value: +"Validate the resulting document (default true)."
- Changed
bom1 field changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)."
- Changed
check2 fields changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)." - added
Input schema / properties / profiles / descriptionAdded value: +"Rule profiles to apply, e.g. ['nfc15100', 'enedis'] (France) or ['iec60364']; default: the 'profiles' of the document. 'core' always applies."
- Changed
describe2 fields changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)." - added
Input schema / properties / lang / descriptionAdded value: +"Language of the returned texts: 'en' (English) or 'fr' (French)."
- Changed
get_example1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Example name from list_examples, or its number prefix (e.g. '02')."
- Changed
get_reference_card2 fields changed- added
Input schema / properties / lang / descriptionAdded value: +"Language of the returned texts: 'en' (English) or 'fr' (French)." - added
Input schema / properties / level / descriptionAdded value: +"'compact' (about 3k tokens) or 'full' (every field)."
- Changed
list_types2 fields changed- added
Input schema / properties / category / descriptionAdded value: +"Only the types of this category: source, measure, protection, switching, control, converter, conductor, container, connector or load; default: all." - added
Input schema / properties / lang / descriptionAdded value: +"Language of the returned texts: 'en' (English) or 'fr' (French)."
- Changed
normalize1 field changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)."
- Changed
render8 fields changed- added
Input schema / properties / color / descriptionAdded value: +"Colouring: 'none', 'conductors', 'phase', 'source', 'status' or 'voltage' (adds a legend)." - added
Input schema / properties / conductor_colors / descriptionAdded value: +"Conductor colour convention: 'iec' (IEC 60445) or 'us'." - added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)." - added
Input schema / properties / format / descriptionAdded value: +"'svg' or 'pdf'." - added
Input schema / properties / kind / descriptionAdded value: +"'single-line' or 'multi-line' (one line per conductor)." - added
Input schema / properties / path / descriptionAdded value: +"File to write the PDF to (local server only)." - added
Input schema / properties / sheet / descriptionAdded value: +"Only this sheet (numbered from 1); default: all." - added
Input schema / properties / view / descriptionAdded value: +"Id of a view of the document (its 'views' list); default: the first view of the requested kind."
- Changed
type_info2 fields changed- added
Input schema / properties / lang / descriptionAdded value: +"Language of the returned texts: 'en' (English) or 'fr' (French)." - added
Input schema / properties / type / descriptionAdded value: +"A node type name from list_types, e.g. 'breaker', 'rcd', 'socket'."
- Changed
validate1 field changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)."
- Changed
viewer_link1 field changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)."
- Changed
wiring3 fields changed- added
Input schema / properties / document / descriptionAdded value: +"The uniwire document of the electrical installation: a JSON object, or its JSON text, as returned by get_example, apply_patch or normalize (a file path is accepted when the server runs locally)." - added
Input schema / properties / view / descriptionAdded value: +"Id of a view of the document (its 'views' list); default: the first view of the requested kind." - added
Input schema / properties / what / descriptionAdded value: +"'markers' (one row per wire end, for label printers), 'wires' (wire list) or 'cables' (cable schedule)."
14 tool updates
v0.1.1- First observed
apply_patch - First observed
bom - First observed
check - First observed
describe - First observed
get_example - First observed
get_reference_card - First observed
list_examples - First observed
list_types - First observed
normalize - First observed
render - First observed
type_info - First observed
validate - First observed
viewer_link - First observed
wiring
TDQS
Scored across 14 tools
Most tools have clearly distinct roles (validate vs check is explicitly contrasted, list_types vs type_info vs get_reference_card form a clean hierarchy). Minor overlap exists: normalize and describe both advertise 'get stable ids before apply_patch', and render/viewer_link both surface viewer_url/pdf_url. Descriptions resolve these, so an agent can still pick correctly.
A mix of conventions is present: verb_noun (get_reference_card, apply_patch, list_examples, get_example), bare verbs (validate, check, describe, render, normalize), and bare nouns/acronyms (type_info, wiring, bom, viewer_link). All names are snake_case and fairly readable, but there is no single predictable pattern.
14 tools is within a sensible range for a rich domain spanning format reference, editing, validation, rendering, and exports. A couple of pairs (render/viewer_link, bom/wiring) could conceivably be tightened, but each tool covers a real, non-trivial capability.
The surface covers the full authoring lifecycle well: learn the format (reference card, types, examples), obtain a document (get_example), edit it (apply_patch, normalize), validate (validate/check), and export (render, wiring, bom). No explicit blank-document creation or delete/cleanup operation is provided, a minor gap that examples plus apply_patch largely work around.
Maintenance
Related MCP Connectors
Render, verify, describe, and safely edit Mermaid diagrams through MCP.
MCP Spec Compliance MCP — audits any MCP server.json against the official Model Context Protocol
Collaborative whiteboard MCP server — create objects, connectors, C4 diagrams, and manage boards
Headless CAD engine & MCP server for 2D/3D drafting, solids, DXF/SVG export, and automation.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for DACH e-invoicing. Create XRechnung (UBL) and ZUGFeRD 2.3 (Factur-X CII) invoices, validate against EN 16931 rules, extract data from XML, and convert between UBL, CII and JSON formats.649 npm2MIT
- AlicenseAqualityAmaintenanceMCP server for rendering 35+ diagram types — sequence, flowchart, ER, C4, gantt, mindmap, infra, and more — to SVG/PNG with browser preview. Local rendering with palette/theme support and shareable diagrammo.app URLs.11856 npm3MIT
- AlicenseAqualityAmaintenanceModel Context Protocol (MCP) server for French Electronic Invoicing (NF XP Z12-013). Provide tools to validate, generate, and explore API specifications for PDP/OD interoperability.34Apache 2.0
- AlicenseAqualityAmaintenanceEnables natural-language interaction with Ladybug Tools for building performance simulation, 3D modeling, and data visualization, allowing agents to perform complex environmental analysis tasks without CAD software.335 PyPI11GPL 3.0