# KiCad Tools (pypi · mcp-server-kicad)

Byte-preserving KiCad automation: 100+ tools for schematics, PCB layout, ERC, DRC, exports

- Trust score: 69/100 (medium)
- Change this week: +18
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-18

## Components

- pypi · `mcp-server-kicad`: 69/100 (this document), [markdown](https://verifymcp.io/servers/productofamerica-mcp-server-kicad/mcp-server-kicad.md), [page](https://verifymcp.io/servers/productofamerica-mcp-server-kicad/mcp-server-kicad)

## Channel facts

- Registry: `pypi`
- Package: `mcp-server-kicad`
- Version: `0.20.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-18.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it.
  - 2 of 30 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 69/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 14242 tokens (~130/item across 109 items; 109 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability check failed: the tool surface changed between 0.13.0 and 0.20.1: 0 tool removals, 7 breaking changes, 0 additions.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### Claude

```bash
claude mcp add productofamerica-mcp-server-kicad -- uvx mcp-server-kicad
```

### Codex

```bash
codex mcp add productofamerica-mcp-server-kicad -- uvx mcp-server-kicad
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "productofamerica-mcp-server-kicad": {
      "type": "local",
      "command": [
        "uvx",
        "mcp-server-kicad"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add productofamerica-mcp-server-kicad --command uvx --arg mcp-server-kicad
```

### Hermes

```yaml
mcp_servers:
  productofamerica-mcp-server-kicad:
    command: "uvx"
    args: ["mcp-server-kicad"]
```

### Other

```json
{
  "mcpServers": {
    "productofamerica-mcp-server-kicad": {
      "command": "uvx",
      "args": [
        "mcp-server-kicad"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-17 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20.

### 2026-08-16 (score 68, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-08-15 (score 52, 0)

- [security improvement] Malware scan: unverified → pass
- [functional] Package version: 0.19.2 → 0.20.1
- [functional] Package version: 0.19.2 → 0.20.0
- [functional] Package version: 0.19.2 → 0.19.4
- [functional] Package version: 0.19.2 → 0.19.3

### 2026-08-14 (score 52, −15)

- [security regression] Malware scan: pass → unverified
- [security regression] Stability: fail → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified
- [functional] Package version: 0.17.3 → 0.19.2
- [functional] Package version: 0.17.3 → 0.19.1
- [functional] Package version: 0.17.3 → 0.18.0

### 2026-08-13 (score 67, +1)

- [security regression] Stability: fail → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified
- [functional] Package version: 0.17.1 → 0.17.3
- [functional] Package version: 0.17.1 → 0.17.2

### 2026-08-12 (score 66, +15)

- [security regression] Stability: 0.03 → fail
- [security improvement] Malware scan: unverified → pass
- [functional] Package version: 0.13.4 → 0.17.1
- [functional] Package version: 0.13.4 → 0.17.0
- [functional] Package version: 0.13.4 → 0.16.0
- [functional] Package version: 0.13.4 → 0.15.0
- [functional] Package version: 0.13.4 → 0.14.0

### 2026-08-11 (score 51, 0)

- [functional regression] Schema quality: 109 → 121
- [functional improvement] Stability: unverified → 0.03
- [functional] Package version: 0.13.0 → 0.13.4
- [functional] Package version: 0.13.0 → 0.13.3
- [functional] Package version: 0.13.0 → 0.13.1

### 2026-08-10 (score 51)

First indexed and scored.

## MCP tools (109)

### `get_schematic_summary` (~51 tokens)

Get schematic page info and item counts.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `components` (integer)
- `global_labels` (integer)
- `hierarchical_labels` (integer)
- `junctions` (integer)
- `labels` (integer)
- `no_connects` (integer)
- `page_height_mm` (number)
- `page_size` (string)
- `page_width_mm` (number)
- `sheets` (integer)
- `wires` (integer)

### `list_schematic_components` (~51 tokens)

List all placed components in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_labels` (~51 tokens)

List all net labels in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_wires` (~52 tokens)

List all wire segments in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_global_labels` (~52 tokens)

List all global labels in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_hierarchical_labels` (~54 tokens)

List all hierarchical labels in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_sheets` (~52 tokens)

List all hierarchical sheets in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_junctions` (~53 tokens)

List all junctions in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_no_connects` (~54 tokens)

List all no-connect flags in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `list_schematic_bus_entries` (~52 tokens)

List all bus entries in the schematic.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `result` (array)

### `get_symbol_pins` (~85 tokens)

Symbol pins from the schematic's embedded library

Get pin info for a symbol in the schematic's lib_symbols.

Args:
    symbol_name: Symbol name (e.g. "LM7805", "C", "Fuse")
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `symbol_name` (string, required)

Output parameters:

- `result` (string)

### `get_pin_positions` (~81 tokens)

Get absolute pin positions for a placed component (accounts for rotation/mirror).

Args:
    reference: Component reference (e.g. "U1", "R1")
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `reference` (string, required)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `get_net_connections` (~102 tokens)

Find all component pins connected to a net label.

Scans labels matching the text, traces wires from label positions,
and identifies component pins at wire endpoints.

Args:
    label_text: Net name to search for (e.g. "VCC", "GND")
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `label_text` (string, required)
- `schematic_path` (string)

Output parameters:

- `connections` (array)
- `label_count` (integer)
- `net` (string)

### `place_component` (~322 tokens)

Place a schematic symbol: resistor, capacitor, inductor, diode, LED,
transistor, crystal, switch, connector, or an IC such as a microcontroller
or regulator chip. Any lib_id in a library works.

Args:
    lib_id: Library identifier (e.g. "Device:R", "Device:C", "MyLib:MyPart")
    reference: Reference designator (e.g. "R1", "U1")
    value: Component value (e.g. "10K", "100nF")
    x: X position in schematic units (mm)
    y: Y position in schematic units (mm)
    rotation: Rotation angle in degrees (0, 90, 180, 270)
    symbol_lib_path: Path to .kicad_sym file if using custom library.
        Optional; omit to use the configured default.
    mirror: Mirror axis ("x", "y", or "" for none)
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    project_path: Path to .kicad_pro file (for correct hierarchy resolution in sub-sheets)

Input parameters:

- `lib_id` (string, required)
- `mirror` (string)
- `project_path` (string)
- `reference` (string, required)
- `rotation` (integer)
- `schematic_path` (string)
- `symbol_lib_path` (string)
- `value` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `remove_component` (~72 tokens)

Remove a component by reference designator.

Args:
    reference: Reference designator to remove (e.g. "U2")
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `reference` (string, required)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `remove_label` (~168 tokens)

Remove net label(s) or global label(s) by text, optionally filtered by position.

If x and y are provided, only removes labels matching both text AND
position (within 0.1mm tolerance). Otherwise removes ALL labels with
matching text. To move a global label, remove it and re-add with
add_global_label (which takes shape and rotation).

Args:
    text: Label text to match (e.g. "VCC", "PGND")
    x: Optional X position filter
    y: Optional Y position filter
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `text` (string, required)
- `x`
- `y`

Output parameters:

- `result` (string)

### `remove_wire` (~138 tokens)

Remove a wire segment by its endpoint coordinates.

Matches wires with endpoints within 0.1mm tolerance (in either order).
Use list_schematic_wires to get wire coordinates first.

Args:
    x1: Start X
    y1: Start Y
    x2: End X
    y2: End Y
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `x1` (number, required)
- `x2` (number, required)
- `y1` (number, required)
- `y2` (number, required)

Output parameters:

- `result` (string)

### `remove_junction` (~76 tokens)

Remove a junction at the given coordinates.

Args:
    x: X position
    y: Y position
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `add_wires` (~95 tokens)

Add multiple wires at once. Each wire dict has keys: x1, y1, x2, y2.

Args:
    wires: List of wire defs [{x1, y1, x2, y2}, ...]
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `wires` (array, required)

Output parameters:

- `result` (string)

### `add_label` (~132 tokens)

Add a net label at a position.

Args:
    text: Net name (e.g. "VIN_PROT", "5V_REL")
    x: X position
    y: Y position
    rotation: Degrees (0=right, 90=up, 180=left, 270=down)
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `rotation` (integer)
- `schematic_path` (string)
- `text` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `add_junctions` (~79 tokens)

Add multiple junctions. Each point dict has keys: x, y.

Args:
    points: List of junction positions [{x, y}, ...]
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `points` (array, required)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `add_lib_symbol` (~113 tokens)

Load a symbol definition from a .kicad_sym library into the schematic.

Args:
    symbol_lib_path: Path to .kicad_sym file. Optional; omit to use the configured default.
    symbol_name: Symbol name (e.g. "LM7805")
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `symbol_lib_path` (string, required)
- `symbol_name` (string, required)

Output parameters:

- `result` (string)

### `move_component` (~117 tokens)

Move a placed component to a new position.

Args:
    reference: Reference designator (e.g. "R1")
    x: New X position
    y: New Y position
    rotation: New rotation in degrees (None = keep current)
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `reference` (string, required)
- `rotation`
- `schematic_path` (string)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `set_component_property` (~207 tokens)

Set any property on a placed component, or rename it. Creates the
property if it is missing.

Reference, Value and Footprint are mirrored into the symbol's own
instances and into the root symbol_instances table, so setting
key="Reference" is how a component is renamed and both views stay in
step. The root table needs the .kicad_pro to resolve the hierarchy
path; a loose .kicad_sch with no project beside it keeps the symbol
correct and leaves that table alone.

Args:
    reference: Component reference (e.g. "R1")
    key: Property name (e.g. "MPN", "Tolerance", "Value")
    value: Property value
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `key` (string, required)
- `reference` (string, required)
- `schematic_path` (string)
- `value` (string, required)

Output parameters:

- `result` (string)

### `set_page_size` (~157 tokens)

Set the schematic page/sheet size.

Args:
    size: Standard name (A5, A4, A3, A2, A1, A0, A, B, C, D, E) or 'User' for custom
    width: Custom width in mm (required when size='User')
    height: Custom height in mm (required when size='User')
    portrait: If True, swap width/height for portrait orientation
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `height`
- `portrait` (boolean)
- `schematic_path` (string)
- `size` (string, required)
- `width`

Output parameters:

- `result` (string)

### `add_global_label` (~159 tokens)

Add a global net label (visible across all sheets).

Args:
    text: Net name (e.g. "VCC", "SDA")
    x: X position
    y: Y position
    rotation: Degrees (0=right, 90=up, 180=left, 270=down)
    shape: Label shape: input, output, bidirectional, tri_state, passive
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `rotation` (integer)
- `schematic_path` (string)
- `shape` (string)
- `text` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `add_hierarchical_label` (~151 tokens)

Add a hierarchical label to a sub-sheet schematic.

Args:
    text: Label name (must match parent sheet pin name)
    shape: Direction — input, output, bidirectional, tri_state, passive
    x: X position in mm
    y: Y position in mm
    rotation: Degrees (0, 90, 180, 270)
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `rotation` (integer)
- `schematic_path` (string)
- `shape` (string, required)
- `text` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `remove_hierarchical_label` (~91 tokens)

Remove a hierarchical label by name or UUID.

Args:
    text: Label text to match
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    uuid: Optional UUID for disambiguation when multiple labels share a name

Input parameters:

- `schematic_path` (string)
- `text` (string, required)
- `uuid` (string)

Output parameters:

- `result` (string)

### `modify_hierarchical_label` (~163 tokens)

Modify an existing hierarchical label.

Args:
    text: Current label text to find
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    new_text: New label text (empty = keep current)
    new_shape: New shape/direction (empty = keep current)
    new_x: New X position (None = keep current)
    new_y: New Y position (None = keep current)
    uuid: UUID for disambiguation

Input parameters:

- `new_shape` (string)
- `new_text` (string)
- `new_x`
- `new_y`
- `schematic_path` (string)
- `text` (string, required)
- `uuid` (string)

Output parameters:

- `result` (string)

### `add_power_symbol` (~259 tokens)

Place a power symbol (VCC, GND, +3V3, etc.).

Uses place_component internally. Power symbols are regular symbols
from the 'power' library with isPower=True.

Automatically places a PWR_FLAG at the same position so the net
satisfies ERC (power pin driven).

Args:
    lib_id: Library ID (e.g. "power:VCC", "power:GND")
    reference: Reference (e.g. "#PWR01")
    x: X position
    y: Y position
    rotation: Rotation in degrees
    symbol_lib_path: Path to power symbol .kicad_sym if not in schematic.
        Optional; omit to use the configured default.
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    project_path: Path to .kicad_pro file (for sub-sheet instance tracking)

Input parameters:

- `lib_id` (string, required)
- `project_path` (string)
- `reference` (string, required)
- `rotation` (integer)
- `schematic_path` (string)
- `symbol_lib_path` (string)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `auto_place_decoupling_cap` (~318 tokens)

Place a decoupling capacitor and wire it to power/ground nets.

Places the cap, wires pin 1 (top) to power_net and pin 2 (bottom)
to ground_net via stub wires + labels.

Args:
    lib_id: Cap symbol (e.g. "Device:C")
    reference: Reference (e.g. "C5")
    value: Cap value (e.g. "100nF")
    x: X position
    y: Y position
    power_net: Label for pin 1 (e.g. "VCC", "+3V3")
    ground_net: Label for pin 2 (e.g. "GND", "PGND")
    rotation: Rotation in degrees (default 0)
    symbol_lib_path: Path to .kicad_sym if using custom lib.
        Optional; omit to use the configured default.
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    project_path: Path to .kicad_pro file (for sub-sheet instance tracking)

Input parameters:

- `ground_net` (string, required)
- `lib_id` (string, required)
- `power_net` (string, required)
- `project_path` (string)
- `reference` (string, required)
- `rotation` (integer)
- `schematic_path` (string)
- `symbol_lib_path` (string)
- `value` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `add_text` (~102 tokens)

Add a text annotation to the schematic.

Args:
    text: Text content
    x: X position
    y: Y position
    rotation: Rotation in degrees
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `rotation` (integer)
- `schematic_path` (string)
- `text` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `remove_text` (~129 tokens)

Remove text annotation(s) by content, optionally filtered by position.

If x and y are provided, only removes texts matching both content AND
position (within 0.1mm tolerance). Otherwise removes ALL texts with
matching content.

Args:
    text: Text content to match
    x: Optional X position filter
    y: Optional Y position filter
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `text` (string, required)
- `x`
- `y`

Output parameters:

- `result` (string)

### `wire_pins_to_net` (~213 tokens)

Wire multiple component pins to the same net label.

Wires each pin with a short stub and a shared net label, one file write.

Args:
    pins: List of {"reference": "R1", "pin": "1"} dicts
    label_text: Net label text (e.g. "GND", "VCC")
    direction: Wire direction: "auto", "left", "right", "up", "down"
    stub_length: Wire stub length in mm (default 2.54)
    auto_pwr_flag: Auto-place PWR_FLAG when net has power_in but no power_out (default True)
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `auto_pwr_flag` (boolean)
- `direction` (string)
- `label_text` (string, required)
- `pins` (array, required)
- `schematic_path` (string)
- `stub_length` (number)

Output parameters:

- `result` (string)

### `connect_pins` (~153 tokens)

Connect two component pins with Manhattan (L-shaped) wire routing.

Combines get_pin_positions + coordinate math + add_wires into one call.

Args:
    ref1: First component reference (e.g. "U1")
    pin1: First pin name or number
    ref2: Second component reference (e.g. "C3")
    pin2: Second pin name or number
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `pin1` (string, required)
- `pin2` (string, required)
- `ref1` (string, required)
- `ref2` (string, required)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `no_connect_pin` (~131 tokens)

Place a no-connect flag on a component pin.

Resolves pin position and places a no-connect flag. Idempotent:
calling again for a pin that already has one is a no-op.

Args:
    reference: Component reference (e.g. "U2")
    pin_name: Pin name (e.g. "NC") or number (e.g. "3")
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `pin_name` (string, required)
- `reference` (string, required)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `remove_no_connect` (~129 tokens)

Remove no-connect flag(s) from a component pin.

Removes every no-connect at the pin's position, so stacked
duplicates from repeated no_connect_pin calls clear in one go.

Args:
    reference: Component reference (e.g. "U2")
    pin_name: Pin name (e.g. "NC") or number (e.g. "3")
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `pin_name` (string, required)
- `reference` (string, required)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `list_unconnected_pins` (~134 tokens)

List unconnected pins by running ERC and filtering results.

Requires kicad-cli. Auto-redirects to root schematic for sub-sheets
to avoid false positives from hierarchical label context.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    output_dir: Directory for ERC report file. Optional; omit to use the configured default.
    project_path: Path to .kicad_pro file for explicit root resolution

Input parameters:

- `output_dir` (string)
- `project_path` (string)
- `schematic_path` (string)

Output parameters:

- `note`
- `pins` (array)
- `unconnected_count` (integer)

### `run_erc` (~139 tokens)

Run Electrical Rules Check (ERC) on a schematic.

Auto-redirects to root schematic for sub-sheets to avoid false
positives from missing hierarchical context.

Returns JSON report with violations.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    output_dir: Directory for report file (default: same as schematic).
        Optional; omit to use the configured default.
    project_path: Path to .kicad_pro file for explicit root resolution

Input parameters:

- `output_dir` (string)
- `project_path` (string)
- `schematic_path` (string)

Output parameters:

- `kicad_version` (string)
- `note`
- `source` (string)
- `violation_count` (integer)
- `violations` (array)

### `export_schematic` (~144 tokens)

Export schematic to PDF, SVG, or DXF format.

pdf and dxf produce one file, so path names it and size_bytes is filled.
svg produces one file per sheet, so path names the directory. files and
count are filled either way.

Args:
    format: Output format - "pdf", "svg", or "dxf"
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    output_dir: Directory for output files. Optional; omit to use the configured default.

Input parameters:

- `format` (string)
- `output_dir` (string)
- `schematic_path` (string)

Output parameters:

- `count` (integer)
- `files` (array)
- `format` (string)
- `path` (string)
- `size_bytes`

### `export_netlist` (~95 tokens)

Export a netlist for one schematic

Export a schematic netlist.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    output_dir: Output directory. Optional; omit to use the configured default.
    format: Netlist format. spice and spicemodel produce simulator input.

Input parameters:

- `format` (string)
- `output_dir` (string)
- `schematic_path` (string)

Output parameters:

- `format` (string)
- `note`
- `path` (string)
- `size_bytes` (integer)

### `export_bom` (~77 tokens)

Export Bill of Materials (BOM) as CSV.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    output_dir: Output directory. Optional; omit to use the configured default.

Input parameters:

- `output_dir` (string)
- `schematic_path` (string)

Output parameters:

- `component_count` (integer)
- `format` (string)
- `note`
- `path` (string)
- `size_bytes` (integer)

### `list_pcb_footprints` (~52 tokens)

List all footprints on the PCB.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `result` (array)

### `list_pcb_traces` (~54 tokens)

List all trace segments and vias on the PCB.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `result` (array)

### `list_pcb_nets` (~52 tokens)

List all named nets on the PCB.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `result` (array)

### `list_pcb_zones` (~58 tokens)

List all zones (copper and keepout) on the PCB.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `result` (array)

### `list_pcb_layers` (~115 tokens)

List all layers defined in the PCB stackup: copper, silkscreen,
soldermask, solder paste, courtyard, fabrication, and the board outline.

Which of those a given board actually defines is up to the board. Call
this before any tool that takes a layer name, since the valid set is
per-board and renamed layers are common.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `result` (array)

### `list_pcb_graphic_items` (~60 tokens)

List all graphic items (lines, text, etc.) on the PCB.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `result` (array)

### `get_board_info` (~57 tokens)

Get board summary: footprint count, trace count, net count, thickness.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `result` (string)

### `get_footprint_pads` (~81 tokens)

Pads of a footprint placed on the board

Get pad info for a placed footprint on the PCB.

Args:
    reference: Footprint reference (e.g. "R1", "U1")
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)
- `reference` (string, required)

Output parameters:

- `result` (string)

### `place_footprint` (~337 tokens)

Place a footprint on the PCB.

Name a library and a footprint to place the real thing: its pads, silkscreen,
courtyard and 3D model are copied from the library file exactly as KiCad
would place them. Without them you get a marker carrying only the reference
and value, which has NO PADS and so cannot be routed or checked; that is the
older behaviour and it is kept for callers that only want a placeholder.

Use list_lib_footprints to see what a library holds.

Args:
    reference: Reference designator (e.g. "R2")
    value: Component value (e.g. "4.7K")
    x: X position in mm
    y: Y position in mm
    rotation: Rotation in degrees
    layer: Layer (F.Cu or B.Cu)
    library: Footprint library nickname (e.g. "Resistor_SMD"), or a path to a
        .pretty directory. Optional; omit for a pad-less marker.
    footprint: Footprint name within that library (e.g. "R_0805_2012Metric").
        Required when library is given.
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `footprint` (string)
- `layer` (string)
- `library` (string)
- `pcb_path` (string)
- `reference` (string, required)
- `rotation` (number)
- `value` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `move_footprint` (~196 tokens)

Move a footprint to a new position.

Args:
    reference: Reference designator (e.g. "R1")
    x: New X position
    y: New Y position
    rotation: New rotation (None = keep current)
    layer: New layer. Naming the other side flips the footprint: every pad,
        graphic and text layer mirrors with it, the local geometry mirrors,
        and text gains a mirrored justification, which is what KiCad's own
        flip does. A footprint carrying a construct whose flip has not been
        measured here is refused rather than half-transformed.
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `layer` (string)
- `pcb_path` (string)
- `reference` (string, required)
- `rotation`
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `check_placement` (~168 tokens)

Check one proposed footprint position

Check if placing/moving a footprint to (x, y) would violate constraints.

Both checks are on the footprint's origin point, not its courtyard, so a
footprint whose body overlaps a keep-out while its origin does not still
reports ok. That is also why there is no rotation parameter: rotating about
the origin cannot move the origin, so an angle could not change either
answer.

Args:
    reference: Footprint reference designator
    x: Proposed X position
    y: Proposed Y position
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)
- `reference` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `board_edge_checked` (boolean)
- `keepout_violations` (array)
- `outside_board_edge` (boolean)
- `status` (string)

### `remove_footprint` (~72 tokens)

Remove a footprint by reference designator.

Args:
    reference: Reference designator (e.g. "R1")
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)
- `reference` (string, required)

Output parameters:

- `result` (string)

### `add_trace` (~163 tokens)

Add a trace segment between two points.

Args:
    x1: Start X
    y1: Start Y
    x2: End X
    y2: End Y
    width: Trace width in mm
    layer: Copper layer (e.g. "F.Cu", "B.Cu")
    net: Net number
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `layer` (string)
- `net` (integer)
- `pcb_path` (string)
- `width` (number)
- `x1` (number, required)
- `x2` (number, required)
- `y1` (number, required)
- `y2` (number, required)

Output parameters:

- `result` (string)

### `add_via` (~142 tokens)

Add a via at a position.

Args:
    x: X position
    y: Y position
    size: Via pad size in mm
    drill: Drill diameter in mm
    net: Net number
    layers: Via layers (default: ["F.Cu", "B.Cu"])
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `drill` (number)
- `layers`
- `net` (integer)
- `pcb_path` (string)
- `size` (number)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `add_pcb_text` (~143 tokens)

Add text to the PCB (silkscreen, fab layer, etc.).

Args:
    text: Text content
    x: X position
    y: Y position
    layer: Layer (e.g. "F.SilkS", "B.SilkS", "F.Fab")
    rotation: Rotation in degrees
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `layer` (string)
- `pcb_path` (string)
- `rotation` (number)
- `text` (string, required)
- `x` (number, required)
- `y` (number, required)

Output parameters:

- `result` (string)

### `add_pcb_line` (~161 tokens)

Add a graphic line to the PCB (edge cuts, silkscreen, etc.).

Args:
    x1: Start X
    y1: Start Y
    x2: End X
    y2: End Y
    layer: Layer (e.g. "Edge.Cuts", "F.SilkS")
    width: Line width in mm
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `layer` (string)
- `pcb_path` (string)
- `width` (number)
- `x1` (number, required)
- `x2` (number, required)
- `y1` (number, required)
- `y2` (number, required)

Output parameters:

- `result` (string)

### `add_copper_zone` (~276 tokens)

Create an unfilled copper zone: a ground plane, power plane, or any
filled copper pour. Call fill_zones afterward to compute the fills.

Args:
    net_name: Name of the net to assign to this zone (e.g. "GND")
    layer: Copper layer (e.g. "F.Cu", "B.Cu")
    corners: List of {x, y} dicts defining the zone polygon (min 3)
    clearance: Zone clearance in mm
    min_thickness: Minimum copper thickness in mm
    thermal_relief: Use thermal relief pads (True) or solid connection (False)
    thermal_gap: Thermal relief gap in mm
    thermal_bridge_width: Thermal relief bridge width in mm
    priority: Zone fill priority (higher fills first)
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `clearance` (number)
- `corners` (array, required)
- `layer` (string, required)
- `min_thickness` (number)
- `net_name` (string, required)
- `pcb_path` (string)
- `priority` (integer)
- `thermal_bridge_width` (number)
- `thermal_gap` (number)
- `thermal_relief` (boolean)

Output parameters:

- `clearance_mm` (number)
- `corners` (integer)
- `layer` (string)
- `net` (string)

### `add_keepout_zone` (~221 tokens)

Create a keep-out zone that restricts placement of specified items.

Args:
    corners: List of {x, y} dicts defining the zone polygon (min 3)
    layers: Layers to apply keep-out to (default: ["F.Cu", "B.Cu"])
    no_tracks: Restrict tracks in this zone
    no_vias: Restrict vias in this zone
    no_pads: Restrict pads in this zone
    no_copper_pour: Restrict copper pour in this zone
    no_footprints: Restrict footprints in this zone
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `corners` (array, required)
- `layers`
- `no_copper_pour` (boolean)
- `no_footprints` (boolean)
- `no_pads` (boolean)
- `no_tracks` (boolean)
- `no_vias` (boolean)
- `pcb_path` (string)

Output parameters:

- `corners` (integer)
- `layers` (array)
- `restrictions` (object)

### `fill_zones` (~148 tokens)

Fill all copper zones on the board using pcbnew's zone filler.

pcbnew computes the fill; this server writes it. The board is handed to
pcbnew read-only and the computed polygons come back as data, so the file
that reaches the disk is the original with its zones' fills replaced and
every other byte untouched. Nothing else about it changes: not its format
version, not its layer names, not the constructs pcbnew does not model.

Requires KiCad's pcbnew Python bindings to be installed.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `status` (string)
- `warnings` (array)
- `zones_filled` (integer)

### `update_pcb_from_schematic` (~348 tokens)

Update the PCB from the schematic (headless Tools -> Update PCB from Schematic).

Exports the schematic's netlist, loads the assigned footprints from
libraries, and binds every pad to its net. Creates the .kicad_pcb if
it does not exist; new footprints land in a grid cluster. Existing
footprints are matched by reference and keep their position; a
changed footprint assignment swaps the footprint in place. Stale
board footprints are reported, and removed only with delete_stale
(locked ones are never removed). Zones are NOT refilled: run
fill_zones afterward. Net names arrive exactly as KiCad's F8
produces them (local labels sheet-prefixed, e.g. "/SIG"); read them
with list_pcb_nets.

Requires kicad-cli. It no longer needs KiCad's pcbnew Python bindings.

Every byte this writes goes through the server's byte-preserving write, so
a board's format stamp does not move and the parts of it this tool did not
touch arrive unchanged.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    pcb_path: Path to .kicad_pcb file (created if missing).
        Optional; omit to use the configured default.
    delete_stale: Remove unlocked board footprints absent from the schematic
    project_path: Path to .kicad_pro for explicit root resolution (sub-sheets)

Input parameters:

- `delete_stale` (boolean)
- `pcb_path` (string)
- `project_path` (string)
- `schematic_path` (string)

Output parameters:

- `added` (array)
- `fpid_changed` (array)
- `nets_added` (integer)
- `nets_removed` (integer)
- `orphaned_tracks` (integer)
- `orphaned_zones` (integer)
- `pads_bound` (integer)
- `skipped` (array)
- `stale_footprints` (array)
- `stale_removed` (array)
- `status` (string)
- `value_updated` (array)
- `warnings` (array)

### `set_trace_width` (~203 tokens)

Change the width of existing traces matching the given filters.
At least one filter (net_name, layer, or bounding box) is required.

Args:
    width: New trace width in mm
    net_name: Filter by net name
    layer: Filter by layer name (e.g. "F.Cu", "B.Cu")
    x_min: Left edge of bounding box filter (mm)
    y_min: Top edge of bounding box filter (mm)
    x_max: Right edge of bounding box filter (mm)
    y_max: Bottom edge of bounding box filter (mm)
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `layer`
- `net_name`
- `pcb_path` (string)
- `width` (number, required)
- `x_max`
- `x_min`
- `y_max`
- `y_min`

Output parameters:

- `net`
- `new_width_mm` (number)
- `traces_modified` (integer)

### `remove_traces` (~189 tokens)

Remove trace segments matching the given filters. Does not remove vias.
At least one filter (net_name, layer, or bounding box) is required.

Args:
    net_name: Filter by net name
    layer: Filter by layer name (e.g. "F.Cu", "B.Cu")
    x_min: Left edge of bounding box filter (mm)
    y_min: Top edge of bounding box filter (mm)
    x_max: Right edge of bounding box filter (mm)
    y_max: Bottom edge of bounding box filter (mm)
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `layer`
- `net_name`
- `pcb_path` (string)
- `x_max`
- `x_min`
- `y_max`
- `y_min`

Output parameters:

- `layer`
- `net`
- `traces_removed` (integer)

### `add_thermal_vias` (~228 tokens)

Add a grid of thermal vias under a footprint pad.

Args:
    reference: Footprint reference (e.g. "U1", "R1")
    pad_number: Pad number to center vias on. If empty, auto-selects largest SMD pad.
    rows: Number of rows in the via grid
    cols: Number of columns in the via grid
    spacing: Spacing between vias in mm
    via_size: Via annular ring diameter in mm
    via_drill: Via drill diameter in mm
    net_name: Net to assign to vias. If None, auto-detect from pad.
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `cols` (integer)
- `net_name`
- `pad_number` (string)
- `pcb_path` (string)
- `reference` (string, required)
- `rows` (integer)
- `spacing` (number)
- `via_drill` (number)
- `via_size` (number)

Output parameters:

- `center` (object)
- `net` (string)
- `pad` (string)
- `reference` (string)
- `vias_added` (integer)

### `set_net_class` (~211 tokens)

Create or update a net class with design rules and assign nets.

Edits the KiCad project file (.kicad_pro) alongside the board to
define the net class and assign nets.  Does NOT require pcbnew.

Args:
    name: Net class name (e.g. "Power", "HighSpeed")
    nets: List of net names to assign to this class
    track_width: Track width in mm (None = use default)
    clearance: Clearance in mm (None = use default)
    via_size: Via diameter in mm (None = use default)
    via_drill: Via drill in mm (None = use default)
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `clearance`
- `name` (string, required)
- `nets` (array, required)
- `pcb_path` (string)
- `track_width`
- `via_drill`
- `via_size`

Output parameters:

- `clearance_mm`
- `net_class` (string)
- `nets_assigned` (integer)
- `track_width_mm`

### `remove_dangling_tracks` (~88 tokens)

Detect and remove trace segments with unconnected endpoints.

Iteratively removes dangling segments until no more are found.
A segment is considered dangling if either endpoint does not connect
to a pad, via, or another trace endpoint.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `iterations` (integer)
- `tracks_removed` (integer)

### `run_drc` (~93 tokens)

Run Design Rules Check (DRC) on a PCB.

Returns structured report with violations.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.
    output_dir: Directory for report file (default: same as PCB).
        Optional; omit to use the configured default.

Input parameters:

- `output_dir` (string)
- `pcb_path` (string)

Output parameters:

- `kicad_version` (string)
- `note`
- `source` (string)
- `unconnected_count` (integer)
- `unconnected_items` (array)
- `violation_count` (integer)
- `violations` (array)

### `export_pcb` (~246 tokens)

Export PCB to PDF, SVG, or DXF format.

Args:
    format: Output format - "pdf", "svg", or "dxf"
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.
    output_dir: Directory for output files. Optional; omit to use the configured default.
    layers: Optional list of layer names to include (required for DXF)
    output_units: DXF output units - "in" or "mm" (DXF only)
    exclude_refdes: Exclude reference designators (DXF only)
    exclude_value: Exclude component values (DXF only)
    use_contours: Use board outline contours (DXF only)
    include_border_title: Include border and title block (DXF only)

Input parameters:

- `exclude_refdes` (boolean)
- `exclude_value` (boolean)
- `format` (string)
- `include_border_title` (boolean)
- `layers`
- `output_dir` (string)
- `output_units` (string)
- `pcb_path` (string)
- `use_contours` (boolean)

Output parameters:

- `format` (string)
- `layers` (array)
- `note`
- `path` (string)
- `size_bytes` (integer)

### `export_gerbers` (~186 tokens)

Export Gerber files for manufacturing.

When layers contains exactly one layer, exports a single Gerber file: path
names it, and size_bytes and layer are filled. Otherwise exports all layers
(or the specified subset) plus optional drill files, and path names the
output directory. files and count are filled either way.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.
    output_dir: Output directory for gerber files. Optional; omit to use the configured default.
    include_drill: Also export drill files (default: True, ignored in single-layer mode)
    layers: Optional list of layer names. Single layer = single file output.

Input parameters:

- `include_drill` (boolean)
- `layers`
- `output_dir` (string)
- `pcb_path` (string)

Output parameters:

- `count` (integer)
- `drill_count` (integer)
- `drill_files` (array)
- `files` (array)
- `format` (string)
- `layer`
- `note`
- `path` (string)
- `size_bytes`

### `export_3d` (~215 tokens)

Export PCB 3D model or render 3D view to image.

\`render` fills width, height and side; the mesh formats leave them unset.

Args:
    format: Output format - "step", "stl", "glb", or "render" (PNG image)
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.
    output_dir: Output directory. Optional; omit to use the configured default.
    width: Image width in pixels (render only)
    height: Image height in pixels (render only)
    side: View side: top, bottom, left, right, front, back (render only)
    quality: Render quality: basic, high (render only)

Input parameters:

- `format` (string)
- `height` (integer)
- `output_dir` (string)
- `pcb_path` (string)
- `quality` (string)
- `side` (string)
- `width` (integer)

Output parameters:

- `format` (string)
- `height`
- `path` (string)
- `side`
- `size_bytes` (integer)
- `width`

### `export_positions` (~74 tokens)

Export component position file (pick and place).

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.
    output_dir: Output directory. Optional; omit to use the configured default.

Input parameters:

- `output_dir` (string)
- `pcb_path` (string)

Output parameters:

- `component_count` (integer)
- `format` (string)
- `note`
- `path` (string)
- `size_bytes` (integer)

### `export_ipc2581` (~144 tokens)

Export PCB in IPC-2581 format for manufacturing data exchange.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.
    output: Output file path
    precision: Numeric precision (default: 3)
    compress: Compress output file
    version: IPC-2581 version (default: "C")
    units: Output units - "mm" or "in"

Input parameters:

- `compress` (boolean)
- `output` (string)
- `pcb_path` (string)
- `precision` (integer)
- `units` (string)
- `version` (string)

Output parameters:

- `format` (string)
- `note`
- `path` (string)
- `size_bytes` (integer)

### `autoroute_pcb` (~280 tokens)

Autoroute PCB traces using the Freerouting autorouter.

Exports the board to Specctra DSN format, runs Freerouting for automated
trace routing, and imports the results into a new PCB file. The original
board is never modified.

Requires Java 17+ and KiCad's pcbnew Python bindings, whose major version
has to match the board's format era. On first run, the Freerouting JAR is
auto-downloaded (~20MB).

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.
    max_passes: Maximum autorouter optimization passes
    num_threads: Thread count for routing. Defaults to 1 because
        freerouting prints "Multi-threaded route optimization is broken
        and it is known to generate clearance violations" on every run.
        Raise it only if you are willing to DRC the result carefully.
    timeout: Max seconds to wait for routing (default: 600)
    output_dir: Directory for output files (default: same as PCB).
        Optional; omit to use the configured default.

Input parameters:

- `max_passes` (integer)
- `num_threads` (integer)
- `output_dir` (string)
- `pcb_path` (string)
- `timeout` (integer)

Output parameters:

- `drc_unconnected`
- `drc_violations`
- `keepouts_promoted` (integer)
- `routed_path` (string)
- `text_fields_fixed` (integer)
- `traces_added` (integer)
- `vias_added` (integer)
- `warnings` (array)

### `get_footprint_bounds` (~71 tokens)

Outline bounds of a footprint placed on the board

Get the board-coordinate bounding box of a placed footprint.

Args:
    reference: Footprint reference designator
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)
- `reference` (string, required)

Output parameters:

- `courtyard`
- `layer` (string)
- `position` (object)
- `reference` (string)
- `rotation` (number)

### `validate_board` (~53 tokens)

Check every footprint already on the board

Validate all footprint placements against keep-out zones and board edge.

Args:
    pcb_path: Path to .kicad_pcb file. Optional; omit to use the configured default.

Input parameters:

- `pcb_path` (string)

Output parameters:

- `board_edge_checked` (boolean)
- `status` (string)
- `total_footprints` (integer)
- `violations` (array)

### `list_lib_symbols` (~56 tokens)

List all symbols in a .kicad_sym library file.

Args:
    symbol_lib_path: Path to .kicad_sym file. Optional; omit to use the configured default.

Input parameters:

- `symbol_lib_path` (string)

Output parameters:

- `result` (string)

### `get_symbol_info` (~79 tokens)

Symbol details from a library file

Get detailed pin and property info for a symbol in a library.

Args:
    symbol_name: Symbol name (e.g. "LM7805")
    symbol_lib_path: Path to .kicad_sym file. Optional; omit to use the configured default.

Input parameters:

- `symbol_lib_path` (string)
- `symbol_name` (string, required)

Output parameters:

- `result` (string)

### `add_symbol` (~524 tokens)

Add a new symbol definition to a .kicad_sym library.

Creates a complete symbol with pins and body graphics.  If the library
file does not exist it will be created.

Args:
    name: Symbol name (e.g. "MP4572GQB-P", "TLV75733PDBVR")
    pins: Pin definitions — list of dicts, each with keys:
        number (str): pin number, e.g. "1"
        name (str): pin name, e.g. "VIN" ("~" for unnamed)
        type (str): electrical type — "input", "output", "bidirectional",
          "passive", "power_in", "power_out", "tri_state",
          "open_collector", "open_emitter", "unconnected", "free"
        x (float): X position in mm (default 0)
        y (float): Y position in mm (default 0)
        rotation (float): angle 0/90/180/270 (default 0)
        length (float): pin length in mm (default 2.54)
    reference_prefix: Reference prefix e.g. "U", "R", "C" (default "U")
    is_power: True for power symbols (default False)
    pin_names_offset: Pin name label offset in mm (default 0.508)
    in_bom: Include in BOM (default True)
    on_board: Place on board (default True)
    footprint: Default footprint e.g. "Package_SO:SOIC-8" (default "")
    datasheet: Datasheet URL (default "~")
    rectangles: Optional body rectangle(s) — list of dicts with keys:
        x1, y1, x2, y2 (float): corner coordinates in mm
        fill (str): "none", "background", or "outline" (default "background")
        If omitted, a rectangle is auto-computed from pin positions.
    symbol_lib_path: Path to .kicad_sym file. Optional; omit to use the configured default.

Input parameters:

- `datasheet` (string)
- `footprint` (string)
- `in_bom` (boolean)
- `is_power` (boolean)
- `name` (string, required)
- `on_board` (boolean)
- `pin_names_offset` (number)
- `pins` (array, required)
- `rectangles`
- `reference_prefix` (string)
- `symbol_lib_path` (string)

Output parameters:

- `result` (string)

### `export_symbol_svg` (~74 tokens)

Export symbol library to SVG images.

Args:
    symbol_lib_path: Path to .kicad_sym file. Optional; omit to use the configured default.
    output_dir: Output directory. Optional; omit to use the configured default.

Input parameters:

- `output_dir` (string)
- `symbol_lib_path` (string)

Output parameters:

- `count` (integer)
- `files` (array)
- `format` (string)
- `path` (string)

### `upgrade_symbol_lib` (~161 tokens)

Upgrade a symbol library to current KiCad format.

KiCad performs the migration, as it should, but it performs it on a copy:
the result lands through the server's atomic write, so your library is
replaced whole or not at all and can never be left truncated. A backup is
still taken beside it at ``<name>.kicad_sym.bak``, and the result names it,
because that is the undo for an upgrade that SUCCEEDED and is not something
an atomic write can offer. There is exactly one, and every run overwrites it.

Args:
    symbol_lib_path: Path to .kicad_sym file. Optional; omit to use the configured default.

Input parameters:

- `symbol_lib_path` (string, required)

Output parameters:

- `result` (string)

### `list_lib_footprints` (~48 tokens)

List all footprints in a .pretty library directory.

Args:
    pretty_dir: Path to .pretty directory containing .kicad_mod files

Input parameters:

- `pretty_dir` (string)

Output parameters:

- `result` (string)

### `get_footprint_info` (~58 tokens)

Footprint details from a .kicad_mod file

Get pad and outline details for a footprint .kicad_mod file.

Args:
    footprint_path: Path to .kicad_mod file. Optional; omit to use the configured default.

Input parameters:

- `footprint_path` (string, required)

Output parameters:

- `result` (string)

### `export_footprint_svg` (~81 tokens)

Export footprint to SVG.

Args:
    footprint_path: Path to a .kicad_mod file, or a .pretty library directory.
        Optional; omit to use the configured default.
    output_dir: Output directory. Optional; omit to use the configured default.

Input parameters:

- `footprint_path` (string, required)
- `output_dir` (string)

Output parameters:

- `count` (integer)
- `files` (array)
- `format` (string)
- `path` (string)

### `upgrade_footprint_lib` (~257 tokens)

Upgrade a footprint library to current KiCad format.

Rewrites every footprint in the library, so this takes the library
directory.  kicad-cli has no per-footprint option here, and a single
.kicad_mod path is rejected.

KiCad performs the migration, as it should, but it performs it on a copy and
each result lands through the server's atomic write, so no footprint file can
be left truncated. Only files whose content actually changed are written, so
an upgrade that touches three footprints leaves the rest of the library
alone. The whole library is still copied to ``<name>.pretty.bak`` first and
the result names it, because that is the undo for an upgrade that SUCCEEDED.
There is exactly one, and every run overwrites it.

Each file is atomic; the library as a whole is not a transaction. An upgrade
interrupted midway leaves some footprints migrated and some not, and no file
damaged. Version control is still the better answer for a library you care
about.

Args:
    footprint_path: Path to a .pretty library directory.
        Optional; omit to use the configured default.

Input parameters:

- `footprint_path` (string, required)

Output parameters:

- `result` (string)

### `create_project` (~75 tokens)

Create a KiCad 9 project (.kicad_pro + .kicad_prl + .kicad_sch).

Args:
    directory: Directory to create the project in (created if missing)
    name: Project name (used for filenames)

Input parameters:

- `directory` (string, required)
- `name` (string, required)

Output parameters:

- `result` (string)

### `create_schematic` (~56 tokens)

Create a valid empty KiCad 9 schematic file.

Args:
    schematic_path: Path for the new .kicad_sch file.
        Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string, required)

Output parameters:

- `result` (string)

### `create_symbol_library` (~57 tokens)

Create a valid empty KiCad 9 symbol library.

Args:
    symbol_lib_path: Path for the new .kicad_sym file.
        Optional; omit to use the configured default.

Input parameters:

- `symbol_lib_path` (string, required)

Output parameters:

- `result` (string)

### `create_sym_lib_table` (~87 tokens)

Create a sym-lib-table file in the given directory.

Each entry dict needs 'name' and 'uri' keys.
Overwrites existing sym-lib-table if present.

Args:
    directory: Directory to write sym-lib-table in
    entries: List of dicts with 'name' and 'uri' keys

Input parameters:

- `directory` (string, required)
- `entries` (array, required)

Output parameters:

- `result` (string)

### `add_hierarchical_sheet` (~245 tokens)

Add a hierarchical sheet to a parent schematic with matching labels in the child.

Creates the sheet block in the parent and corresponding hierarchical
labels in the child schematic. The child schematic must already exist
(create it with create_schematic first).

Args:
    parent_schematic_path: Path to parent .kicad_sch
    sheet_name: Display name for the sheet
    sheet_file: Path to child .kicad_sch (must exist)
    pins: List of dicts with 'name' (str) and 'direction' (str) keys.
          Direction: input, output, bidirectional, tri_state, passive.
    x: X position of sheet block (default 25.4)
    y: Y position of sheet block (default 25.4)
    project_path: Path to .kicad_pro file (for sub-sheet instance tracking)

Input parameters:

- `parent_schematic_path` (string, required)
- `pins` (array, required)
- `project_path` (string)
- `sheet_file` (string, required)
- `sheet_name` (string, required)
- `x` (number)
- `y` (number)

Output parameters:

- `result` (string)

### `remove_hierarchical_sheet` (~143 tokens)

Remove a hierarchical sheet block from a parent schematic.

Identify the sheet by name, uuid, or both. If name matches multiple sheets,
returns an error with UUIDs for disambiguation.

Args:
    parent_schematic_path: Path to parent .kicad_sch
    name: Sheet name to match
    uuid: Sheet UUID for unambiguous identification
    delete_child_file: If True, delete the child .kicad_sch file
          (unless still referenced by another sheet)

Input parameters:

- `delete_child_file` (boolean)
- `name`
- `parent_schematic_path` (string, required)
- `uuid`

Output parameters:

- `result` (string)

### `modify_hierarchical_sheet` (~153 tokens)

Modify properties of an existing hierarchical sheet block.

Args:
    sheet_uuid: UUID of the sheet to modify (from list_schematic_sheets)
    schematic_path: Path to parent .kicad_sch. Optional; omit to use the configured default.
    sheet_name: New display name (empty = keep)
    file_name: New file path (empty = keep)
    width: New width in mm (None = keep)
    height: New height in mm (None = keep)

Input parameters:

- `file_name` (string)
- `height`
- `schematic_path` (string)
- `sheet_name` (string)
- `sheet_uuid` (string, required)
- `width`

Output parameters:

- `result` (string)

### `add_sheet_pin` (~140 tokens)

Add a pin to an existing hierarchical sheet block.

Args:
    sheet_uuid: UUID of the sheet
    pin_name: Pin name (should match a hierarchical label in the child schematic)
    connection_type: input, output, bidirectional, tri_state, passive
    schematic_path: Path to parent .kicad_sch. Optional; omit to use the configured default.
    side: Which sheet edge to place pin on (left or right)

Input parameters:

- `connection_type` (string, required)
- `pin_name` (string, required)
- `schematic_path` (string)
- `sheet_uuid` (string, required)
- `side` (string)

Output parameters:

- `result` (string)

### `remove_sheet_pin` (~87 tokens)

Remove a pin from a hierarchical sheet block.

Args:
    sheet_uuid: UUID of the sheet
    pin_name: Name of the pin to remove
    schematic_path: Path to parent .kicad_sch. Optional; omit to use the configured default.

Input parameters:

- `pin_name` (string, required)
- `schematic_path` (string)
- `sheet_uuid` (string, required)

Output parameters:

- `result` (string)

### `annotate_schematic` (~122 tokens)

Auto-assign reference designators to unannotated components.

Finds components with '?' in their reference (e.g. R?, U?) and assigns
sequential numbers, respecting existing references in the schematic
and across the hierarchy when project_path is provided.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.
    project_path: Path to .kicad_pro file (scans hierarchy for existing refs)

Input parameters:

- `project_path` (string)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `validate_hierarchy` (~77 tokens)

Validate hierarchical schematic for common issues.

Checks for orphaned labels/pins, direction mismatches, duplicate
reference designators, unannotated components, and missing files.

Args:
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `issue_count` (integer)
- `issues` (array)
- `status` (string)

### `is_root_schematic` (~55 tokens)

Check if a schematic is the root or a sub-sheet.

Args:
    schematic_path: Path to .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `is_root` (boolean)
- `root_path`

### `list_hierarchy` (~54 tokens)

List the full sheet hierarchy starting from a root schematic.

Args:
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `component_count` (integer)
- `root` (string)
- `sheet_count` (integer)
- `sheets` (array)

### `get_sheet_info` (~72 tokens)

Get detailed info about a hierarchical sheet including pin/label matching.

Args:
    sheet_uuid: UUID of the sheet
    schematic_path: Path to parent .kicad_sch. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)
- `sheet_uuid` (string, required)

Output parameters:

- `component_count`
- `file_name` (string)
- `height` (number)
- `hierarchical_label_count`
- `label_count`
- `pins` (array)
- `sheet_name` (string)
- `uuid` (string)
- `width` (number)
- `x` (number)
- `y` (number)

### `trace_hierarchical_net` (~77 tokens)

Trace a net across the hierarchy, following hierarchical pins and labels.

Args:
    net_name: Net/label name to trace
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `net_name` (string, required)
- `schematic_path` (string)

Output parameters:

- `connection_count` (integer)
- `connections` (array)
- `net_name` (string)
- `sheets_touched` (array)

### `list_cross_sheet_nets` (~60 tokens)

List all nets that cross sheet boundaries (hierarchical pins and global labels).

Args:
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `global_nets` (array)
- `hierarchical_nets` (array)

### `get_symbol_instances` (~56 tokens)

List all symbol instances from a root schematic's symbolInstances table.

Args:
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `schematic_path` (string)

Output parameters:

- `count` (integer)
- `instances` (array)

### `move_hierarchical_sheet` (~113 tokens)

Move a hierarchical sheet block to a new position, including all pins.

Args:
    sheet_uuid: UUID of the sheet to move
    new_x: New X position in mm
    new_y: New Y position in mm
    schematic_path: Path to parent .kicad_sch. Optional; omit to use the configured default.

Input parameters:

- `new_x` (number, required)
- `new_y` (number, required)
- `schematic_path` (string)
- `sheet_uuid` (string, required)

Output parameters:

- `result` (string)

### `reorder_sheet_pages` (~75 tokens)

Reorder hierarchical sheets by specifying the desired UUID order.

Args:
    page_order: List of sheet UUIDs in desired order
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.

Input parameters:

- `page_order` (array, required)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `duplicate_sheet` (~144 tokens)

Duplicate a hierarchical sheet, copying the child file with new UUIDs.

Args:
    sheet_uuid: UUID of the sheet to duplicate
    new_sheet_name: Display name for the new sheet
    schematic_path: Path to parent .kicad_sch. Optional; omit to use the configured default.
    project_path: Path to .kicad_pro (for hierarchy metadata)
    new_file_name: Name for the copied file (auto-generated if empty)

Input parameters:

- `new_file_name` (string)
- `new_sheet_name` (string, required)
- `project_path` (string)
- `schematic_path` (string)
- `sheet_uuid` (string, required)

Output parameters:

- `result` (string)

### `flatten_hierarchy` (~104 tokens)

Flatten a hierarchical schematic into a single sheet.

Merges all child sheet content into one schematic with offset positions.
Creates a new file — does NOT modify the original hierarchy.

Args:
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.
    output_path: Path for flattened output (defaults to *_flat.kicad_sch)

Input parameters:

- `output_path` (string)
- `schematic_path` (string)

Output parameters:

- `result` (string)

### `export_hierarchical_netlist` (~117 tokens)

Export a netlist with sheet paths for the whole hierarchy

Export a netlist from the root schematic, including hierarchy info.

Runs kicad-cli to generate a netlist and returns parsed component/net data
with sheet path information for each component.

Args:
    schematic_path: Path to root .kicad_sch file. Optional; omit to use the configured default.
    output_dir: Directory for netlist output (defaults to schematic directory).
        Optional; omit to use the configured default.

Input parameters:

- `output_dir` (string)
- `schematic_path` (string)

Output parameters:

- `component_count` (integer)
- `components` (array)
- `net_count` (integer)
- `nets` (array)
- `output_path` (string)

### `run_jobset` (~43 tokens)

Run a KiCad jobset file.

Args:
    jobset_path: Path to .kicad_jobset file

Input parameters:

- `jobset_path` (string, required)

Output parameters:

- `result` (string)

### `get_version` (~20 tokens)

Get KiCad version information including build details and library versions.

Output parameters:

- `version_info` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/productofamerica-mcp-server-kicad/mcp-server-kicad#diagnostics

## Score history

- 2026-08-18: 69
- 2026-08-17: 69
- 2026-08-16: 68
- 2026-08-15: 52
- 2026-08-14: 52
- 2026-08-13: 67
- 2026-08-12: 66
- 2026-08-11: 51
- 2026-08-10: 51

## Links

- PyPI project: https://pypi.org/project/mcp-server-kicad/
- Socket report: https://socket.dev/pypi/package/mcp-server-kicad
- Repository: https://github.com/ProductOfAmerica/mcp-server-kicad
- Changelog RSS feed: https://verifymcp.io/servers/productofamerica-mcp-server-kicad/mcp-server-kicad.xml
- Changelog JSON feed: https://verifymcp.io/servers/productofamerica-mcp-server-kicad/mcp-server-kicad.json
- HTML version of this page: https://verifymcp.io/servers/productofamerica-mcp-server-kicad/mcp-server-kicad
