jlcpcb-skill-mcp
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., "@jlcpcb-skill-mcpPick parts for this circuit for a 50-board run."
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.
jlcpcb-skill-mcp
English | ํ๊ตญ์ด | ๐ Docs site
An MCP server + Claude skill that picks JLCPCB/LCSC parts for your KiCad circuit with assembly cost in mind.
๐ Docs & install guide (Claude Code / Codex / other MCP clients): https://hulryung.github.io/jlcpcb-skill-mcp/
Not just search โ it automates part selection:
Basic > Preferred > Extended tier priority โ Extended parts carry a $3 loading fee per unique part (Basic is free; Preferred Extended is waived on Economic PCBA)
Stock risk checks โ verifies stock covers 5โ10ร your production need
Quantity-tiered pricing โ costs are computed at the price break your order quantity actually hits
KiCad integration โ parses
.kicad_schschematics / BOM CSVs directly and matches lines to LCSC part numbersPackage consolidation hints โ flags the same value scattered across 0603/0805 to save reel changes
Data comes from the public jlcsearch API by tscircuit.
Demo
One command takes the example ESP32-C3 board from schematic to a costed, tier-aware BOM (live data):

And the same thing inside a real Claude Code session โ one natural-language request ("Search for parts and pick the right ones for this board, for a 20-board production run.") drives the skill + MCP tools end to end:

