diff --git a/README.md b/README.md index 538a6d7..cd94a43 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The [Model Context Protocol](https://modelcontextprotocol.io/) is an open standa - 64 fully-documented tools with JSON Schema validation - Smart tool discovery with router pattern (reduces AI context by 70%) - 8 dynamic resources exposing project state -- JLCPCB parts integration with 100k+ component catalog and local library search +- JLCPCB parts integration with 2.5M+ component catalog and local library search - Full MCP 2025-06-18 protocol compliance - Cross-platform support (Linux, Windows, macOS) - Real-time KiCAD UI integration via IPC API (experimental) @@ -129,7 +129,7 @@ Complete integration with JLCPCB's parts catalog, providing two complementary ap **Dual-Mode Architecture:** 1. **Local Symbol Libraries** - Search JLCPCB libraries installed via KiCAD Plugin and Content Manager (contributed by [@l3wi](https://github.com/l3wi)) -2. **JLCPCB API Integration** - Access the complete 100k+ parts catalog with real-time pricing and stock data +2. **JLCPCB API Integration** - Access the complete 2.5M+ parts catalog with real-time pricing and stock data **Key Features:** - Real-time pricing with quantity breaks (1+, 10+, 100+, 1000+) @@ -457,7 +457,22 @@ Claude Code automatically detects MCP servers in the current directory. No addit The JLCPCB integration provides two modes that can be used independently or together: -**Mode 1: Local Symbol Libraries (No Setup Required)** +**Mode 1: JLCSearch Public API (Recommended - No Setup Required)** + +The easiest way to access JLCPCB's parts catalog: +- No API credentials needed +- No JLCPCB account required +- Access to 2.5M+ parts with pricing and stock data +- Download time: 40-60 minutes for full catalog (100-part batches due to API limit) + +To download the database: +``` +Ask Claude: "Download the JLCPCB parts database" +``` + +This creates a local SQLite database at `data/jlcpcb_parts.db` (~1-2 GB for full catalog). + +**Mode 2: Local Symbol Libraries (No Setup Required)** Install JLCPCB libraries via KiCAD's Plugin and Content Manager: 1. Open KiCAD @@ -466,14 +481,15 @@ Install JLCPCB libraries via KiCAD's Plugin and Content Manager: 4. Install libraries like `JLCPCB-KiCAD-Library` or `EDA_MCP` 5. Use `search_symbols` to find components with pre-configured footprints and LCSC IDs -**Mode 2: JLCPCB API (Complete Catalog Access)** +**Mode 3: Official JLCPCB API (Advanced - Requires Enterprise Account)** -For access to the full 100k+ parts catalog with pricing: +For users with JLCPCB enterprise accounts and order history: 1. **Get API Credentials** - Log in to [JLCPCB](https://jlcpcb.com/) - - Navigate to Account > API Management + - Navigate to Account > API Management (requires enterprise approval) - Create API Key and save your `appKey` and `appSecret` + - Note: This requires prior order history and enterprise account approval 2. **Configure Environment Variables** @@ -489,12 +505,6 @@ For access to the full 100k+ parts catalog with pricing: JLCPCB_API_SECRET=your_app_secret_here ``` -3. **Download Parts Database (One-time setup, takes 5-10 minutes)** - ``` - Ask Claude: "Download the JLCPCB parts database" - ``` - This creates a local SQLite database at `data/jlcpcb_parts.db` with ~100k parts. - See [JLCPCB Usage Guide](docs/JLCPCB_USAGE_GUIDE.md) for detailed documentation. ## Usage Examples diff --git a/docs/JLCPCB_USAGE_GUIDE.md b/docs/JLCPCB_USAGE_GUIDE.md index fd2fa76..0bc7c33 100644 --- a/docs/JLCPCB_USAGE_GUIDE.md +++ b/docs/JLCPCB_USAGE_GUIDE.md @@ -1,11 +1,12 @@ # JLCPCB Integration Guide -The KiCAD MCP Server provides **two complementary approaches** for working with JLCPCB parts: +The KiCAD MCP Server provides **three complementary approaches** for working with JLCPCB parts: -1. **Local Symbol Libraries** - Search JLCPCB libraries installed via KiCad PCM _(contributed by [@l3wi](https://github.com/l3wi) in [PR #25](https://github.com/mixelpixx/KiCAD-MCP-Server/pull/25))_ -2. **JLCPCB API Integration** - Access the complete 100k+ parts catalog with real-time pricing +1. **JLCSearch Public API** - No authentication required, 2.5M+ parts with pricing (Recommended) +2. **Local Symbol Libraries** - Search JLCPCB libraries installed via KiCad PCM _(contributed by [@l3wi](https://github.com/l3wi) in [PR #25](https://github.com/mixelpixx/KiCAD-MCP-Server/pull/25))_ +3. **Official JLCPCB API** - Requires enterprise account (Advanced) -Both approaches can be used together to give you maximum flexibility. +All approaches can be used together to give you maximum flexibility. ## Credits @@ -14,7 +15,46 @@ Both approaches can be used together to give you maximum flexibility. --- -## Approach 1: Local Symbol Libraries (Recommended for Getting Started) +## Approach 1: JLCSearch Public API (Recommended) + +### What It Does +- Access to 2.5M+ JLCPCB parts with pricing and stock data +- **No authentication required** - works immediately +- **No JLCPCB account needed** +- Real-time pricing with quantity breaks +- Basic vs Extended library type identification +- Local SQLite database for fast offline searching +- Note: Download takes 40-60 minutes due to API pagination (100 parts per request) + +### Setup + +No setup required! Just download the database: + +``` +download_jlcpcb_database({ force: false }) +``` + +This downloads ~2.5M parts from JLCSearch API and creates a local SQLite database (`data/jlcpcb_parts.db`). + +**Expected Output:** +``` +Downloading JLCPCB parts database... +Downloaded 100 parts... +Downloaded 200 parts... +... (continues for 40-60 minutes) +Downloaded 2,500,000 parts... + +Total parts: 2,500,000+ +Database size: ~1-2 GB +``` + +### Usage Examples + +See "Approach 2" usage examples below - the API is the same. + +--- + +## Approach 2: Local Symbol Libraries (Good for Offline Use) ### What It Does - Searches symbol libraries you've installed via KiCad's Plugin and Content Manager (PCM) @@ -94,10 +134,10 @@ Class: Extended --- -## Approach 2: JLCPCB API Integration (For Complete Catalog Access) +## Approach 3: Official JLCPCB API (Advanced - Enterprise Accounts Only) ### What It Does -- Downloads the **complete JLCPCB parts catalog** (~100k+ parts) +- Downloads from the **official JLCPCB API** (requires enterprise account) - Provides **real-time pricing and stock information** - Automatic **Basic vs Extended** library type identification (Basic = free assembly) - Smart suggestions for cheaper/in-stock alternatives diff --git a/docs/KNOWN_ISSUES.md b/docs/KNOWN_ISSUES.md index c42d83e..7fdf47c 100644 --- a/docs/KNOWN_ISSUES.md +++ b/docs/KNOWN_ISSUES.md @@ -101,6 +101,12 @@ Schematic operations use the kicad-skip library which has some limitations with ## Recently Fixed +### DRC Violations API KiCAD 9.0 (Fixed 2026-02-26) + +**Was:** `get_drc_violations` failed with `AttributeError: 'BOARD' object has no attribute 'GetDRCMarkers'` +**Now:** Reimplemented to use `run_drc()` internally which calls kicad-cli +**Impact:** Maintains backward compatibility while using stable kicad-cli interface + ### Component Library Integration (Fixed 2025-11-01) **Was:** Could not find footprint libraries diff --git a/python/commands/design_rules.py b/python/commands/design_rules.py index 9ef158a..65bd27c 100644 --- a/python/commands/design_rules.py +++ b/python/commands/design_rules.py @@ -385,7 +385,15 @@ class DesignRuleCommands: return None def get_drc_violations(self, params: Dict[str, Any]) -> Dict[str, Any]: - """Get list of DRC violations""" + """ + Get list of DRC violations + + Note: This command internally uses run_drc() which calls kicad-cli. + The old BOARD.GetDRCMarkers() API was removed in KiCAD 9.0. + This implementation provides backward compatibility by parsing kicad-cli output. + """ + import json + try: if not self.board: return { @@ -396,27 +404,37 @@ class DesignRuleCommands: severity = params.get("severity", "all") - # Get DRC markers - violations = [] - for marker in self.board.GetDRCMarkers(): - violation = { - "type": marker.GetErrorCode(), - "severity": "error", # KiCAD DRC markers are always errors - "message": marker.GetDescription(), - "location": { - "x": marker.GetPos().x / 1000000, - "y": marker.GetPos().y / 1000000, - "unit": "mm" - } + # Run DRC using kicad-cli (this saves violations to JSON file) + drc_result = self.run_drc({}) + + if not drc_result.get("success"): + return drc_result # Return the error from run_drc + + # Read violations from the saved JSON file + violations_file = drc_result.get("violationsFile") + if not violations_file or not os.path.exists(violations_file): + return { + "success": False, + "message": "Violations file not found", + "errorDetails": "run_drc did not create violations file" } - # Filter by severity if specified - if severity == "all" or severity == violation["severity"]: - violations.append(violation) + # Load violations from file + with open(violations_file, 'r', encoding='utf-8') as f: + data = json.load(f) + + all_violations = data.get("violations", []) + + # Filter by severity if specified + if severity != "all": + filtered_violations = [v for v in all_violations if v.get("severity") == severity] + else: + filtered_violations = all_violations return { "success": True, - "violations": violations + "violations": filtered_violations, + "violationsFile": violations_file # Include file path for reference } except Exception as e: