uniwire

io.github.uniwire-devPublished by GitHub account uniwire-devv0.1.8Updated Nov 3, 2026

Electrical single-line and multi-line diagrams: build, check (NF C 15-100, IEC 60364), draw, PDF.

VerifiedStreamable HTTPWeb executableDeveloper ToolsData & AnalyticsMedia & Design

Overview

AI-generated overview

Remote MCP server for uniwire that lets an assistant build, validate, rule-check and draw electrical single-line and multi-line diagrams.

What you can do
  • Read the format reference card, list node types and inspect the fields of one type
  • Validate a diagram document and check it against electrical rule profiles (NF C 15-100, IEC 60364, Enedis, PLC)
  • Describe a document as an outline with stable ids, and edit it by node id with patches
  • Render single-line or multi-line drawings as SVG or PDF and get viewer and PDF links
  • Export wiring lists (wire markers, wires, cables) and a bill of materials
  • List and load 53 example installations as starting points, and normalize a document
When to use it
Useful when the user asks for an electrical diagram, a panel or distribution board layout, or a check of protections, cables and RCDs, and wants a reviewable text document plus drawings and exports instead of a CAD file.
Requirements
A remote streamable HTTP endpoint; no package, environment variable or header is declared. Documents are JSON in the uniwire format, and the assistant should read the reference card before writing one.
Before you install
The server edits and rewrites diagram documents, so patches change the user's file content. Rule checks are automatic and not a conformity certificate; a qualified electrician must verify the installation. On the hosted server, documents are kept 30 days so short viewer links open them, and anyone with the link can open the document. It does not draw control schematics.

Installation

In SourceWeft

  1. Open uniwire in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.uniwire-dev%2Funiwire/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "uniwire": {
      "type": "http",
      "url": "https://mcp.uniwire.sh/mcp"
    }
  }
}

README

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.

[CI] [PyPI] [Python] [License: Apache-2.0]

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.

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 (calibre instead of in_A is caught), extensions live in ext. Templates declare a device once.
  • Rule profiles: core (always), nfc15100 (French dwellings), vde0100 (German installations), iec60364 (cable current-carrying capacity), enedis (connection to the French public network), plus PLC consistency checks.
  • Bill of materials: structured product references (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 --write freezes 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.
  • Drawings in English, French, German, Spanish, Portuguese, Italian, Polish, Turkish, Russian and Simplified Chinese, 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 (in ChatGPT, the uniwire plugin of the plugin directory); details in LLM tools.

Gallery

[French house, TT, single-line diagram]
French house, TT (NF C 15-100), single-line
[German house, TN-C-S, multi-line diagram in conductor colours]
German house, TN-C-S, multi-line in conductor colours
[Office building main LV switchboard]
Office building, main LV switchboard
[MV/LV substation, 1000 kVA]
MV/LV substation, 1000 kVA
[Standby generator, automatic transfer switch, load shedding]
Standby generator, ATS, load shedding
[Motor control centre, multi-line diagram with wire marks]
Motor control centre, multi-line with wire marks

All 53 examples are in examples/ and listed in the documentation; open any of them in the web viewer.

Install

bash
pip install uniwire                 # validation, rules, SVG rendering, bill of materials, exportspip 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:

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": "AC", "children": [            { "type": "breaker", "ref": "-Q11", "use": "C16", "cable": { "cores": "3G", "section_mm2": 1.5 },              "children": [ { "type": "lighting", "label": "Lighting", "points": 6 } ] }          ] },          { "type": "rcd", "ref": "-Q2", "in_A": 40, "idn_mA": 30, "rcd_type": "A", "children": [            { "type": "breaker", "ref": "-Q21", "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.

bash
uniwire validate house.uniwire.json                 # schema + integrityuniwire 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.pdfuniwire render house.uniwire.json --kind multi-line # multi-line power diagramuniwire bom house.uniwire.json -o house.bom.csv     # bill of materialsuniwire wires house.uniwire.json                    # wire list (also: markers, cables, marks)uniwire card                                        # reference card for assistants

The same installation in Python:

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="AC"):            Breaker("-Q11", "C16", cable="3G1,5") >> Lighting("Lighting", points=6)        with RCD("-Q2", "40 A", "30 mA", type="A"):            Breaker("-Q21", "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.

Source: README.md at commit e9a98d8

Tools

14

get_reference_card

Reference card of the uniwire format

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.

Parameterslanglevel

list_types

List the node types

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.

Parameterslangcategory

type_info

Fields of a node type

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.

Parameterslangtyperequired

validate

Validate an electrical diagram

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).

Parametersdocumentrequired

check

Check an electrical installation (NF C 15-100, IEC 60364)

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).

Parametersdocumentrequiredprofiles

describe

Outline of an electrical diagram

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.

Parameterslangdocumentrequired

apply_patch

Edit an electrical diagram

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).

Parametersopsrequireddocumentrequiredvalidate

render

Draw the single-line or multi-line diagram

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'.

Parameterskindpathviewcolorsheetformatdocumentrequiredconductor_colors

wiring

Wire list, wire markers and cable schedule

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.

Parametersviewwhatdocumentrequired

bom

Bill of materials

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.

Parametersdocumentrequired

list_examples

List the example installations

List the 53 example installations (dwellings, shops, offices, workshops, PV, EV charging, UPS, MV/LV substations, PLCs): name, title, language, profiles, earthing, system.

Takes no parameters.

get_example

Get an example installation

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.

Parametersnamerequired

normalize

Normalized document

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).

Parametersdocumentrequired

Version history

7
  1. v0.1.8LatestNov 3, 2026
  2. v0.1.7Nov 1, 2026
  3. v0.1.6Oct 30, 2026
  4. v0.1.5Oct 30, 2026
  5. v0.1.4Oct 29, 2026
  6. v0.1.1Oct 13, 2026
  7. v0.1.0Oct 13, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts