PCB Parts MCP Server
This MCP server gives AI coding assistants electronic-component data and PCB design resources, mainly around JLCPCB with optional Mouser/DigiKey lookups.
Search JLCPCB's 630K+ in-stock parts with natural-language/parametric filters, browse categories, and inspect filterable attributes.
Check real-time JLCPCB stock and get full part details, MPN-to-JLCPCB equivalents, pinouts, and catalog-checked alternatives.
Look up live price/stock/datasheets on Mouser and DigiKey when optional API keys are configured.
Search SamacSys ECAD models and download KiCad symbols/footprints.
Recommend sensor ICs/modules by measurement, protocol, or platform.
Search OSHW reference boards, inspect IC neighborhoods/BOMs, and retrieve curated PCB design rules (per README).
No API key required for JLCPCB; Mouser/DigiKey keys are optional.
Retrieves component pin information and symbol availability data from EasyEDA to assist with electronic part verification and circuit design.
Provides specialized sensor recommendations, including ICs and modules, specifically tailored for projects utilizing the ESPHome platform.
Enables searching for and downloading schematic symbols and PCB footprints in KiCad format for electronic components through SamacSys integration.
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., "@PCB Parts MCP Serverfind an N-channel MOSFET with Vgs(th) < 2V and Rds(on) < 10mΩ"
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.
PCB Parts MCP Server
MCP server that gives Claude, Cursor, and other AI coding assistants electronic component data from JLCPCB, Mouser, and DigiKey: parametric search over 630K+ in-stock JLCPCB parts, live stock and pricing on all three, KiCad footprints, reference boards, sensor picks, and design rules. No API key required.
Website: pcbparts.dev
Features
Three distributors: search JLCPCB, and look up live price and stock for specific parts on Mouser and DigiKey
Parametric search: Filter by electrical specs (Vgs(th) < 2V, Rds(on) < 10mΩ, etc.)
Smart query parsing: "10k 0603 1%" auto-parses into structured filters
Find alternatives: Spec-aware compatibility checking for 120+ component types
KiCad footprints: Download symbols and footprints via SamacSys
Pinout data: Component pin information from EasyEDA symbols
MPN lookup: Find JLCPCB equivalents by manufacturer part number
Sensor recommendation: Find sensor ICs by what they measure, protocol, or platform (1,600+ sensors, 56 measure types)
Reference boards: Search ~285 OSHW board schematics, IC neighborhoods, cross-board consensus for design patterns
Design rules: 41 curated PCB design reference files covering power, protection, interfaces, MCUs, layout, and EMC
14 MCP tools
No API key required for JLCPCB (Mouser/DigiKey optional)
Related MCP server: SheetsData MCP
Quick Start
Claude Code
claude mcp add -s user --transport http pcbparts https://pcbparts.dev/mcpOptional — auto-approve all pcbparts tools in ~/.claude/settings.json:
{
"permissions": {
"allow": ["mcp__pcbparts__*"]
}
}Claude Desktop
Add via Settings → Connectors → "Add custom connector", or add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"pcbparts": {
"type": "http",
"url": "https://pcbparts.dev/mcp"
}
}
}Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"pcbparts": {
"type": "http",
"url": "https://pcbparts.dev/mcp"
}
}
}VS Code
Add to .vscode/mcp.json:
{
"servers": {
"pcbparts": {
"type": "http",
"url": "https://pcbparts.dev/mcp"
}
}
}Copilot for Xcode
Add to Extensions config:
{
"mcpServers": {
"pcbparts": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://pcbparts.dev/mcp"]
}
}
}Available Tools
Typical workflow: get_design_rules / board_search + board_get(focus=IC) → jlc_search → jlc_get_part (datasheet, footprint) → jlc_find_alternatives → cse_get_kicad (KiCad files).
Tool descriptions include reply-field guidance: relaxed names omitted query words, a query-only library preference or a dropped part type; relaxed.dropped_filters lists parsed spec filters omitted by a part-number retry; parsed.adjusted_filters lists moved/omitted specs; ignored_filters explains unapplied/rare filters; hint suggests a next step on empty replies; when a search shortens a full part number (LM1117-3.3 searches LM1117), each result's mpn_match says whether it is the full part number, keeps its suffixes (same_suffix) or is another family member, those come in that order, and mpn_matches counts each; MOSFET results add rds_on_at_drive when the query gives a gate drive (the listed RDS(on) at the highest gate voltage at or below it, or null when RDS(on) is only listed at higher gate voltages); counts_complete=false means partial counts; valid_values lists accepted inputs on errors. In jlc_get_part, prices lists quantity tiers, datasheet is LCSC's datasheet page (a viewer; null when LCSC has none), datasheet_pdf is the datasheet as a PDF, a link valid until datasheet_pdf_expires (about 30 minutes, so fetch it rather than store it), lcsc_url is the LCSC product page, and has_easyeda_footprint=null means unknown (false means absent); MPN lookups return results and total. MPN replies that aren't exact matches add match (separators, packing, alias, alternative, lcsc or related) and matched_mpn; related replies add a note naming the part types returned and any part another manufacturer numbered after the original; an LCSC code given as mpn returns that part (lcsc), and so does a jlc_search query of LCSC codes alone. In alternatives, summary.found counts verified alternatives, unverified_alternatives need manual comparison, specs_unparseable lists specs not verified, and unchecked_requirements includes pinout/circuit checks still needed. In board_get, focus_match_type is exact, partial or ref matching; consensus.board_count counts compared boards, and passives_omitted counts hidden plain passives.
jlc_get_part(mpn=...) also finds a part spelled with different dashes or spaces (ERJ-2RKF2702X → ERJ2RKF2702X), with another reel or packing code from the same manufacturer (AD8630ARZ-REEL7 → AD8630ARZ), or written as a BOM entry with notes or alternatives (TL074 OP AMP, AMC1301 or AMC1302). It never substitutes a different temperature or performance grade. related results can span different part types (SSD1306 returns an OLED display and power inductors), so check them before choosing a part.
JLCPCB (Local DB + Live API)
Tool | Description |
| Primary search — smart query parsing + parametric spec filters (local DB, 630K+ in-stock parts, updated daily; default shortlist 20, max 100) |
| Real-time stock verification via live JLCPCB API (use |
| Full details for a specific LCSC part code or MPN lookup |
| Component pin information from EasyEDA symbols |
| Find catalog-checked alternatives and separate unverified candidates |
| Browse categories, subcategories, and filterable attributes |
Mouser (requires MOUSER_API_KEY)
Tool | Description |
| Price, stock, and datasheet for specific parts on Mouser; batch up to 10 per call (shared daily limit on pcbparts.dev) |
DigiKey (requires DIGIKEY_CLIENT_ID + DIGIKEY_CLIENT_SECRET)
Tool | Description |
| Price, stock, and datasheet for one part on DigiKey (shared daily limit on pcbparts.dev) |
Sensor Recommendation (no key required)
Tool | Description |
| Find sensor ICs/modules by measurement need, protocol, or platform (1,600+ sensors, 56 measure types) |
Reference Boards (no key required)
Tool | Description |
| Search ~285 OSHW reference board schematics by IC, tag, org, or free text. Cross-board consensus shows how ICs are typically used. |
| Get full board details — BOM, design rules, dimensions. Use |
Design Rules (no key required)
Tool | Description |
| PCB design rules & best practices (41 curated reference files: power, protection, interfaces, MCUs, layout, EMC) |
SamacSys (no key required)
Tool | Description |
| Search for ECAD models, datasheets, and footprint availability |
| Download KiCad symbols and footprints for any part |
search vs stock_check
Use jlc_search (default) for:
Parametric filtering ("Vgs(th) < 2V", "voltage >= 25V")
Smart query parsing ("10k 0603 1%" auto-detects value, package, tolerance)
Most searches
Use jlc_stock_check only when you need:
Real-time stock verification before ordering
Out-of-stock or low-stock parts (stock < 10)
The full catalog (7M+ parts;
jlc_searchcovers the 630K+ with stock >= 10)
Library Types
Type | Assembly Fee | Description |
| None | Common parts in JLCPCB's standard library |
| None | Recommended parts with good availability |
| $3/unique part | Less common parts |
| None | Filter shortcut: searches basic + preferred combined |
Subcategory Aliases
Natural language names that map to JLCPCB subcategories (220+ aliases supported):
Category | Aliases |
Capacitors |
|
Resistors |
|
Inductors |
|
Diodes |
|
MOSFETs |
|
Regulators |
|
Crystals |
|
Connectors |
|
LEDs |
|
MCUs |
|
Relays |
|
Interface ICs |
|
Drivers, switches |
|
inductor, relay and diode each cover several subcategories (SMD, power, molded and through-hole inductors; signal, power, automotive, reed and latching relays; switching, general-purpose, Schottky, fast-recovery and SBR diodes).
A value in the query goes to the spec that part type lists: "5V relay" is the coil voltage, "3.3V LDO" the exact output, "12V buck converter" an output range covering 12V (with Topology Buck), "3.3V level shifter" a supply range covering 3.3V. "24V input 3.3V output" and "12V to 5V" set both sides of a regulator. "0.2pF ESD" is a junction capacitance of at most 0.2pF and "5V ESD diode" a stand-off voltage (Vrwm) of at least 5V. "SMA", "SMB" and "SMC" with connector words ("SMA edge mount connector", "SMA female") or a connector subcategory are the coax series; otherwise they are the diode packages. If the part type lists no such spec, the value is left out and parsed.adjusted_filters says so; words that match no part together with the rest of the query are left out and relaxed says so, except when you give subcategory_name or spec_filters, where hint names the words and how many parts match without them; filters that can't be applied are listed in ignored_filters.
jlc_search defaults to 20 results; an explicit limit can request up to 100. Component replies omit description when nonempty specs already provide the detail. price_10 is removed from search, stock-check and part-detail replies; use the stated quantity tiers in jlc_get_part.prices.
packages (search/stock check) and manufacturers (stock check) accept a list, JSON array string, or one bare string. Values containing commas stay intact. Query package alternatives such as 100nF 25V capacitors in 0402 or 0603 apply an OR constraint, equivalent to packages=["0402", "0603"]; explicit package arguments take precedence.
Explicit spec_filters accept JSON arrays or JSON array strings, with text or numeric values. Attribute/alias names ignore case, => normalizes to >=, and unitless numbers use the attribute's base unit (V, A, ohms, F, H, Hz, W, mm or bytes; tolerance/ppm follow their named scale). Malformed lists/filters and invalid operators return an error with valid_values instead of removing constraints. Unknown library/sort enum values list their valid choices. Explicit unsupported or rare attributes are reported in ignored_filters with attribute_share and suggested real names; the reason distinguishes “not applied” (with the query-builder reason) from “applied, but few or none of these parts list it”, where results may be incomplete or empty. Rare valid constraints are retained. Gate Threshold and Vgs(th) both alias Gate Threshold Voltage (Vgs(th)) / Gate Threshold Voltage.
library_type_counts and no_fee_available describe the same matching population as total, after every spec and library restriction. Post-filter scans check at most 50,000 SQL candidates; if that cap is reached, counts_complete=false labels these counts and availability as applying only to checked matches.
Recovery hints use exposed calls such as jlc_search_help() and jlc_search_help(subcategory="MOSFETs"). Every returned design-rule key (for example power/ldo) can be passed back as get_design_rules(topic="power/ldo") for that exact file.
Board consensus pin choices use distinct-board votes: count is supporting boards and pct divides by consensus.board_count. Each choice adds boards (supporting slugs) and quantities (component occurrences per supporting board). Repeated components on a board do not add votes; the denominator includes all matching boards with an IC neighborhood.
Attribute Aliases
Short names for parametric spec filters:
Component | Attributes |
MOSFETs |
|
Diodes |
|
BJTs |
|
Regulators |
|
ICs |
|
Passives |
|
Crystals, oscillators |
|
RF inductors |
|
ESD/TVS |
|
Supply and output voltages are often ranges ("2.7V~5.5V"): = matches a range that includes the value, >= one that reaches it, <= one that goes down to it.
Use jlc_search_help(subcategory=...) to discover all filterable specs for any subcategory.
Query values accept u/µ/μ and Ω: 2.2µF, 10 kΩ, 4u7 (4.7uF, or 4.7uH in an inductor query), 6V3 (6.3V), and 1F. Resistance prefixes keep their case: 10M/10Meg/10MEG mean megaohms; 10m/10mOhm/10 milliohm mean milliohms. Query package 1005 means imperial 0402. Crystal/oscillator capacitance means Load Capacitance. Named comparisons such as 3.3V LDO quiescent current < 10µA, standby current < 10uA, Iq < 10uA, and schottky diode 1A Vf < 0.3V preserve the quantity and operator. A sign before a bare value keeps its direction: 10uF capacitor < 25V means Voltage Rating < 25V. A current under 1mA in an LDO or DC-DC query is the quiescent current (LDO 3.3V 1uA means Quiescent Current <= 1uA), and a resistance written with an ohm unit on a part type that lists RDS(on) or DCR instead of Resistance, such as MOSFETs, load switches and inductors, is a maximum for it (mosfet 10mohm; without the unit, 1m in an inductor query may be 1mH, so it isn't). On ferrite beads and common mode filters, a value of 1Ω or more is the impedance. Use a numeric limit for idle current; “low Iq” does not apply one. Unparsed numeric units such as 2.2qF stay in the text search, are listed in parsed.detected.unsupported_constraints, and are named as unapplied in relaxed.reason if the default relaxed retry drops them. Relaxation remains the default; pass strict=true to keep query words and parsed requirements, disable both text and library retries, and return an actionable error with no results for unsupported constraints (ignored_filters / parsed.adjusted_filters). Strict replies never contain relaxed. Shorthand rewrites do not alter model tokens or hyphen-connected suffixes such as AMS1117-3V3.
Compound buck-boost/buck boost topology is retained. Regulator input phrases (input up to 24V, Vin 24V, 24V max input, from 24V, up to 24V in) target the supply, separately from output voltage. 3.3V to 5V bidirectional level shifter checks Channel Type and VCCA/VCCB independently; verify bus and signal-standard compatibility in the datasheet. Through-hole mounting selects the through-hole resistor or leaded electrolytic category when the default is SMD-only.
motor driver covers all four motor-driver categories; dc motor driver/h-bridge, stepper driver, and bldc driver/esc select brushed DC, stepper, and BLDC respectively. Hobby-part aliases include USB PD/USB-PD, eFuse, fuel gauge (Monitoring IC), MEMS microphone, and polymer capacitor. supercap/supercapacitor is recognized as unavailable in this JLCPCB catalog and points to Mouser/DigiKey; general unknown-part-type handling is unchanged.
Connector queries filter on pin or contact count and pitch: every result for USB-C 16 pin connector or JST PH 2 pin has that count and pitch. qwiic, STEMMA QT and easyC mean a 1.0mm 4-pin JST SH connector and Grove a 2.0mm 4-pin one, and JST footprint names such as JST_SH4_RA supply the series, pitch and pin count. A series (PH, SH, XH) ranks matching parts first instead of filtering, since many connectors don't list one, and a query that says JST ranks JST's own parts before compatible parts from other makers. Where a connector type rarely lists the count or pitch, the value is left out and parsed.adjusted_filters says so. Female headers take 1x8 or 2x20 as their hole layout. JLCPCB doesn't record the plug size a barrel jack takes (5.5x2.1mm), so it isn't searched and parsed.detected.not_searched says so.
One-time fuses match the exact current rating (500mA matches 0.5A) and a voltage rating at least the one asked for. PTC, polyfuse, polyswitch or resettable anywhere in the query selects resettable fuses, which match Hold Current at or above the value; so does a fuse package that only resettable fuses come in (1812, 1210, 2920), and parsed.adjusted_filters says so.
In a MOSFET query, a voltage next to logic level, GPIO or MCU (up to 5V) or gate/Vgs (up to 20V) is the gate drive, not Vds; logic level mosfet 30V still means Vds >= 30V. Parts that list RDS(on) at or below the gate drive rank first, and the rest stay in the results. PD with controller, sink, source or trigger means a USB PD controller, even next to USB-C: sink and trigger rank receiver controllers first, source ranks supply controllers first, and a sink voltage ranks parts that can negotiate it. Most PD parts don't list their role, so these rank rather than filter.
Words copied from a BOM line: USB C, USBC, Type C and typec mean Type-C connectors; LED wins over diode (red LED 0603 diode searches LEDs); respack and resistor pack mean resistor networks. CAD footprint names (BTN_KMR2, R_0603_1608Metric) aren't part numbers: if they leave a search empty, it is retried without them and relaxed.dropped_text names them (not with strict=true).
Memory sizes are minimum capacities: ESP32-S3 module 16MB flash 8MB PSRAM checks module N/R ordering codes, microcontroller 128KB flash checks Program Storage Size, and SPI flash 16MB still searches NOR flash. ESP32 modules with unknown memory codes cannot satisfy a memory constraint. An N-code without an R-code has known zero PSRAM, so it cannot satisfy a PSRAM minimum or replace a module requiring PSRAM.
Query words basic/basic part, preferred, and no assembly fee/no fee set the library filter; cheapest/lowest price select price sorting (within library tiers when prefer_no_fee=true). These appear in parsed.detected; explicit library_type and sort_by arguments win. Library choices have a schema enum, with case and no-fee normalized before validation. If a query-only library preference finds nothing, the default search retries without it and explains that the library preference was left out in relaxed.reason. An explicit library_type never relaxes. Stock-check and alternatives library arguments accept the same spellings; sort choices ignore case too.
Sensor filters accept 1-wire/one-wire as one_wire, and heart rate/blood oxygen as biometric. Sensor measures, protocols and platforms, and board tags, are validated against the local catalog; unknown values return an error with valid_values. ESP-IDF has no platform-support records in this catalog, so platform="esp-idf" reports the supported choices. Board tag usb-c maps to usb; tag matching ignores case and surrounding whitespace.
Package Expansion
Package filters auto-expand to include variants:
"SOT-23"→ includesSOT-23-3,SOT-23-3L,SOT-23(TO-236)"0603"→ includes1608(metric equivalent)A bare QFN, QFP or SOIC family covers its other catalog spellings, of any body size:
QFN-32also matches VQFN, WQFN, TQFN, UQFN, ST's UFQFPN and NXP's HVQFN,TQFP-44matches LQFP and QFP, andSOIC-8matches SOP-8 and SO-8.parsed.adjusted_filterssays soA full package such as
"QFN-24-EP(4x4)"keeps its body size and exposed pad across those spellings;4x4mmand4.0x4.0spell the same body as4x4, and5.5x3.5the same as3.5x5.5. If no catalog package has that body, the bare family is matched andparsed.adjusted_filterssays so;strict=truedoesn't fall back
find_alternatives
Finds alternatives checked against catalog compatibility rules (summary.found counts only verified alternatives). unverified_alternatives separately lists candidates missing a required match, with verification_status, unverified_requirements and unchecked_requirements; these require manual comparison. Unsupported categories continue to return similar_parts, with summary.found=0 and summary.similar_count.
Matches the primary spec (resistance, capacitance, etc.) and required specs. Missing or unparseable required matches cannot enter
alternatives.Checks connector contacts, mounting orientation and stated wire-to-board reference series; battery IC function; transistor polarity/count; and module chip identity. An empty ESP32 chip attribute can be inferred from its MPN. ESP32 N/R flash and PSRAM capacities must be at least the original's; unknown capacities are unverified.
Checks same-or-better ratings. Dropout, Vf and RDS(on) use test conditions when available. Unchecked secondary specs stay in
specs_unparseableandunchecked_requirementsand lower confidence.Requires regulator input/output ranges to cover the original's full ranges. A scalar supply rating proves only the maximum; minimum input voltage remains unchecked. Regulator pinout and external-circuit requirements always need manual review, so regulator confidence is never high.
Ranks no-fee parts (basic/preferred) first. Within each fee tier, passives and crystals prefer the original package, then the existing stock/footprint/manufacturer/price score. Other packages remain available;
same_package=truefilters them out. Each verified/unverified list has its ownlimit(default 10, max 50).RF parts (splitters, baluns, couplers, LNAs and other amplifiers, attenuators, filters, transceivers) have no compatibility rules, so they return
similar_parts, drawn from every manufacturer in the subcategory and ordered by how much of the original's frequency range each covers:frequency_coverageisfull,partial(withshare) orunknown(no range listed). Parts that don't overlap the original's range are left out;summary.frequency_checkcounts each status. Covering the band doesn't make a part a replacement.
Candidates come from live JLCPCB search and the daily local database. Rule checks establish catalog compatibility, not a guaranteed drop-in replacement; review datasheets and package_warning. An empty library_type="no_fee" result states how many verified extended matches were evaluated (summary.extended_count), rather than claiming no savings are possible. Counts are bounded by the candidate search, not catalog totals.
Use an LCSC C-code for lcsc; for an MPN, first use jlc_get_part(mpn=...). Project savings accept positive board_quantity and placements_per_board (both default 1). comparison.savings separates the one-time assembly_fee difference, unit_price_diff, component_quantity and order_total; the misleading total_per_unit field is removed. Fees include added as well as removed extended part types, assuming the original type is removed entirely and the replacement type is newly added to the order. Prices are qty-1 tier estimates; unknown prices leave unit/order savings null.
Supported: Resistors, capacitors, inductors, ferrite beads, MOSFETs, BJTs, diodes (all types), LEDs, optocouplers, crystals, oscillators, LDOs, DC-DC converters, voltage references, WiFi/BT/LoRa modules, switches, relays, connectors, and more (120+ subcategories).
Example Queries
"Find logic-level MOSFETs with Vgs(th) < 2V and Id >= 5A"
"100nF 25V capacitors in 0402 or 0603"
"Find alternatives for C82899 in basic library"
"STM32 microcontrollers with 10000+ stock"
"Look up TPS63020 stock and pricing on Mouser"
"Get KiCad footprint for ESP32-S3-WROOM-1"
"What sensor should I use to measure CO2 on ESPHome?"
"Recommend an IMU sensor with I2C interface"
"Show me boards that use the MCP73831 charger"
"How is the RP2040 typically used? What decoupling and crystal do real boards use?"
"Get the ESP32-S3 neighborhood on the Adafruit Feather"
"What are the design rules for USB-C?"
"Show me LDO design best practices"API Details
Endpoint:
https://pcbparts.dev/mcpTransport: Streamable HTTP (stateless)
Health:
https://pcbparts.dev/health(status, version, EasyEDA footprint answers seeded and stored, CSE searches and KiCad parts stored, and each distributor's requests today)Usage stats:
https://pcbparts.dev/mcp/stats(anonymous counts per UTC day, with totals for the days shown: calls per UTC hour, calls to each tool split into ok, similar_only (alternatives that returned only similar or unverified candidates to compare by hand), not_found, bad_request, rate_limited and failed, with the average time, which MCP apps connect, the number of distinct callers, and Mouser/DigiKey lookups sent, cached or turned away by the limits; the stats keep no IPs, queries or part numbers; the last 30 days,?days=Nfor fewer)Rate limit: 100 requests/minute per IP
Auth: None required
Self-Hosting
On pcbparts.dev, Mouser and DigiKey lookups share one API key each: 1,000 requests a day and 25 (Mouser) or 100 (DigiKey) a minute for everyone. Self-hosting with your own keys (MOUSER_API_KEY, DIGIKEY_CLIENT_ID/DIGIKEY_CLIENT_SECRET, free from Mouser's API hub and DigiKey's developer portal) gets you your own limits.
git clone https://github.com/Averyy/pcbparts-mcp
cd pcbparts-mcp
uv venv && uv pip install -e .
.venv/bin/python -m pcbparts_mcp.server # http://localhost:8080/mcpThe server builds data/components.db only when it's missing. If yours is from before 0.6.0,
rebuild it (.venv/bin/python scripts/build_database.py) to get the EasyEDA footprint seed;
without it, footprint checks still work but each one asks EasyEDA.
The server logs a warning naming what's missing or slow if the database predates this
version; rebuilding with the same command fixes missing quiescent-current filter matches
and slow MPN lookups, connector filters and MOSFET gate-drive ranking.
Or with Docker:
docker compose up -d # production (GHCR image)
docker compose -f docker-compose.local.yml up --build # local dev (builds from source)docker-compose.yml publishes the server on 127.0.0.1:8080 only, for a reverse proxy on the same
host (pcbparts.dev runs Caddy in front of it). To reach it from other machines, change the port
mapping to "8080:8080".
Building the image needs BuildKit, the default builder since Docker 23 and the one Compose v2 uses.
Environment Variables
Variable | Default | Description |
|
| Server port |
|
| Requests per minute per IP |
|
| Comma-separated Host headers accepted by the server (DNS-rebinding protection; localhost is always allowed) |
|
| Daily API request quota per distributor (Mouser/DigiKey) |
|
| JSON file that keeps each distributor's request count for the day, and any pause Mouser or DigiKey asked for, across restarts. Unset means memory only, so every restart starts the count from 0 |
|
| JSON file that keeps the |
| — | Mouser API key (optional, enables Mouser tools) |
| — | DigiKey OAuth2 client ID (optional, enables DigiKey tools) |
| — | DigiKey OAuth2 client secret |
|
| SQLite file that keeps EasyEDA footprint answers across restarts. The compose files mount a named volume at |
|
| SQLite file that keeps CSE searches and KiCad files across restarts (an uncached CSE search takes 11-15 s). A search where every part has a model, and KiCad files, are kept a year; a search with a part that has no model yet, or no parts, a week. Unset means memory only |
LLM-Readable Documentation
An llms.txt file is available for LLMs and AI agents to quickly understand this service. See llmstxt.org for the spec.
Changelog
See CHANGELOG.md. Minor releases in 0.x can change replies; each lists what to check under Breaking.
Contributing
Issues and PRs welcome — see CONTRIBUTING.md for development setup, testing, and project conventions.
License
MIT
Links
Available Tools
11 toolscse_get_kicadGet KiCad Symbol & FootprintARead-onlyIdempotent
Get KiCad schematic symbol and PCB footprint for any component.
Downloads from SamacSys ComponentSearchEngine. Works for any manufacturer's part, not limited to JLCPCB. Returns the raw .kicad_sym and .kicad_mod file contents as text that can be read directly or saved to a KiCad project.
WARNING: This tool is slow (up to 45s response time). Only use when you specifically need KiCad symbol/footprint files. For checking if an EasyEDA footprint exists, use jlc_get_part instead.
Args: query: MPN to search for (e.g., "LM358P", "STM32F103CBT6", "ESP32-WROOM-32E"). Finds the best matching part with an available model. part_id: CSE part ID from a previous cse_search result (skips search step). Use this if you already know the exact part.
One of query or part_id must be provided.
Returns: kicad_symbol: Raw .kicad_sym file content (pin names, types, graphical symbol) kicad_footprint: Raw .kicad_mod file content (pad layout, silkscreen, courtyard) part_id: CSE part ID (for future lookups) mfr_part_number, manufacturer, description: Part metadata (when searched by query)
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| part_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations: it discloses the slow response time (up to 45s), specifies the source (SamacSys ComponentSearchEngine), and explains the return format (raw file contents as text). Annotations cover read-only, open-world, and idempotent hints, but the description complements these with practical constraints and data source details without contradiction.
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, starting with the core purpose, followed by key details (source, scope, output format), warnings, usage guidelines, and parameter explanations. Every sentence adds value, with no redundant information, making it efficient and easy to parse.
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 API integration, slow operation, multiple parameters) and the presence of an output schema, the description is complete. It covers purpose, usage context, behavioral traits, parameter semantics, and output details, providing all necessary context for an agent to invoke the tool correctly without needing to rely solely on structured fields.
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?
With 0% schema description coverage, the description fully compensates by explaining both parameters in detail: 'query' is defined as an MPN to search for with examples, and 'part_id' is described as a CSE part ID from previous results that skips search. It also clarifies the relationship ('One of query or part_id must be provided'), adding crucial semantics not in 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 clearly states the tool's purpose with specific verbs ('Get', 'Downloads') and resources ('KiCad schematic symbol and PCB footprint', 'raw .kicad_sym and .kicad_mod file contents'). It distinguishes itself from siblings by specifying it works for any manufacturer's part via SamacSys ComponentSearchEngine, unlike JLCPCB-focused tools like jlc_get_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?
The description provides explicit guidance on when to use this tool ('when you specifically need KiCad symbol/footprint files') and when not to ('For checking if an EasyEDA footprint exists, use jlc_get_part instead'). It also mentions performance considerations ('slow, up to 45s response time') and prerequisites ('One of query or part_id must be provided'), offering clear alternatives and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cse_searchCSE Search (ECAD Models)ARead-onlyIdempotent
Search SamacSys ComponentSearchEngine for ECAD model availability and datasheets.
Use this to check if KiCad/Eagle/Altium symbols, footprints, and 3D models exist for a part. No API key required.
WARNING: This tool is slow (up to 45s response time). Only use when you specifically need ECAD model availability or datasheets from ComponentSearchEngine. For general part search, use jlc_search instead. For EasyEDA footprint availability, use jlc_get_part.
Args: query: MPN or keyword (e.g., "LM358P", "STM32F103", "ESP32") limit: Max results to return (1-10, default 5)
Returns: results: List of parts with mfr_part_number, manufacturer, description, datasheet_url, has_model (symbol/footprint available), has_3d (3D model available), model_quality (0-4), cse_part_id, pin_count, image_url total: Total matching results
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: it discloses the slow response time ('up to 45s response time'), clarifies that no API key is required, and specifies the return format (list of parts with detailed fields). Annotations cover read-only, open-world, and idempotent hints, but the description enriches this with practical constraints and output details, providing full transparency.
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 front-loaded with purpose and key guidelines, followed by parameter and return details. Every sentence adds value—no redundancy or fluff. It efficiently conveys essential information in a well-structured manner, making it easy to parse and apply.
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 (search with performance constraints) and the presence of annotations and an output schema, the description is complete. It covers purpose, usage, behavioral traits, parameters, and returns, ensuring the agent has all necessary context without needing to rely solely on structured fields.
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?
With 0% schema description coverage, the description compensates by explaining both parameters: 'query' is defined as 'MPN or keyword' with examples, and 'limit' specifies the range and default. It adds meaningful semantics beyond the bare schema, though it could detail format constraints (e.g., query syntax) more fully to reach a perfect score.
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 specific action ('Search SamacSys ComponentSearchEngine') and resource ('ECAD model availability and datasheets'), distinguishing it from siblings by specifying its focus on ECAD models rather than general part search or other functions. It explicitly mentions the target formats (KiCad/Eagle/Altium symbols, footprints, and 3D models), making the purpose highly specific and 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 provides explicit guidance on when to use this tool ('when you specifically need ECAD model availability or datasheets from ComponentSearchEngine') and when not to use it ('For general part search, use jlc_search instead. For EasyEDA footprint availability, use jlc_get_part'). It names specific alternative tools, offering clear context and exclusions for proper tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
digikey_get_partDigiKey Part LookupARead-onlyIdempotent
Cross-reference a specific MPN on DigiKey. Use jlc_search first for general component searches. Daily quota applies.
Args: product_number: DigiKey part number or manufacturer PN (e.g., "296-1395-5-ND" or "LM358P")
Returns: Full product details including all parameters, pricing variations, availability, datasheet
| Name | Required | Description | Default |
|---|---|---|---|
| product_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, non-destructive, idempotent, and open-world behavior. The description adds valuable context beyond annotations by disclosing a 'Daily quota applies' constraint, which is critical for usage planning. No contradictions with annotations are present.
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 highly concise and well-structured: a purpose statement, usage guideline, quota warning, parameter explanation with examples, and return value summary—all in minimal sentences. Every part adds value without 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?
Given the tool's complexity (single parameter, annotations, output schema), the description is complete. It covers purpose, usage guidelines, behavioral constraints (quota), parameter semantics, and return values, with the output schema handling detailed response structure.
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?
With 0% schema description coverage, the description fully compensates by explaining the parameter's purpose ('DigiKey part number or manufacturer PN') and providing concrete examples (e.g., '296-1395-5-ND' or 'LM358P'). This adds essential meaning not present in 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 clearly states the tool's purpose with specific verbs ('Cross-reference', 'Lookup') and identifies the resource ('specific MPN on DigiKey'). It distinguishes from siblings by mentioning 'jlc_search' as an alternative for general searches, making the scope explicit.
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 explicit guidance on when to use this tool ('Cross-reference a specific MPN on DigiKey') versus alternatives ('Use jlc_search first for general component searches'), including a named sibling tool. This helps the agent choose appropriately based on the query type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jlc_find_alternativesFind Alternative PartsARead-onlyIdempotent
Find alternative parts similar to a given component.
Searches the same subcategory for parts with better availability. Useful when a part has low stock or you want to compare options.
Args: lcsc: LCSC part code to find alternatives for (e.g., "C2557") min_stock: Minimum stock for alternatives (default: 10) same_package: If True, only return parts with the same package size library_type: Filter alternatives by library type: - "basic": Only basic parts (no assembly fee) - "preferred": Only preferred parts (no assembly fee) - "no_fee": Basic or preferred (no assembly fee) - best for cost optimization - "extended": Only extended parts ($3 assembly fee each) - "all" or None (default): All library types Use "no_fee" to find cheaper alternatives for an extended part. has_easyeda_footprint: Filter by EasyEDA footprint availability: - True: Only return parts WITH EasyEDA footprints (for Atopile/KiCad users) - False: Only return parts WITHOUT footprints - None (default): Don't filter by footprint (fastest) Note: Filtering by footprint is slower as it checks each alternative. limit: Maximum alternatives to return (default: 10, max: 50)
Returns: Original part info (with library_type and has_easyeda_footprint) and list of alternatives sorted by stock. Alternatives include library_type and specs for easy comparison. When filtering by footprint, alternatives also include EasyEDA UUIDs.
| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | Yes | ||
| min_stock | No | ||
| same_package | No | ||
| library_type | No | ||
| has_easyeda_footprint | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond what annotations provide. While annotations already indicate this is a read-only, non-destructive, idempotent operation, the description adds practical details about performance implications ('filtering by footprint is slower'), sorting behavior ('sorted by stock'), and response structure. It doesn't contradict annotations, which already cover the safety profile adequately.
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 efficiently organized. It starts with a clear purpose statement, provides usage context, then documents parameters in a structured format with bullet points for enum values, and concludes with return value information. Every sentence adds value without 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?
Given the tool's complexity (6 parameters, 0% schema coverage) and the presence of an output schema, the description provides excellent contextual completeness. It fully documents all parameters, explains behavioral aspects, provides usage guidance, and describes the return structure. The output schema handles the formal return specification, allowing the description to focus on semantic understanding.
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?
With 0% schema description coverage, the description fully compensates by providing comprehensive parameter documentation. It explains each parameter's purpose, provides examples (e.g., 'C2557'), documents defaults, enumerates valid values for library_type and has_easyeda_footprint with clear explanations, and offers practical guidance on parameter usage. This goes well beyond what the bare schema provides.
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 with specific verbs ('find alternative parts similar to a given component') and resources ('searches the same subcategory for parts with better availability'). It distinguishes itself from siblings like 'jlc_get_part' or 'jlc_search' by focusing specifically on finding alternatives rather than retrieving or searching for parts generally.
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 explicit guidance on when to use this tool ('useful when a part has low stock or you want to compare options'). It also offers specific usage advice within parameter descriptions, such as recommending 'no_fee' library type 'to find cheaper alternatives for an extended part' and noting that 'filtering by footprint is slower as it checks each alternative.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jlc_get_partGet Part DetailsARead-onlyIdempotent
Get full details for a specific JLCPCB part.
Args: lcsc: LCSC part code (e.g., "C82899") mpn: Manufacturer part number (e.g., "LM358P", "STM32F103C8T6"). Searches local DB by exact MPN match, then normalized variants, then full-text search. Useful for finding the JLCPCB equivalent of a part from another distributor or reference design.
One of lcsc or mpn must be provided. If both are provided, lcsc takes precedence.
Returns: For lcsc: Full part details including description, all pricing tiers, datasheet URL, component attributes, and EasyEDA footprint availability: - has_easyeda_footprint: True if EasyEDA has footprint/symbol, False if not, null if unknown - easyeda_symbol_uuid: UUID for direct EasyEDA editor link (null if no footprint) - easyeda_footprint_uuid: UUID for footprint (null if no footprint)
For mpn: List of matching JLCPCB parts from the local database (stock >= 10),
sorted by stock. Each result includes lcsc, model (MPN), manufacturer,
package, stock, price, library_type, category, subcategory, and specs.
Note: has_easyeda_footprint=True means `ato create part` will work for Atopile/KiCad users.| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | No | ||
| mpn | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false, covering safety and idempotency. The description adds valuable behavioral context beyond annotations: it explains the search logic for mpn ('exact match, then normalized variants, then full-text search'), specifies a stock threshold ('stock >= 10'), and mentions sorting order ('sorted by stock'), which are not captured in annotations.
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 with clear sections (Args, Returns, Note), uses bullet points for readability, and every sentence adds value—no fluff. It efficiently covers parameter rules, return formats, and a practical note, making it easy to scan and understand.
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 (two parameters with conditional logic, different return formats based on input) and the presence of an output schema, the description is complete. It explains parameter requirements, search behavior, return details (including specific fields like has_easyeda_footprint), and even includes a practical note for Atopile/KiCad users, leaving no gaps for agent understanding.
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?
With 0% schema description coverage, the description fully compensates by detailing both parameters: lcsc is defined as 'LCSC part code' with an example, and mpn is defined as 'Manufacturer part number' with examples and a thorough explanation of its search behavior. This adds significant meaning beyond the bare 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 clearly states the verb 'Get' and resource 'full details for a specific JLCPCB part', making the purpose explicit. It distinguishes from siblings like 'jlc_search' (which likely returns multiple results) and 'jlc_stock_check' (which focuses on stock), establishing a specific lookup function.
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 explicit usage rules: 'One of lcsc or mpn must be provided. If both are provided, lcsc takes precedence.' It also explains when to use mpn ('Useful for finding the JLCPCB equivalent of a part from another distributor or reference design'), guiding users on parameter selection based on their needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jlc_get_pinoutGet Component PinoutARead-onlyIdempotent
Get pin information for a component from EasyEDA symbol data.
Returns raw pin data exactly as EasyEDA provides it, with no interpretation or guessing. Pin names are descriptive (VCC, GND, PA0, etc.) and can be read directly by LLMs and users.
Args: lcsc: LCSC part code (e.g., "C8304"). If provided, fetches UUID automatically. uuid: EasyEDA symbol UUID directly (alternative to lcsc)
One of lcsc or uuid must be provided.
Returns: Pin mapping with: - lcsc: LCSC code (if provided) - model: Part model/name - manufacturer: Manufacturer name - package: Package type - pin_count: Total number of pins - pins: List of pins, each with: - number: Physical pin number (e.g., "1", "2") - name: Pin name exactly as in EasyEDA symbol - electrical: (rare) EasyEDA electrical type if set by symbol creator - easyeda_symbol_uuid: UUID to view symbol at easyeda.com/component/{uuid} - unverified: (only if true) "Symbol not verified by LCSC"
The electrical field is only included when the symbol creator explicitly set it in EasyEDA. Values: "input", "output", "bidirectional", "power". Most symbols don't set this field.
Example output for STM32F103CBT6: {"pin_count": 48, "pins": [ {"number": "1", "name": "VBAT"}, {"number": "2", "name": "PC13-TAMPER-RTC"}, {"number": "10", "name": "PA0_WKUPUSART2_CTSADC12_IN0TIM2_CH1_ETR"}, ... ]}
Example output for MOSFET AO3400: {"pin_count": 3, "pins": [ {"number": "1", "name": "G"}, {"number": "2", "name": "S"}, {"number": "3", "name": "D"} ]}
Example output for RP2040 (has electrical types): {"pin_count": 57, "pins": [ {"number": "1", "name": "1", "electrical": "bidirectional"}, {"number": "2", "name": "2", "electrical": "bidirectional"}, ... ]}
| Name | Required | Description | Default |
|---|---|---|---|
| lcsc | No | ||
| uuid | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations. While annotations indicate read-only, non-destructive, and idempotent operations, the description clarifies that data is returned 'exactly as EasyEDA provides it, with no interpretation or guessing,' explains the optional 'electrical' field's rarity and possible values, and mentions the 'unverified' flag. This provides important implementation details not covered by annotations.
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 appropriately sized. It begins with the core purpose, then explains the return format, details parameters, and provides multiple illustrative examples. Every sentence adds value - there's no redundant information, and the structure helps users quickly understand what the tool does and how to use it.
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 (fetching and returning structured pin data), the description is complete. It explains the purpose, parameters, return format with detailed field descriptions, includes important behavioral notes about data interpretation and optional fields, and provides multiple concrete examples. The presence of an output schema reduces the need to explain return values, but the description still provides valuable context about what to expect.
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?
With 0% schema description coverage, the description fully compensates by explaining both parameters: 'lcsc: LCSC part code (e.g., "C8304"). If provided, fetches UUID automatically.' and 'uuid: EasyEDA symbol UUID directly (alternative to lcsc).' It also clarifies the relationship between them: 'One of lcsc or uuid must be provided.' This provides complete parameter semantics beyond the bare 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 clearly states the tool's purpose: 'Get pin information for a component from EasyEDA symbol data.' It specifies the exact resource (component pinout) and source (EasyEDA symbol data), and distinguishes itself from siblings like 'jlc_get_part' by focusing specifically on pin information rather than general part data.
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 explicit usage guidance: 'One of lcsc or uuid must be provided.' It also distinguishes this tool from alternatives by specifying it returns 'raw pin data exactly as EasyEDA provides it, with no interpretation or guessing,' which helps users understand when to use this versus other data-fetching tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jlc_searchSearch ComponentsARead-onlyIdempotent
Fast DB search with natural language parsing and parametric filters. In-stock parts only (stock >= 10).
Args: query: Search query - supports natural language like: - "10k resistor 0603 1%" (auto-detects type, value, package, tolerance) - "100nF 25V capacitor" (auto-applies voltage >= 25V filter) - "n-channel mosfet SOT-23" (auto-filters to MOSFETs subcategory) Or use with explicit filters for text search within results.
subcategory_id: Subcategory ID (e.g., 2954 for MOSFETs)
subcategory_name: Subcategory name (e.g., "MOSFETs", "Schottky Diodes")
spec_filters: Parametric filters for precise searches. Each filter is a dict:
- name: Attribute name (Vgs(th), Capacitance, Voltage, etc.)
- op: Operator: "=", ">=", "<=", ">", "<"
- value: Value with units (e.g., "2.5V", "10uF", "20mΩ")
Example: [{"name": "Vgs(th)", "op": "<", "value": "2.5V"}]
min_stock: Minimum stock (default 10). Database only indexes stock >= 10.
library_type: "basic", "preferred", "no_fee", "extended", or None (all)
prefer_no_fee: Sort basic/preferred first (default True)
package: Single package filter (e.g., "0603", "SOT-23")
packages: Multiple packages (OR logic): ["0402", "0603", "0805"]
manufacturer: Manufacturer filter
match_all_terms: AND logic for query terms (default True)
sort_by: "stock" (highest) or "price" (cheapest)
limit: Max results (default 50, max 100)Attribute aliases: MOSFETs: Vgs(th), Vds, Id, Rds(on) Diodes: Vr, If, Vf Passives: Capacitance, Resistance, Inductance, Voltage, Tolerance
Returns: results: Matching components with specs total: Total count (before limit) filters_applied: Applied filters (useful for debugging) parsed: (when using natural language) What was extracted from query
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| subcategory_id | No | ||
| subcategory_name | No | ||
| spec_filters | No | ||
| min_stock | No | ||
| library_type | No | ||
| prefer_no_fee | No | ||
| package | No | ||
| packages | No | ||
| manufacturer | No | ||
| match_all_terms | No | ||
| sort_by | No | stock | |
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations: it specifies that the search is limited to 'In-stock parts only (stock >= 10)' and 'Database only indexes stock >= 10', which are not covered by annotations like readOnlyHint. It also details natural language parsing capabilities and result sorting options. However, it does not mention rate limits or authentication needs, which could be relevant for a search tool.
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 with sections like 'Args:', 'Attribute aliases:', and 'Returns:', making it easy to navigate. It is appropriately sized for a tool with 13 parameters, but some parts (e.g., the detailed 'query' examples) could be slightly condensed without losing clarity. Overall, it is efficient but not maximally concise.
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 complexity (13 parameters, 0% schema coverage) and the presence of an output schema (implied by 'Returns:' section), the description is complete. It thoroughly explains all parameters, provides usage examples, details return values, and adds behavioral context like stock limitations. No gaps are evident for a search tool of this nature.
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?
With 0% schema description coverage, the description fully compensates by providing detailed explanations for all 13 parameters. It includes examples for 'query', clarifies defaults (e.g., 'min_stock: Minimum stock (default 10)'), lists enum values for 'library_type' and 'sort_by', and explains complex structures like 'spec_filters' with attribute aliases. This adds significant meaning beyond the bare 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 clearly states the tool's purpose as 'Fast DB search with natural language parsing and parametric filters' and specifies 'In-stock parts only (stock >= 10)', which distinguishes it from other search tools. It provides specific details about what it searches (components) and how (natural language parsing, parametric filters), making it distinct from siblings like 'jlc_stock_check' or 'jlc_get_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?
The description provides clear context for when to use this tool: for searching components with natural language queries or parametric filters, and it specifies 'In-stock parts only (stock >= 10)'. However, it does not explicitly mention when not to use it or name alternatives among sibling tools (e.g., 'jlc_search_help' or 'jlc_find_alternatives'), which prevents a score of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jlc_search_helpSearch Help & BrowseARead-onlyIdempotent
Browse categories, subcategories, and filterable attributes to help build searches.
Call with no args to list all categories. Pass a category to see its subcategories. Pass a subcategory to discover filterable attributes for use with jlc_search spec_filters.
Args: category: Category name (e.g., "Connectors") or ID (e.g., 13). Lists subcategories. subcategory: Subcategory name (e.g., "MOSFETs") or ID (e.g., 2954). Lists filterable attributes.
If both provided, subcategory takes precedence (more specific).
Returns: No args: List of all categories with id, name, part count, subcategory count category: Subcategories with id, name, part count subcategory: Filterable attributes with name, alias, type, example values
Example: 1. search_help() → see all categories sorted by part count 2. search_help(category="Transistors") → see MOSFETs, BJTs, etc. 3. search_help(subcategory="MOSFETs") → see Vgs(th), Vds, Id, Rds(on) filters 4. jlc_search(query="n-channel", spec_filters=[{"name": "Vgs(th)", "op": "<", "value": "2.5V"}])
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | ||
| subcategory | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering safety and idempotency. The description adds valuable behavioral context: the precedence rule ('If both provided, subcategory takes precedence'), the sorting behavior ('sorted by part count'), and the relationship to jlc_search. No contradictions with annotations.
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 with the core purpose. Each sentence adds value: purpose statement, usage rules, parameter details, return values, and examples. No redundant information, and the example section efficiently demonstrates three key usage patterns.
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 (hierarchical browsing with multiple modes), the description is complete. It covers all parameter combinations, return formats for each case, and ties into the broader workflow with jlc_search. With annotations covering safety and an output schema presumably detailing return structures, no 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?
With 0% schema description coverage, the description fully compensates by explaining both parameters in detail: 'category: Category name (e.g., "Connectors") or ID (e.g., 13). Lists subcategories.' and 'subcategory: Subcategory name (e.g., "MOSFETs") or ID (e.g., 2954). Lists filterable attributes.' It also clarifies precedence and provides concrete examples.
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: 'Browse categories, subcategories, and filterable attributes to help build searches.' It specifies the verb ('browse') and resources ('categories, subcategories, filterable attributes'), and distinguishes it from sibling tools like jlc_search by explaining it's for discovery rather than actual searching.
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 explicit guidance on when to use this tool: 'Call with no args to list all categories. Pass a category to see its subcategories. Pass a subcategory to discover filterable attributes for use with jlc_search spec_filters.' It also references the sibling tool jlc_search for actual searching, creating clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jlc_stock_checkStock Check (Live API)ARead-onlyIdempotent
Real-time stock verification via live JLCPCB API. Use jlc_search first for most queries — it's faster and supports parametric filters.
Only use this when you need:
Real-time stock verification before placing an order
Parts with stock < 10 or out-of-stock parts
Pagination through large result sets
Args: query: Search keywords (e.g., "ESP32", "10uF 25V", "STM32F103") category_id: Category ID from search_help subcategory_id: Subcategory ID from search_help category_name: Category name (e.g., "Resistors", "Capacitors") subcategory_name: Subcategory name (e.g., "Tactile Switches") min_stock: Min stock (default 10). Set 0 for out-of-stock parts library_type: "basic", "preferred", "no_fee", "extended", or "all" package: Package filter (e.g., "0402", "LQFP48") manufacturer: Manufacturer filter packages: Multiple packages (OR filter) manufacturers: Multiple manufacturers (OR filter) sort_by: "quantity" or "price" page: Page number (default 1) limit: Results per page (default 20, max 100)
Returns: Results with pagination. Use get_part(lcsc) for full details.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| category_id | No | ||
| subcategory_id | No | ||
| category_name | No | ||
| subcategory_name | No | ||
| min_stock | No | ||
| library_type | No | ||
| package | No | ||
| manufacturer | No | ||
| packages | No | ||
| manufacturers | No | ||
| sort_by | No | ||
| page | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, and idempotentHint=true, covering safety and idempotency. The description adds valuable context: it's a 'live API' for 'real-time' verification, mentions pagination behavior ('Pagination through large result sets'), and notes it's specifically for low-stock scenarios ('Parts with stock < 10 or out-of-stock parts'). It doesn't contradict annotations and provides operational context beyond them.
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 efficiently structured: purpose and guidelines upfront, followed by categorized parameter explanations and return note. Every sentence adds value—no redundancy. It's appropriately sized for a complex tool with many parameters, using bullet points and clear sections without unnecessary elaboration.
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 (14 parameters, 0% schema coverage), the description provides comprehensive guidance: clear purpose, explicit usage scenarios, detailed parameter semantics, and notes on output ('Results with pagination. Use get_part(lcsc) for full details.'). With annotations covering safety and an output schema presumably detailing returns, the description fills all necessary gaps without over-explaining structured data.
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?
With 0% schema description coverage and 14 parameters, the description carries full burden. It provides detailed semantic explanations for all parameters: examples (e.g., 'ESP32' for query), clarifications (e.g., 'default 10. Set 0 for out-of-stock parts' for min_stock), enumerations (e.g., library_type options), and usage notes (e.g., 'Category ID from search_help'). This fully compensates for the schema's lack of descriptions.
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 performs 'Real-time stock verification via live JLCPCB API' with specific verb ('verification') and resource ('stock'), distinguishing it from siblings like 'jlc_search' (faster with parametric filters) and 'jlc_get_part' (full details). It explicitly differentiates from 'jlc_search' by noting this tool is for real-time verification before orders.
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 explicit when-to-use guidance: 'Use jlc_search first for most queries — it's faster and supports parametric filters. Only use this when you need: - Real-time stock verification before placing an order - Parts with stock < 10 or out-of-stock parts - Pagination through large result sets.' It names the alternative tool ('jlc_search') and specifies three concrete scenarios for this tool's use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mouser_get_partMouser Part LookupARead-onlyIdempotent
Cross-reference a specific MPN on Mouser. Use jlc_search first for general component searches. Daily quota applies.
Args: part_number: Mouser part number or manufacturer PN (e.g., "595-LM358P" or "LM358P"). For batch lookup, pipe-delimit up to 10 numbers: "595-LM358P|511-LM358P"
Returns: results: Full part details including all attributes, pricing tiers, availability, datasheet total: Number of parts found
| Name | Required | Description | Default |
|---|---|---|---|
| part_number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, and idempotentHint=true, covering safety and idempotency. The description adds valuable behavioral context beyond annotations: the daily quota constraint (rate limiting) and batch lookup capability (pipe-delimited up to 10 numbers), which are not captured in annotations.
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 perfectly structured and front-loaded: the first sentence states purpose and usage guidance, the second adds behavioral constraints, then parameter and return sections provide essential details. Every sentence earns its place with zero 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?
Given the tool's complexity (cross-referencing with batch capability), the description provides complete context: purpose, usage guidelines, behavioral constraints (quota), parameter semantics, and return value explanation. With an output schema present, the description appropriately focuses on what the tool does rather than return format details.
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?
With 0% schema description coverage, the description fully compensates by explaining the part_number parameter's semantics: it accepts 'Mouser part number or manufacturer PN' with examples ('595-LM358P' or 'LM358P') and describes batch lookup syntax ('pipe-delimit up to 10 numbers'). This adds crucial meaning beyond the bare 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 clearly states the specific action ('Cross-reference a specific MPN on Mouser') and resource ('MPN'), distinguishing it from siblings like 'jlc_search' for general searches and 'digikey_get_part' for other distributors. It precisely defines the tool's scope as a targeted part lookup rather than general component searching.
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 explicit guidance on when to use this tool ('Cross-reference a specific MPN') versus alternatives ('Use jlc_search first for general component searches'), naming a specific sibling tool. It also includes a daily quota constraint that informs usage frequency decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sensor_recommendSensor RecommendARead-onlyIdempotent
Recommend sensor ICs and modules for a measurement need. Returns popular, well-supported options with platform compatibility info.
NOT for buying parts — use jlc_search to find JLCPCB stock and pricing. This answers: "What sensor should I use to measure X on my platform?"
Args: query: Search by name, description, or manufacturer (e.g., "BME280", "waterproof temperature") measure: What to measure. Single or AND multiple: "temperature", ["temperature", "pressure"]. Types: temperature, humidity, pressure, distance, co2, gas, particulate, light, color, uv, acceleration, gyroscope, magnetic_field, current, voltage, motion, rotation, proximity, gesture, radar, sound, flow, touch, weight, ph, dissolved_oxygen, conductivity, orp, ir_temperature, biometric, radiation, gps, co, soil_moisture. Aliases: "imu" → acceleration OR gyroscope OR magnetic_field. "barometric" → pressure. Sub-measures (search directly): voc, pir, ultrasonic, lidar, tof, radar. type: Sensing technology: "tof", "ultrasonic", "radar", "ndir", "electrochemical", "mems", etc. protocol: Interface: "i2c", "spi", "uart", "one_wire", "analog", "digital", "pwm" platform: Filter by support: "arduino", "esphome", "micropython", "circuitpython", "tasmota", "zephyr" limit: Max results (default 15)
Returns: Sensors sorted by platform support (how many platforms have drivers for this sensor). Each result includes: name, manufacturer, measures, type, protocol, voltage, platforms, platform_count, description, urls, datasheet_url (when available).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| measure | No | ||
| type | No | ||
| protocol | No | ||
| platform | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering safety and idempotency. The description adds valuable context about what the tool returns (popular, well-supported options with platform compatibility info) and how results are sorted (by platform support count), which goes beyond what annotations provide.
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 with clear sections (purpose, exclusion, question answered, parameters, returns) and every sentence adds value. It's appropriately sized for a 6-parameter tool with complex options, though slightly lengthy due to the extensive measure type list.
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 (6 parameters, 0% schema coverage) and the presence of an output schema, the description is complete. It explains all parameters thoroughly, clarifies the tool's purpose and exclusions, and describes the return format and sorting logic, making the output schema sufficient for detailed response structure.
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?
With 0% schema description coverage, the description carries the full burden of explaining parameters. It provides comprehensive details for all 6 parameters: query usage examples, measure types with extensive list and aliases, type examples, protocol options, platform filters, and limit default. This fully compensates for the schema's lack of descriptions.
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 specific verb ('Recommend') and resource ('sensor ICs and modules'), explicitly distinguishing it from sibling tools like jlc_search for buying parts. It answers a specific question pattern: 'What sensor should I use to measure X on my platform?'
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 explicit guidance on when to use this tool (for sensor recommendations based on measurement needs) and when not to use it ('NOT for buying parts — use jlc_search'). It names a specific alternative tool and defines the exact question this tool answers.
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.
11 tool updates
v0.4.2- First observed
cse_get_kicad - First observed
cse_search - First observed
digikey_get_part - First observed
jlc_find_alternatives - First observed
jlc_get_part - First observed
jlc_get_pinout - First observed
jlc_search - First observed
jlc_search_help - First observed
jlc_stock_check - First observed
mouser_get_part - First observed
sensor_recommend
TDQS
Scored across 11 tools
Most tools have distinct purposes, such as cse_get_kicad for KiCad files, jlc_search for parametric searches, and sensor_recommend for sensor recommendations. However, there is some overlap between jlc_search and jlc_stock_check, as both can search for parts, though jlc_stock_check is specifically for real-time stock verification. The descriptions help clarify these distinctions, but an agent might occasionally confuse them.
The naming follows a consistent pattern with prefixes like cse_, jlc_, digikey_, mouser_, and sensor_ to group tools by source, and uses verb_noun or noun_verb formats (e.g., cse_get_kicad, jlc_search_help). There are minor deviations, such as jlc_find_alternatives (verb_noun) vs. jlc_stock_check (noun_noun), but overall, the naming is predictable and readable.
With 11 tools, the count is well-scoped for a PCB parts server covering multiple distributors (JLCPCB, DigiKey, Mouser, SamacSys) and specialized functions like sensor recommendations. Each tool serves a clear purpose, such as searching, getting details, finding alternatives, or checking stock, without redundancy or bloat, making it efficient for agents to handle PCB design tasks.
The tool set provides comprehensive coverage for PCB part sourcing and design, including search (jlc_search, cse_search), detailed part retrieval (jlc_get_part, digikey_get_part), cross-referencing (jlc_find_alternatives), stock verification (jlc_stock_check), ECAD model access (cse_get_kicad), pinout data (jlc_get_pinout), and sensor recommendations (sensor_recommend). There are no obvious gaps; agents can perform end-to-end workflows from part discovery to integration in designs.
Maintenance
Related MCP Connectors
Find electronic parts with live Mouser, DigiKey and JLCPCB stock and prices, check BOMs, order.
Search real parts with datasheet-provenance specs, check compatibility and compose priced BOMs.
Turn datasheets into source-backed JSON contracts, pinout matrices, and KiCad CAD for AI agents.
Verified KiCad footprints, symbols & 3D models for AI agents. No signup, CC-BY-4.0, quality-gated.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables natural language search and exploration of KiCad component symbol libraries with fast full-text search across 20,000+ components including metadata like datasheets, footprints, and descriptions.MIT
- AlicenseAqualityAmaintenanceProvides AI agents with instant, structured access to electronic component datasheets, pinouts, and electrical specifications without requiring PDF uploads. It enables seamless part searching, design validation, and side-by-side component comparisons across major hardware providers.14120 npm12MIT
- FlicenseAqualityBmaintenanceEnables AI assistants to search JLCPCB's 450K+ electronic component catalog with real-time stock levels and pricing, supporting keyword search, filtering, and detailed component information.467 PyPI8-
- AlicenseAqualityBmaintenanceSearches electronic components across DigiKey and Mouser, enabling keyword search, part details, and merged offers with price comparison.41MIT