Bug 1 - add_schematic_component: footprint parameter silently ignored The footprint value from MCP params was never passed through to DynamicSymbolLoader.add_component() / create_component_instance(). Every placed symbol had an empty Footprint field regardless of input. Fix: added footprint: str='' to both functions, passed through all call sites, added footprint to schematic.ts tool schema. Bug 2 - delete_schematic_component: only deleted first duplicate When a reference appeared multiple times (e.g. after a failed add attempt), only the first instance was removed due to break after first match. Fix: collect all matching blocks first, then delete back-to-front to preserve indices. Response now includes deleted_count. New tool - edit_schematic_component Update footprint, value or reference of a placed symbol in-place. More efficient than delete+re-add: preserves position and UUID. Accepts: schematicPath, reference, footprint?, value?, newReference? All 3 fixes verified by live tests on a real JLCPCB/KiCAD 9 project: - R_TEST1: footprint Resistor_SMD:R_0603_1608Metric written correctly - J1 duplicate: deleted_count=2 with single call - J2 edit: PinSocket footprint assigned in-place, no delete+add needed - PCB update (F8) confirmed: only components with footprint imported
476 lines
18 KiB
Markdown
476 lines
18 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to the KiCAD MCP Server project are documented here.
|
||
|
||
## [2.2.1-alpha] - 2026-02-28
|
||
|
||
### New MCP Tools
|
||
|
||
- `edit_schematic_component` – Update properties of a placed symbol in-place (footprint,
|
||
value, reference rename). More efficient than delete + re-add: preserves position and UUID.
|
||
|
||
### Bug Fixes
|
||
|
||
- `add_schematic_component`: `footprint` parameter was accepted but silently ignored – the
|
||
value was never passed through to `DynamicSymbolLoader.add_component()` /
|
||
`create_component_instance()`. All newly placed symbols always had an empty Footprint
|
||
field. Fix: added `footprint: str = ""` to both functions and threaded it through every
|
||
call site including the TypeScript tool schema.
|
||
|
||
- `delete_schematic_component`: only deleted the first matching instance when duplicate
|
||
references existed (e.g. after an aborted add attempt). Root cause: loop used `break`
|
||
after the first match. Fix: collect all matching blocks first, then delete them all back-
|
||
to-front (to preserve line indices). Response now includes `deleted_count`.
|
||
|
||
- `templates/*.kicad_sch`, `project.py`, `schematic.py`: Update KiCAD schematic format
|
||
version from `20230121` (KiCAD 7) to `20250114` (KiCAD 9). The MCP server targets
|
||
KiCAD 9 exclusively (`pcbnew.pyd` compiled for KiCAD 9.0, Python 3.11.5) – generating
|
||
files in an outdated format caused a spurious "This file was created with an older
|
||
KiCAD version" warning on every newly created schematic.
|
||
|
||
- `template_with_symbols_expanded.kicad_sch`: Remove 13 corrupt `_TEMPLATE_*` placed-symbol
|
||
blocks with `(lib_id -100)` – an integer caused by old sexpdata serializer (same bug
|
||
PR #40 fixed for the add path). KiCAD crashed with a null-pointer when selecting these
|
||
symbols. They appeared as grey `_TEMPLATE_R?`, `_TEMPLATE_U_REG?` etc. labels far
|
||
outside the sheet boundary (~5000mm off-sheet).
|
||
|
||
**Discovered via:** live testing on a real JLCPCB/KiCAD 9 project.
|
||
**Affected users:** schematics created from this template before this fix contain the
|
||
same corrupt blocks – remove all `(symbol (lib_id -100) ...)` blocks whose Reference
|
||
starts with `_TEMPLATE_`.
|
||
|
||
---
|
||
|
||
---
|
||
|
||
## [2.2.0-alpha] - 2026-02-27
|
||
|
||
### New MCP Tools (TypeScript layer – previously Python-only)
|
||
|
||
**Routing tools:**
|
||
- `delete_trace` - Delete traces by UUID, position or net name
|
||
- `query_traces` - Query/filter traces on the board
|
||
- `get_nets_list` - List all nets with net code and class
|
||
- `modify_trace` - Modify trace width or layer
|
||
- `create_netclass` - Create or update a net class
|
||
- `route_differential_pair` - Route a differential pair between two points
|
||
- `refill_zones` - Refill all copper zones ⚠️ SWIG segfault risk, prefer IPC/UI
|
||
|
||
**Component tools:**
|
||
- `get_component_pads` - Get all pad data for a component
|
||
- `get_component_list` - List all components on the board
|
||
- `get_pad_position` - Get absolute position of a specific pad
|
||
- `place_component_array` - Place components in a grid array
|
||
- `align_components` - Align components along an axis
|
||
- `duplicate_component` - Duplicate a component with offset
|
||
|
||
### Bug Fixes
|
||
|
||
- `routing.py`: Fix SwigPyObject UUID comparison (`str()` → `m_Uuid.AsString()`)
|
||
- `routing.py`: Fix SWIG iterator invalidation after `board.Remove()` by snapshotting `list(board.Tracks())`
|
||
- `routing.py`: Add `board.SetModified()` + `track = None` after `Remove()` to prevent dangling SWIG pointer crashes
|
||
- `routing.py`: Per-track `try/except` in `query_traces()` to skip invalid objects after bulk delete
|
||
- `routing.py`: Add missing return statement (mypy)
|
||
- `library.py`: Fix `search_footprints` parameter mapping (`search_term` → `pattern`)
|
||
- `library.py`: Fix field access (`fp.name` → `fp.full_name`)
|
||
- `library.py`: Accept both `pattern` and `search_term` parameter names
|
||
- `library.py`: Fix loop variable shadowing `Path` object (mypy)
|
||
- `design_rules.py`: Add type annotation for `violation_counts` (mypy)
|
||
|
||
### New MCP Tools (cont.)
|
||
|
||
**Datasheet tools:**
|
||
- `get_datasheet_url` - Return LCSC datasheet PDF URL and product page URL for a given
|
||
LCSC number (e.g. `C179739` → `https://www.lcsc.com/datasheet/C179739.pdf`).
|
||
No API key required – URL is constructed directly from the LCSC number.
|
||
- `enrich_datasheets` - Scan a `.kicad_sch` file and write LCSC datasheet URLs into
|
||
every symbol that has an `LCSC` property but an empty `Datasheet` field. After
|
||
enrichment the URL appears natively in KiCAD's symbol properties, footprint browser
|
||
and any other tool that reads the standard KiCAD `Datasheet` field.
|
||
Supports `dry_run=true` for preview without writing.
|
||
Implementation: `python/commands/datasheet_manager.py` (text-based, no `skip` writes)
|
||
|
||
**Schematic tools:**
|
||
- `delete_schematic_component` - Remove a placed symbol from a `.kicad_sch` file by
|
||
reference designator (e.g. `R1`, `U3`).
|
||
|
||
### Bug Fixes (cont.)
|
||
|
||
- `schematic.ts` / `kicad_interface.py`: Fix missing `delete_schematic_component` MCP tool.
|
||
|
||
**Root cause (two separate issues):**
|
||
1. No MCP tool named `delete_schematic_component` existed. Claude had no way to call
|
||
it, so any "delete schematic component" request fell through to the PCB-only
|
||
`delete_component` tool, which searches `pcbnew.BOARD` and always returned
|
||
"Component not found" for schematic symbols.
|
||
2. `component_schematic.py::remove_component()` still used `skip` for writes.
|
||
PR #40 rewrote `DynamicSymbolLoader` (add path) to avoid `skip`-induced schematic
|
||
corruption, but `remove_component` (delete path) was not touched by that PR.
|
||
|
||
**Fix:**
|
||
- Added `delete_schematic_component` to the TypeScript tool layer (`schematic.ts`)
|
||
with clear docstring distinguishing it from the PCB `delete_component`.
|
||
- Implemented `_handle_delete_schematic_component` in `kicad_interface.py` using
|
||
direct text manipulation (parenthesis-depth tracking, same approach as PR #40).
|
||
Does not call `component_schematic.py::remove_component()` at all.
|
||
- Error message explicitly guides the user when the wrong tool is used:
|
||
*"note: this tool removes schematic symbols, use delete_component for PCB footprints"*
|
||
|
||
### Additional Bug Fixes
|
||
|
||
- `connection_schematic.py` / `kicad_interface.py`: Fix `generate_netlist` missing
|
||
`schematic_path` parameter – without it `get_net_connections` always fell back to
|
||
proximity matching which only returns one connection per component (first wire hit,
|
||
then `break`). PinLocator was never invoked. Fix: added `schematic_path: Optional[Path]`
|
||
to `generate_netlist` signature and threaded it through to `get_net_connections`,
|
||
and updated `_handle_generate_netlist` in `kicad_interface.py` to pass `schematic_path`.
|
||
- `server.ts`: Fix KiCAD bundled Python (3.11.5) not being selected on Windows – the
|
||
detection condition `process.env.PYTHONPATH?.includes("KiCad")` was fragile and failed
|
||
in some environments, causing System Python 3.12 to be used instead. Since `pcbnew.pyd`
|
||
is compiled for KiCAD's Python 3.11.5, this resulted in `No module named 'pcbnew'`.
|
||
Fix: removed the condition, KiCAD bundled Python is now always preferred on Windows
|
||
when it exists at `C:\Program Files\KiCad\9.0\bin\python.exe`.
|
||
Also added `KICAD_PYTHON` to `claude_desktop_config.json` as explicit override.
|
||
- `pin_locator.py`: Fix `generate_netlist` timeout – `get_pin_location` and
|
||
`get_all_symbol_pins` called `Schematic(schematic_path)` on every single pin lookup,
|
||
causing O(nets × components × pins) schematic file loads (e.g. 400+ loads for a
|
||
medium schematic). Fix: added `_schematic_cache` dict to `PinLocator.__init__`,
|
||
schematic is now loaded once per path and reused.
|
||
|
||
---
|
||
|
||
## [2.1.0-alpha] - 2026-01-10
|
||
|
||
### Phase 1: Intelligent Schematic Wiring System - Core Infrastructure
|
||
|
||
**Major Features:**
|
||
- Automatic pin location discovery with rotation support
|
||
- Smart wire routing (direct, orthogonal horizontal/vertical)
|
||
- Net label management (local, global, hierarchical)
|
||
- S-expression-based wire creation
|
||
- Professional right-angle routing
|
||
|
||
**New Components:**
|
||
- `python/commands/wire_manager.py` - S-expression wire creation engine
|
||
- `python/commands/pin_locator.py` - Intelligent pin discovery with rotation
|
||
- Updated `python/commands/connection_schematic.py` - High-level connection API
|
||
- `docs/SCHEMATIC_WIRING_PLAN.md` - Implementation roadmap
|
||
|
||
**MCP Tools Enhanced:**
|
||
- `add_schematic_wire` - Create wires with stroke customization
|
||
- `add_schematic_connection` - Auto-connect pins with routing options (NEW)
|
||
- `add_schematic_net_label` - Add labels with type and orientation control (NEW)
|
||
- `connect_to_net` - Connect pins to named nets (ENHANCED)
|
||
|
||
**Technical Implementation:**
|
||
- Rotation transformation matrix for pin coordinates
|
||
- S-expression injection for guaranteed format compliance
|
||
- Pin definition caching for performance
|
||
- Orthogonal path generation for professional schematics
|
||
|
||
**Testing:**
|
||
- End-to-end integration test: 100% passing
|
||
- MCP handler integration test: 100% passing
|
||
- Pin discovery with rotation: Verified working
|
||
- KiCad-skip verification: All wires/labels correctly formed
|
||
|
||
---
|
||
|
||
### Phase 2: Power Nets & Wire Connectivity - COMPLETE
|
||
|
||
**Major Features:**
|
||
- Power symbol support (VCC, GND, +3V3, +5V, etc.) via dynamic loading
|
||
- Wire graph analysis for net connectivity tracking
|
||
- Geometric wire tracing with tolerance-based point matching
|
||
- Accurate netlist generation with component/pin connections
|
||
- Critical template mapping bug fixes
|
||
|
||
**Updates:**
|
||
- `connect_to_net()` - Migrated to WireManager + PinLocator
|
||
- `get_net_connections()` - Complete rewrite with geometric wire tracing
|
||
- `generate_netlist()` - Now uses wire graph analysis for connectivity
|
||
- `get_or_create_template()` - Fixed special character handling, auto-reload after dynamic loading
|
||
- `add_component()` - Fixed template lookup with symbol iteration
|
||
|
||
**Bug Fixes:**
|
||
- CRITICAL: Template mapping after dynamic symbol loading
|
||
- Special character handling in symbol names (+ prefix in +3V3, +5V)
|
||
- Schematic reload synchronization after S-expression injection
|
||
- Multi-format template reference detection
|
||
|
||
**Wire Graph Analysis Algorithm:**
|
||
1. Find all labels matching target net name
|
||
2. Trace wires connected to label positions (point coincidence)
|
||
3. Collect all wire endpoints and polyline segments
|
||
4. Match component pins at wire connection points using PinLocator
|
||
5. Return accurate component/pin connection pairs
|
||
|
||
**Technical Implementation:**
|
||
- Tolerance-based point matching (0.5mm for grid alignment)
|
||
- Multi-segment wire (polyline) support
|
||
- Rotation-aware pin location matching via PinLocator
|
||
- Fallback proximity detection (10mm threshold)
|
||
- Template existence checking via symbol iteration (handles special characters)
|
||
|
||
**Testing:**
|
||
- Power symbols: 4/4 loaded (VCC, GND, +3V3, +5V)
|
||
- Components: 4/4 placed
|
||
- Connections: 8/8 created successfully
|
||
- Net connectivity: 100% accurate (VCC: 2, GND: 4, +3V3: 1, +5V: 1)
|
||
- Netlist generation: 4 nets with accurate connections
|
||
- Comprehensive integration test: 100% PASSING
|
||
|
||
**Commits:**
|
||
- `c67f400` - Updated connect_to_net to use WireManager
|
||
- `b77f008` - Fixed template mapping bug (critical)
|
||
- `a5a542b` - Implemented wire graph analysis
|
||
|
||
**Addresses:**
|
||
- Issue #26 - Schematic workflow wiring functionality (Phase 2)
|
||
|
||
---
|
||
|
||
### Phase 2: JLCPCB Integration Complete
|
||
|
||
**Major Features:**
|
||
- ✅ Complete JLCPCB parts integration via JLCSearch public API
|
||
- ✅ Access to ~100k JLCPCB parts catalog
|
||
- ✅ Real-time stock and pricing data
|
||
- ✅ Parametric component search
|
||
- ✅ Cost optimization (Basic vs Extended library)
|
||
- ✅ KiCad footprint mapping
|
||
- ✅ Alternative part suggestions
|
||
|
||
**New Components:**
|
||
- `python/commands/jlcsearch.py` - JLCSearch API client (no auth required)
|
||
- `python/commands/jlcpcb_parts.py` - Enhanced with `import_jlcsearch_parts()`
|
||
- `docs/JLCPCB_INTEGRATION.md` - Comprehensive integration guide
|
||
|
||
**MCP Tools Available:**
|
||
- `download_jlcpcb_database` - Download full parts catalog
|
||
- `search_jlcpcb_parts` - Parametric search with filters
|
||
- `get_jlcpcb_part` - Part details + footprint suggestions
|
||
- `get_jlcpcb_database_stats` - Database statistics
|
||
- `suggest_jlcpcb_alternatives` - Find similar/cheaper parts
|
||
|
||
**Technical Improvements:**
|
||
- SQLite database with full-text search (FTS5)
|
||
- Package-to-footprint mapping for standard SMD packages
|
||
- Price comparison and cost optimization algorithms
|
||
- HMAC-SHA256 authentication support (for official JLCPCB API)
|
||
|
||
**Testing:**
|
||
- All integration tests passing
|
||
- Database operations validated
|
||
- Live API connectivity confirmed
|
||
- End-to-end MCP tool testing complete
|
||
|
||
**Documentation:**
|
||
- Complete API reference with examples
|
||
- Package mapping tables (0402, 0603, 0805, SOT-23, etc.)
|
||
- Best practices guide
|
||
- Troubleshooting section
|
||
|
||
---
|
||
|
||
## [2.1.0-alpha] - 2025-11-30
|
||
|
||
### Phase 1: Schematic Workflow Fix
|
||
|
||
**Critical Bug Fix:**
|
||
- ✅ Fixed completely broken schematic workflow (Issue #26)
|
||
- Created template-based symbol cloning approach
|
||
- All schematic tests now passing
|
||
|
||
**Root Cause:**
|
||
- kicad-skip library limitation: cannot create symbols from scratch, only clone existing ones
|
||
|
||
**Solution:**
|
||
- Template schematic with cloneable R, C, LED symbols
|
||
- Updated `create_project` to create both PCB and schematic
|
||
- Rewrote `add_schematic_component` to use `clone()` API
|
||
- Proper UUID generation and position setting
|
||
|
||
**Files Modified:**
|
||
- `python/commands/project.py` - Now creates schematic files
|
||
- `python/commands/schematic.py` - Uses template approach
|
||
- `python/commands/component_schematic.py` - Complete rewrite
|
||
|
||
**Files Created:**
|
||
- `python/templates/template_with_symbols.kicad_sch`
|
||
- `python/templates/empty.kicad_sch`
|
||
- `docs/SCHEMATIC_WORKFLOW_FIX.md`
|
||
|
||
**Testing:**
|
||
- Created comprehensive test suite
|
||
- All 7 tests passing
|
||
- KiCad CLI validation successful
|
||
|
||
---
|
||
|
||
## [2.0.0-alpha] - 2025-11-05
|
||
|
||
### Router Pattern & Tool Organization
|
||
|
||
**Major Architecture Change:**
|
||
- Implemented tool router pattern (70% context reduction)
|
||
- 12 direct tools, 47 routed tools in 7 categories
|
||
- Smart tool discovery system
|
||
|
||
**New Router Tools:**
|
||
- `list_tool_categories` - Browse available categories
|
||
- `get_category_tools` - View tools in category
|
||
- `search_tools` - Find tools by keyword
|
||
- `execute_tool` - Run any routed tool
|
||
|
||
**Benefits:**
|
||
- Dramatically reduced AI context usage
|
||
- Maintained full functionality (64 tools)
|
||
- Improved tool discoverability
|
||
- Better organization for users
|
||
|
||
---
|
||
|
||
## [2.0.0-alpha] - 2025-11-01
|
||
|
||
### IPC Backend Integration
|
||
|
||
**Experimental Feature:**
|
||
- KiCad 9.0 IPC API integration for real-time UI sync
|
||
- Changes appear immediately in KiCad (no manual reload)
|
||
- Hybrid backend: IPC + SWIG fallback
|
||
- 20+ commands with IPC support
|
||
|
||
**Implementation:**
|
||
- Routing operations (interactive push-and-shove)
|
||
- Component placement and modification
|
||
- Zone operations and fills
|
||
- DRC and verification
|
||
|
||
**Status:**
|
||
- Under active development
|
||
- Enable via KiCad: Preferences > Plugins > Enable IPC API Server
|
||
- Automatic fallback to SWIG when IPC unavailable
|
||
|
||
---
|
||
|
||
## [2.0.0-alpha] - 2025-10-26
|
||
|
||
### Initial JLCPCB Integration (Local Libraries)
|
||
|
||
**Features:**
|
||
- Local JLCPCB symbol library search
|
||
- Integration with KiCad Plugin and Content Manager
|
||
- Search by LCSC part number, manufacturer, description
|
||
|
||
**Credit:**
|
||
- Contributed by [@l3wi](https://github.com/l3wi)
|
||
|
||
**Components:**
|
||
- `python/commands/symbol_library.py`
|
||
- Basic library search functionality
|
||
|
||
---
|
||
|
||
## [1.0.0] - 2025-10-01
|
||
|
||
### Initial Release
|
||
|
||
**Core Features:**
|
||
- 64 fully-documented MCP tools
|
||
- JSON Schema validation for all tools
|
||
- 8 dynamic resources for project state
|
||
- Cross-platform support (Linux, Windows, macOS)
|
||
- Comprehensive error handling
|
||
- Detailed logging
|
||
|
||
**Tool Categories:**
|
||
- Project Management (4 tools)
|
||
- Board Operations (9 tools)
|
||
- Component Management (8 tools)
|
||
- Routing (6 tools)
|
||
- Export & Manufacturing (5 tools)
|
||
- Design Rule Checking (4 tools)
|
||
- Schematic Operations (6 tools)
|
||
- Symbol Library (3 tools)
|
||
- JLCPCB Integration (5 tools)
|
||
|
||
**Platform Support:**
|
||
- Linux (KiCad 7.x, 8.x, 9.x)
|
||
- Windows (KiCad 9.x)
|
||
- macOS (KiCad 9.x)
|
||
|
||
**Documentation:**
|
||
- Complete README with setup instructions
|
||
- Platform-specific guides
|
||
- Tool reference documentation
|
||
- Contributing guidelines
|
||
|
||
---
|
||
|
||
## Version Numbering
|
||
|
||
- **2.1.0-alpha**: Current development version with JLCPCB integration
|
||
- **2.0.0-alpha**: Router pattern and IPC backend
|
||
- **1.0.0**: Initial stable release
|
||
|
||
## Breaking Changes
|
||
|
||
### 2.1.0-alpha
|
||
- None (additive changes only)
|
||
|
||
### 2.0.0-alpha
|
||
- Tool execution now requires router for 47 tools
|
||
- Direct tool access limited to 12 high-frequency tools
|
||
- Schema validation stricter (catches errors earlier)
|
||
|
||
## Deprecations
|
||
|
||
### 2.1.0-alpha
|
||
- `docs/JLCPCB_USAGE_GUIDE.md` - Superseded by `docs/JLCPCB_INTEGRATION.md`
|
||
- `docs/JLCPCB_INTEGRATION_PLAN.md` - Implementation complete
|
||
|
||
## Migration Guide
|
||
|
||
### Upgrading to 2.1.0-alpha from 2.0.0-alpha
|
||
|
||
**New Dependencies:**
|
||
- No new system dependencies
|
||
- Python packages: `requests` (already in requirements.txt)
|
||
|
||
**Database Setup:**
|
||
1. Run `download_jlcpcb_database` tool (one-time, ~5-10 minutes)
|
||
2. Database created at `data/jlcpcb_parts.db`
|
||
3. Subsequent searches use local database (instant)
|
||
|
||
**API Changes:**
|
||
- All existing tools remain compatible
|
||
- 5 new JLCPCB tools available
|
||
- No breaking changes to existing functionality
|
||
|
||
### Upgrading to 2.0.0-alpha from 1.0.0
|
||
|
||
**Router Pattern:**
|
||
- Some tools now accessed via `execute_tool` instead of direct calls
|
||
- Use `list_tool_categories` to discover available tools
|
||
- Search with `search_tools` to find specific functionality
|
||
|
||
**IPC Backend (Optional):**
|
||
- Enable in KiCad: Preferences > Plugins > Enable IPC API Server
|
||
- Set `KICAD_BACKEND=ipc` environment variable
|
||
- Falls back to SWIG if unavailable
|
||
|
||
---
|
||
|
||
## Credits
|
||
|
||
- **JLCSearch API**: [@tscircuit](https://github.com/tscircuit/jlcsearch)
|
||
- **JLCParts Database**: [@yaqwsx](https://github.com/yaqwsx/jlcparts)
|
||
- **Local JLCPCB Search**: [@l3wi](https://github.com/l3wi)
|
||
- **KiCad**: KiCad Development Team
|
||
- **MCP Protocol**: Anthropic
|
||
|
||
## License
|
||
|
||
See LICENSE file for details.
|