Server · #55 trending MCP repo · ↗ +129 stars this week
KiCAD-MCP-Server
mixelpixx/KiCAD-MCP-Server
KiCAD MCP is a Model Context Protocol (MCP) implementation that enables Large Language Models (LLMs) like Claude to directly interact with KiCAD for printed circuit board design.
- Stars
- 3.2k
- This week
- +129
- Forks
- 421
- Open issues
- 28
- Latest release
v2.8.3
Get started
Add it to your agent
claude mcp add --scope user kicadRun in your terminal. Add --scope project to share it with your team through .mcp.json.
codex mcp add kicad -- uvx kicad-mcp-serverSaved to ~/.codex/config.toml.
{
"mcpServers": {
"kicad": {
"command": "uvx",
"args": [
"kicad-mcp-server"
]
}
}
}Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).
{
"servers": {
"kicad": {
"type": "stdio",
"command": "uvx",
"args": [
"kicad-mcp-server"
]
}
}
}Add to .vscode/mcp.json, then start it from the MCP view in Copilot Chat.
gemini mcp add kicad uvx kicad-mcp-serverSaved to .gemini/settings.json.
Documentation
README
Discussions. Get in here.
https://github.com/mixelpixx/KiCAD-MCP-Server/discussions/73
🚀 Meet Konnect — the next generation
Konnect is this project rebuilt from scratch in Rust as a native KiCAD 10 plugin: a single binary with no runtime dependencies, built on KiCAD's official IPC API instead of SWIG, with 171 tools, bundled Claude skills and agents, design-review audits, and a manufacturing pipeline. It's where new development happens — licensed AGPL-3.0 (free for individuals and open source; commercial licenses available for businesses).
This Python/TypeScript server remains fully open (MIT) and maintained.
KiCAD MCP Server
A Model Context Protocol (MCP) server that enables AI assistants like Claude to interact with KiCAD for PCB design automation. Built on the MCP 2025-06-18 specification, this server provides comprehensive tool schemas and real-time project state access for intelligent PCB design workflows.
Overview
The Model Context Protocol is an open standard from Anthropic that allows AI assistants to securely connect to external tools and data sources. This implementation provides a standardized bridge between AI assistants and KiCAD, enabling natural language control of PCB design operations.
Key Capabilities:
- 251 tools registered, every one of them indexed for keyword discovery
- 251 tools across 20 categories with JSON Schema validation
- Keyword tool discovery via
search_tools/get_category_tools - Optional toolboxes: start with a 37-tool core and open the rest by category, to save context and stay under client tool limits
- 23 dynamic resources exposing project state
- Complete schematic workflow with 65 tools (authoring, batch edits, hierarchy, layout) and dynamic symbol loading (~10,000 symbols)
- Freerouting autorouter integration (Java, Docker, or Podman)
- Custom footprint and symbol creation tools
- JLCPCB parts integration with 2.5M+ component catalog and local library search
- Datasheet enrichment via LCSC
- Full MCP 2025-06-18 protocol compliance
- Cross-platform support (Linux, Windows, macOS)
- Real-time KiCAD UI integration via IPC API (experimental)
- Comprehensive error handling and logging
Try out Arduino MCP - now you can get Claude to help in the IDE, real time!:
https://github.com/mixelpixx/arduino-ide
What's New in v2.8.3
Toolboxes to keep the tool list small, a Linux setup script, and a batch of fixes. Thanks to @cornellana, @YORROY123, @reinauer and @ToThePointTechDev.
Toolboxes
- Set
KICAD_MCP_TOOLBOXES=coreand a client starts with 37 tools instead of about 250: the core tools,search_tools, andlist_toolboxes,open_toolboxandclose_toolbox. The assistant opens the toolboxes a task needs. Name toolboxes in the setting, such asschematic,drc, to have them open from the start; Claude Desktop needs that, because it doesn't re-read the tool list until it restarts. Without the setting nothing changes. See Toolboxes. - Every tool now has a category, so
search_toolsfinds all of them (#345).
Setup
setup-linux.shdetects KiCad's Python, checks the dependencies in the environment it will configure, and merges the server into Claude Desktop's config with a backup, likesetup-macos.sh(#445, @reinauer).
Fixes
export_gerberwrites the files it reports. On the SWIG backend it wrote none while listing every layer (#455, #456, @cornellana).download_jlcpcb_databasegets the time a download needs, reports the real error when it fails, and no longer mixes cached yaqwsx volumes from different days (#454).- A tool call made while the server is still starting waits instead of failing with "Python process ... is not running" (#453).
- Courtyard checks test each outline of a multi-outline courtyard separately (#406, #452, @YORROY123).
route_differential_pairreads the parameters its schema declares, andgapis the edge-to-edge spacing;get_nets_listreturns the statistics it advertises, andget_net_padshonoursunit(#450, #451, @YORROY123).- MCP SDK 1.31.0 (from 1.29.0).
Full details in the CHANGELOG.
What's New in v2.8.2
A patch release with three fixes. KiCad 10's stock libraries are found on installs where the global library table refers to them through a variable. New sheets are written the way KiCad writes them. A line break in a value no longer makes KiCad drop a sheet. Thanks to @zerthimon, who reported and fixed the first two and traced the third.
KiCad 10's stock libraries
- KiCad 10's global library tables hold one row that points to KiCad's own
table of stock libraries. Where that row uses
${KICAD10_TEMPLATE_DIR}, as on Linux, the server found none of them:search_symbolscame back empty andlist_library_symbolsfailed forDevice. The row is now followed, so all 223 symbol and 155 footprint libraries are found (#438, #439). - Loading a library table went from about half a second to a few milliseconds, because path variables are now resolved once per table instead of once per row.
Hierarchical sheets
add_hierarchical_sheetwrites a sheet the way KiCad does. It uses theSheetnameandSheetfileproperty names, and puts the page number inside the sheet block, once for each use of the parent sheet. KiCad 10 flagged the old format when the project was opened (#436, #437).- Page numbers are unique across the project, and adding a sheet inside a sub-sheet no longer fails.
Line breaks in values
- A multi-line value, such as a Description set with
edit_schematic_component, was written with a raw line break that KiCad cannot read. In a sub-sheet, KiCad then left the whole sheet out of the design without an error. On KiCad's complex_hierarchy demo, one such value took the netlist from 68 components to 10. Line breaks are now written the way KiCad writes them (#441). get_schematic_componentreturns fields whose values contain quotes, such as the Description of KiCad's stock GND symbol. Before, those fields were missing from its result.
Installing
- The install instructions now clone the
stablebranch, which holds the latest release.mainmay carry fixes that are not released yet.
Full details in the CHANGELOG.
What's New in v2.8.1
A patch release with three fixes for hierarchical schematics and KiCad 10-only machines. They came out of reviewing the fixes that went into v2.8.0.
Parts on reused sheets get a reference per use
- A sheet placed more than once gets an instance entry, with its own reference, for every use. KiCad's complex_hierarchy demo uses one amplifier sheet twice. Before, a part placed there had one entry, and kicad-cli listed it twice with "schematic has annotation errors" (#428).
annotate_schematicnumbers each use on its own and skips numbers already used on other sheets of the project. It keeps the units of a multi-unit part on one number and gives power symbols KiCad's leading zero (#432).add_schematic_component,batch_add_componentsandannotate_schematicreport the reference in each use, so callers don't give those numbers to other parts.- Sheets kept in a subdirectory now find their root, as in KiCad's
royalblue54L_feather demo, which keeps its sheets in
sch/.add_hierarchical_sheetwrites correct paths at any depth (#428).
KiCad 10-only machines
- Global library registration writes the newest KiCad version's table. It used to create a 9.0 table that KiCad 10 never reads. With no global table yet it now returns an error, because creating one would hide KiCad's stock libraries (#425).
${KICAD10_3RD_PARTY}(Plugin and Content Manager libraries) resolves at its default location. The cairo DLL is now found in KiCad 10 installs and custom install folders (#425).
Full details in the CHANGELOG.
What's New in v2.8.0
A crashed or stuck worker comes back on its own
One bad request could end the Python worker, and a command that hung inside pcbnew blocked every call queued behind it. Either way, every later tool call failed until the MCP server was restarted by hand. Now a request whose response cannot be sent gets an error instead of ending the worker (#405), and the bridge restarts a worker that exits or wedges, failing only the call in flight (#390, @siddolo). A worker that keeps crashing stays down after three restarts in five minutes instead of respawning forever. On Windows, a log file locked by another program no longer silences logging, and a missing kicad-skip now disables only the schematic tools that need it (#389, @AmirF194).
Schematic edits land where KiCad expects them
- Parts placed on a sub-sheet get the hierarchical instance path KiCad writes (#423, @zerthimon).
connect_to_netno longer puts a label where a moved part's pin used to be (#427).add_schematic_wirereports an endpoint that did not snap to a pin instead of calling a floating wire a success (#404, reported by @andersresen).- One unit of a multi-unit part can be moved, rotated or deleted on its own, dragging keeps wiring orthogonal and carries no-connect flags along, net labels face the way their pin does, and placed symbols keep the library's field visibility (#391, @komar3456).
edit_componentreally swaps the footprint, keeping nets, the schematic link, attributes and the lock (#411, @AmirF194).sync_schematic_to_boardreads only the design's own sheets and keeps unlabeled nets (#400, #402), and placing a symbol no longer writes KiCad 10-only attributes into KiCad 8 or 9 schematics (#351).
GUI driver, opt-in
Eleven tools drive KiCad's live GUI: menus, toolbars, dialogs and
action-plugin buttons (#333, @rossvonfange). Nothing is installed until you run
install_gui_driver, and the helper listens only when
KICAD_GUI_DRIVER_ENABLE=1 is set, on 127.0.0.1, with a per-session token.
KiCad 10, IPC and Freerouting
- IPC placement on KiCad 10 places the real library footprint again (#378, @AlloyPlane), and IPC rotation keeps 3D models (#422, @Putpluto).
- KiCad 10 and custom install folders are found on Windows (#416,
@DieterMayerOSS; setup scripts: #356, @LiJoeAllen), and a KiCad started from
PATHis detected on Linux (#401, @famez). - The
PCB_VIA::GetWidthassert dialog on KiCad 9 and 10 is gone, and KiCad 8 works again (#398, @scorp508). autorouteandimport_sesreport a failed import instead of success, the Java version is read from the Freerouting JAR, and routed tracks keep the edge clearance around mounting holes (#417, #418, #419, @outstanda).
Faster net listing
list_schematic_nets and generate_netlist resolve every net in one pass per
sheet: about ten times faster on KiCad's demo projects, with identical results
(#394, @markszente).
New tools
- GUI driver: the eleven tools above.
- Digi-Key:
digikey_search_parts,digikey_check_library_availability,digikey_test_connection(#368, @karu2003). set_net_color(#375, @JMcordobamendez).
search_tools now indexes 184 of the 244 registered tools, in 17 categories.
Full details in the CHANGELOG.
What's New in v2.7.0
The bridge no longer crosses its wires
The Node-Python protocol had no request IDs: after one timeout, the next command was silently resolved with the previous command's late result, and every response after that was off by one. Tool calls now carry an ID that Python echoes back; stale responses are discarded instead of mis-delivered (#373). The MCP transport also connects before Python spawns, so clients no longer stack up against a silent server for up to two minutes during pcbnew warm-up (#377).
Two file-corruption classes fixed
add_symbol_property dropped a closing paren on every call and could splice
a unit symbol into a top-level sibling (#362, @karu2003). And S-expression
escaping is now symmetric: reads (#336) and writes (#324) share one
escape-aware implementation, so a property value containing \" survives a
round-trip — 419 of KiCad's own stock symbol files carry such values.
8 new tools
- Validation:
validate_schematic,validate_symbol_library— locate structural damage with line/column, confirmed viakicad-clion a copy. - Library tables:
list_library_table,remove_library_table_entry,set_library_table_uri— the missing CRUD aroundregister_*_library. - Symbol editing:
set_symbol_pin_type(bulk pin type fixes with dry-run),find_duplicate_symbols(the same part stored twice). - Back-annotation:
backannotate_footprints— PCB footprint choices flow back to the schematic, the reverse ofsync_schematic_to_board.
All by @karu2003. With #359 (@AmirF194) registering 15 existing symbol tools,
search_tools now indexes 169 tools in 15 categories.
Quality of life
autoroutestages its.dsn/.seswork files in a temp directory and cleans up on every exit — no more litter next to your board, no stale-SES imports, and a killed run says "terminated externally" instead ofexit code 4294967295(#249, scoped by @Dewieinns' traces).- Placed symbols inherit the library's default Footprint (#300, implementation by @stefangordon).
add_layeractually adds inner copper layers (#222) — it previously wrote to non-copper layer IDs and renamed F.SilkS.sync_schematic_to_boardmatches by symbol UUID, not just refdes (#250).- JLCPCB tools decode the new upstream
source-db-v2schema (#352, @stefanobaldo) and degrade gracefully when the parts DB is unavailable (#264, @fage2022). setup-macos.sh --verifynow fails when Python requirements are missing instead of passing on a server that cannot start (#350, @francisrath).
Full details in the CHANGELOG.
What's New in v2.6.0
A session-killing bug is fixed
Deleting anything from a board — a component, a trace, a board outline —
worked exactly once. The next operation, even a pure read, failed with a
SwigPyObject error, and only close_project then open_project recovered.
BOARD.Remove() hands C++ ownership to Python, so dropping the reference ran
a destructor on an object KiCad still pointed at, corrupting SWIG state
process-wide. Six call sites were affected; all now use BOARD.Delete().
10 new tools
- Vendor PCB import:
import_pcbconverts PADS, Altium, Eagle, CADSTAR, Fabmaster, P-CAD, SolidWorks PCB and binary Cadence Allegro.brdfiles via KiCad 10's native importer. - Hierarchical schematics:
remove_hierarchical_sheet,set_sheet_property,get_sheet_properties, andhierarchical_placefor arranging footprints by schematic hierarchy. - Schematic lint and repair:
lint_offgridfinds and safely snaps off-grid geometry that silently breaks junction placement;repair_flat_symbolsfixes SnapEDA/SamacSys symbols that crash kicad-skip;lint_schematic_cosmetictidies pin names and label orientation. - Board origins:
set_board_origin/get_board_origin.
Your .kicad_pro net classes stop disappearing
Board saves no longer let pcbnew serialize a stale in-memory project model
over your hand-edited net classes and netclass_patterns. Opening a project
no longer rewrites the file at all.
Breaking: schematic tools fail loudly on an unparseable sheet
Tools that used to return partial or empty results now return a structured
schematic_load_failed error naming the offending symbols. Silently skipping
a broken sheet produced an incomplete pad-to-net map reported as success,
which is worse. repair_flat_symbols fixes the usual cause. See
KNOWN_ISSUES.md section 7.
Full details in the CHANGELOG.
What's New in v2.5.0
20 new board-lifecycle and geometry tools
- Lifecycle:
open_board,reload_board,save_board,save_as,is_dirty,discard_or_reload,create_board_from_schematic. - Graphics editing:
clear_board_outline,replace_board_outline,list_graphics,delete_graphic,update_graphic,move_footprint_text. - Geometry queries:
batch_move_components,get_component_geometry,get_pads,get_net_pads,get_ratsnest,estimate_airwire_lengths,check_placement_clearance.
All of them respect backend session pinning, so a board saved while KiCad's
GUI owns the session routes to the GUI rather than writing a stale in-memory
copy — including the awkward case where save_as changes the board's
identity mid-session.
Formatting is normalized and enforced
pre-commit run --all-files(black, isort, prettier, flake8, mypy, eslint) is now a real CI gate, which is what CONTRIBUTING has always claimed.npm run lintused to runblackin write mode against whateverblackwas onPATH, silently reformatting your working tree with a version that disagreed with CI. It now checks only;npm run format:pyis the write path.- The README's tool count is pinned to the registry by a test, so it self-corrects instead of drifting.
Full details in the CHANGELOG.
What's New in v2.4.1
Three tools that were registered but had no backend now work
assign_net_to_class,check_clearanceandset_layer_constraintseach had a full schema and a router entry but no dispatch handler, so every call returnedUnknown command. Found by a documentation-coverage audit.- Per-layer constraints are written to a project-scoped
.kicad_drucustom-rules file, whichkicad-cli pcb drcand the GUI both pick up — there is no pcbnew API for them.
Silent failures removed
autoroutewas abandoned by the Node bridge at 30 s while Freerouting was still running, reporting failure against a valid.sesthat existed on disk. Its timeout now derives from thetimeoutandattemptsyou pass.get_board_2d_viewomitted--layersentirely when no layers were given, and KiCad 9+ then refuses the export — producing no file at all.create_zoneraisedAttributeErroron every call over the IPC backend.
New part-sourcing tools
search_parts_registry/get_registry_part/download_registry_partreuse a verified existing footprint or symbol instead of generating one. Downloads are host-allowlisted, extension-checked and size-capped.get_jlcpcb_partreturns live stock and tiered pricing when JLCPCB Open Platform credentials are configured, falling back to the local snapshot.
CI now actually runs the test suite
- The Python job had been a no-op in four independent ways, and Actions was disabled repo-wide — 32 failed runs and 0 successes across the project's whole history. All 1551 Python and 63 TypeScript tests now gate every push.
Full details in the CHANGELOG.
What's New in v2.4.0
Symbol library management
import_symbol/export_symbol/rename_symbolcopy a symbol between.kicad_symlibraries, extract one to a standalone file, and rename a symbol including its sub-symbol shards and any(extends ...)references from derived symbols in the same library.add_symbol_propertyandadd_library_symbol_propertyset custom BOM fields (Manufacturer, MPN, LCSC, ...) on a library symbol or on a schematic's cached definition.update_symbol_from_libraryrefreshes cachedlib_symbolsdefinitions across one schematic, a list, or every project under a directory — the programmatic equivalent of KiCad's Update Symbol from Library.replace_instance_lib_idsswapslib_idreferences per an explicit old-to-new mapping, for migrating a schematic between libraries.
Faster symbol discovery
- Library directories, resolved paths, extracted symbol blocks, and parsed
symbol lists are now cached process-wide instead of being rebuilt for every
component add. Staleness guards revalidate paths and track source
mtime_ns, and the mutating write paths clear the caches explicitly.
Fixes that restore basic operation
- Every
.kicad_symand schematic write raisedTypeErroron Python 3.9, the project's declared floor —Path.write_textdid not acceptnewlineuntil 3.10. - JLCPCB part search could not find hyphenated MPNs.
- Eagle import wrote a KiCad 9 schematic header; it now writes the KiCad 10
header, verified against real
kicad-cli10.0. - Component placement snaps to the 1.27 mm grid,
import_sesno longer creates phantom slashless nets, andexport_dsn/autoroutekeep.kicad_pronet classes.
Full details in the CHANGELOG.
What's New in v2.3.1
Eagle schematic import
import_eagle_schematicconverts Eagle.schXML designs to KiCad format with symbol mapping, net wires, multi-gate parts, dangling-wire pruning, and ground-truth ERC reporting viakicad-cli.
3D model tools and interactive reload
add_component_3d_model/remove_component_3d_modelfor attaching STEP/WRL models to footprints.- Opt-in
KICAD_INTERACTIVE_SCHEMATIC=1auto-confirms KiCad's reload dialog on Windows after schematic writes.
Scaffolding cluster complete
- New projects start blank (no
_TEMPLATE_*symbols leaked into user files). .kicad_profiles match what KiCad itself writes.- Format version
20260101ensures all KiCad 10.0.x builds can open generated schematics.
KiCad 10 compatibility
- Derived symbols in
.kicad_symdirlibraries resolve their parent from sibling shards. - Unified install discovery finds relocated Windows installs via registry.
- User env-var placeholders from
kicad_common.jsonare resolved in library paths. - Phantom cross-unit pin reports in
get_wire_connectionsare eliminated.
Full details in the CHANGELOG.
What's New in v2.3.0
Schematic corruption on KiCad 10 — both mechanisms fixed
- Complete instance blocks: placed components now carry the real project name, root-sheet uuid path, per-pin uuid entries (ERC can bind wires to pins), and the full KiCad 10 field set — verified byte-equivalent to what eeschema itself writes. Previously, dragging or editing a placed symbol could crash KiCad.
- Canonical multi-line writes: schematic tools no longer minify the whole
file onto one line. Tool writes now match eeschema's "Save" byte-for-byte,
with a self-check on every write that can never corrupt data. Already-
minified files are repairable with
scripts/kicad_sch_reformat.py.
Your edits are protected
- Backend session pinning: a loaded project stays on one backend (SWIG or IPC) for its whole lifecycle — saves can no longer silently route to a stale GUI board and lose your edits.
- External-edit guard:
save_projectrefuses to overwrite a board file whose contents changed on disk since load (passforce: trueto override). close_project(new tool): release the project so files can be edited directly, then reopen — no more restart choreography.
Works on a stock Windows install
kicad-cliand 7-Zip are resolved from their install locations even when not on PATH — un-breaking exports, ERC/DRC, netlists, board views, and the JLCPCB database download, each with actionable errors when truly missing.
New layout tools
suggest_placement: connectivity-driven PCB placement optimizer (dry-run by default, deterministic).suggest_schematic_declutter: re-orients overlapping net labels without touching connectivity.
Plus KiCad 10 compatibility fixes (sheet renames, sharded .kicad_symdir
libraries, IPC Box2 board size), correct pin geometry for rotated+mirrored
and multi-unit symbols, bounded IPC connects with SWIG fallback, and a real
Vitest suite for the TypeScript layer. Full details in the
CHANGELOG.
What's New in v2.2.3
New Tools: FFC/Ribbon Cable Passthrough Workflow
A complete workflow for designing passthrough adapter boards (e.g. Raspberry Pi CSI cable adapters) is now supported:
connect_passthrough— wires all pins of one connector to the matching pins of another in the schematic (J1 pin N → J2 pin N, auto-named nets).sync_schematic_to_board— imports the net assignments into the PCB.route_pad_to_pad— routes each connection with automatic via insertion when pads are on opposite copper layers.snapshot_project— saves a named checkpoint into<project>/snapshots/.
Bug Fixes (KiCAD 9 / Windows)
- Via insertion for B.Cu footprints —
route_pad_to_padnow correctly detects when a footprint is on B.Cu and inserts the required via. (KiCAD 9 SWIG returnedF.Cufor all SMD pads regardless of layer — fixed.) - Board outline rounded corners —
add_board_outlinenow correctly appliescornerRadiuswhenshape="rounded_rectangle". - B.Cu placement hang — placing a footprint on B.Cu no longer causes a ~30s freeze in KiCAD 9.
Developer Mode
Set KICAD_MCP_DEV=1 in your Claude Desktop MCP environment to automatically save
the MCP session log into the project's logs/ folder on every export_gerber and
snapshot_project call. Useful for debugging and for attaching to GitHub issues.
"env": {
"KICAD_MCP_DEV": "1"
}
Privacy warning: The session log contains your full tool call history (including file paths and design details). Review or delete
logs/before sharing a project directory publicly.
See CHANGELOG for the full list of changes in this release.
What's New in v2.1.0
Critical Schematic Workflow Fix + Complete Wiring System (Issue #26)
The schematic workflow was completely broken in previous versions - this is now fixed AND dramatically enhanced!
What was broken:
create_projectonly created PCB files, no schematicsadd_schematic_componentcalled non-existent API methods- Schematics couldn't be created or edited at all
- Only 13 component types available (severe limitation)
- No working wire/connection functionality
Complete Implementation (3 Phases):
Phase 1: Component Placement Foundation
create_projectnow creates both .kicad_pcb and .kicad_sch files- Added pre-configured template schematics with 13 common component types
- Rewrote component placement to use proper
clone()API
Phase 2: Dynamic Symbol Loading (BREAKTHROUGH!)
- Access to ALL ~10,000 KiCad symbols from standard libraries
- Automatic detection and dynamic loading from
.kicad_symlibrary files - Zero configuration required - just specify library and symbol name
- Seamless integration with existing MCP tools
- Full S-expression parsing and injection system
Phase 3: Intelligent Wiring System (NEW in v2.1.0)
- Automatic pin location discovery with rotation support (0°, 90°, 180°, 270°)
- Smart wire routing (direct, orthogonal horizontal-first, orthogonal vertical-first)
- Power symbol support (VCC, GND, +3V3, +5V, etc.)
- Wire graph analysis - geometric tracing for net connectivity
- Net label management (local, global, hierarchical labels)
- Netlist generation with accurate component/pin connections
Technical Architecture: The kicad-skip library cannot create symbols or wires from scratch. We implemented a comprehensive solution:
- Static Templates: 13 pre-configured symbols (R, C, L, LED, etc.) for instant use
- Dynamic Loading: On-demand injection of ANY symbol from KiCad libraries:
- Parse
.kicad_symlibrary files using S-expression parser - Inject symbol definition into schematic's
lib_symbolssection - Create offscreen template instance
- Reload schematic so kicad-skip sees new template
- Clone template to create actual component
- Parse
- Wire Creation: S-expression-based wire injection (bypasses kicad-skip API limitations)
- Pin Discovery: Parse symbol definitions, apply rotation transformations, calculate absolute positions
- Connectivity Analysis: Geometric wire tracing to build net connection graphs
Example - Complete Circuit Creation:
# Load power symbols dynamically
loader.load_symbol_dynamically(sch_path, "power", "VCC")
# Place components with auto-rotation
ComponentManager.add_component(sch, {
"type": "STM32F103C8Tx",
"library": "MCU_ST_STM32F1",
"reference": "U1",
"x": 100, "y": 100, "rotation": 0
})
# Connect with intelligent routing
ConnectionManager.add_connection(sch_path, "U1", "1", "R1", "2", routing="orthogonal_h")
# Connect to power nets
ConnectionManager.connect_to_net(sch_path, "U1", "VDD", "VCC")
# Analyze connectivity
connections = ConnectionManager.get_net_connections(sch, "VCC", sch_path)
# Returns: [{"component": "U1", "pin": "VDD"}, {"component": "R1", "pin": "1"}]
Test Results:
- Component placement: 100% passing
- Dynamic symbol loading: 10,000+ symbols accessible
- Wire creation: 100% passing (8/8 connections in test circuit)
- Pin discovery: Rotation-aware, sub-millimeter accuracy
- Net connectivity: 100% accurate (VCC: 2 connections, GND: 4 connections)
- Netlist generation: Working with accurate pin-level connections
See Schematic Tools Reference for the complete schematic tool documentation, and the Headless Authoring Guide for field-tested practice driving these tools without the KiCad GUI.
IPC Backend (Experimental)
We are currently implementing and testing the KiCAD 9.0 IPC API for real-time UI synchronization:
- Changes made via MCP tools appear immediately in the KiCAD UI
- No manual reload required when IPC is active
- Hybrid backend: uses IPC when available, falls back to SWIG API
- IPC runtime reconnect: if MCP has fallen back to SWIG, IPC-capable board tools retry IPC after KiCAD launches instead of staying on SWIG for the entire session
- 20+ commands now support IPC including routing, component placement, and zone operations
Note: IPC features are under active development and testing. Enable IPC in KiCAD via Preferences > Plugins > Enable IPC API Server.
For OpenCode on Windows, the backend can be configured as auto, ipc, or
swig during setup. See OpenCode (Windows) for the
configuration command and backend options.
Tool Discovery
Every tool is registered individually, so an MCP client can call any of them by name. Every tool is also indexed, so an assistant can find one by keyword instead of guessing:
- 33 core tools that
search_toolssurfaces first, covering the operations nearly every session needs - 20 categories (board, component, export, drc, schematic, library, symbol_library, symbol_pins, schematic_hierarchy, schematic_layout, schematic_batch, routing, autoroute, validation, parts-registry, digikey, gui-driver, footprint, import, jlcpcb)
- Discovery tools:
list_tool_categories- Browse all available categoriesget_category_tools- View tools in a specific categorysearch_tools- Find tools by keyword
Why this matters: the assistant can locate the right tool for your task by keyword rather than inventing a name. Discovery on its own does not reduce context: by default every tool schema is still sent to the client. Toolboxes, below, do.
Toolboxes
The full set is about 250 tool definitions. Every one a client loads costs
context, and some clients cap the count: VS Code Copilot stops at 128 tools.
Set KICAD_MCP_TOOLBOXES in the server's environment to load only what you
need. Each category above is a toolbox.
| Setting | What the client sees |
|---|---|
not set, or all |
Every tool, as before |
core |
The 33 core tools, search_tools, and the toolbox controls (37 tools) |
a list, such as schematic,drc,routing |
The same, plus those toolboxes from the start (names match case-insensitively) |
With toolboxes on, the assistant gets three controls in place of
list_tool_categories and get_category_tools:
list_toolboxes- every toolbox with its description, its tools, and whether it is openopen_toolbox- add one or more toolboxes' tools to the tool listclose_toolbox- remove them again to free context
Opened tools are ordinary tools with their real schemas: the server tells the client its tool list changed, and the client reads it again. How quickly they can be used depends on the client:
- Claude Code, VS Code Copilot: from your next message. The assistant opens a toolbox and says so; your reply lets it continue.
- Claude Desktop: only after a restart, because it does not re-read the
list. Name the toolboxes you need in
KICAD_MCP_TOOLBOXESinstead.
An earlier design saved context by hiding tools behind an execute_tool
dispatcher. It was removed because the model then invented arguments for tools
whose schemas it had never been shown; toolboxes avoid that by never calling a
tool indirectly. See ROUTER_ARCHITECTURE.md for
that history.
Operating modes
KICAD_MCP_OPERATING_MODE limits what the assistant can do, for example to let
a review agent inspect a design without any way to change it:
| Setting | What the client gets |
|---|---|
not set, or write |
Every tool, as before |
…
Releases