An MCP server for KiCAD that provides 204+ tools for schematic and PCB design automation, component placement, ERC/DRC checking, and design document manipulation through local LLM integration.
Mixed quality across 28 tools. Meta-tools (find_capabilities, load_tools, kicad_invoke) have excellent descriptions (150-300 chars) with clear intent and prerequisites. Export/DRC tools have adequate schemas but minimal descriptions (20-50 chars). Composition tools (place_component, move_component) lack output schema documentation. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Parameter descriptions are present but often generic ('Path to the board file'). Error handling guidance is absent across all tools.
Align components on the PCB board along a specified axis.
Edit component properties such as value.
Export PCB board to 3D format (STEP or STL).
Export bill of materials from schematic.
Export Gerber files from PCB board.
Export manufacturing package from PCB board.
Export netlist from schematic.
Export and utility tools (export_pdf, export_svg, run_drc, etc.) have minimal descriptions (20-40 chars). LLMs cannot distinguish between export_pdf and export_schematic_pdf without reading full descriptions. Descriptions should explain WHEN to use each variant and what output format to expect.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., does export_gerber return file paths? revision numbers?). Every tool must document its return type and key fields.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Export PCB board to PDF format.
Export component position file from PCB.
Export schematic to PDF format.
Export PCB board to SVG format.
Search all 204 KiCAD tools by intent and return the best matches as name + toolset + one-line summary. This is the cheap way to build a toolbelt: describe the task in plain words ('connect two pins', 'export gerbers', 'run ERC'), then pass the names you want to load_tools(). Prefer this over list_toolboxes + load_toolset, which exposes an entire domain to obtain a handful of tools.
List currently loaded toolsets.
Get a 2D rendered view of the PCB board.
Get design rule check violations from PCB board.
Last N tool calls (newest first) with timing + status.
Explicit agent mode: the LLM is given a task, a budget, and the full tool catalogue, and it plans and executes until the task is done or the budget is spent. The reply carries the task anchor and the final state; pass it back to continue.
Return the full input schema of named tools so they can be called through kicad_invoke without ever appearing in tools/list. Names come from find_capabilities(). This is the gateway path: one response carries exactly the schemas you asked for, where load_tools makes the client re-fetch the whole catalogue instead.
Call one or more KiCAD tools by name, in order, whether or not they are loaded. Nothing is added to tools/list, so no catalogue refresh is triggered and the batch costs only its own result. Use kicad_describe() for the argument schemas. Execution stops at the first failure, and every KiCAD file it touched is restored. The reply returns each changed file's new revision; pass those back as base_revisions so a batch built against a document the user has since edited is refused instead of applied.
Show all 22 toolsets with descriptions and load state.
Expose specific tools by name so they can be called, without loading their whole toolset. Names come from find_capabilities(). Unknown names are reported in not_found rather than failing the call, so one bad guess does not cost a round trip.
Activate a toolset, expose its tools in tools/list.
Move a component on the PCB board to new coordinates.
Place a component on the PCB board at specified coordinates.
Place an array of components on the PCB board.
Run design rule check on PCB board.
Uptime, per-tool totals/errors, JSONL log path.
Deactivate a toolset, remove its tools from tools/list.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. Tools marked WRITE (place_component, move_component, edit_component, etc.) should carry destructiveHint=true. This prevents LLMs from accidentally applying irreversible changes.
Composition tools (place_component, move_component, edit_component) lack error recovery guidance. What happens if a component reference does not exist? If coordinates are out of bounds? Errors should guide the LLM to retry with valid inputs or call a discovery tool.
Utility tools (list_toolboxes, get_active_toolsets, get_recent_calls, server_stats) have generic 20-50 char descriptions. They should explain WHEN to call them (e.g., 'Call before load_toolset to see available options') and what structure they return.