Electrical single-line and multi-line diagrams: build, check (NF C 15-100, IEC 60364), draw, PDF.
One address for any MCP client. No sign-in needed on this server.

7 read1 act6 other
Grouped by tool name.
Odel charges nothing per call. The publisher may charge for its own service.
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.
*.uniwire.json, format 1.0, defined by the specification
and validated by a published JSON Schema: https://uniwire.sh/schema/v1/uniwire.schema.json.pip install uniwire: Python API, code-first builder and the uniwire command line.in_A, idn_mA, section_mm2, p_kW; unknown fields are
errors (calibre instead of in_A is caught), extensions live in ext. Templates declare a device once.core (always), nfc15100 (French dwellings), iec60364 (cable current-carrying
capacity), plus PLC consistency checks.product references (manufacturer, part number, range, accessories)
on any node or PLC module, aggregated to CSV (uniwire bom).uniwire wires), wire marker list
(uniwire markers), cable schedule (uniwire cables); uniwire marks --write freezes the marks.meta.lang.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.All 52 examples are in examples/ and listed in the documentation; open any of them in the web viewer.
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.
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 assistants
The 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.
Ideas and format proposals are welcome: see CONTRIBUTING.md.
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.
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.