eda-mcp
# eda-mcp
MCP server for EDA (Electronic Design Automation) tools. Currently supports **KiCad 9.x** with 39 tools covering the full PCB design workflow.
## Requirements
- Python 3.11+
- [KiCad 9.x](https://www.kicad.org/download/) installed
- [uv](https://docs.astral.sh/uv/) package manager
## Installation
```bash
git clone https://github.com/SaeronLab/eda-mcp.git
cd eda-mcp
uv sync
```
## Claude Code Configuration
Add to your `.mcp.json`:
```json
{
"mcpServers": {
"eda-mcp": {
"type": "stdio",
"command": "uv",
"args": ["--directory", "/path/to/eda-mcp", "run", "eda-mcp"]
}
}
}
```
## Tools
### Core (6)
| Tool | Description |
|------|-------------|
| `kicad.get_session_state` | Current session state and capabilities |
| `kicad.create_project` | Create a new KiCad project |
| `kicad.open_project` | Open an existing project |
| `kicad.list_projects` | Find projects in a directory |
| `kicad.save_project` | Save all project files |
| `kicad.help` | Workflow and tool documentation |
### Schematic (13)
| Tool | Description |
|------|-------------|
| `kicad.add_component` | Add a symbol to the schematic |
| `kicad.add_power_symbol` | Add VCC, GND, +3V3, etc. |
| `kicad.set_value` | Set component value (10k, 100nF) |
| `kicad.set_reference` | Change reference designator |
| `kicad.set_component_field` | Set custom fields (MPN, supplier) |
| `kicad.delete_component` | Remove a component |
| `kicad.move_component` | Reposition a component |
| `kicad.add_wire` | Connect two points with a wire |
| `kicad.add_net_label` | Add a named net label |
| `kicad.add_global_label` | Add a cross-sheet label |
| `kicad.add_no_connect` | Mark unused pins |
| `kicad.annotate_schematic` | Auto-assign reference designators |
| `kicad.list_components` | List all components with details |
### PCB (10)
| Tool | Description |
|------|-------------|
| `kicad.create_board_outline` | Draw the PCB boundary |
| `kicad.set_design_rules` | Set min trace/clearance/drill |
| `kicad.create_net_class` | Create net class with specific rules |
| `kicad.route_trace` | Route a copper trace |
| `kicad.place_via` | Place a via |
| `kicad.fill_zones` | Fill copper zones |
| `kicad.add_text` | Add silkscreen text |
| `kicad.add_line` | Add lines/shapes to layers |
| `kicad.design_summary` | Board statistics and sanity check |
| `kicad.list_footprints` | List all footprints on the PCB |
### Export (7)
| Tool | Description |
|------|-------------|
| `kicad.export_netlist` | Export netlist from schematic |
| `kicad.export_gerbers` | Export Gerber manufacturing files (DRC-gated) |
| `kicad.export_bom` | Export Bill of Materials |
| `kicad.export_pdf` | Export schematic/PCB to PDF |
| `kicad.export_svg` | Export schematic/PCB to SVG |
| `kicad.run_drc` | Design Rules Check |
| `kicad.run_erc` | Electrical Rules Check |
### Library (3)
| Tool | Description |
|------|-------------|
| `kicad.search_symbols` | Search component symbols |
| `kicad.search_footprints` | Search PCB footprints |
| `kicad.get_symbol_info` | Get symbol pins and properties |
## Architecture
```
src/eda_mcp/
├── server.py # FastMCP server, tool registration
├── session.py # Session state management
├── common/
│ ├── types.py # ToolResponse, Position
│ └── errors.py # Error hierarchy
└── plugins/
└── kicad/
├── discovery.py # KiCad path detection
├── guardrails.py # Pre-export safety checks
├── worker.py # Async pcbnew worker manager
├── worker_process.py # Persistent pcbnew subprocess
├── sexp/
│ ├── parser.py # S-expression parser
│ └── writer.py # S-expression writer
└── tools/
├── schematic.py # Schematic manipulation via sexp
├── cli.py # kicad-cli exports (Gerber, PDF, DRC)
└── library.py # Symbol/footprint search
```
Three integration paths:
- **S-expression parser/writer** — Direct manipulation of `.kicad_sch` files with round-trip fidelity
- **Persistent pcbnew worker** — JSON-RPC subprocess using KiCad's Python API for PCB operations
- **kicad-cli** — Subprocess calls for exports, DRC, and ERC
## Development
```bash
uv run pytest tests/ -v # Run all tests
uv run ruff check src/ tests/ # Lint
uv run pyright src/ # Type check
```
## License
MIT
TDQS
Scored across 39 tools
Most tools have distinct purposes, but some overlap exists: add_line and route_trace both handle drawing on PCB layers, and add_net_label and add_global_label both create net connections, which could cause confusion. However, descriptions clarify their specific contexts (schematic vs. PCB) and use cases, helping agents differentiate them.
All tools follow a consistent verb_noun pattern with the 'kicad.' prefix, such as add_component, create_project, export_gerbers, and run_drc. This predictability makes it easy for agents to understand and navigate the toolset without naming confusion.
With 39 tools, the count is high and may feel heavy for an EDA server, potentially overwhelming agents. While it covers many KiCad operations, it could benefit from consolidation or scoping down to a more manageable set, as some tools are highly specific (e.g., add_no_connect, fill_zones).
The toolset provides comprehensive coverage for KiCad EDA workflows, including project management, schematic design, PCB layout, validation (ERC/DRC), and export functions. It supports full CRUD operations on components and projects, with no obvious gaps that would hinder agent tasks in this domain.