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
Star trend · last 17 days+309 ★
Oct 21, 2026: 2,894 starsOct 22, 2026: 2,909 starsOct 23, 2026: 2,924 starsOct 24, 2026: 2,930 starsOct 25, 2026: 2,943 starsOct 26, 2026: 2,962 starsOct 27, 2026: 2,983 starsOct 28, 2026: 3,002 starsOct 29, 2026: 3,021 starsOct 30, 2026: 3,056 starsOct 31, 2026: 3,074 starsNov 1, 2026: 3,094 starsNov 2, 2026: 3,110 starsNov 3, 2026: 3,138 starsNov 4, 2026: 3,151 starsNov 5, 2026: 3,173 starsNov 6, 2026: 3,187 starsNov 7, 2026: 3,203 stars

Get started

Add it to your agent

claude mcp add --scope user kicad

Run in your terminal. Add --scope project to share it with your team through .mcp.json.

Documentation

README

View on GitHub ↗

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=core and a client starts with 37 tools instead of about 250: the core tools, search_tools, and list_toolboxes, open_toolbox and close_toolbox. The assistant opens the toolboxes a task needs. Name toolboxes in the setting, such as schematic,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_tools finds all of them (#345).

Setup

  • setup-linux.sh detects KiCad's Python, checks the dependencies in the environment it will configure, and merges the server into Claude Desktop's config with a backup, like setup-macos.sh (#445, @reinauer).

Fixes

  • export_gerber writes the files it reports. On the SWIG backend it wrote none while listing every layer (#455, #456, @cornellana).
  • download_jlcpcb_database gets 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_pair reads the parameters its schema declares, and gap is the edge-to-edge spacing; get_nets_list returns the statistics it advertises, and get_net_pads honours unit (#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_symbols came back empty and list_library_symbols failed for Device. 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_sheet writes a sheet the way KiCad does. It uses the Sheetname and Sheetfile property 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_component returns 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 stable branch, which holds the latest release. main may 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_schematic numbers 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_components and annotate_schematic report 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_sheet writes 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_net no longer puts a label where a moved part's pin used to be (#427).
  • add_schematic_wire reports 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_component really swaps the footprint, keeping nets, the schematic link, attributes and the lock (#411, @AmirF194).
  • sync_schematic_to_board reads 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 PATH is detected on Linux (#401, @famez).
  • The PCB_VIA::GetWidth assert dialog on KiCad 9 and 10 is gone, and KiCad 8 works again (#398, @scorp508).
  • autoroute and import_ses report 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 via kicad-cli on a copy.
  • Library tables: list_library_table, remove_library_table_entry, set_library_table_uri — the missing CRUD around register_*_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 of sync_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

  • autoroute stages its .dsn/.ses work 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 of exit code 4294967295 (#249, scoped by @Dewieinns' traces).
  • Placed symbols inherit the library's default Footprint (#300, implementation by @stefangordon).
  • add_layer actually adds inner copper layers (#222) — it previously wrote to non-copper layer IDs and renamed F.SilkS.
  • sync_schematic_to_board matches by symbol UUID, not just refdes (#250).
  • JLCPCB tools decode the new upstream source-db-v2 schema (#352, @stefanobaldo) and degrade gracefully when the parts DB is unavailable (#264, @fage2022).
  • setup-macos.sh --verify now 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_pcb converts PADS, Altium, Eagle, CADSTAR, Fabmaster, P-CAD, SolidWorks PCB and binary Cadence Allegro .brd files via KiCad 10's native importer.
  • Hierarchical schematics: remove_hierarchical_sheet, set_sheet_property, get_sheet_properties, and hierarchical_place for arranging footprints by schematic hierarchy.
  • Schematic lint and repair: lint_offgrid finds and safely snaps off-grid geometry that silently breaks junction placement; repair_flat_symbols fixes SnapEDA/SamacSys symbols that crash kicad-skip; lint_schematic_cosmetic tidies 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 lint used to run black in write mode against whatever black was on PATH, silently reformatting your working tree with a version that disagreed with CI. It now checks only; npm run format:py is 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_clearance and set_layer_constraints each had a full schema and a router entry but no dispatch handler, so every call returned Unknown command. Found by a documentation-coverage audit.
  • Per-layer constraints are written to a project-scoped .kicad_dru custom-rules file, which kicad-cli pcb drc and the GUI both pick up — there is no pcbnew API for them.

Silent failures removed

  • autoroute was abandoned by the Node bridge at 30 s while Freerouting was still running, reporting failure against a valid .ses that existed on disk. Its timeout now derives from the timeout and attempts you pass.
  • get_board_2d_view omitted --layers entirely when no layers were given, and KiCad 9+ then refuses the export — producing no file at all.
  • create_zone raised AttributeError on every call over the IPC backend.

New part-sourcing tools

  • search_parts_registry / get_registry_part / download_registry_part reuse a verified existing footprint or symbol instead of generating one. Downloads are host-allowlisted, extension-checked and size-capped.
  • get_jlcpcb_part returns 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_symbol copy a symbol between .kicad_sym libraries, 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_property and add_library_symbol_property set custom BOM fields (Manufacturer, MPN, LCSC, ...) on a library symbol or on a schematic's cached definition.
  • update_symbol_from_library refreshes cached lib_symbols definitions across one schematic, a list, or every project under a directory — the programmatic equivalent of KiCad's Update Symbol from Library.
  • replace_instance_lib_ids swaps lib_id references 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_sym and schematic write raised TypeError on Python 3.9, the project's declared floor — Path.write_text did not accept newline until 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-cli 10.0.
  • Component placement snaps to the 1.27 mm grid, import_ses no longer creates phantom slashless nets, and export_dsn/autoroute keep .kicad_pro net classes.

Full details in the CHANGELOG.

What's New in v2.3.1

Eagle schematic import

  • import_eagle_schematic converts Eagle .sch XML designs to KiCad format with symbol mapping, net wires, multi-gate parts, dangling-wire pruning, and ground-truth ERC reporting via kicad-cli.

3D model tools and interactive reload

  • add_component_3d_model / remove_component_3d_model for attaching STEP/WRL models to footprints.
  • Opt-in KICAD_INTERACTIVE_SCHEMATIC=1 auto-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_pro files match what KiCad itself writes.
  • Format version 20260101 ensures all KiCad 10.0.x builds can open generated schematics.

KiCad 10 compatibility

  • Derived symbols in .kicad_symdir libraries resolve their parent from sibling shards.
  • Unified install discovery finds relocated Windows installs via registry.
  • User env-var placeholders from kicad_common.json are resolved in library paths.
  • Phantom cross-unit pin reports in get_wire_connections are 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_project refuses to overwrite a board file whose contents changed on disk since load (pass force: true to 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-cli and 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:

  1. 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).
  2. sync_schematic_to_board — imports the net assignments into the PCB.
  3. route_pad_to_pad — routes each connection with automatic via insertion when pads are on opposite copper layers.
  4. snapshot_project — saves a named checkpoint into <project>/snapshots/.

Bug Fixes (KiCAD 9 / Windows)

  • Via insertion for B.Cu footprints — route_pad_to_pad now correctly detects when a footprint is on B.Cu and inserts the required via. (KiCAD 9 SWIG returned F.Cu for all SMD pads regardless of layer — fixed.)
  • Board outline rounded corners — add_board_outline now correctly applies cornerRadius when shape="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_project only created PCB files, no schematics
  • add_schematic_component called 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_project now 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_sym library 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:

  1. Static Templates: 13 pre-configured symbols (R, C, L, LED, etc.) for instant use
  2. Dynamic Loading: On-demand injection of ANY symbol from KiCad libraries:
    • Parse .kicad_sym library files using S-expression parser
    • Inject symbol definition into schematic's lib_symbols section
    • Create offscreen template instance
    • Reload schematic so kicad-skip sees new template
    • Clone template to create actual component
  3. Wire Creation: S-expression-based wire injection (bypasses kicad-skip API limitations)
  4. Pin Discovery: Parse symbol definitions, apply rotation transformations, calculate absolute positions
  5. 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_tools surfaces 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 categories
    • get_category_tools - View tools in a specific category
    • search_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 open
  • open_toolbox - add one or more toolboxes' tools to the tool list
  • close_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_TOOLBOXES instead.

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

Recent versions

All releases ↗
  1. v2.8.3
  2. v2.8.2
  3. v2.8.1
  4. v2.8.0
  5. v2.7.0
  6. v2.6.0