pi-kicad — KiCad CAD design via Konnect
Drive KiCad 10 through the Konnect binary using three Pi tools:
| Tool |
Purpose |
kicad_call |
Invoke any Konnect tool by name (185 tools across 18 toolsets) |
kicad_batch |
Run multiple Konnect tool calls SEQUENTIALLY in one shot (each awaits before the next, so same-file writes don't race) |
kicad_status |
Wire up + health-check the bridge (binary, kicad-cli, IPC socket, daemon, version) |
First move
If anything is unclear or a call fails, run kicad_status first. It resolves the
Konnect binary + kicad-cli, (re)starts the local HTTP daemon, and reports
whether the bridge is healthy. Restart with restart: true after changing KiCad
config or the IPC socket.
The toolset-loading protocol (context economy)
Konnect exposes 185 tools but loads only a small starter kit (2K tokens, not
~23K). Domain tools live in toolsets you must load before use:
kicad_call tool=list_toolboxes → see all toolsets + counts
kicad_call tool=load_toolset arguments={name:"sch_components"}
kicad_call tool=add_schematic_component arguments={...}
kicad_call tool=unload_toolset arguments={name:"sch_components"} → prune when done
If a tool errors with "toolset not loaded", the message names the toolset —
call load_toolset("<that>") then retry. That single hop recovers every such error.
Toolsets: project, sch_components, sch_wiring, sch_analysis, sch_batch,
sch_export, sch_hierarchy, pcb_board, pcb_components, pcb_routing,
pcb_export, plus design-review, JLCPCB parts, Freerouting, reference circuits,
manufacturing. (Call list_toolboxes for the live list.)
Two editing models — know which one you're in
- Schematic tools edit
.kicad_sch files directly via Konnect's S-expression
engine (atomic writes, UUID-safe). No running KiCad needed. Work headless.
- PCB tools talk to KiCad's IPC API. Requires KiCad 10 open with
Preferences → Plugins → Enable KiCad API, and the target board loaded. PCB
edits integrate with KiCad's undo/redo and appear live in the editor.
Productive habits
- Batch-first. Prefer
batch_add_wire, batch_delete,
bulk_move_schematic_components, batch_edit_schematic_components — one file
read/write cycle instead of N.
- Let the tool compute coordinates.
connect_pins (route by reference+pin),
add_schematic_connection (auto H+V between points), connect_to_net (stub +
label) beat hand-placing every wire.
- Validate as you go.
validate_wire_connections,
validate_component_connections, find_orphan_items, find_shorted_nets
catch placement errors immediately; don't wait for ERC.
- Reference circuits as starters. Load the reference-circuits toolset for
verified USB-C / LDO / buck / STM32 / I2C / LED blocks instead of building from scratch.
- JLCPCB parts. Use the JLCPCB toolset to find in-stock footprints/symbols and
alternatives from the local 2.5M-part catalog.
- Visual feedback.
get_schematic_view / get_board_2d_view render PNGs;
open_schematic_viewer launches the live auto-refresh viewer.
- Self-diagnose.
get_recent_calls and server_stats show the last tool
calls, durations, and errors — use them when a tool misbehaves.
Standard design flow
create_project / open_project
→ schematic capture (sch_components, sch_wiring)
→ annotate_schematic (R? → R1, U? → U1)
→ run_erc → fix violations (sch_analysis tools find orphans/shorts)
→ update PCB from schematic
→ layout (pcb_components) → route (pcb_routing) → copper pours / mounting holes (pcb_board)
→ get_drc_violations → fix → refill_zones
→ export_gerber / export_pdf / export_bom / export_position_file / export_3d
Snapshot before risky edits with snapshot_project (exports a timestamped PDF).
Known Konnect v0.2.0 limitations (work around these)
These are Konnect (third-party Rust binary) bugs, not pi-kicad bugs. pi-kicad works
around them where it can:
- Standard symbol libraries don't resolve. Konnect's
.kicad_sym parser
returns 0 symbols from KiCad 10's standard libraries (Device, power, …), so
add_schematic_component Device:R, power:GND, etc. all fail. Build every
symbol from scratch with create_symbol in a .kicad_sym inside the project,
then place dcdc:<Name>.
add_schematic_component resolves lib_id ONLY via KICAD10_SYMBOL_DIR
(a single dir set at daemon start, NOT the sym-lib-table). pi-kicad ALWAYS
points it at its managed symbol dir ~/.pi/kicad-symbols (created
automatically). So create your from-scratch symbols there: create_symbol
with library_path=~/.pi/kicad-symbols/<lib>.kicad_sym, then place
<lib>:<sym>. No env var or project-dir setup needed — kicad_status prints
the symbol dir. (The daemon never reuses a stale stranger daemon, so it always
runs with the correct env.)
register_symbol_library writes the wrong table format ((fp_lib_table …)
into sym-lib-table). Hand-write sym-lib-table as (sym_lib_table …) if ERC
warns "configuration does not include the symbol library".
list_symbols_in_library mangles names (strips the first char: Res→es).
Placement lookup is unaffected — place by the real lib_id.
delete_symbol reports success but doesn't persist; annotate_schematic
reports success but leaves references as ?. Pass explicit reference
(e.g. R1, U1) when placing, and don't rely on annotate/delete.
- Wiring by net label is the robust path.
connect_to_net needs pin_x/pin_y
(not pin numbers): call get_schematic_pin_locations (or
batch_get_schematic_pin_locations) first, then
connect_to_net {schematic, pin_x, pin_y, net} per pin — it adds a **wire stub
- label** that KiCad attaches. Use all-
passive pin types to keep ERC focused
on connectivity (avoids power-pin driver rules when power symbols are
unavailable).
- ⚠ Do NOT use
batch_connect_to_net — in Konnect v0.2.0 it places bare
net labels at pin coords with no wire stub, so they FLOAT and do not
connect. ERC won't catch it (passive pins aren't flagged) and
list_schematic_nets just reads label names. Always use connect_to_net.
- Verify connectivity with
get_net_connectivity or the kicad-cli netlist
(generate_netlist) — NOT run_erc alone (passive pins hide unconnected
pins) and NOT list_schematic_nets (label names ≠ attached).
- For VISIBLE wires between components (a real schematic, not just
connect-by-name), use
connect_pins {schematic, ref1, pin1, ref2, pin2}
which routes an actual wire (L-bend) between two pins. Chain/star same-net
pins (e.g. star each net through the regulator). connect_to_net only adds
a short stub+label (connect-by-name, no inter-component wire) — fine for
naming a net, but pair it with connect_pins when real wires are expected.
Render to PDF/PNG and eyeball it (or ask a vision model) to confirm.
- PCB tools need KiCad 10 running with its API enabled; schematic/export tools
are file-based and work headless.
- Never call file-mutating Konnect tools in parallel (multiple kicad_call in one
message run concurrently). Konnect's read-modify-write + atomic-rename races:
concurrent calls lose edits or fail with "No such file or directory" and can
corrupt the file (duplicates, lost symbols). Use
kicad_batch for any
multi-step flow — it runs the ops strictly sequentially (each awaited). Inside
one Konnet tool, prefer the batch_* variants (e.g. batch_connect_to_net does
a whole net's pins in a single file write).
1---2name: kicad3description: Design KiCad schematics and PCB layouts via the Konnect bridge. Use when the user wants to create/edit KiCad schematics or PCBs, place and wire components, route traces, run ERC/DRC, export Gerbers/BOM/PDF/3D, search JLCPCB parts, use reference circuits, or do manufacturing prep. Trigger on "KiCad", "schematic", "PCB", "layout", "route traces", "ERC", "DRC", "Gerber", "BOM", "footprint", "design rule check", "pick-and-place", or any CAD/EDA design task.4---56# pi-kicad — KiCad CAD design via Konnect78Drive KiCad 10 through the **Konnect** binary using three Pi tools:910| Tool | Purpose |11|---|---|12| `kicad_call` | Invoke any Konnect tool by name (185 tools across 18 toolsets) |13| `kicad_batch` | Run multiple Konnect tool calls SEQUENTIALLY in one shot (each awaits before the next, so same-file writes don't race) |14| `kicad_status` | Wire up + health-check the bridge (binary, kicad-cli, IPC socket, daemon, version) |1516## First move1718If anything is unclear or a call fails, run `kicad_status` first. It resolves the19Konnect binary + `kicad-cli`, (re)starts the local HTTP daemon, and reports20whether the bridge is healthy. Restart with `restart: true` after changing KiCad21config or the IPC socket.2223## The toolset-loading protocol (context economy)2425Konnect exposes ~185 tools but loads only a small starter kit (~2K tokens, not26~23K). **Domain tools live in toolsets you must load before use:**2728```29kicad_call tool=list_toolboxes → see all toolsets + counts30kicad_call tool=load_toolset arguments={name:"sch_components"}31kicad_call tool=add_schematic_component arguments={...}32kicad_call tool=unload_toolset arguments={name:"sch_components"} → prune when done33```3435If a tool errors with **"toolset not loaded"**, the message names the toolset —36call `load_toolset("<that>")` then retry. That single hop recovers every such error.3738Toolsets: `project`, `sch_components`, `sch_wiring`, `sch_analysis`, `sch_batch`,39`sch_export`, `sch_hierarchy`, `pcb_board`, `pcb_components`, `pcb_routing`,40`pcb_export`, plus design-review, JLCPCB parts, Freerouting, reference circuits,41manufacturing. (Call `list_toolboxes` for the live list.)4243## Two editing models — know which one you're in4445- **Schematic** tools edit `.kicad_sch` files directly via Konnect's S-expression46 engine (atomic writes, UUID-safe). **No running KiCad needed.** Work headless.47- **PCB** tools talk to KiCad's IPC API. **Requires KiCad 10 open** with48 Preferences → Plugins → *Enable KiCad API*, and the target board loaded. PCB49 edits integrate with KiCad's undo/redo and appear live in the editor.5051## Productive habits5253- **Batch-first.** Prefer `batch_add_wire`, `batch_delete`,54 `bulk_move_schematic_components`, `batch_edit_schematic_components` — one file55 read/write cycle instead of N.56- **Let the tool compute coordinates.** `connect_pins` (route by reference+pin),57 `add_schematic_connection` (auto H+V between points), `connect_to_net` (stub +58 label) beat hand-placing every wire.59- **Validate as you go.** `validate_wire_connections`,60 `validate_component_connections`, `find_orphan_items`, `find_shorted_nets`61 catch placement errors immediately; don't wait for ERC.62- **Reference circuits as starters.** Load the reference-circuits toolset for63 verified USB-C / LDO / buck / STM32 / I2C / LED blocks instead of building from scratch.64- **JLCPCB parts.** Use the JLCPCB toolset to find in-stock footprints/symbols and65 alternatives from the local 2.5M-part catalog.66- **Visual feedback.** `get_schematic_view` / `get_board_2d_view` render PNGs;67 `open_schematic_viewer` launches the live auto-refresh viewer.68- **Self-diagnose.** `get_recent_calls` and `server_stats` show the last tool69 calls, durations, and errors — use them when a tool misbehaves.7071## Standard design flow7273```74create_project / open_project75 → schematic capture (sch_components, sch_wiring)76 → annotate_schematic (R? → R1, U? → U1)77 → run_erc → fix violations (sch_analysis tools find orphans/shorts)78 → update PCB from schematic79 → layout (pcb_components) → route (pcb_routing) → copper pours / mounting holes (pcb_board)80 → get_drc_violations → fix → refill_zones81 → export_gerber / export_pdf / export_bom / export_position_file / export_3d82```8384Snapshot before risky edits with `snapshot_project` (exports a timestamped PDF).8586## Known Konnect v0.2.0 limitations (work around these)8788These are Konnect (third-party Rust binary) bugs, not pi-kicad bugs. pi-kicad works89around them where it can:9091- **Standard symbol libraries don't resolve.** Konnect's `.kicad_sym` parser92 returns 0 symbols from KiCad 10's standard libraries (Device, power, …), so93 `add_schematic_component Device:R`, `power:GND`, etc. all fail. **Build every94 symbol from scratch with `create_symbol`** in a `.kicad_sym` inside the project,95 then place `dcdc:<Name>`.96- **`add_schematic_component` resolves lib_id ONLY via `KICAD10_SYMBOL_DIR`**97 (a single dir set at daemon start, NOT the sym-lib-table). pi-kicad ALWAYS98 points it at its **managed symbol dir `~/.pi/kicad-symbols`** (created99 automatically). So **create your from-scratch symbols there**: `create_symbol`100 with `library_path=~/.pi/kicad-symbols/<lib>.kicad_sym`, then place101 `<lib>:<sym>`. No env var or project-dir setup needed — `kicad_status` prints102 the symbol dir. (The daemon never reuses a stale stranger daemon, so it always103 runs with the correct env.)104- **`register_symbol_library` writes the wrong table format** (`(fp_lib_table …)`105 into `sym-lib-table`). Hand-write `sym-lib-table` as `(sym_lib_table …)` if ERC106 warns "configuration does not include the symbol library".107- **`list_symbols_in_library` mangles names** (strips the first char: `Res`→`es`).108 Placement lookup is unaffected — place by the real lib_id.109- **`delete_symbol` reports success but doesn't persist**; `annotate_schematic`110 reports success but leaves references as `?`. **Pass explicit `reference`**111 (e.g. `R1`, `U1`) when placing, and don't rely on annotate/delete.112- **Wiring by net label is the robust path.** `connect_to_net` needs `pin_x`/`pin_y`113 (not pin numbers): call `get_schematic_pin_locations` (or114 `batch_get_schematic_pin_locations`) first, then115 `connect_to_net {schematic, pin_x, pin_y, net}` per pin — it adds a **wire stub116 + label** that KiCad attaches. Use all-`passive` pin types to keep ERC focused117 on connectivity (avoids power-pin driver rules when power symbols are118 unavailable).119 - **⚠ Do NOT use `batch_connect_to_net`** — in Konnect v0.2.0 it places *bare*120 net labels at pin coords with **no wire stub**, so they FLOAT and do not121 connect. ERC won't catch it (passive pins aren't flagged) and122 `list_schematic_nets` just reads label names. Always use `connect_to_net`.123 - **Verify connectivity with `get_net_connectivity` or the kicad-cli netlist**124 (`generate_netlist`) — NOT `run_erc` alone (passive pins hide unconnected125 pins) and NOT `list_schematic_nets` (label names ≠ attached).126 - **For VISIBLE wires between components** (a real schematic, not just127 connect-by-name), use **`connect_pins {schematic, ref1, pin1, ref2, pin2}`**128 which routes an actual wire (L-bend) between two pins. Chain/star same-net129 pins (e.g. star each net through the regulator). `connect_to_net` only adds130 a short stub+label (connect-by-name, no inter-component wire) — fine for131 naming a net, but pair it with `connect_pins` when real wires are expected.132 Render to PDF/PNG and eyeball it (or ask a vision model) to confirm.133- **PCB tools need KiCad 10 running** with its API enabled; schematic/export tools134 are file-based and work headless.135- **Never call file-mutating Konnect tools in parallel** (multiple kicad_call in one136 message run concurrently). Konnect's read-modify-write + atomic-rename races:137 concurrent calls lose edits or fail with "No such file or directory" and can138 corrupt the file (duplicates, lost symbols). **Use `kicad_batch`** for any139 multi-step flow — it runs the ops strictly sequentially (each awaited). Inside140 one Konnet tool, prefer the batch_* variants (e.g. `batch_connect_to_net` does141 a whole net's pins in a single file write).