(Also available as MP4: script demo ยท session demo. Re-render with vhs docs/demo.tape / vhs docs/demo-claude.tape.)
Related MCP server: jlcpcb-mcp
Quick start
npm install
npm run buildThis repository ships a .mcp.json, so opening this directory in Claude Code registers the server automatically.
The part-selection skill (.claude/skills/jlcpcb-parts/) loads alongside it โ ask "pick parts for this circuit" and the skill drives the tools in order, applying the tier/stock/price doctrine.
Using it in other projects / globally
Easiest path โ install the plugin (skill + MCP in one step, no clone or build):
/plugin marketplace add hulryung/jlcpcb-skill-mcp
/plugin install jlcpcb-parts@jlcpcb-toolsIf you installed the plugin, skip the manual registration in 1) and 2) below โ they only matter when developing against a local checkout.
1) Register the MCP server at user scope โ applies to every project:
claude mcp add --scope user jlcpcb-parts -- node /path/to/jlcpcb-skill-mcp/dist/index.js
claude mcp list # confirm "โ Connected"Remove with claude mcp remove jlcpcb-parts -s user. (Inside this repo the project-scope .mcp.json overlaps with it and prints a duplicate warning; it is the same server, so this is harmless.)
2) Install the skill globally (personal scope) โ a symlink, so repo updates propagate automatically:
ln -sfn /path/to/jlcpcb-skill-mcp/.claude/skills/jlcpcb-parts ~/.claude/skills/jlcpcb-parts3) Workflow alongside KiCad โ KiCad itself is not an MCP client, so the integration is "a terminal next to KiCad":
cd ~/dev/my-board # the project with your .kicad_sch
claude
> Pick parts for this circuit, for a 50-board run.The skill triggers automatically and runs analyze_kicad โ suggest_bom_parts โ resolves review lines โ estimates cost; ask it to fix LCSC fields/footprints and it edits the schematic for you. After schematic edits, press F8 in KiCad (Update PCB from Schematic) to propagate changes to the board. For hierarchical designs, pass the root sheet โ sub-sheets are followed automatically.
4) Claude Desktop / other MCP clients โ it is a plain stdio server, so it plugs in anywhere. For Claude Desktop, add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"jlcpcb-parts": {
"command": "node",
"args": ["/path/to/jlcpcb-skill-mcp/dist/index.js"]
}
}
}Fully quit and restart the Desktop app to apply. (Skills are Claude Code-only; Desktop gets the tools.)
Updating: git pull && npm install && npm run build โ registrations point at dist/index.js, so no re-registration is needed.
Distributing to a team: GitHub, npm, or a remote server
Three ways to share without local paths.
A) Claude Code plugin (recommended โ ships skill + MCP together)
This repo is structured as a plugin and its own marketplace (.claude-plugin/plugin.json + marketplace.json, with a dependency-inclusive single-file bundle dist-plugin/index.mjs committed). Teammates need no clone and no build:
/plugin marketplace add hulryung/jlcpcb-skill-mcp
/plugin install jlcpcb-parts@jlcpcb-toolsSkill and MCP server install together, with update/removal via the /plugin menu. After changing server code, run npm run bundle and commit the refreshed bundle. Direct single-plugin installs without a marketplace are not supported, hence the included marketplace.json.
B) Publish to npm (MCP only)
npm publish # then users run:
claude mcp add jlcpcb-parts -- npx -y jlcpcb-parts-mcpnpx caches the package, so it does not reinstall every session. The skill must be distributed separately (option A covers that), so this fits MCP-only consumers. Note npx github:owner/repo-style direct GitHub execution is not supported.
C) Hosted catalog API on Cloudflare D1 (zero download)
A Cloudflare Worker serves the full in-stock JLCPCB catalog (~693k parts) from D1, so teammates get catalog search without the local DB download โ they just point the local MCP server at the URL. A live instance runs at https://jlcpcb-parts-api.dkkang7484.workers.dev:
claude mcp add --scope user jlcpcb-parts \
-e JLCPCB_API_URL=https://jlcpcb-parts-api.dkkang7484.workers.dev \
-- node /path/to/jlcpcb-skill-mcp/dist/index.jsThe KiCad file tools still run locally (a remote server can't read your .kicad_sch); only the parts data comes from D1. get_part proxies live jlcsearch for fresh stock + preferred tier. Deploy your own with npm run build:d1-db + the runbook in worker/README.md โ it fits the D1 free plan (~330 MB < 500 MB).
Local parts database (optional)
By default the server queries the live jlcsearch API. You can instead run against a local copy of the full JLCPCB catalog โ no rate limits, no dependency on a third-party mirror, and complete results (the live mirror caps some queries at 100 rows).
npm run db:update # downloads ~830 MB, expands to ~4.9 GB at ~/.cache/jlcpcb-parts/Requires the unzip CLI and Node โฅ 22 (built-in node:sqlite). The server auto-detects the DB on start and switches to hybrid mode: search runs offline over the full catalog, while get_part still hits the live API for fresh stock and the preferred-tier flag before you commit to a part. The download is a snapshot (from bouni/kicad-jlcpcb-tools, rebuilt daily) so stock figures are approximate until that final live check โ always re-verify before ordering.
Refreshes when older than 7 days (
npm run db:update -- --forceto force).JLCPCB_PARTS_DB=/path/to/parts-fts5.dboverrides the location.The catalog DB distinguishes only Basic vs Extended (not Preferred); preferred-extended detection still comes from the live API on
get_part. Basic detection matches the live data (verified 13/13 on real boards).
MCP tools (7)
Tool | Purpose |
| Free-text search (package / tier / min-stock filters) |
| Parametric R/C search โ understands |
| Detail lookup by LCSC number (price breaks, attributes) |
| Same-spec substitutes, ranked by tier/stock/price |
|
|
| Whole-BOM matching + ranking + cost (the core tool) |
| Component cost + loading fees for a chosen part list |
| Fetch a part's symbol + footprint + 3D model into a KiCad project's libraries, registered and ready to place (via kicad-lcsc-manager + python3) |
Example run (real output)
The bundled example board examples/esp32c3-sensor (ESP32-C3 + AMS1117 + USB-C + 15 passives), for a 20-board run:
npm run demoRefs | Qty | Value | Pkg | LCSC | Tier | Stock | Unit | Status |
J1 | 1 | USB-C | โ | C165948 | extended | 336,394 | $0.16 | preassigned |
U2 | 1 | AMS1117-3.3 | SOT-223 | C6186 | basic | 1,490,681 | $0.15 | preassigned |
U1 | 1 | ESP32-C3 | QFN-32 | C2838500 | extended | 8,750 | $1.55 | needs_review |
R1 R2 | 2 | 10k | 0603 | C25804 | basic | 37,165,617 | $0.0008 | matched |
R3 R4 | 2 | 5.1k | 0603 | C23186 | basic | 7,571,904 | $0.0009 | matched |
C1 C2 | 2 | 100nF | 0603 | C14663 | basic | 81,299,425 | $0.0022 | matched |
โฆ |
Components $39.05 + Loading fees $9.00 (3 extended parts ร $3) = $48.05 ($2.40/board)
needs review: U1 (IC matched via text โ verify footprint), SW1 (switch matched via text)Passives all land on basic-tier parts with millions in stock; low-confidence matches (IC text search, package prefix match) are flagged needs_review instead of being silently accepted.
Selection rules (encoded in the engine + skill)
Hard filters: out-of-stock dropped; resistance ยฑ0.5% / capacitance ยฑ5% value match; package match (exact for passives, prefix-tolerant for ICs with a review flag); tolerance at least as tight as requested
Scoring: tier (basic +100 / preferred +60 / extended +0) โ stock adequacy (+25 plus depth bonus) โ price (+15) โ tolerance (+3)
Cost: the loading fee counts once per unique extended part (no double-charging a part reused across lines)
Limitations & caveats
jlcsearch is an unofficial mirror of JLCPCB data. Stock and prices are snapshots โ re-verify with
get_partright before ordering.Text matching for ICs/connectors is a convenience โ always verify the MPN and datasheet (
needs_reviewis that signal).Supports KiCad 6โ9
.kicad_schfiles and common BOM CSV exports.
Development
npm test # full test suite (vitest)
npm run demo # live end-to-end demo
node scripts/smoke-mcp.mjs # stdio smoke test of the built serverLayout: src/kicad (parsers) ยท src/jlc (API client) ยท src/engine (ranking/cost) ยท src/tools (MCP tools) โ module contracts in CONTRACTS.md, live API findings in docs/jlcsearch-api-notes.md.
Credits
Data: tscircuit/jlcsearch, upstream data pipeline yaqwsx/jlcparts
Unofficial project, not affiliated with JLCPCB/LCSC.
MIT License
Available Tools
8 toolsanalyze_kicadAnalyze KiCad schematic / BOMA
Parse a KiCad schematic (.kicad_sch, KiCad 6-9) or a KiCad BOM CSV export (.csv) and return grouped BOM lines: references, quantity per board, value, JLC-style package derived from the footprint, component class, any pre-assigned LCSC part numbers, and DNP flags. Hierarchical sheets are followed automatically: sheet files referenced by the schematic are resolved relative to it, parsed recursively (each file once), and merged into the BOM; missing sheet files are skipped with a warning. Power symbols and #-references are excluded. Run this first to understand a design, then pass the same path to suggest_bom_parts for part suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to a .kicad_sch schematic or a BOM .csv export. Relative paths resolve against the MCP server's working directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behaviors: it follows hierarchical sheets recursively, skips missing files with warnings, excludes power symbols and #-references, and returns specific BOM fields. This goes well beyond basic operation and covers edge cases.
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 well-structured and front-loaded: it opens with the core function and output fields, then explains behaviors. Each sentence provides distinct value, with no filler or redundant content.
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 annotations or an output schema, the description explains inputs, output fields, hierarchical sheet recursion, exclusions, and a follow-up tool. It is sufficiently complete for an agent to select and invoke 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?
The schema already provides a 100% description of the single 'path' parameter, so the baseline is 3. The description adds a helpful version constraint ('KiCad 6-9') but otherwise repeats the schema's file type and path handling without substantial new 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?
The description states a clear action ('Parse') and a specific resource ('a KiCad schematic or BOM CSV'), with detailed output fields. It explicitly distinguishes itself from the sibling tool by saying 'Run this first... then pass the same path to suggest_bom_parts.'
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 usage guidance: 'Run this first to understand a design, then pass the same path to suggest_bom_parts for part suggestions.' This names an alternative (suggest_bom_parts) and when to use this tool vs. that one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_assembly_costEstimate JLCPCB assembly parts costA
Estimate the parts side of a JLCPCB assembly order for a chosen set of LCSC parts: component cost using quantity price breaks (at qty = board_qty ร qty_per_board) plus one-time loading fees โ $3 per unique extended-tier part; basic and preferred (Preferred Extended) parts carry no fee. Does not include PCB fabrication or per-joint assembly charges. Use after finalizing part picks from suggest_bom_parts / find_alternatives.
| Name | Required | Description | Default |
|---|---|---|---|
| parts | Yes | The chosen parts to cost | |
| board_qty | Yes | Number of boards to assemble |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description takes on the full disclosure burden. It clearly explains the fee structure ($3 per unique extended-tier part; no fee for basic/preferred parts) and the quantity calculation (qty = board_qty ร qty_per_board). It also states what is excluded (fabrication and assembly charges), providing solid behavioral context though not detailing the response format.
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 three sentences, each earning its place: the first states the core function, the second excludes non-included costs, and the third gives usage timing. It is dense, front-loaded, and contains no redundant or irrelevant wording.
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 tool with only 2 parameters and no output schema, the description covers the essential operational details: what it computes, how fees are calculated, what is excluded, and when to use it. It omits only optional details like response breakdown structure, which are not required because there is no output schema.
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 parameters are already documented. The description adds meaning by explaining how board_qty and qty_per_board interact to determine the quantity for price breaks, and clarifies that the fee applies per unique extended-tier part, going beyond the schema's simple property definitions.
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 starts with the specific verb 'Estimate' and names the exact resource: the parts side of a JLCPCB assembly order for LCSC parts. It also implies that the tool is distinct from sibling tools like suggest_bom_parts and find_alternatives by stating it is used after finalizing part picks.
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?
Explicitly says 'Use after finalizing part picks from suggest_bom_parts / find_alternatives,' giving clear timing relative to alternatives. It also clarifies exclusions ('Does not include PCB fabrication or per-joint assembly charges'), which sets expectations for when not to use this tool for a full cost estimate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_alternativesFind alternative partsA
Given an LCSC part number, find ranked drop-in alternatives with matching specs and package โ useful when a part is out of stock, extended-tier (carries the $3 loading fee), or expensive. The original part is excluded from results. Ranking prefers basic/preferred tier (no loading fee), deep stock relative to need, and lower price; each alternative carries reasons and warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | Yes | LCSC part number of the part to replace, e.g. "C25804" | |
| limit | No | Max alternatives to return, clamped to 1-50 (default 5) |
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 key behaviors: 'The original part is excluded from results' and details ranking criteria (tier, stock, price, reasons/warnings). This adds meaningful context about output and selection logic, though it does not explicitly state read-only behavior or error cases.
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 and front-loaded: one sentence covers purpose, use cases, and behavior, followed by a second sentence with ranking details. 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 2-parameter tool with no output schema, the description explains purpose, use cases, ranking logic, and output characteristics (reasons/warnings). It does not explicitly state the return type (e.g., list of alternatives) but the implied structure is sufficient for most agents.
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% with clear descriptions for both 'lcsc' and 'limit'. The description adds general context about ranking but does not add parameter-specific meaning beyond the schema, so baseline 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 clearly states the tool's function: 'Given an LCSC part number, find ranked drop-in alternatives with matching specs and package.' This uses a specific verb and resource, and distinguishes it from siblings like search_parts and get_part by focusing on alternatives for an existing part.
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 explicit use cases: 'useful when a part is out of stock, extended-tier (carries the $3 loading fee), or expensive.' This gives clear context for when to use, though it does not explicitly name alternative tools or state when-not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_partGet JLCPCB part detailA
Look up a single part by LCSC number (e.g. "C25804") and return full detail: assembly tier (basic = no loading fee, preferred = $3 fee waived, extended = one-time $3 loading fee per unique part), live stock, quantity price breaks, parsed attributes (resistance, tolerance, voltage...), and product URL. Use to verify a candidate part before committing it to a BOM.
| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | Yes | LCSC part number, e.g. "C25804" (bare digits also accepted) |
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 the return payload in detail (assembly tier with fee semantics, stock, price breaks, attributes, URL) and frames the operation as a lookup, implying read-only behavior without stating it explicitly. This is strong behavioral transparency, though it stops short of discussing 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 sentences, with the first sentence front-loading the action and listing the key return fields in a compact parenthetical. The second sentence provides a clear usage directive, and every word adds value. No redundancy.
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 and no annotations, the description fully covers the tool's purpose, parameter format, return contents, fee semantics, and intended usage within a single BOM workflow. It is sufficiently complete for a single-parameter lookup tool.
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% for the single 'lcsc' parameter, and the schema already states the format and example. The description reinforces the example and usage context but adds no new semantic details beyond the schema, so the baseline of 3 applies.
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 'Look up a single part by LCSC number' which is a specific verb+resource+identifier, and it distinguishes itself from sibling search tools by focusing on a single part by exact ID. The example 'C25804' and the BOM verification use case reinforce its unique role.
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 states 'Use to verify a candidate part before committing it to a BOM,' giving a clear when-to-use scenario. It does not enumerate alternative tools or exclusion criteria, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_part_to_kicadImport a part into a KiCad libraryA
Fetch an LCSC part's KiCad symbol, footprint, and 3D model (STEP + WRL) and add them to a KiCad project's libraries, registering them in the project's sym/fp-lib-table so the part is immediately usable. Reuses the kicad-lcsc-manager engine (github.com/hulryung/kicad-lcsc-manager) โ install it or set KICAD_LCSC_MANAGER if missing. Requires python3. Run after picking parts with suggest_bom_parts / find_alternatives to make them usable in the schematic.
| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | Yes | LCSC part number(s), e.g. "C25804" or ["C25804","C7593"] | |
| include | No | Which assets to import (default: all three) | |
| overwrite | No | Overwrite an existing entry for this LCSC id (default false) | |
| project_dir | Yes | KiCad project directory (or a .kicad_pro path). Library files are written under it (libs/lcsc/...) and registered in its lib tables. | |
| manager_path | No | Path to a kicad-lcsc-manager checkout, if not auto-detected |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It clearly states side effects (writes files, registers in lib tables), prerequisites (python3, kicad-lcsc-manager), and project impact. It does not mention error handling or return behavior, but the core disruptive behavior is adequately 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?
Three sentences, front-loaded with the core action, followed by essential prerequisites and usage timing. Every sentence adds value without redundancy or fluff.
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 the tool's complexity (external engine, file writes, library registration) and no output schema, the description covers key context: what it does, prerequisites, and when to use it. It could mention failure modes (e.g., missing library tables) but the provided information is sufficient for correct invocation.
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 has 100% description coverage, so the baseline is 3. The description adds useful context beyond the schema, such as the 3D model format (STEP + WRL) and the explicit mention of sym/fp-lib-table registration, which complements the project_dir parameter. This enhancement justifies a 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 uses specific verbs ('Fetch', 'add', 'registering') and clearly identifies the resource (LCSC part) and destination (KiCad project libraries). It distinguishes this tool from siblings by focusing on importing/registering parts, unlike search/get/analyze 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?
Explicitly states when to run it: 'after picking parts with suggest_bom_parts / find_alternatives to make them usable in the schematic.' It also gives prerequisites (python3, external engine). However, it does not explicitly mention when not to use it or name an alternative for this task, so it falls 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.
search_partsSearch JLCPCB partsA
Free-text search of the JLCPCB/LCSC parts catalog. Use for ICs, connectors, LEDs, diodes, or any part by keyword, value+package text, or manufacturer part number (e.g. "AMS1117-3.3", "10k 0603", "USB-C 16pin"). For resistors/capacitors by exact value prefer search_passives. Tier semantics: basic = pre-loaded at JLCPCB, no loading fee; preferred = Preferred Extended, $3 loading fee waived (Economic PCBA); extended = one-time $3 loading fee per unique part per order.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | Tier filter with admit-lower semantics โ NOT an exact-tier match. 'basic' or 'preferred' both return only fee-free parts (basic and preferred-extended, no $3 loading fee); 'extended' applies no filtering and returns parts of all tiers. Check each result's tier field for its actual tier. | |
| limit | No | Max results, clamped to 1-50 (default 10) | |
| query | Yes | Free-text query: keywords, value + package, or manufacturer part number (e.g. "10k 0603", "ESP32-C3", "WS2812B") | |
| package | No | Filter by JLC package name, e.g. "0603", "SOT-23-5", "SOIC-8", "QFN-32" | |
| min_stock | No | Only return parts with at least this much JLCPCB stock |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It goes beyond a basic search statement by explaining the financial implications of tier selections (loading fees, which tiers are fee-free). It doesn't mention result structure or pagination, but for a read-only search tool the tier behavior is the most critical nuance and it is thoroughly 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?
Three dense sentences, each serving a distinct purpose: (1) state what it does, (2) give usage examples and a sibling alternative, (3) explain the nuanced tier fees. There is zero filler or repetitionโ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 has 5 parameters, one enum, and no output schema. The description covers the query format, package filtering context, tier meaning with fee implications, and the distinction from a sibling. It doesn't describe result fields, but for a search tool the most important contextโhow to search and what the tier filter doesโis fully addressed.
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. The description adds value with concrete example queries ('AMS1117-3.3', '10k 0603', 'USB-C 16pin') and clarifies the non-obvious 'admit-lower semantics' of the tier enum beyond the schema's own description. This raises it above the baseline.
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 specific verb ('search') and a clear resource ('JLCPCB/LCSC parts catalog'), then lists example use cases (ICs, connectors, LEDs) and concrete query formats. It explicitly distinguishes itself from the sibling tool search_passives, which is the strongest form of purpose clarity.
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 direction on when to use this tool versus search_passives ('For resistors/capacitors by exact value prefer search_passives'), provides multiple usage examples, and explains the tier filter semantics in detail. This is exactly the 'when-to-use vs alternatives' guidance the rubric asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_passivesParametric resistor/capacitor searchA
Parametric JLCPCB search for chip resistors or capacitors by value. Parses the value string ("10k", "4k7", "0.1R", "100nF", "4u7", "10p") into ohms/farads and searches by exact spec, optionally filtered by package (0402/0603/0805...). Prefer this over search_parts for R/C BOM lines โ it avoids fuzzy text matches. Results are ordered by the client; prefer basic-tier (no loading fee) parts with deep stock.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which passive family to search | |
| limit | No | Max results, clamped to 1-50 (default 10) | |
| value | Yes | Component value: resistors like "10k", "4k7", "0.1R", "1M", "470"; capacitors like "100nF", "4u7", "0.1uF", "10p" | |
| package | No | Chip package filter, e.g. "0402", "0603", "0805", "1206" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It discloses that the tool parses value strings into ohms/farads, searches by exact spec, optionally filters by package, and that results are ordered with a preference for basic-tier parts. This goes well beyond a generic search description, though it does not detail return format or error handling.
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: purpose, usage guidance, and behavioral note. Every sentence adds value with no redundancy. The most important information (what and when) is front-loaded, and the text is concise 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?
Given that this is a search tool with four parameters and no output schema, the description covers all necessary aspects: what it does, how to invoke it (value and optional package), when to use it instead of alternatives, and what to expect from results. No significant gaps remain.
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 enriches the parameter meaning with parsing examples ('10k', '4k7', '100nF') and clarifies that values are interpreted as ohms/farads. This helps the agent construct valid inputs, especially for the 'value' parameter.
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 specifies a precise action ('Parametric JLCPCB search') and distinct resource ('chip resistors or capacitors by value'). It differentiates from siblings by explicitly noting it uses exact spec parsing rather than fuzzy text matching, making it clear when this tool is the right choice.
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 when-to-use guidance: 'Prefer this over search_parts for R/C BOM lines โ it avoids fuzzy text matches.' It also describes the optional package filter and how to request specific component values, providing clear context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_bom_partsSuggest JLCPCB parts for a BOMA
Suggest concrete JLCPCB parts for a whole BOM with assembly-cost awareness. Input EITHER 'path' (a .kicad_sch schematic or KiCad BOM .csv) OR 'bom_lines' (inline rows) โ exactly one. Each line gets ranked candidates with reasons/warnings and a status: matched, needs_review (verify manually โ e.g. IC matched only by fuzzy text), no_match, preassigned (schematic already carries an LCSC number), or skipped_dnp. Also returns a cost breakdown: component cost at price breaks plus one-time $3 loading fee per unique extended-tier part (basic and preferred parts are fee-free). Ranking prefers basic tier, deep stock vs. needed qty (board_qty ร qty ร stock_multiple), and lower price.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path to a .kicad_sch or BOM .csv (mutually exclusive with bom_lines). Relative paths resolve against the server's working directory. | |
| board_qty | No | Number of boards to assemble (default 10) | |
| bom_lines | No | Inline BOM lines (mutually exclusive with path) | |
| max_candidates | No | Ranked candidates kept per line, clamped to 1-50 (default 5) | |
| stock_multiple | No | Stock safety factor: warn unless stock โฅ needed ร this (default 5) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses ranking preferences (basic tier, deep stock, lower price), the $3 loading fee for extended-tier parts, fee-free status for basic/preferred, and the statuses including needs_review with a warning about fuzzy text matching. This is rich behavioral detail.
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 dense paragraph, but every sentence adds relevant information. It is front-loaded with the core purpose, then details input, output statuses, and cost logic. Slightly long but efficient.
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 5 parameters, no output schema, and no annotations, the description thoroughly covers expected outputs (statuses, candidates, reasons/warnings, cost breakdown) and ranking logic. Nothing critical is missing for an agent to invoke and understand the tool.
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 baseline is 3. The description adds value by clarifying the 'exactly one' input rule and explaining how inputs like board_qty and stock_multiple influence ranking and stock warnings, going beyond bare schema definitions.
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: 'Suggest concrete JLCPCB parts for a whole BOM with assembly-cost awareness.' This is specific and distinguishes it from sibling tools like search_parts or estimate_assembly_cost, which handle individual searches or cost estimation separately.
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 explains the intended context (whole BOM, assembly-cost awareness) and explicitly describes the input switch (path vs bom_lines, exactly one). It does not explicitly name alternatives or exclusions, but the scope 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.
8 tool updates
v0.2.0- First observed
analyze_kicad - First observed
estimate_assembly_cost - First observed
find_alternatives - First observed
get_part - First observed
import_part_to_kicad - First observed
search_parts - First observed
search_passives - First observed
suggest_bom_parts
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: searching (general vs. passives), part lookup, alternatives, BOM suggestion, schematic parsing, KiCad import, and cost estimation. The only slight overlap in cost reporting between suggest_bom_parts and estimate_assembly_cost is clarified by their different roles.
All tool names follow a consistent verb_noun pattern in lowercase snake_case (e.g., search_parts, get_part, find_alternatives, estimate_assembly_cost). The naming is highly regular and predictable.
8 tools is well-scoped for a JLCPCB/PCBA workflow, covering search, lookup, alternatives, BOM handling, KiCad integration, and cost estimation without redundancy or bloat.
The tool set provides end-to-end coverage: analyze a schematic/BOM, suggest parts, search and verify, find alternatives, import to KiCad, and estimate assembly cost. No critical operations are missing for the intended use case.
Maintenance
Related MCP Connectors
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for generating rough-draft project plans from natural-language prompts.
An MCP server that automatically collects feedback on your MCP server.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP servers for KiCad schematic, PCB, symbol, footprint, and project automation, enabling AI-assisted electronic design via tools for read/write, analysis, and exports.1098MIT
- AlicenseAqualityCmaintenanceMCP server for JLCPCB/LCSC component search, live stock and pricing, datasheets, and PCB/3D printing ordering via authenticated API.281MIT
- AlicenseBqualityBmaintenanceAn MCP server that enables AI assistants to analyze schematics, inspect PCBs, trace connections, validate designs, and generate embedded code for KiCad projects.39129MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that gives AI agents end-to-end control of KiCad 9+ for rule checks, manufacturing exports, production-readiness certification, and live PCB editor control.MIT