Mini MCP server that drives a running KiCad PCB editor over the IPC API
kicad-mcp has 22 tools with consistent naming (verb_noun pattern: board_*, place_*, add_*, etc.) and clear descriptions (avg ~80 chars). All tools have input schemas with typed parameters. However, output schemas are undocumented, LLMs cannot predict return structures. Parameter descriptions are present but terse (many under 50 chars). Error handling is minimal; tools lack recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Missing pagination for list-like tools (board_pads, board_nets, board_copper could return large datasets). Composition is good: tools chain well (place_part → connect_pins → add_track). Security: write tools gated behind --allow-ai-write flag, but no per-tool permission declarations.
Add a copper track between two points on a layer
Add multiple copper tracks in bulk
Add a via at a given position
Add multiple vias in bulk
Route specified nets using the KiCad Routing Tools CLI (py_router/route.py)
Get all copper items (tracks, vias, zones) on the board
Get all nets on the board with their pad counts
Get the board outline (Edge.Cuts) as a polygon
Output schemas undocumented. LLMs cannot predict return structures for any tool. board_pads, board_nets, board_copper, board_summary lack documented field lists, types, and pagination info.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools marked DESTRUCTIVE (remove_part) or WRITE (place_part, add_track) lack machine-readable risk signals. LLMs cannot distinguish safe reads from dangerous writes without parsing descriptions.
List tools lack pagination. board_pads, board_nets, board_copper return unbounded arrays. No limit, offset, or cursor parameters. Large boards could return thousands of items, exhausting context windows.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | <=2025-11-25 | v2 |
Get all pads on the board with their positions, nets, and footprint references
Get a summary of the open board: track count, via count, net count, layer count, board dimensions
Connect multiple pins to nets in bulk with validation
Connect pins on the board to nets by reference and pin number
Check pin coverage: every electrical pin must be netted or explicitly allowed open
Download an LCSC/EasyEDA part by C-number and add it to the project library
Export the board to SVG format
Create an NPTH mounting hole footprint with custom hole diameter
Create a PTH wire pad footprint with custom copper and drill diameter
Place a footprint on the board at a given position and rotation
Refill all copper zones on the board
Remove a footprint from the board by reference designator
Save the open board to disk
Create a rectangular copper zone on a layer
Error handling lacks recovery guidance. No tool documents what errors are retryable, user-fixable, or fatal. autoroute_nets can timeout (300s CLI) but no guidance on retry strategy. Errors do not include invalid values or constraint violations.
Parameter descriptions are terse (many <50 chars). 'Net name', 'Layer name', 'Rotation in degrees' lack context on valid values, ranges, or formats. LLMs cannot infer whether layer='F.Cu' or layer='front', or if rotation wraps at 360.