PCB Parts MCP Server
Summary: Research and source PCB components, ECAD models, reference designs, sensors, and design rules via MCP tools.
Search JLCPCB's 630K+ in-stock parts with plain-language queries, spec/package filters, sorting, and category/subcategory browsing.
Check live JLCPCB stock and pricing, including low/out-of-stock parts and larger catalog coverage.
Look up JLCPCB/LCSC parts by LCSC code or manufacturer part number with price tiers, specs, datasheet links, and EasyEDA footprint availability.
Get EasyEDA symbol pinouts and, optionally, footprint pad geometry.
Find compatibility-checked alternatives, ranked by no-fee library status and package, with unverified candidates separated.
Query Mouser and DigiKey for live price, stock, datasheet, lifecycle, and packaging data within shared daily limits.
Search SamacSys ECAD models and download KiCad symbols/footprints.
Search ~300 reference boards and inspect BOMs, dimensions, design rules, and pin-by-pin IC usage/consensus.
Recommend sensors by measurement, protocol, and platform support.
Retrieve curated PCB design rules/checklists by topic.
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 Server find 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 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 · Endpoint: https://pcbparts.dev/mcp
Features
Parametric search: ask in plain words ("10k 0603 1%", "logic-level MOSFET Vgs(th) < 2V") and the query becomes spec, package and part-type filters
Three distributors: search JLCPCB's catalog, and check live price and stock on JLCPCB, Mouser and DigiKey
Alternatives: replacements checked against compatibility rules for 120+ part types, with no-assembly-fee parts first
Part details: lookup by LCSC code or manufacturer part number, with price tiers, datasheet PDFs, pinouts and EasyEDA footprints
KiCad files: symbols and footprints from SamacSys
Reference boards: ~300 open-source boards and Espressif DevKits, showing how real designs wire an IC (decoupling, crystals, pull-ups)
Sensors: 1,600+ sensor ICs and modules by what they measure, their bus and the platforms with drivers
Design rules: 41 reference files on power, protection, interfaces, MCUs, layout and EMC
Related MCP server: SheetsData MCP
Quick start
Claude Code
claude mcp add -s user --transport http pcbparts https://pcbparts.dev/mcpTo skip the approval prompt on every call, add this to ~/.claude/settings.json:
{
"permissions": {
"allow": ["mcp__pcbparts__*"]
}
}Claude Desktop and Cursor
Claude Desktop: Settings → Connectors → "Add custom connector", or edit ~/Library/Application Support/Claude/claude_desktop_config.json. Cursor: edit ~/.cursor/mcp.json. Both take:
{
"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 the Extensions config:
{
"mcpServers": {
"pcbparts": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://pcbparts.dev/mcp"]
}
}
}Tools
Tool | What it does |
| Main search: plain-words queries, spec filters and sorting by a spec over the daily catalog snapshot |
| Live JLCPCB stock, including out-of-stock and low-stock parts |
| Full details for an LCSC code or manufacturer part number |
| Pin numbers and names from the EasyEDA symbol; |
| Replacements checked against compatibility rules, with unverified candidates listed apart |
| Categories, subcategories and the specs each one can filter on |
| Mouser price, stock and datasheet, up to 10 parts per call |
| DigiKey price, stock and datasheet for one part |
| SamacSys search for ECAD models and datasheets |
| KiCad symbol and footprint download |
| Find reference boards by IC, tag, org or text; consensus shows how boards use an IC |
| A board's BOM, design rules and dimensions; |
| Sensors by measurement, protocol or platform |
| Design rules and checklists by topic |
A typical session goes get_design_rules or board_search → jlc_search → jlc_get_part → jlc_find_alternatives → cse_get_kicad.
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 the basic library"
"Look up TPS63020 stock and pricing on Mouser"
"Get the KiCad footprint for ESP32-S3-WROOM-1"
"What sensor should I use to measure CO2 on ESPHome?"
"How is the RP2040 typically used? What decoupling and crystal do real boards use?"
"What are the design rules for USB-C?"Good to know
jlc_searchcovers parts with at least 10 in stock, from a snapshot taken daily (data_as_ofin each reply).jlc_get_part(lcsc=...)andjlc_stock_checkare live, andjlc_stock_checkalso reaches the rest of JLCPCB's 7M+ part catalog.For Economic assembly, basic and preferred parts avoid the extended-type loading fee. Alternatives savings use a rounded legacy $3 estimate per extended type, not a current quote; Standard assembly fees differ.
jlc_searchranks basic and preferred parts first, andlibrary_type="no_fee"keeps only those.Spec figures are JLCPCB's listings, and alternatives are checked against the catalog. Check the datasheet and pinout before you order.
On pcbparts.dev, all users share one Mouser key and one DigiKey app: 1,000 requests a day each. Self-host with your own keys to get your own limits.
docs/search-guide.md covers how queries are read, spec filter syntax, package matching, sorting and the alternatives rules.
Self-hosting
git clone https://github.com/Averyy/pcbparts-mcp
cd pcbparts-mcp
uv venv && uv pip install -e .
uv run python -m pcbparts_mcp.server # http://localhost:8080/mcpOr with Docker (needs BuildKit, the default since Docker 23). docker-compose.yml joins an external network named web, so create it first:
docker network create web
docker compose up -d # GHCR image
docker compose -f docker-compose.local.yml up --build # built from sourcedocker-compose.yml publishes the server on 127.0.0.1:8080 for a reverse proxy on the same host. Change the mapping to "8080:8080" to reach it from other machines.
The server builds data/components.db on first run. After upgrading, it logs a warning if the database is too old for the new version; rebuild it with uv run python scripts/build_database.py.
Mouser keys are free from Mouser's API hub, and DigiKey client credentials from DigiKey's developer portal. cse_get_kicad downloads need a SamacSys ComponentSearchEngine account; cse_search works without one.
Variable | Default | Description |
| — | Enables |
| — | Enable |
| — | SamacSys login for |
|
| Server port |
|
| Requests per minute per IP |
|
| Comma-separated Host headers to accept (DNS-rebinding protection; localhost always works) |
|
| Daily request quota for each of Mouser and DigiKey |
|
| Keeps the day's Mouser/DigiKey counts and pauses across restarts |
|
| Keeps the |
|
| Keeps EasyEDA footprint answers across restarts |
|
| Keeps SamacSys searches and KiCad files across restarts |
The four paths are unset outside Docker, which keeps that data in memory only. The compose files mount a named volume at /app/cache.
API
Endpoint:
https://pcbparts.dev/mcp, Streamable HTTP (stateless), no authRate limit: 100 requests a minute per IP
Health:
https://pcbparts.dev/health(version, cache sizes, each distributor's requests today)Usage stats:
https://pcbparts.dev/mcp/stats, anonymous daily counts of calls per tool and per hour, apps and Mouser/DigiKey lookups. No IPs, queries or part numbers are kept.
More
llms.txt: this service described for LLMs, with the defaults and limits they need
CHANGELOG.md: every release, also published as GitHub releases from 0.8.21. Minor releases in 0.x can change replies, and each lists what to check under Breaking.
CONTRIBUTING.md: development setup, tests and project conventions. Issues and PRs welcome.
License: MIT
Available Tools
14 toolsboard_getGet Reference BoardARead-onlyIdempotent
A reference board from board_search. With focus=IC it returns that IC's pin-by-pin neighborhood (decoupling, pull-ups, connected parts) and, when 2+ boards use the IC, how the others wire it. Reply: focus_match_type says exact, partial or ref matching; consensus compares wiring across consensus.board_count boards; passives_omitted counts hidden plain passives. Components and a focused IC carry the design files' own part numbers where listed (mpn, manufacturer, lcsc, mouser, digikey): look them up with jlc_get_part or mouser_get_part. An unknown slug's error adds did_you_mean (boards sharing most of its words).
Inputs: slug (required), focus, include_bom, include_nets. Returns: object
board_searchSearch Reference BoardsARead-onlyIdempotent
Search ~300 open-source reference board schematics to see how real designs use an IC: its passives, decoupling, pull-ups and power topology. Not for buying parts (jlc_search) or choosing sensors (sensor_recommend). Then call board_get(slug, focus=IC) for that IC's pin-by-pin neighborhood.
Use component= for an IC name (searches the BOMs; when 2+ boards match it adds a cross-board consensus), query= for a function ("motor driver", "USB power delivery"), tag= to browse. Tags ignore case/whitespace; usb-c means usb. Unknown tags return valid_values from the catalog. Combine them to narrow. Results are sorted by relevance, then component count; matched_by says why each appeared (key IC, component, text, tag). A component consensus counts distinct boards per pin choice (pct divides by consensus.board_count); browsing by tag alone adds tag_consensus, the ICs boards in that category commonly use. An empty reply's hint names the words no board matches and what leaving them out finds.
Inputs: org, tag, limit, query, +2 more. Returns: object
cse_get_kicadGet KiCad Symbol & FootprintARead-onlyIdempotent
Download a part's KiCad symbol (.kicad_sym) and footprint (.kicad_mod) as text from SamacSys ComponentSearchEngine; works for any manufacturer. Slow (a search of about 15 s, then a download; files are kept): only when you need the KiCad files. For EasyEDA footprints use jlc_get_part.
Inputs: query, part_id. Returns: object
cse_searchCSE Search (ECAD Models)ARead-onlyIdempotent
Check whether KiCad, Eagle or Altium symbols, footprints and 3D models exist for a part on SamacSys ComponentSearchEngine, with its datasheet. Slow (a search takes about 15 s, longer when ComponentSearchEngine is busy; answers are kept): only when you need ECAD models. For part search use jlc_search; for EasyEDA footprints, jlc_get_part.
Inputs: query (required), limit. Returns: object
digikey_get_partDigiKey Part LookupARead-onlyIdempotent
DigiKey price, stock and datasheet for one part. Use only when the user wants DigiKey data; find parts with jlc_search first. Shared daily limit, one part per call: don't check whole BOMs. Don't retry a quota error. Reply: part_number, price, price_breaks and min_qty are one packaging's (the DigiKey PN given, else the smallest order, usually cut tape; packaging names it); other_packaging lists the rest (reel, Digi-Reel) with their PN, min_qty and price. lifecycle is DigiKey's product status.
Inputs: product_number (required). Returns: object
get_design_rulesPCB Design RulesARead-onlyIdempotent
Curated PCB design rules for power, protection, interfaces, MCUs, layout and EMC. An empty topic lists every rule file. note says the files were found by their text, not their name or keywords.
Inputs: topic. Returns: object
jlc_find_alternativesFind Alternative PartsARead-onlyIdempotent
Find catalog-checked alternatives, ranked no-fee first (same-package passives/crystals first within each tier). Reply: summary.found counts verified alternatives; unverified_alternatives need manual comparison for missing required matches or incomparable rating conditions (inductor Isat, DCR, thermal current; multi-diode loading); specs_unparseable lists specs not verified; unchecked_requirements includes pinout/circuit checks still needed; has_easyeda_footprint=null means unknown. Reviewed spec_evidence cites manufacturer values/conditions; spec_discrepancies preserves catalog conflicts. no_datasheet and no_datasheet_note refer only to JLCPCB availability. RF parts (splitters, baluns, couplers, amplifiers, filters, transceivers) have no rules, so they come back as similar_parts from every maker, ordered by how much of the original's frequency range each covers (frequency_coverage: full, partial with share, or unknown); parts that don't overlap it are left out and counted in summary.frequency_check. Other part types without rules (modules, load switches, addressable LEDs) list parts in the original's package and part family first, with likely_drop_in (pinout unchecked), then other makers' parts in the same package. library_type="no_fee" with no basic/preferred match names the best extended ones in summary.extended_examples. Listed parts carry has_easyeda_footprint where it's already known (no extra request), and pcba_type ("economic" or "standard_only"). Lifecycle (NRND) isn't checked: mouser_get_part or digikey_get_part has it. Stock comes from the live search or the daily catalog snapshot. Each part's data_source identifies that observation. Savings use a rounded $3 Economic loading-fee estimate (is_estimate and assembly_service_assumption), not a current quote; Standard service differs.
Inputs: lcsc (required), limit, min_stock, library_type, +4 more. Returns: object
jlc_get_partGet Part DetailsARead-onlyIdempotent
Full details for one JLCPCB part (all price tiers, datasheet, specs, EasyEDA footprint availability), or the JLCPCB parts matching a manufacturer part number.
Reply: stock and prices are live, held up to an hour; prices lists quantity tiers; datasheet is LCSC's datasheet page (a viewer, null when LCSC has none) and datasheet_pdf the datasheet itself: a short link on this server that redirects to the PDF and stays valid (LCSC's own link when the PDF is LCSC's); maker_datasheet is the manufacturer's own datasheet link where JLCPCB lists one (most TI parts), and datasheet_note says when there is no PDF, or that datasheet_pdf is LCSC's copy when JLCPCB has none (specs come from LCSC too when JLCPCB lists none); specs_note says when LCSC lists no specs, or what the listing leaves out for the part type (Isat's definition, MLCC DC-bias loss, an RF cable's end styles, a MOSFET's RDS(on)/Vgs(th) mixing typical and maximum figures, multi-diode loading conditions); spec_evidence cites reviewed manufacturer values and conditions, document identity, printed page and source URL; spec_discrepancies flags catalog/document conflicts without replacing catalog specs. no_datasheet/no_datasheet_note refer only to JLCPCB availability; lcsc_url is the LCSC product page; pcba_type is "economic" or "standard_only" (JLCPCB's PCBA Type: one standard_only part moves the whole order to Standard assembly). No lifecycle status (NRND, obsolete): JLCPCB doesn't list it; mouser_get_part and digikey_get_part return lifecycle (Mouser's is null where it states none). jlc_get_pinout(lcsc, footprint=true) gives the footprint's pads. has_easyeda_footprint=null means unknown, false means absent; MPN lookups return results and total. Non-exact replies add match (separators, packing, alias, alternative, lcsc or related), matched_mpn where applicable, and a note naming the part types for related full-text results (and parts another manufacturer numbered after the original). An LCSC code given as mpn finds that part (match=lcsc); BOM placeholders such as N/A or DNP find nothing. MPN lookups search the daily catalog snapshot (stock >= 10), most stock first. Rows carry data_source (kind/provider/observed_at); cached live observations retain their timestamp. MPN misses describe snapshot scope, availability outside it is unknown, and next_call offers an explicit jlc_stock_check with min_stock=0 without executing it.
Inputs: mpn, lcsc. Returns: object
jlc_get_pinoutGet Component PinoutARead-onlyIdempotent
Pin numbers and names from a part's EasyEDA symbol, exactly as EasyEDA has them (e.g., VCC, GND, PA0); with footprint=true also the EasyEDA footprint's pads. A pin's number is as the symbol shows it and matches the footprint pad ("1", "A2"); electrical (input, output, bidirectional, power) appears only where the symbol's creator set it, so its absence says nothing. unverified ("Symbol not verified by LCSC") appears when LCSC hasn't verified the symbol; note means every pin's name is its number, so the symbol doesn't say what the pins do, or that a polarized two-pin part's numbers may not match its datasheet's (connect it by pin name). footprint_error says why a requested footprint is missing.
Inputs: lcsc, uuid, footprint. Returns: object
jlc_searchSearch ComponentsARead-onlyIdempotent
Search in-stock JLCPCB parts locally with natural-language parsing and spec filters. Stock and price (the 1-piece price) are from the daily catalog snapshot, scraped at data_as_of; jlc_get_part and jlc_stock_check are live. Default 20 results; strict=true disables relaxation. Reply: filters_applied lists every filter that ran, given or read from the query; parsed shows only what the query text gave. relaxed names query words, a query-only library preference or part type left out; ignored_filters explains unapplied/rare filters, parsed.adjusted_filters explains moved/omitted specs; unlisted counts, per range filter, parts it left out only because they don't list that attribute ("-"); counts_complete=false means partial counts; valid_values lists accepted inputs on errors. When the search shortens a full part number (LM1117-3.3 searches LM1117), parts matching it come first: mpn_match is full, same_suffix or family, and mpn_matches counts each. A full package (QFN-24-EP(4x4)) keeps its body size and exposed pad; a bare family (QFN-24) matches any body, and parsed.adjusted_filters says so. In results, pcba_type "standard_only" means one such part moves the whole order to Standard assembly (higher setup and stencil fees), and no_datasheet=true that JLCPCB lists no datasheet (find it on the maker's site, or pick another). total counts every match before limit and offset; library_type_counts use the same constraints. Spec sorts add sort_value (the figure sorted on, as listed, with its test condition, or null) and sort (what was compared, at which condition, and how far the order compares like with like). An empty reply's hint suggests a next step. why_empty adds bounded local library/package/stock checks with counts, next calls and diagnostics_complete; original results stay empty. Negative Vout preserves polarity, impedance@frequency compares that condition, and part-number exclusions are reported as unsupported. Part rows carry data_source (snapshot/provider/observation time); no diagnostic makes live requests.
Inputs: limit, query, offset, strict, +14 more. Returns: object
jlc_search_helpSearch Help & BrowseARead-onlyIdempotent
List categories, a category's subcategories, or a subcategory's filterable attributes (with type and example values) for jlc_search spec_filters. No args lists all categories.
Inputs: category, subcategory. Returns: object
jlc_stock_checkStock Check (Live API)ARead-onlyIdempotent
Live JLCPCB stock and price search. Use jlc_search first (faster, parametric filters); use this only to confirm stock before ordering, find parts with stock under 10 or out of stock, or page through large result sets. JLCPCB matches whole part numbers and their starts, not text inside them: when no result contains a part-number fragment ("2812"), hint names in-stock parts that do (WS2812B). Use jlc_get_part(lcsc=...) for full details.
Inputs: page, limit, query, package, +10 more. Returns: object
mouser_get_partMouser Part LookupARead-onlyIdempotent
Mouser price, stock and datasheet for specific parts. Use only when the user wants Mouser data; find parts with jlc_search first. Shared daily limit: batch up to 10 parts per call (one request). Don't retry a quota error. Reply: lifecycle is Mouser's status where it states one (Not Recommended for New Designs, End of Life, Obsolete, Discontinued), else null: Mouser states none for most parts, including some the maker marks NRND (AP2553W6-7). digikey_get_part's lifecycle is DigiKey's product status (it listed AP2553W6-7 as NRND); the maker's site decides. not_found lists the given numbers no result matches (Mouser skips them without saying). A number can match another maker's part (Mouser's SRV05-4 is onsemi's): check manufacturer.
Inputs: part_number (required). Returns: object
sensor_recommendSensor RecommendARead-onlyIdempotent
Recommend sensor ICs and modules for what you want to measure, with protocol and platform support. Filter choices come from the catalog; unknown values list valid choices. Accepts 1-wire/one-wire and heart rate/blood oxygen aliases. Not for buying parts: use jlc_search. Results are sorted by how many platforms have drivers for the sensor. CCS811 exposes estimated eco2 and VOC output; humidity/temperature are compensation inputs, with cited operating/stress voltage evidence. Generic MCU/platform IDs such as RP2040 are excluded.
Inputs: type, limit, query, measure, +2 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Most tools have clearly distinct purposes, and the descriptions actively disambiguate the tricky pairs: jlc_search vs jlc_stock_check (daily snapshot vs live), board_search vs board_get, and jlc_get_part vs jlc_find_alternatives. The main residual overlap is jlc_get_part vs jlc_get_pinout (pinout is arguably a detail of the part), but the cross-references make the boundary workable.
Strong prefix conventions: jlc_* for JLCPCB operations, cse_* for ComponentSearchEngine, board_* for reference boards, and source_get_part for DigiKey/Mouser. Only get_design_rules and sensor_recommend deviate from a source-prefixed pattern, which is a minor inconsistency rather than a confusion.
14 tools sit comfortably in the well-scoped 3-15 range, and each covers a distinct capability (search, detail, alternatives, stock, pinout, ECAD files, distributor pricing, board references, sensors, design rules). Nothing feels padded or missing at the count level.
The surface covers the full parts workflow: discovery, parametrics/help, detail, cross-distributor pricing, alternatives, ECAD models, pinout, and reference-design context. The only gap is BOM-level/batch operations (Mouser batches up to 10 but there is no dedicated multi-part BOM tool), which agents can work around with repeated calls.
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
- AlicenseAqualityBmaintenanceProvides 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.1495 npm12MIT
- FlicenseAqualityDmaintenanceEnables 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.444 PyPI9-
- AlicenseAqualityCmaintenanceEnables AI assistants to search millions of electronic components and ICs, retrieve specifications, compare alternates, and submit turnkey BOM procurement requests.4MIT