kicad10-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KICAD_API_TOKEN | No | KiCad API token (usually auto-configured, not needed) | |
| KICAD_API_SOCKET | No | KiCad API socket path (usually auto-configured, not needed) | |
| KICAD_API_TIMEOUT_MS | No | IPC request timeout in milliseconds (default 10000) | 10000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| kicad_statusA | Report whether KiCad is reachable, its version, and which documents are open. Use this first to confirm connectivity before other operations. |
| get_versionA | Return the connected KiCad version and the kicad-python API version. |
| pingA | Ping the KiCad API server. Returns 'pong' on success. |
| list_open_documentsA | List all documents currently open in KiCad, grouped by type. |
| save_boardB | Save the currently open PCB to disk. |
| save_board_asB | Save a copy of the open PCB to a new path. Args: file_path: Destination .kicad_pcb path. overwrite: Overwrite if the file already exists. include_project: Also write the associated project file. |
| revert_boardA | Discard unsaved changes and reload the open PCB from disk. |
| run_actionA | Run an arbitrary KiCad tool action by name (power user / unstable API). Example actions: 'pcbnew.InteractiveRouter.routeSingleTrack', 'pcbnew.EditTool.Rotate', 'common.Control.zoomFitScreen'. Action names are not guaranteed stable across KiCad versions and may have side effects. Args: action: The KiCad TOOL_ACTION name to invoke. |
| get_kicad_binary_pathA | Return the full path to a bundled KiCad binary (e.g. 'kicad-cli'). Args: binary_name: Short binary name; '.exe' is assumed on Windows. |
| get_board_summaryA | Return counts and basic metadata for the open PCB. Includes element counts, copper layer count, board file name, and bounding box extents in millimetres. |
| list_footprintsB | List footprints on the open PCB. Args: reference_filter: Case-insensitive substring match on the reference (e.g. 'R', 'U1'). value_filter: Case-insensitive substring match on the component value. include_pads: Include each footprint's pads (number, net, position). |
| get_footprintC | Return full detail for a single footprint by reference designator. Args: reference: Reference designator, e.g. 'U1'. include_pads: Include the footprint's pads. |
| list_padsB | List pads on the board, optionally filtered by footprint reference or net. Args: reference: Only pads belonging to this footprint reference. net_filter: Case-insensitive substring match on the pad's net name. |
| list_tracksA | List copper tracks and arc tracks on the board. Args: layer: Restrict to a layer name, e.g. 'F.Cu'. net_filter: Case-insensitive substring match on the net name. |
| list_viasA | List vias on the board, optionally filtered by net. |
| list_zonesA | List copper zones, rule areas, and graphic zones on the board. |
| list_shapesA | List graphic shapes (lines, arcs, circles, rectangles, polygons) on the board. Args: layer: Restrict to a layer name, e.g. 'Edge.Cuts' for the board outline. |
| get_board_outlineA | Return all graphic shapes on the Edge.Cuts layer (the board outline). |
| list_textA | List free text and text-box objects on the board. |
| list_dimensionsB | List dimension annotations on the board. |
| list_groupsA | List item groups on the board with their member item IDs. |
| get_bounding_boxA | Return KiCad-computed bounding boxes for the given item IDs. Args: item_ids: Item KIID strings (from any list_* tool). include_text: Include child reference/value text in footprint boxes. |
| move_footprintB | Move a footprint to an absolute position, optionally setting its rotation. Args: reference: Reference designator, e.g. 'R1'. x_mm: Target X in millimetres. y_mm: Target Y in millimetres. angle_deg: Optional absolute rotation in degrees. |
| rotate_footprintB | Set a footprint's absolute rotation in degrees. Args: reference: Reference designator, e.g. 'U1'. angle_deg: Absolute angle in degrees (0, 90, 180, 270, ...). |
| set_footprint_lockedB | Lock or unlock a footprint. Args: reference: Reference designator. locked: True to lock, False to unlock. |
| set_footprint_valueC | Set the value field text of a footprint (e.g. '10k', '100nF'). Args: reference: Reference designator. value: New value string. |
| batch_move_footprintsA | Move/rotate several footprints in a single undo step. Args: moves: List of objects with keys 'reference', 'x_mm', 'y_mm', and optional 'angle_deg'. Example: [{"reference": "R1", "x_mm": 100, "y_mm": 95}, {"reference": "C1", "x_mm": 102, "y_mm": 95, "angle_deg": 90}] |
| set_items_lockedC | Lock or unlock arbitrary board items by ID. Args: item_ids: Item KIID strings. locked: True to lock, False to unlock. |
| delete_itemsA | Delete board items by their KIID strings (single undo step). Args: item_ids: Item KIID strings from any list_* tool. |
| select_itemsB | Select board items by ID in the PCB editor. Args: item_ids: Item KIID strings. add_to_existing: Keep the current selection and add to it. |
| clear_selectionB | Clear the current selection in the PCB editor. |
| get_selectionA | Return the items currently selected in the PCB editor (id + type). |
| get_footprint_geometryA | Position, rotation, side, courtyard box, and every pad (number, net, position, size) of one footprint. Use this before placing or routing around a part. Args: reference: Reference designator, e.g. 'U1'. |
| place_relativeB | Place a footprint at an offset from another footprint's origin. Args: reference: Footprint to move. anchor_reference: Footprint to measure from. dx_mm, dy_mm: Offset in mm (Y grows downward). angle_deg: Optional absolute rotation for the moved part. |
| place_near_padA | Place a part right next to a specific pad, just outside the target part's courtyard and aligned with the pad. Ideal for decoupling capacitors, pull-ups, and series resistors. Args: reference: Footprint to move, e.g. 'C3'. target_reference: Part that owns the pad, e.g. 'U2'. target_pad: Pad number on the target, e.g. '13'. side: 'left', 'right', 'up', 'down', or 'auto' (the courtyard edge nearest the pad). gap_mm: Courtyard-to-courtyard gap in mm. angle_deg: Optional absolute rotation for the moved part (applied first). auto_orient: If the moved part has a pad on the target pad's net, turn it 180 degrees when that makes the same-net pad face the target (so the connecting track doesn't cross the part's other pad). |
| place_on_edgeA | Place a part against a board edge (connectors, sensors, switches). Args: reference: Footprint to move. edge: 'left', 'right', 'top', or 'bottom' edge of the board outline. inset_mm: Distance from the board edge to the part's courtyard. along_mm: Absolute coordinate along the edge (X for top/bottom, Y for left/right). Defaults to the middle of that edge. angle_deg: Optional absolute rotation (applied first). |
| arrange_rowA | Line several parts up in a row or column in one undo step. Args:
references: Parts in order, e.g. ['R1', 'R2', 'R3'].
start_x_mm, start_y_mm: Origin of the first part.
pitch_mm: Fixed origin-to-origin spacing. If omitted, parts are packed
courtyard-to-courtyard with |
| flip_footprintA | Move a footprint to the other side of the board (front <-> back), mirrored in place. Args: reference: Footprint to flip. |
| check_placementA | Score the current placement: courtyard overlaps, parts off the board, and total airwire (ratsnest) length. Lower airwire length usually means easier routing; compare before/after when moving parts. Args: exclude_nets: Nets to ignore in the airwire total, typically ['GND'] when a ground pour will connect it. top_airwires: How many of the longest airwires to list. |
| add_trackA | Add a straight copper track segment. Prefer route_pads (connect pads by name) or add_track_path (multi-segment) - they avoid hand-copied coordinates. Args: start_x_mm, start_y_mm: Start point in mm. end_x_mm, end_y_mm: End point in mm. width_mm: Track width in mm; default is the net's netclass width. layer: Copper layer name, e.g. 'F.Cu' or 'B.Cu'. net_name: Net to assign (must exist on the board). |
| add_arc_trackA | Add a curved (arc) copper track defined by start, mid, and end points. Args: start_x_mm, start_y_mm: Arc start in mm. mid_x_mm, mid_y_mm: A point on the arc between start and end, in mm. end_x_mm, end_y_mm: Arc end in mm. width_mm: Track width in mm. layer: Copper layer name. net_name: Optional net to assign. |
| add_viaA | Add a through via at a position, sized from the net's netclass by default, and report clearance problems with other nets on the outer layers. Args: x_mm, y_mm: Via centre in mm. diameter_mm: Copper diameter in mm; default from netclass. drill_mm: Drill diameter in mm; default from netclass. net_name: Net to assign (must exist on the board). |
| add_zoneA | Add a copper zone (filled pour) bounded by a polygon outline. Args: points: Outline vertices, each {"x_mm": .., "y_mm": ..} or [x, y]. >= 3 points. layers: Layer names the zone exists on, e.g. ['F.Cu']. net_name: Net to connect the pour to (e.g. 'GND'). Empty for no net. name: Optional zone name. priority: Fill priority (higher fills first). refill: Refill all zones after creating (slower, reflects in editor). |
| add_zone_rectA | Add a rectangular copper zone (convenience wrapper around add_zone). Args: x_min_mm, y_min_mm: Top-left corner in mm. x_max_mm, y_max_mm: Bottom-right corner in mm. layers: Layer names, e.g. ['F.Cu']. net_name: Net to connect (e.g. 'GND'). name: Optional zone name. priority: Fill priority. refill: Refill zones after creating. |
| refill_zonesA | Refill (recompute) all copper zones on the board. May take a few seconds. |
| add_lineB | Add a graphic line segment (silkscreen, fab, Edge.Cuts, etc.). Args: start_x_mm, start_y_mm: Start point in mm. end_x_mm, end_y_mm: End point in mm. layer: Layer name, e.g. 'F.SilkS' or 'Edge.Cuts'. width_mm: Line width in mm. |
| add_rectangleB | Add a graphic rectangle. Args: x_min_mm, y_min_mm: Top-left corner in mm. x_max_mm, y_max_mm: Bottom-right corner in mm. layer: Layer name. width_mm: Outline width in mm. filled: Whether the rectangle is solid-filled. |
| add_circleB | Add a graphic circle. Args: center_x_mm, center_y_mm: Centre in mm. radius_mm: Radius in mm. layer: Layer name. width_mm: Outline width in mm. filled: Whether the circle is solid-filled. |
| add_arcA | Add a graphic arc defined by start, mid, and end points. Args: start_x_mm, start_y_mm: Arc start in mm. mid_x_mm, mid_y_mm: Point on the arc, in mm. end_x_mm, end_y_mm: Arc end in mm. layer: Layer name. width_mm: Outline width in mm. |
| add_polygonB | Add a graphic polygon. Args: points: Vertices, each {"x_mm": .., "y_mm": ..} or [x, y]. >= 3 points. layer: Layer name. width_mm: Outline width in mm. filled: Whether the polygon is solid-filled. |
| add_board_outline_rectB | Add a rectangular board outline on the Edge.Cuts layer. Args: x_min_mm, y_min_mm: Top-left corner in mm. x_max_mm, y_max_mm: Bottom-right corner in mm. width_mm: Outline width in mm. |
| add_textB | Add free text to the board. Args: text: The text string. x_mm, y_mm: Anchor position in mm. layer: Layer name, e.g. 'F.SilkS'. size_mm: Glyph height (and width) in mm. thickness_mm: Stroke thickness in mm. angle_deg: Rotation in degrees. |
| route_padsA | Route a track between two pads by name - no coordinates needed. Looks up both pads, takes the net from them, uses the netclass track width unless overridden, draws a 45-degree (or orthogonal) path, and then reports clearance conflicts with other nets. A power track wider than a fine-pitch pad is necked down where it leaves the pad (see 'necks' in the result). Args: from_reference, from_pad: Start pad, e.g. 'U2', '7'. to_reference, to_pad: End pad, e.g. 'J3', '1'. layer: Copper layer. Empty = a layer both pads share (F.Cu preferred). width_mm: Track width; default is the net's netclass width. style: '45' (default), 'manhattan' (90-degree), or 'direct' (straight line). bend: 'straight_first' or 'diagonal_first' - which end gets the bend. via_at: [x_mm, y_mm] to change layer through a via on the way. Required when the pads have no copper layer in common (e.g. one SMD on each side); if omitted in that case the via goes at the midpoint. to_layer: Layer after the via (default: the other outer layer). rollback_on_conflict: Undo the whole route if any clearance problem is found. neck_down: Where the full width would hit the part's other pins, run the stretch next to the pad at the widest width that fits (at most the pad's size) and widen once clear. |
| add_track_pathA | Draw a connected multi-segment track through a list of points in one step, then check both ends are connected and nothing is too close. Args: points: Vertices, each [x, y] or {"x_mm":.., "y_mm":..}; at least 2. net_name: Net to assign (must exist; e.g. 'GND', '/MOTOR_A'). layer: Copper layer name. width_mm: Track width; default is the net's netclass width. rollback_on_conflict: Undo the path if any clearance problem is found. |
| check_clearanceA | Quick clearance check of tracks against other nets' copper (tracks, vias, pads), using each net's netclass clearance. Pass track IDs to check just those, or nothing to check every track. Approximate - run_drc is authoritative. Args: item_ids: Track KIIDs to check; empty = all tracks on the board. |
| freerouting_statusA | Report whether autorouting can run: Java version, installed Freerouting jars, and KiCad's Python (needed for DSN/SES conversion). |
| install_freeroutingA | Download the official Freerouting release jar from GitHub into ~/.kicad10_mcp/freerouting. 'auto' picks the newest release the installed Java can run (2.4.1 on Java 25+, 2.1.0 on Java 21-24). Freerouting is GPL-3.0 and runs as a separate program. Args: version: 'auto' or an explicit release such as '2.1.0'. |
| autorouteA | Route the remaining connections with Freerouting. Typical flow: set net classes (configure_netclasses), route or pour the high-current nets yourself, then autoroute the rest with those classes in skip_netclasses. Existing tracks are locked so they are not moved. With the board open in KiCad it is saved, backed up (.pre-autoroute.kicad_pcb), routed on disk, and reloaded into the editor - that replaces the editor's undo history, so the backup is the way back. Afterwards zones are refilled and DRC runs; always read 'drc_after' (copper text and some keepouts are invisible to Freerouting). Args: max_passes: Autorouter pass limit (honoured by Freerouting 2.2+). timeout_s: Hard limit for the Freerouting run, in seconds. lock_existing: Keep existing tracks exactly where they are. skip_netclasses: Net classes Freerouting must not route, e.g. ['HighCurrent']. board_file: Route this .kicad_pcb on disk instead of the open board. |
| list_netsA | List all nets on the board, optionally filtered by net class name. Args: netclass_filter: Restrict to nets belonging to this net class. |
| list_netclassesA | List the project's net classes and their key parameters (mm). |
| get_items_by_netB | Summarise every board item belonging to a net (counts by type + IDs). Args: net_name: The net name, e.g. 'GND'. |
| get_connected_itemsB | Find items copper-connected to a given item (by KIID). Args: item_id_str: KIID string of the source track/via/pad. |
| list_board_layersB | Report copper layer count plus enabled, visible, and active layers (names). |
| set_active_layerB | Set the active drawing layer in the PCB editor. Args: layer: Layer name, e.g. 'B.Cu'. |
| set_visible_layersA | Set exactly which layers are visible in the editor. Args: layers: Full list of layer names to make visible (others are hidden). |
| set_copper_layer_countA | Set the number of copper layers (must be even, >= 2). WARNING: removing layers deletes any content on them and cannot be undone. Pass confirm=True to proceed. Args: count: New copper layer count. confirm: Must be True to apply the change. |
| get_stackupA | Return the board stackup: ordered layers with type, thickness, material. |
| get_design_rulesA | Return the board's minimum design-rule constraints in mm (best effort). Falls back to an explanatory message if the running KiCad build does not expose design rules over the API. |
| calc_track_widthA | IPC-2221 minimum track width for a current, plus resistance and voltage drop when a length is given. Args: current_a: Continuous (or worst-case, e.g. motor stall) current in amps. temp_rise_c: Allowed temperature rise above ambient (10 C is conservative). copper_oz: Copper weight (1 oz = 35 um is the usual default). internal_layer: True for inner layers (they cool worse, need ~2.5x width). length_mm: Optional track length to report resistance, drop, and loss. |
| get_netclass_configA | Read net classes and net-to-class patterns from the project file (works with KiCad closed). list_netclasses reads the live values from a running KiCad. Args: project_path: .kicad_pro file or its folder; default = project of the open board. |
| configure_netclassesA | Create/update net classes and assign nets to them in the .kicad_pro file. Widths can be derived from current (IPC-2221) instead of fixed numbers. The project must be CLOSED in KiCad (both editors): KiCad keeps project settings in memory and would overwrite this change on its next save. Reopen it afterwards and the nets pick up their classes. Args: classes: One object per class, e.g. [{"name": "Power", "current_a": 1.5, "nets": ["+5V", "VMOT"]}, {"name": "Motor", "current_a": 2.5, "nets": ["AO1", "AO2"]}, {"name": "Signal", "track_width_mm": 0.25, "nets": ["/*"]}] Keys: name (required); nets (names or KiCad wildcard patterns - plain names also match their '/NAME' root-sheet form); current_a (sizes the track via IPC-2221) or track_width_mm; clearance_mm; via_diameter_mm; via_drill_mm; priority (lower wins when patterns overlap). project_path: .kicad_pro file or its folder; default = project of the open board. temp_rise_c: Temperature rise used for current-based widths. copper_oz: Copper weight used for current-based widths. replace_patterns: Drop all existing net-class patterns first. |
| analyze_power_budgetA | Estimate how much current every supply net carries, from the schematic, and suggest track widths / net classes. Works for any kind of board. Reads the saved schematic via kicad-cli (save it first). Parts are looked up in the current database; regulators, drivers, and series parts (fuse, diode, switch, inductor, 0-ohm) propagate current from loads back to the source. Returns 'questions' when information is missing - answer them and run again:
Args: schematic_path: .kicad_sch / .kicad_pro / project folder; default = project of the open board. external_loads: What hangs off connectors (or any part), by reference: {"J2": 2.5} or {"J2": {"typ_a": 0.4, "max_a": 2.5, "note": "motor stall"}}. Current is charged to every non-ground net the part touches; restrict with "pins": ["1"] (e.g. only the supply pin of a 3-pin servo header). sources: References of the supply inputs (battery/power connectors). Default: batteries, USB/barrel jacks, and connectors named like BAT/PWR/SUPPLY. net_voltages: Voltages for nets whose name doesn't say it, e.g. {"/VMOT": 7.4}; used for switching regulators and linear-regulator dissipation. temp_rise_c: Temperature rise for the width suggestions. copper_oz: Copper weight for the width suggestions. |
| set_part_currentA | Save a part's current data (from its datasheet) to the user part database so analyze_power_budget can use it. Always cite where the numbers came from. Args: part: Symbol name as in KiCad (e.g. 'TB6612FNG'); also used as the match pattern unless entry has "match": [...] (wildcards allowed). entry: Behaviour description; any of: "supply": [{"pins": ["VCC"], "typ_a": 0.0015, "max_a": 0.0022}] "regulators": [{"in_pins": ["VIN"], "out_pins": ["VOUT"], "type": "linear"|"buck", "vout": 3.3, "efficiency": 0.9, "max_out_a": 1.0}] "drivers": [{"supply_pins": ["VM"], "channels": [["OUT1", "OUT2"]], "max_continuous_a": 1.2, "max_peak_a": 3.2}] Pin names must match the KiCad symbol's pin names. source: Datasheet URL (and page/table) the numbers came from. verified: False if the numbers are estimates rather than datasheet values. |
| list_part_databaseB | List parts the power budget knows about (built-in and user-added). Args: filter: Optional case-insensitive substring to filter part names. |
| get_project_infoA | Return the open project's name and path. |
| get_text_variablesA | Return the project's text variables (used in ${VAR} substitutions). |
| set_text_variableA | Set (or add) one project text variable, merging with existing variables. Args: name: Variable name (referenced as ${name}). value: Variable value. |
| expand_textA | Expand ${...} text variables in a string using the project's values. Args: text: Text possibly containing ${VAR} references. |
| get_title_blockA | Return the board's title block fields (title, date, revision, company, comments). |
| set_title_blockB | Update title block string fields on the board. Args: fields: Map of field name to value, e.g. {"title": "My Board", "revision": "B", "company": "Acme", "date": "2026-05-23"}. Valid field names are returned by get_title_block. |
| get_schematic_summaryA | Return counts of symbols, labels, text, lines, and sheets in the open schematic. |
| list_symbolsA | List symbol instances in the open schematic (reference, value, position). Note: requires KiCad's schematic symbol API (KiCad 11+); on KiCad 10 this may return an error — fall back to execute_kipy or read the .kicad_sch file. |
| list_labelsA | List labels (local/global/hierarchical) in the open schematic. |
| list_schematic_textA | List free text objects in the open schematic. |
| get_schematic_hierarchyA | Return the sheet hierarchy of the open schematic (KiCad 11+ feature). |
| add_schematic_textC | Add a free text object to the open schematic. Args: text: Text string. x_mm, y_mm: Position in mm. |
| add_local_labelC | Add a local net label to the open schematic. Args: text: Label text (the net name). x_mm, y_mm: Position in mm. |
| save_schematicB | Save the open schematic to disk. |
| run_kicad_cliB | Run an arbitrary kicad-cli command (escape hatch for any export). Args: args: Argument list after the binary, e.g. ["pcb", "export", "gerbers", "board.kicad_pcb", "-o", "out/"] or ["version"]. Use the currently open board's path from get_board_summary. |
| export_gerbersA | Export Gerber files for the open PCB into a directory. Args: output_dir: Destination directory (created if needed). layers: Optional comma-separated layer list, e.g. 'F.Cu,B.Cu,Edge.Cuts'. Empty exports all enabled plottable layers. save_first: Save the board before exporting. |
| export_drillA | Export drill files (Excellon) for the open PCB into a directory. Args: output_dir: Destination directory (created if needed). save_first: Save the board before exporting. |
| export_stepA | Export a 3D STEP model of the open PCB. Args: output_path: Destination .step/.stp file. save_first: Save the board before exporting. |
| export_pdfB | Export a PDF plot of selected PCB layers. Args: output_path: Destination .pdf file. layers: Comma-separated layers to plot. save_first: Save the board before exporting. |
| export_svgB | Export an SVG plot of selected PCB layers. Args: output_path: Destination .svg file. layers: Comma-separated layers to plot. save_first: Save the board before exporting. |
| export_posA | Export a component placement (pick-and-place) file. Args: output_path: Destination file. fmt: 'csv', 'ascii', or 'gerber'. side: 'front', 'back', or 'both'. save_first: Save the board before exporting. |
| render_3dB | Render a 3D image (PNG) of the open PCB. Args: output_path: Destination .png file. side: 'top', 'bottom', 'left', 'right', 'front', 'back'. width, height: Image dimensions in pixels. save_first: Save the board before rendering. |
| run_drcA | Run Design Rule Check on the open PCB and summarise the results. Args: output_path: Optional .json report path (a temp file is used if empty). save_first: Save the board before checking. refill_zones: Refill zones first (in the editor too when saving) - stale fills after routing show up as false clearance errors. |
| export_bomA | Export a bill of materials (CSV) from the open schematic. Args: output_path: Destination .csv file. schematic_path: Explicit .kicad_sch path (defaults to the open project's). save_first: Save the schematic before exporting. |
| export_netlistB | Export a netlist from the open schematic. Args: output_path: Destination netlist file (e.g. .net). schematic_path: Explicit .kicad_sch path (defaults to the open project's). save_first: Save the schematic before exporting. |
| run_ercA | Run Electrical Rule Check on the open schematic and summarise the results. Args: output_path: Optional .json report path (a temp file is used if empty). schematic_path: Explicit .kicad_sch path (defaults to the open project's). save_first: Save the schematic before checking. |
| snapshot_boardA | Return a PNG picture of the open board (top view) to check placement and routing visually. Front copper is red, back copper blue, zone fills are tinted in their layer's colour, courtyards are grey (front) / purple (back) boxes labelled with references, airwires are yellow. Args: side: 'both', 'front', or 'back' - which side's parts and copper to draw. show_ratsnest: Draw airwires for connections that copper (tracks, vias, zone fills) does not make yet. ratsnest_exclude_nets: Nets to leave out of the airwires, e.g. ['GND']. highlight_net: Draw this net's pads, tracks, and airwires in green. width_px: Image width in pixels (height follows the board's aspect ratio). show_zones: Draw copper zone fills (refill_zones first if they are stale). |
| execute_kipyA | Run arbitrary Python against the live KiCad session (FULL-CONTROL escape hatch). Use this for anything not covered by a dedicated tool. The code runs in-process with these names pre-bound:
Conventions:
Args: code: Python source to execute. autosave: If True and a board is open, save it after the code runs. Example: code = ''' from kipy.board_types import Track from kipy.geometry import Vector2 t = Track() t.start = Vector2.from_xy_mm(10, 10) t.end = Vector2.from_xy_mm(20, 10) t.width = 250000 # 0.25 mm in nm t.layer = BoardLayer.BL_F_Cu with commit(board, "api track"): created = board.create_items(t) result = [c.id.value for c in created] ''' |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 102 tools
The set spans many distinct PCB and project resources, but with 102 tools there are overlapping boundaries among list/get/summary tools, multiple placement/routing helpers, and three general escape hatches (run_action, run_kicad_cli, execute_kipy). Detailed descriptions mitigate most confusion, but an agent can still misselect among near-duplicate inspection, export, and low-level execution tools.
Nearly all names use snake_case and follow a verb_noun or noun_verb convention such as save_board, list_footprints, add_track, and export_gerbers. A few outliers like ping, autoroute, kicad_status, and freerouting_status deviate from the dominant pattern, but the set remains readable and broadly consistent.
102 tools is far beyond the 3-15 range for a coherent MCP server and exceeds the 50+ extreme-mismatch threshold. Even for a complex EDA domain, this volume creates a heavy selection burden and many capabilities could be consolidated.
Coverage is extensive for PCB work: placement, routing, zones, DRC/ERC, autoroute, netclasses, power analysis, visualization, and many export formats are present. Schematic editing is thinner (no symbol/wire creation or deletion), but execute_kipy and run_kicad_cli provide workarounds for gaps.