uniwire

io.github.uniwire-dev由 GitHub 账号 uniwire-dev 发布v0.1.8更新于 Nov 3, 2026

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

已验证Streamable HTTP可网页运行开发者工具数据与分析媒体与设计

概览

AI 生成的概览

uniwire 的远程 MCP 服务器,让助手编写、校验、按规范检查并绘制电气单线图和多线图。

可以做什么
  • 读取格式参考卡、列出节点类型并查看某一类型的字段
  • 校验图纸文档,并按电气规则配置(NF C 15-100、IEC 60364、Enedis、PLC)进行检查
  • 以带稳定 id 的大纲描述文档,并按节点 id 打补丁修改
  • 渲染单线图或多线图为 SVG 或 PDF,并返回查看器链接和 PDF 链接
  • 导出接线清单(线号、导线、电缆)和物料清单
  • 列出并载入 53 个示例装置作为起点,以及规范化文档
适用场景
当用户需要电气图、配电箱或配电盘布局,或需要检查保护器件、电缆和漏电保护器时适用;它给出可审阅、可对比的文本文档,以及图纸和导出文件,而不是 CAD 文件。
运行要求
远程 streamable HTTP 端点;未声明任何软件包、环境变量或请求头。文档为 uniwire 格式的 JSON,助手在编写前应先阅读参考卡。
安装前请注意
服务器会编辑并重写图纸文档,补丁会改变用户的文件内容。规则检查是自动检查,不是合规证书,须由合格电工核实装置。在托管服务器上文档保留 30 天以便短链接打开,任何拿到链接的人都能打开该文档。它不绘制控制原理图。

安装

在 SourceWeft 中

  1. 打开 控制台中的 uniwire,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.uniwire-dev%2Funiwire/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "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.

来源:README.md,提交 e9a98d8

工具

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.

输入参数langlevel

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.

输入参数langcategory

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.

输入参数langtype必填

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

输入参数document必填

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

输入参数document必填profiles

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.

输入参数langdocument必填

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

输入参数ops必填document必填validate

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

输入参数kindpathviewcolorsheetformatdocument必填conductor_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.

输入参数viewwhatdocument必填

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.

输入参数document必填

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.

无需输入参数。

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.

输入参数name必填

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

输入参数document必填

版本历史

7
  1. v0.1.8最新Nov 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

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分