kicad-jlcpcb
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kicad-jlcpcb/pcb-new ESP32-C3 sensor board, USB-C, 3.3V LDO"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kicad-jlcpcb
From "I want a board that does X" to a wired
.kicad_pcbEasyEDA can auto-route and JLCPCB can build — in a single Claude Code conversation.
kicad-jlcpcb is a Claude Code plugin + MCP server that automates the tedious half of going from idea to fab. It sources LCSC parts with a hard preference for JLCPCB basic-library stock, auto-fetches pin maps from EasyEDA, places KiCad-stdlib footprints, wires every net by pin name (not pad number), and hands off a .kicad_pcb that EasyEDA can route and order in two clicks.
┌─ you ──────────────────────────────────┐
│ /pcb-new An ESP32-C3 soil-moisture │
│ sensor, USB-C, 3.3V LDO... │
└────────────────┬───────────────────────┘
│
┌─────────────▼─────────────┐
│ kicad-jlcpcb MCP server │
│ • source parts (LCSC) │
│ • fetch pin maps │
│ • place + wire footprints│
│ • save .kicad_pcb │
└─────────────┬─────────────┘
│
drag into easyeda.com
│
Auto Route
│
Order via JLCPCBWhy this plugin
Three recurring friction points in small-batch PCB work, automated:
"Is this part basic or extended on JLCPCB?" — You stop needing to cross-reference LCSC's UI. The plugin queries the JLCPCB catalog directly, caches the answer, and always prefers basic-tier (no $3/part assembly setup fee).
"What's the right pad number for this IC's
GPIO10?" — You stop reading datasheets to build netlists. The plugin queries EasyEDA by LCSC C-number, caches the pin-name → pad-number map, and lets you reference pins by their functional names."Why is my auto-router failing?" — You stop fighting Freerouting on RF boards. The plugin stops at "wired
.kicad_pcb" and hands off to EasyEDA's cloud auto-router, which works on real designs.
Related MCP server: Altium MCP Server
Quick tour
Two slash commands:
/pcb-new(from a description) and/pcb-from-bom(from a CSV).One agent:
part-sourcer— finds the best JLCPCB-stocked part for a generic spec.One skill:
kicad-jlcpcb-workflow— the full reference the LLM consults while driving the workflow.14 MCP tools covering setup, sourcing, schematic, PCB generation, EasyEDA handoff, and session resume.
Session persistence — each project writes a
.kicad_jlcpcb_session.jsonso/pcb-newcan resume mid-flow after a Claude Code restart.
Requirements
Component | Version | Notes |
Python | 3.10 – 3.13 | Tested on all four in CI |
KiCad | 8.0 – 10.x |
|
EasyEDA account | free | Only needed for the final routing + ordering step |
Network | required | Part data is fetched live — see below |
Data dependencies
Part sourcing depends on two third-party, unofficial services. Neither is run by JLCPCB, and neither is run by us. Both are overridable, so a fork can point at a mirror without touching code:
Service | Used for | Override |
Catalog search, JLCPCB stock, basic/extended tier |
| |
| Exact C-number lookup, symbols, pin maps |
|
Resolved parts are cached in ~/.cache/kicad-jlcpcb/lcsc_parts.sqlite for 24
hours. There is no bulk catalog download.
Why the overrides exist. v0.1.0 hardcoded a single third-party URL. Upstream retired that data layout, the URL started returning 404, and part sourcing broke silently for months before anyone noticed (#1). A weekly CI job now tests both services directly, and you can repoint either one yourself.
Install KiCad:
Fedora 40+:
sudo dnf install kicadUbuntu 22.04+:
sudo add-apt-repository ppa:kicad/kicad-9.0-releases && sudo apt install kicadArch:
sudo pacman -Syu kicadmacOS: kicad.org/download
Install
/plugin marketplace add BeckhamLabsLLC/claude-plugins
/plugin install kicad-jlcpcb@beckhamlabs-pluginsRestart Claude Code, then run /mcp and look for kicad-jlcpcb.
That is the whole install. You do not need to clone the repo, and you do not
need to install anything with pip — the plugin resolves its own two
dependencies (mcp, httpx) on first launch via uv,
which most Python toolchains already have:
curl -LsSf https://astral.sh/uv/install.sh | sh # if you do not have itIf you would rather not use uv, install the dependencies into whichever Python
python3 resolves to and the plugin will use them directly:
python3 -m pip install mcp httpxKiCad itself is a separate install — see Requirements.
git clone https://github.com/BeckhamLabsLLC/kicad-jlcpcb.git
cd kicad-jlcpcb
pip install -e ".[dev]"Then register the clone as a local marketplace, which is what makes Claude Code
expand ${CLAUDE_PLUGIN_ROOT} for the MCP server:
/plugin marketplace add /abs/path/to/kicad-jlcpcb
/plugin install kicad-jlcpcb@beckhamlabsNote the marketplace name differs from the published one: the repo's own
.claude-plugin/marketplace.json declares beckhamlabs, while the aggregator
repo declares beckhamlabs-plugins.
Do not register the checkout by enabling its .mcp.json as a project
server. ${CLAUDE_PLUGIN_ROOT} is only substituted for plugin-provided MCP
configs; in project scope it stays a literal string and the server cannot be
found. See TROUBLESHOOTING.
Sanity check
/mcp in Claude Code should list kicad-jlcpcb with its 14 tools. If it
reports the server failed, see TROUBLESHOOTING — the
first step there prints the actual reason, which Claude Code does not show you.
From a clone, you can also check the whole path end to end — that the server starts, registers its handlers, and answers a real tool call:
python3 bin/launch.py --version # prints the version, exits 0
python3 scripts/check_protocol.py # initialize -> tools/list -> tools/callRun the launcher with no arguments and it will appear to hang — that is correct. An MCP server speaks JSON-RPC on stdio and is waiting for a client.
Five-minute quick-start
Pick a small idea — an ESP32-C3 board with one sensor, a USB-C port, and an LDO works well. Run:
/pcb-new An ESP32-C3 soil-moisture sensor with two capacitive probes,
USB-C 5V in, a 3.3V LDO, status LED, and JST-PH battery header.
Place it on an 80x60 mm board.Claude walks you through:
detect_kicad— verify the toolchain (< 1 s)create_project— scaffold.kicad_pro+.kicad_sch+ session fileDecomposes the description into ~12 generic part specs
lcsc_searchper spec (live catalog query, cached locally for 24 h)BOM checkpoint — shows every resolved part, flags extended-tier ones with cost warnings, and waits for your confirmation
pcb_generate— fetches EasyEDA pin maps (~12 s each, only for parts whose nets reference pins by name, first run only), places footprints, wires nets, saves.kicad_pcbeasyeda_handoff— prints the import instructions
The full trace with real timings and tool outputs: examples/soilnode-esp32/walkthrough.md.
First run: ~90 s. Subsequent runs on similar designs: under 10 s.
What the plugin does not do
Set expectations honestly before you start:
❌ Auto-route traces. That's why the
.kicad_pcbgets handed to EasyEDA. Freerouting 2.1.0's CLI is buggy and can't handle RF matching networks; nothing else works headlessly well enough to ship.❌ Beautiful placement. The three-band grid (connectors on top, ICs in the middle, passives below) is functional, not pretty. You rearrange in EasyEDA before routing.
❌ Design review. There's no DRC integration (yet — see Roadmap). The plugin trusts your spec and relies on KiCad / EasyEDA to catch rule violations.
❌ PyPI distribution. Install through the Claude Code marketplace. There is no
pip install kicad-jlcpcb.
MCP tool surface
Stage | Tool | Purpose |
Setup |
| Probe |
Setup |
| Scaffold |
Setup |
| Validate existing |
Resume |
| Report where a prior workflow left off for a project dir |
Resume |
| Record the user's BOM approval so a restart doesn't re-ask |
Sourcing |
| Free-text part search, basic-only by default |
Sourcing |
| Batch BOM resolution with cost-impact warnings |
Sourcing |
| Symbol + footprint from EasyEDA's real geometry into project |
Pin maps |
| Fetch pin-name → pad-number map from EasyEDA |
Schematic |
| Emit |
Schematic |
| Run |
PCB |
| Main tool. Auto-fetches pin maps, places footprints, wires every net, saves |
Terminal |
| Recommended terminal tool. Produces EasyEDA import instructions |
Legacy |
| For users routing in KiCad: export Gerbers + package a JLCPCB upload zip |
Full input-schema definitions are in src/kicad_jlcpcb_mcp/server.py under _tool_definitions().
PCB spec format
pcb_generate consumes a JSON-serializable dict:
{
"name": "demo",
"board": {"width_mm": 80, "height_mm": 60, "layer_count": 2},
"components": [
{
"ref": "U1",
"value": "ESP32-C3-WROOM-02",
"lcsc": "C2934560",
"lib": "RF_Module",
"fp": "ESP32-C3-WROOM-02"
}
],
"nets": {
"3V3": [["U1", "3V3"], ["C1", "1"]],
"GND": [["U1", "GND"], ["C1", "2"]],
"SPI_SCK": [["U1", "GPIO10"], ["U2", "SCK"]]
}
}Key rules:
Reference IC pins by their functional name (
3V3,GPIO10,SCK). The plugin resolves them via EasyEDA's pinmap.For passives (R, C, L, D), use bare pad numbers:
"1","2".libandfpare KiCad-stdlib library + footprint names. The plugin finds KiCad's footprint directory automatically on Linux, macOS, Windows and Flatpak; override withKJLC_FOOTPRINT_DIRorpcb_generate'slib_dir.
Full worked spec: examples/soilnode-esp32/spec.json.
Architecture
src/kicad_jlcpcb_mcp/
server.py ← MCP server + 14 tool definitions
session.py ← per-project state (.kicad_jlcpcb_session.json)
project.py ← .kicad_pro create / load / validate
kicad_cli.py ← async wrapper for kicad-cli (KiCad 8–10)
lcsc_client.py ← jlcsearch + EasyEDA lookup, SQLite cache, basic-tier filter
part_library.py ← EasyEDA client (EasyEdaRateLimiter + pin-map cache)
pcb.py ← pcbnew-based .kicad_pcb generator
schematic.py ← netlist spec → .kicad_sch
gerber_pack.py ← Protel extension normalizer + JLCPCB zip
sexpr.py ← s-expression reader/writer
config.py ← module-level constantsAll HTTP goes through lcsc_client and part_library. All KiCad CLI invocations go through kicad_cli. pcbnew is lazy-imported inside pcb.py so the rest of the plugin runs fine when KiCad isn't installed (most tools don't need it).
Testing
pytest tests/ # offline suite; nothing here touches the networkTwo suites are gated behind environment variables because they need something the default run can't assume:
KICAD_INSTALLED=1 pytest tests/ -v # needs pcbnew
KJLC_NETWORK_TESTS=1 pytest tests/test_network_contract.py # hits live APIsThe offline suite covers subprocess wrapping, HTTP mocking, the SQLite cache,
s-expression round-trip, schematic emission, Gerber renaming, EasyEDA pin-map
parsing, rate-limit / retry, session persistence, MCP tool routing, and real
pcbnew board generation.
test_network_contract.py earns its own paragraph. Every other test is
mocked, which is why the whole suite stayed green for four months while part
sourcing was completely broken in the field. The contract tests assert the
shape of live upstream responses — never a specific price or stock figure —
and run weekly in CI. If that badge goes red, part sourcing is broken for
everyone; please open an issue.
Lint:
ruff check .
ruff format --check .Troubleshooting
Full guide: TROUBLESHOOTING.md. Most common issues:
Symptom | Fix |
MCP server shows as failed / | Run |
| Install KiCad; don't try to |
First run stalls ~12 s per part | Expected — EasyEDA rate limit, and only for parts whose nets use pin names. Cached forever after the first fetch. |
| The error names how many libraries were found and suggests near matches. If none were found, set |
| Delete |
What you get, and what to check
The plugin produces a .kicad_pcb with real footprints and every net wired,
plus a JLCPCB upload zip. Two things are worth checking before you order:
Part geometry comes from EasyEDA. Symbols carry the real pin names and
numbers, and footprints the real pad positions, sizes and drills — EasyEDA,
LCSC and JLCPCB share a parent company, so this is the same data JLCPCB
assembles against. When EasyEDA has no geometry for a part, a placeholder is
written instead and fetch_part_library says so in warnings. A
placeholder footprint will not match the real part — replace it from
KiCad's standard libraries before ordering.
CPL rotations are passed through, not corrected. JLCPCB's expected orientation differs from KiCad's for some packages. Footprints generated from EasyEDA already share JLCPCB's convention; footprints you take from KiCad's standard libraries may not. The plugin says so rather than applying a guess that silently rotates parts — check JLCPCB's assembly preview after upload and fix anything that looks wrong there.
Design rationale: why the handoff
Earlier releases tried to route the board headlessly with Freerouting and produce a JLCPCB Gerber zip directly. That didn't work for real boards — Freerouting 2.1.0 has CLI bugs, can't route RF matching networks, and won't save partial results.
So the plugin takes the pragmatic win: it wires everything up, EasyEDA routes and orders. The tradeoff is opening a browser tab and clicking two buttons; in exchange you get reliability the open-source tooling can't match and a one-click path to a JLCPCB order.
Roadmap
Next — auto-placement that respects functional groupings (power domain, RF block, analog front-end), DRC integration, differential-pair awareness, and a per-package CPL rotation table so JLCPCB orientations need no manual correction.
Later — vision-based schematic extraction: drop in a photo of a hand-drawn schematic, out comes a wired
.kicad_pcb.
Contributing
See CONTRIBUTING.md for dev setup, test running, and PR conventions. All contributors follow the Code of Conduct. Bug reports: open an issue.
License
MIT — see LICENSE.
Available Tools
14 toolscreate_projectA
Scaffold a new KiCad project at // with a .kicad_pro carrying JLCPCB-tuned design rules, an empty .kicad_sch, and libs/ + manufacturing/ subdirectories. Sets the new project as the active session workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Project name. Letters, digits, underscore, hyphen only. Becomes both the folder name and the .kicad_pro/.kicad_sch stem. | |
| parent_dir | Yes | Existing directory under which to create the project folder. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a key side effect: 'Sets the new project as the active session workspace.' It also specifies the exact file/directory structure. However, it doesn't mention failure conditions (e.g., if parent_dir doesn't exist or project already exists), permissions, or reversibility. For a mutation tool, this is a partial disclosure—better than a bare 'Creates a project' but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. The first sentence front-loads the action, target path, and key outputs; the second discloses the side effect. Perfectly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a scaffolding tool with only 2 parameters and no output schema, the description is quite complete. It specifies the exact artifacts created and the session side effect. It doesn't describe return values or error handling, but those are not essential for a creation tool's basic invocation. The description covers everything an agent needs to know to call it correctly and understand the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents both parameters (name, parent_dir). The description references them in the path template but doesn't add new semantic detail beyond what the schema provides (e.g., validation rules for name are in schema). Baseline 3 applies because the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('scaffold') and a specific resource ('a new KiCad project'), and details the exact directory structure and file contents (.kicad_pro, .kicad_sch, libs/, manufacturing/). It clearly distinguishes from siblings like load_project (loading vs creating) and detect_kicad (detection). No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use this to create a new project. It doesn't explicitly name alternatives or exclusions, but the scope is obvious given the sibling list (all other operations assume an existing project). It could have stated 'use load_project to open existing projects', but the description's focus on scaffolding suffices for a creation tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_kicadA
Detect the local KiCad install. Returns version, path, and whether it meets the minimum required version. On a missing or outdated install, returns an install_hint with platform-specific guidance. Never runs installs itself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does so well. It discloses detection-only behavior, the failure branch returning an install_hint, platform-specific guidance, and explicitly states it never runs installs itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The core action is front-loaded, return values are stated compactly, and the critical non-installing boundary is called out without extra prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description explains what the tool returns, the failure mode with install_hint, and the platform-specific nature of guidance. This is complete for a zero-parameter detection utility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to add about parameter meaning; the schema already covers everything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Detect'), a clear resource ('local KiCad install'), and the key return values (version, path, minimum version check). No sibling tool overlaps with environment detection, so it is easily differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it is a prerequisite/environment check, but it never explicitly says when to run it relative to other tools or names alternatives. Since none of the siblings perform a similar function, the lack of explicit routing is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
easyeda_handoffA
Produce the final handoff message for the user: the path to the generated .kicad_pcb and step-by-step instructions for importing it into easyeda.com for routing and ordering. This is the recommended terminal tool of the plugin — EasyEDA handles the final routing + JLCPCB ordering step far more reliably than any headless auto-router we could ship.
| Name | Required | Description | Default |
|---|---|---|---|
| pcb_path | No | Optional .kicad_pcb path. Defaults to the active project's board file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool generates a handoff message (not a file), that it references a .kicad_pcb path, and that it is the recommended terminal step. It could add more about what the message contains or side effects, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core purpose, and every sentence earns its place. The first sentence states what it does; the second explains why it is the recommended terminal tool. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description is nearly complete. It explains the purpose, the default parameter behavior, and the rationale for being the terminal step. It could mention what the handoff message includes beyond the path and import steps, but that is minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single optional parameter. The description adds context by explaining the default behavior ('Defaults to the active project's board file'), which is valuable beyond the schema. With full coverage and one simple param, this is strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: produce the final handoff message with the path to the generated .kicad_pcb and step-by-step import instructions for easyeda.com. It uses a specific verb ('produce') and resource ('handoff message'), and distinguishes itself from siblings by explaining it is the recommended terminal tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says this is the recommended terminal tool and explains why: EasyEDA handles final routing and JLCPCB ordering more reliably than a headless auto-router. This gives clear guidance on when to use it versus alternatives, and the context signals show it is the final step in the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_part_libraryA
Download symbol + footprint (and 3D model when available) for a single LCSC C-number and install them into the active project's libs/ directory. Geometry comes from EasyEDA: real pin names and numbers for the symbol, real pad positions, sizes and drills for the footprint. If EasyEDA is unreachable or has no geometry for the part, a placeholder is written instead and the response says so in warnings — read them, because a placeholder footprint will NOT match the real part and must be replaced before ordering.
| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | Yes | LCSC C-number, e.g. 'C25804'. | |
| libs_dir | No | Optional override for the install directory. Defaults to the active project's libs/. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that it writes files to the libs/ directory, that it downloads from EasyEDA, and that it writes a placeholder if geometry is unavailable, with a warning about the placeholder not matching the real part. It does not mention whether the operation is reversible or any permission requirements, but for a download/install tool, these disclosures are adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but every sentence contributes: it states the purpose, the source of geometry, the fallback behavior, and the importance of warnings. The key information is front-loaded, with the caveat about placeholders placed at the end. It is well-structured and not padded with redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema, the description explains what the response will contain (warnings) and explicitly warns about placeholder mismatches. It covers the failure mode (EasyEDA unreachable or no geometry) and directs the user to read warnings. It does not describe the exact return format or success indicators, but for a tool of this complexity, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% description coverage for both parameters (lcsc and libs_dir), including examples and defaults. The description adds marginal value by reinforcing that lcsc is a C-number and that libs_dir overrides the default directory, but this is already in the schema. The description does not compensate for any missing schema details, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Download) and resource (symbol + footprint + 3D model for a single LCSC C-number) and explicitly mentions the install location (active project's libs/). It also distinguishes itself from siblings by focusing on a single part and sourcing from EasyEDA, making it clear what this tool does versus search or BOM resolution tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use it: when you need to fetch a specific part's library by LCSC number. It also provides guidance on reading warnings when a placeholder is written, which is important for downstream actions. It does not explicitly state when not to use it or list alternative tools, but the context is sufficient for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lcsc_resolve_bomA
Resolve a list of BOM rows to concrete LCSC parts. Each row may specify an LCSC C-number directly or a free-text query with an optional package. Hard-prefers basic-tier parts; for any row that resolves to an extended part, attaches a cost-impact warning and tallies the JLCPCB assembly setup fee.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | BOM rows. Each row needs either 'lcsc' or 'query'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of behavioral disclosure. It transparently states that the tool hard-prefers basic-tier parts, attaches a cost-impact warning for extended parts, and tallies the JLCPCB assembly setup fee. This goes beyond a simple description and informs the agent of potential side effects and cost implications. However, it does not explicitly state whether the operation is read-only or has other side effects, though the resolution focus suggests a non-mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences long, with no filler. It front-loads the core purpose, then efficiently covers input options and the behavioral nuance of basic-tier preference and cost warnings. Every sentence contributes meaning, and the structure is clear and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers the tool's complexity: it handles both direct C-numbers and queries, applies a package filter, prefers basic-tier parts, and manages cost warnings and setup fees. It does not explicitly describe the return format (e.g., the structure of resolved rows), but the purpose 'resolve to concrete LCSC parts' implies the output is a list of resolved parts. Given the lack of an output schema, a more explicit return structure would improve completeness, but the description is still fairly complete for an agent to understand the tool's function and behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so each parameter (rows, qty, lcsc, query, package) is already documented. The description adds context by clarifying that each row may specify an LCSC C-number or a free-text query with an optional package, and notes that qty is passed through and not used for matching. This provides a high-level framing but does not add substantial new details beyond the schema. The baseline of 3 is appropriate given the complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: resolving a list of BOM rows to concrete LCSC parts. It specifies the input options (direct C-number or free-text query with package) and the key behavior of preferring basic-tier parts. This distinguishes it from siblings like lcsc_search (which likely searches for individual parts) and session_confirm_bom (which likely confirms a BOM). The verb 'resolve' and resource 'BOM rows' are specific and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool (to resolve BOM rows) and explains the resolution logic, but it does not explicitly contrast with alternatives like lcsc_search or state when not to use it. There is no mention of exclusions or conditional routing to other tools. The intended usage is implied but not directly contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lcsc_searchA
Search the LCSC / JLCPCB catalog for parts matching a free-text query. Defaults to basic-tier parts only (no JLCPCB assembly setup fee). Set basic_only=false to include extended parts. Results are sorted basic-first then by descending stock.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return. | |
| query | Yes | Free-text search, e.g. '10k 0603 1%' or 'ESP32-S3-WROOM'. | |
| package | No | Optional package filter, e.g. '0603', 'SOT-23-5', 'QFN-32'. | |
| stock_min | No | Minimum JLCPCB SMT stock to include a result. | |
| basic_only | No | When true (default), exclude extended-tier parts entirely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the default tier filtering (basic-only), the option to include extended parts, and the sort order (basic-first then descending stock). This is meaningful behavioral context beyond the schema. It doesn't mention rate limits, pagination, or error behavior, but for a search tool the disclosed behaviors are the most relevant ones. A 4 is appropriate; a 5 would require more depth like result count limits or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste. The first sentence states the core function, the second explains the default tier behavior and how to override it, and the third describes the sort order. Every sentence earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 5 parameters, 100% schema coverage, and no output schema, the description is complete enough. It explains the default behavior and sort order, which are the non-obvious aspects. The absence of an output schema means the description doesn't need to explain return values, but it could have mentioned what fields are returned per result. However, the schema covers all inputs, and the description covers the key behavioral nuances, so a 4 is justified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 5 parameters. The description adds value by explaining the default tier behavior and sort order, which relates to basic_only and the overall result set, but it doesn't add per-parameter semantics beyond the schema. The baseline of 3 is correct when the schema does the heavy lifting, and the description's tier/sort context is a small bonus that doesn't push it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: searching the LCSC/JLCPCB catalog with a free-text query. It specifies the resource (LCSC/JLCPCB catalog), the action (search), and the input type (free-text query). It also distinguishes itself from siblings like lcsc_resolve_bom by focusing on catalog search rather than BOM resolution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool: when searching for parts by free-text query. It explains the default behavior (basic-tier only) and how to change it (basic_only=false). It doesn't explicitly name alternatives or exclusions, but the sibling list shows lcsc_resolve_bom as a related but distinct tool, and the description's focus on catalog search implies the use case. The lack of explicit 'use this instead of X' guidance prevents a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_projectA
Load an existing KiCad project (path to a .kicad_pro file or its containing directory). Validates the manifest, ensures libs/ and manufacturing/ subdirectories exist, and sets the project as the active session workspace. Returns a manifest of the project's current state.
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | Yes | Path to a .kicad_pro file OR the directory containing exactly one .kicad_pro file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses validation of the manifest, subdirectory assurance, setting the active session workspace, and returning a manifest. Minor ambiguity remains around whether missing directories are created or merely checked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: purpose comes first, followed by behavioral details and return value. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, low-complexity tool, the description covers input acceptance, validation behavior, workspace effects, and the return value without needing an output schema. It could add error-handling details, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already fully documents project_path including the .kicad_pro file OR directory alternative. The tool description merely paraphrases the schema, adding no new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Load an existing KiCad project' via a .kicad_pro file or directory. This clearly distinguishes it from siblings like create_project and detect_kicad.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'existing KiCad project' conveys when this tool applies rather than creating a new project. It does not explicitly name alternatives or exclusions, but the usage context is clear enough for an agent to select it over create_project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
package_for_jlcpcbA
Run all kicad-cli manufacturing exports on the active project's .kicad_pcb (gerbers, drill, position, BOM), rename gerbers to Protel extensions, drill to .XLN, and zip everything into a JLCPCB-ready manufacturing/jlcpcb--.zip. Requires that placement and routing are already done in KiCad — this is the terminal tool in the workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| pcb_path | No | Optional .kicad_pcb path. Defaults to the active project's .kicad_pcb. | |
| output_zip | No | Optional output zip path. Defaults to <project>/manufacturing/jlcpcb-<name>-<date>.zip. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It fully describes the operations: running all manufacturing exports, renaming gerbers to Protel extensions and drill to .XLN, zipping everything, and the output path. It also discloses the external dependency on kicad-cli and the prerequisite state of the project, which is important behavioral context for an agent deciding to invoke it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, information-rich sentences with no filler. The first sentence front-loads the exact actions and output format, and the second adds the critical prerequisite and workflow position. Every clause contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description is complete for a terminal packaging tool: it specifies the input, all transformation steps, the output location and naming pattern, and the required project state. An agent has enough context to know when to call it and what it will produce.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents both optional parameters with defaults. The description reinforces the 'active project' default but adds no meaning beyond what the schema provides, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run all kicad-cli manufacturing exports on the active project's .kicad_pcb' and lists exactly what is produced (gerbers, drill, position, BOM, renamed and zipped). It also distinguishes itself from siblings by calling itself 'the terminal tool in the workflow', so an agent can clearly tell it apart from earlier steps like pcb_generate or easyeda_handoff.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit precondition ('Requires that placement and routing are already done in KiCad') and positions the tool as 'the terminal tool in the workflow'. It does not name specific sibling alternatives or state when-not-to-use it, but the workflow positioning and prerequisite give an agent clear guidance on when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
part_pin_mapA
Fetch the pin-name → pad-number map for an LCSC C-number from EasyEDA's component endpoint. Used internally by pcb_generate; exposed as a standalone tool so Claude can inspect a part's pinout before constructing a nets spec. Rate-limited (~12s between unique fetches); cached indefinitely in SQLite after first fetch.
| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | Yes | LCSC C-number, e.g. 'C82942' for ME6211C33M5G-N LDO. | |
| force_refresh | No | Bypass cache and re-fetch from EasyEDA. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: it discloses rate limiting ('~12s between unique fetches') and indefinite SQLite caching after first fetch — the two operational traits most likely to surprise an agent. It does not cover failure modes (invalid C-number, network errors), but for a read-only fetch tool the disclosed traits are the important ones. No contradiction exists since annotations are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero filler. The core verb+resource is front-loaded, the standalone-use context comes second, and the operational constraints (rate limit, caching) close it out. Every sentence earns its place and nothing needs to be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema and no annotations, the description covers purpose, usage timing, and both behavioral constraints (rate limit and caching). Since no output schema exists, the description arguably should hint at the return shape, and 'pin-name → pad-number map' effectively does. Minor omissions like error behavior on invalid C-numbers are the only gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (lcsc, force_refresh) are already well documented in the schema, setting a baseline of 3. The description adds modest value by explaining that caching is indefinite, which gives semantic weight to force_refresh's 'bypass cache' purpose. This is a small increment but not a substantial one — the schema already says enough for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb, resource, and scope: 'Fetch the pin-name → pad-number map for an LCSC C-number from EasyEDA's component endpoint.' This is immediately distinguishable from siblings like fetch_part_library (full library) and lcsc_search (part lookup). The second sentence further clarifies its niche relative to pcb_generate (pinout inspection before nets spec construction), leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for standalone use: 'so Claude can inspect a part's pinout before constructing a nets spec.' This explains the appropriate moment to invoke the tool. It does not, however, explicitly name sibling alternatives or state when NOT to use it as opposed to lcsc_search or fetch_part_library; the differentiation is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pcb_generateA
Generate a fully-wired .kicad_pcb from a declarative spec using KiCad's pcbnew Python API. Each component in the spec needs an LCSC C-number — the plugin auto-fetches pin maps from EasyEDA so your nets can reference pin NAMES (like 'GPIO10' or 'VCC') instead of numbers. First run may pause ~12 seconds per unique IC for EasyEDA's rate limit; results are cached in SQLite so subsequent runs are instant. The tool then auto-places footprints in three bands (connectors on top, ICs in middle, passives below), wires every net pad-to-pad, and draws a board outline. Result: a .kicad_pcb ready to open in KiCad or EasyEDA for routing. REQUIRES KiCad 8+ installed (pcbnew is KiCad-side Python).
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | PCB spec with board/components/nets. See plugin docs for the full schema. | |
| lib_dir | No | Directory holding KiCad's stock .pretty footprint libraries. Normally omit it — the plugin finds KiCad's libraries on Linux, macOS, Windows and Flatpak, and honours KJLC_FOOTPRINT_DIR / KICAD*_FOOTPRINT_DIR. | |
| output_path | No | Optional output .kicad_pcb path. Defaults to the active project's .kicad_pcb. | |
| force_refresh | No | Bypass cached pin maps and refetch from EasyEDA. Slow (rate-limited to one request per 12s); use only when a cached map is known to be wrong. | |
| auto_fetch_pinmaps | No | Fetch pin-name to pad-number maps from EasyEDA for components that have an 'lcsc' field and no explicit 'pinmap'. Set false to work offline — nets must then reference bare pad numbers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and handles it well. It discloses network fetching from EasyEDA, 12-second rate-limit pauses, SQLite caching, auto-placement behavior, wire generation, board outline drawing, and output as a file. It does not mention overwrite behavior or failure modes, but the main side effects are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six information-dense sentences with the core purpose front-loaded and supporting details about latency, caching, placement, and requirements following. Every sentence earns its place, though a few details are partially redundant with the input schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 5 parameters, a nested spec, and no output schema, the description is quite complete: it explains the output, external dependencies, performance characteristics, and system prerequisites. It defers the full spec schema to plugin docs and does not specify whether an existing output file is overwritten, but an agent has enough context to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value beyond the schema. It explains that components need an LCSC C-number, that nets can reference pin names rather than pin numbers, and that pin maps are cached and can be bypassed. This meaningfully enriches the spec parameter and the fetch-related flags.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Generate a fully-wired .kicad_pcb') from a declarative spec and names the mechanism (pcbnew API). It clearly names the output artifact and distinguishes itself from schematic-oriented siblings by describing PCB-specific behaviors such as auto-placement, pad-to-pad wiring, and board outline drawing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this when you have a declarative spec with LCSC C-numbers and need a ready-to-route PCB file. It also states the hard prerequisite of KiCad 8+ being installed. It does not explicitly name alternatives or say 'use sch_generate for schematics instead,' so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sch_generateA
Generate a .kicad_sch from a declarative netlist spec. The spec lists components (with LCSC C-numbers and footprints) and named nets connecting their pins. The generated schematic passes basic ERC and is ready to open in KiCad for human review and PCB layout.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Title block name. Defaults to the active project's name. | |
| sch_path | No | Optional override for the output path. Defaults to the active project's .kicad_sch. | |
| netlist_spec | Yes | Components + nets. See plugin docs for the schema. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds useful context by stating the generated schematic passes basic ERC and is ready for human review and PCB layout, but it does not disclose side effects such as overwriting an existing .kicad_sch or what the tool returns after generation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the core action front-loaded. Every clause contributes: file type, input format, component identifiers, net representation, ERC quality, and intended downstream use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose and input quality well, but since there is no output schema and no annotations, the agent is left without information about return values and overwrite behavior. It is adequate for a simple generation tool but has clear gaps around invocation side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining what the netlist_spec must contain—components with LCSC C-numbers and footprints, and named nets connecting pins—whereas the schema only says 'Components + nets. See plugin docs for the schema.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: generate a .kicad_sch from a declarative netlist spec. It also specifies the input content (components with LCSC C-numbers and footprints, named nets), which distinguishes it from downstream siblings like pcb_generate and sch_run_erc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is used when a netlist spec exists and the goal is a KiCad schematic for review and PCB layout. However, it never explicitly says when to prefer sch_generate over alternatives like pcb_generate or sch_run_erc, nor does it state any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sch_run_ercA
Run KiCad's Electrical Rules Check (ERC) on a schematic via kicad-cli. Returns counts of errors and warnings plus a path to the full report. Errors > 0 means the schematic has structural problems that should be fixed before layout.
| Name | Required | Description | Default |
|---|---|---|---|
| sch_path | No | Optional schematic path. Defaults to the active project's .kicad_sch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral transparency burden. It discloses return values (error/warning counts and a report path) and the meaning of errors > 0, but does not mention side effects such as whether a report file is written to disk, any prerequisites like an opened project, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two focused sentences with no filler. It front-loads the primary action and then supplies high-value information about outputs and interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description adequately covers purpose, return values, and how to interpret errors. It could be more complete by noting prerequisites or side effects, but the essential information for invoking and understanding the result is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter sch_path is fully described in the schema, including its optionality and default behavior. The description adds no additional parameter guidance beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Run KiCad's Electrical Rules Check (ERC) on a schematic via kicad-cli." It clearly states what the tool does and distinguishes it from siblings like sch_generate and pcb_generate by naming a specific check phase and reporting behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool is useful (before layout, when structural problems need fixing) but does not explicitly state when to use this tool versus alternatives or when not to use it. There is clear context but no exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_confirm_bomA
Record that the user has reviewed and approved the BOM. Call this immediately after they confirm at the BOM checkpoint, before pcb_generate. Without it the approval lives only in the conversation: if Claude Code restarts, session_resume reports the BOM as merely 'sourced' and the user is asked to approve the same BOM again. Spending money on a board is the one decision in this workflow worth making durable.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Optional note about what the user approved or asked to change, carried into the resume summary. | |
| project_path | No | Defaults to the active project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that this is a state-changing action ('Record') that persists approval durably, and it explicitly describes the behavioral difference from session_resume. It even explains the risk of skipping it (money spent on a board). This is transparent about the tool's effect and importance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph that front-loads the core purpose, then explains the workflow context and the stakes. Every sentence earns its place: the timing, the alternative tool, and the consequence of omission. No fluff, no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two optional parameters and no output schema, the description is complete. It tells the agent when to call it, why it matters, and what happens if it is skipped. The agent has everything needed to decide correctly without requiring additional lookups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters (notes and project_path) are already documented in the input schema. The description itself does not add new parameter semantics; it only indirectly references the notes via 'carried into the resume summary', but that detail is already in the schema. Per the rubric, with full coverage the baseline is 3, and the description adds no extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Record that the user has reviewed and approved the BOM.' It then anchors the action in the workflow ('immediately after they confirm at the BOM checkpoint, before pcb_generate') and distinguishes it from the sibling session_resume by explaining the consequence of skipping it. An agent can tell exactly what this tool does and when it applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit timing ('immediately after they confirm at the BOM checkpoint, before pcb_generate') and the negative consequence of not calling it (session_resume will ask the user to approve again). It effectively states when to use it and what happens otherwise, leaving no ambiguity about its role in the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_resumeA
Inspect the .kicad_jlcpcb_session.json in a project directory to see where a prior workflow left off. Returns the current stage (created / parts_sourced / bom_confirmed / pcb_generated / handoff_rendered), which checkpoints are complete, and a recommended next step. Use at the start of /pcb-new or /pcb-from-bom on an existing project to offer the user a resume-or-restart choice.
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | No | Project directory or .kicad_pro path. Defaults to the active project when set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral transparency. It describes the inspection and return values, implying read-only behavior, but doesn't explicitly state that it modifies nothing or what happens if the session file is missing. It does mention 'existing project' as a precondition, but more could be disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste. The core functionality is front-loaded, and the usage guidance is concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one optional parameter and no output schema. The description covers what it does, what it returns, and when to use it. It lacks explicit error handling or edge-case behavior (e.g., missing session file), but for this complexity, it's reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the single parameter with 100% coverage, describing project_path and its default behavior. The description adds no additional parameter semantics beyond that, so it meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Inspect' and the resource '.kicad_jlcpcb_session.json', and specifies what is returned (current stage, checkpoints, recommended next step). It differentiates from siblings by mentioning its use for offering a resume-or-restart choice, making its purpose distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context: 'Use at the start of /pcb-new or /pcb-from-bom on an existing project.' This tells the agent when to call it. It doesn't explicitly name alternatives or exclusions, but the context implies it's for resuming existing workflows, which is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.16.0- First observed
create_project - First observed
detect_kicad - First observed
easyeda_handoff - First observed
fetch_part_library - First observed
lcsc_resolve_bom - First observed
lcsc_search - First observed
load_project - First observed
package_for_jlcpcb - First observed
part_pin_map - First observed
pcb_generate - First observed
sch_generate - First observed
sch_run_erc - First observed
session_confirm_bom - First observed
session_resume
TDQS
Scored across 14 tools
Each tool has a single, clearly defined role in the workflow—environment detection, project lifecycle, part sourcing, schematic/PCB generation, testing, packaging, and session persistence. Even the LCSC/EasyEDA-related tools are cleanly separated by their inputs and outputs, so there is no practical ambiguity between them.
All names are snake_case and mostly follow a prefix/verb_noun pattern, but a few deviate from verb-first naming ('part_pin_map', 'easyeda_handoff') and prefixes mix abbreviations like lcsc, sch, and pcb. This is a minor consistency issue rather than a confusing naming scheme.
The 14 tools map directly to the stages of a single end-to-end KiCad-to-JLCPCB workflow, from environment detection through manufacturing handoff. Every tool has a distinct responsibility, and none feel redundant or out of scope.
The workflow is comprehensively covered: project setup, part sourcing, schematic generation/ERC, BOM approval, PCB generation, packaging, and handoff, plus session persistence for resuming. Minor gaps exist around post-generation PCB verification (no explicit DRC/DFM check) and editing existing designs, but these can be worked around in KiCad or EasyEDA.
Maintenance
Related MCP Connectors
Claude Code / MCP skills for the dev pipeline: discover, spec, design, build, ship, operate.
Turn Claude or ChatGPT into a website builder that ships a real site to a live URL you own.
AI code review for GitHub PRs with an MCP autofix loop for Claude Code and Cursor
Manage your IoT device fleet directly from Claude. Create device templates with datastreams and events, provision new devices, read live sensor data, and control outputs. The Blynk connector integrates with the Blynk IoT platform, enabling direct configuration and monitoring of connected devices and infrastructure.
Related MCP Servers
- AlicenseCqualityDmaintenanceAI-powered PCB and schematic design with KiCad. Works with Claude, Cursor, VS Code, Claude Code, and any MCP-compatible client.1003MIT
- AlicenseNot gradedqualityDmaintenanceUse Claude to control or ask questions about your Altium project.MIT
- AlicenseNot gradedqualityCmaintenanceEnables natural language control of KiCad PCB design software through Claude Desktop, automating project creation, design rule checks, component management, export, and cost estimation.5 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants like Claude to interact with KiCAD for PCB design automation, providing comprehensive tool schemas and real-time project state access.39 npm2MIT