> ## Documentation Index
> Fetch the complete documentation index at: https://docs.provenmetal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tool reference

> Every tool on https://mcp.provenmetal.com, with its parameters.

Each tool's full instructions, exactly as your agent sees them, are under **What the agent is told**.

<CardGroup cols={2}>
  <Card title="upload" icon="upload" href="#upload">
    Step 1 of an order: a signed upload link and the command that sends the files.
  </Card>

  <Card title="quote" icon="bolt" href="#quote">
    Step 2: a live JLCPCB price, questions about what the files don't state, or a custom-quote link.
  </Card>

  <Card title="checkout" icon="credit-card" href="#checkout">
    The checkout or quote-request link for an existing quote.
  </Card>

  <Card title="saved_code" icon="envelope" href="#saved-code">
    Buy with saved details, step 1: email the customer a 6-digit code.
  </Card>

  <Card title="saved_verify" icon="shield-halved" href="#saved-verify">
    Step 2: check the code; returns what will be charged and where it ships.
  </Card>

  <Card title="saved_pay" icon="wallet" href="#saved-pay">
    Step 3: pay with the saved card once the customer says yes.
  </Card>

  <Card title="order_status" icon="truck-fast" href="#order-status">
    Where a quote or order stands: awaiting payment, ordered, in production or shipped.
  </Card>

  <Card title="jlcpcb_capabilities" icon="list-check" href="#jlcpcb-capabilities">
    JLCPCB's materials, the 35 documented customization services and the `jlc_options` fields.
  </Card>

  <Card title="buy_link" icon="cart-shopping" href="#buy-link">
    A permanent buy link for a partner site's Buy button.
  </Card>

  <Card title="design_check" icon="microscope" href="#design-check">
    The uploaded board checked the way a fab would, with no quote or order.
  </Card>

  <Card title="parts_check" icon="boxes-stacked" href="#parts-check">
    A part list checked for the build quantity, with no files.
  </Card>
</CardGroup>

## upload

Step 1 of an order: a signed upload link and the command that sends the files.

<Accordion title="What the agent is told">
  Step 1 of an instant JLCPCB order. Returns an upload link and a command that compresses the files with tar and uploads them with curl. Run it from the project folder with the files: a KiCad project (.kicad\_pcb, optionally .kicad\_sch, or the project zipped) or a Gerber zip; for assembly also a BOM CSV with LCSC or manufacturer part numbers if you have one; any line that gives only a value or symbol needs its exact part number, from the design or the user, asked together with the board options. Add any fabrication drawing, stackup PDF or README that states build requirements: ProvenMetal's team gets them with the quote, but the price uses only the options you pass, so pass what they state. ProvenMetal makes Gerbers, drill, BOM and pick-and-place from KiCad files. Send an Altium output folder whole, with its .EXTREP and .REP reports: they say which mechanical layer is the board outline, and without them it can't be measured. Never write, change or delete a file in the user's project, a new one included, without their go-ahead: a BOM you make goes up from a temporary folder outside the project, or piped to curl as -F 'files=@-;filename=bom.csv'.
</Accordion>

No parameters.

## quote

Step 2: a live JLCPCB price, questions about what the files don't state, or a custom-quote link.

<Accordion title="What the agent is told">
  Step 2: a live JLCPCB price for the uploaded design, in USD, delivered with shipping, import duty and tax. Before calling, ask the user once, together, with your multiple-choice question tool (Claude Code's AskUserQuestion, or Codex's equivalent), for the board options neither they nor the files state, whether the board has special requirements, and who receives the boards and where (name, email, phone, street address, city, state, postal code, country). Delivery is optional: pass what they give, never a guess; outside the US no postal code is needed, so never invent one. Each argument says when to pass it; standard\_for\_unstated=true if they accept JLCPCB's standard for the rest. Replies: needs\_details lists the questions left with their choices; needs\_part\_numbers lists BOM lines that name no exact part: find each in the design or ask the user, never guess a variant, add it to a copy of the BOM and upload again (or staff\_picks\_parts=true to let ProvenMetal choose). Never search for replacement parts yourself: this tool checks JLCPCB, Digi-Key, Mouser, LCSC, Octopart and ProvenMetal's AI sourcing. Exact-spec passive replacements are priced without asking; active parts are never swapped automatically. An unpriced part's reason says what was searched, and it may carry similar\_part: show it and how it differs, and pass substitutions only with the user's approval. mode review returns a link for ProvenMetal's team to quote: share it, and offer fabrication\_quote (an instant bare-board price) when present. A KiCad board with shorts or unrouted connections is refused with each problem: tell the user. Keep every BOM placement; never mark parts do-not-populate to get a price. price\_unavailable is temporary. Pricing takes 5 seconds to 2 minutes (the upload's reply gives the estimate): tell the user, and if your client times out, call again with the same arguments to pick up the same quote.
</Accordion>

<ParamField body="upload_id" type="string" required>
  The `upload_id` from `upload`.
</ParamField>

<ParamField body="quantity" type="integer" required>
  How many boards.
</ParamField>

### Delivery

<ParamField body="ship_to_name" type="string">
  The recipient's full name, as the user gave it.
</ParamField>

<ParamField body="ship_to_email" type="string">
  The user's email: their ProvenMetal account is made with it at checkout.
</ParamField>

<ParamField body="ship_to_phone" type="string">
  A delivery phone number with country code, for the courier.
</ParamField>

<ParamField body="ship_to_company" type="string" />

<ParamField body="ship_to_line1" type="string">
  The street address.
</ParamField>

<ParamField body="ship_to_line2" type="string" />

<ParamField body="ship_to_city" type="string">
  The delivery city, if the user gave one; needed with a country outside the US.
</ParamField>

<ParamField body="ship_to_state" type="string">
  State or province, if the user gave it; in Canada and India it (or the postal code) sets the tax.
</ParamField>

<ParamField body="ship_to_postal_code" type="string">
  Only if the user gave it; never invent one.
</ParamField>

<ParamField body="ship_to_country" type="string">
  Two-letter country code, only if the user gave a destination.
</ParamField>

<ParamField body="ship_to_tax_id" type="string">
  A tax or VAT ID, only if the user gave one.
</ParamField>

### Board

<ParamField body="assembly" type="boolean">
  Assemble the boards.
</ParamField>

<ParamField body="layers" type="integer">
  Copper layers, when the files don't state them.
</ParamField>

<ParamField body="thickness_mm" type="number">
  Finished thickness in mm. 0.1 to 10.
</ParamField>

<ParamField body="surface_finish" type="string">
  The finishes JLCPCB's API prices. One of `enig`, `hasl_lead_free`, `hasl`.
</ParamField>

<ParamField body="solder_mask" type="string">
  The gloss colours JLCPCB's API prices. One of `Green`, `Red`, `Blue`, `White`, `Black`, `Yellow`, `Purple`, `Transparent`.
</ParamField>

<ParamField body="copper_oz" type="number">
  Outer copper weight in oz. 0.1 to 12.
</ParamField>

<ParamField body="inner_copper_oz" type="number">
  Inner-layer copper of a 4+ layer board, in oz, only when the user or the design files state it. 0.1 to 12.
</ParamField>

<ParamField body="material" type="string">
  The laminate; `jlcpcb_capabilities` lists JLCPCB's materials. One of `FR-4`, `FR-4 / TG155`, `FR-4 / TG170`, `Aluminum`, `Copper core`, `Rogers 4350B`, `ZYF300CA-P`, `ZYF300CA-C`, `ZYF265D`, `ZYF255DA`, `Polyimide`.
</ParamField>

<ParamField body="board" type="string">
  Which `.kicad_pcb` to use when the upload holds more than one.
</ParamField>

<ParamField body="separate_boards" type="string">
  For a file holding several boards: `one_panel` (as drawn) or `separately`. One of `one_panel`, `separately`.
</ParamField>

<ParamField body="standard_for_unstated" type="boolean">
  true only when the user accepts JLCPCB's standard for whatever neither they nor the files state: 1.6 mm, lead-free HASL, 1 oz outer and 0.5 oz inner copper, green, FR-4 and no special requirements.
</ParamField>

<ParamField body="special_requirements" type="boolean">
  true only when the board needs something the other options can't express: an OSP, ENEPIG or immersion tin or silver finish or a matte mask (none of which JLCPCB's API offers), blind, buried or micro vias, rigid-flex, an unmapped laminate, or impedance on the board's own stackup; describe it in special\_notes.
</ParamField>

<ParamField body="special_notes" type="string">
  The user's words for ProvenMetal's team.
</ParamField>

### Advanced fabrication

<ParamField body="jlc_options" type="object">
  Advanced JLCPCB fields and services, named as `jlcpcb_capabilities` lists them.
</ParamField>

<ParamField body="via_process" type="string">
  One of JLCPCB's five via treatments. One of `tented`, `untented`, `plugged`, `epoxy_filled_capped`, `copper_paste_filled_capped`.
</ParamField>

<ParamField body="impedance_controlled" type="boolean">
  Controlled impedance, with `jlc_stackup` naming the stackup the design was made for.
</ParamField>

<ParamField body="jlc_stackup" type="string">
  The JLCPCB stackup for controlled impedance.
</ParamField>

<ParamField body="file_stackup" type="string">
  When the files carry their own stackup: `replace` lets JLCPCB's construction replace it; `keep` makes a custom quote. One of `replace`, `keep`.
</ParamField>

### Parts

<ParamField body="substitutions" type="object[]">
  Replacements the user approved: `reference`, `original_mpn`, `replacement_mpn`, `reason`, optional `replacement_manufacturer`.
</ParamField>

<ParamField body="customer_supplied_refs" type="string[]">
  References of parts the user will send to ProvenMetal themselves.
</ParamField>

<ParamField body="do_not_fit_refs" type="string[]">
  References to leave unpopulated.
</ParamField>

<ParamField body="staff_picks_parts" type="boolean">
  Leave BOM lines that name no exact part to ProvenMetal's team, who name their picks in the quote.
</ParamField>

### Other

<ParamField body="project_name" type="string">
  A name for the board, shown on the order.
</ParamField>

<ParamField body="board_context" type="string">
  A sentence or two on what the board is for and preferences the user stated, kept with the quote for ProvenMetal's team.
</ParamField>

<ParamField body="skip_board_checks" type="boolean">
  Quote a KiCad board with unrouted connections or shorts anyway.
</ParamField>

<ParamField body="itar" type="boolean">
  Set when the design is ITAR-controlled; it is then refused before anything is read.
</ParamField>

## checkout

The checkout or quote-request link for an existing quote.

<Accordion title="What the agent is told">
  Returns the Central link for an existing quote or sourcing request. Delivery details passed to quote are already there; the customer enters any that weren't, in Central. Instant quotes can be paid there. Reviewed assembly requests and custom quote requests go to staff for a complete quote.
</Accordion>

<ParamField body="quote_id" type="string" required>
  The quote ID from `quote`.
</ParamField>

## saved\_code

Buy with saved details, step 1: email the customer a 6-digit code.

<Accordion title="What the agent is told">
  Only for an instant quote whose reply says saved\_details: true, and only after the user said yes to buying it with their saved details. ProvenMetal emails a 6-digit code to the email they saved; ask the user for it, then call saved\_verify.
</Accordion>

<ParamField body="quote_id" type="string" required>
  The quote ID from `quote`.
</ParamField>

## saved\_verify

Step 2: check the code; returns what will be charged and where it ships.

<Accordion title="What the agent is told">
  Checks the 6-digit code the user read from ProvenMetal's email. Returns what will be charged and where it ships, and a confirm\_token for saved\_pay.
</Accordion>

<ParamField body="quote_id" type="string" required>
  The quote ID from `quote`.
</ParamField>

<ParamField body="code" type="string" required>
  The 6-digit code from ProvenMetal's email, as the user read it.
</ParamField>

## saved\_pay

Step 3: pay with the saved card once the customer says yes.

<Accordion title="What the agent is told">
  Pays an instant quote with the user's saved card, once they said yes to the summary from saved\_verify. ProvenMetal then places the order. A declined card or a bank check returns the checkout link instead.
</Accordion>

<ParamField body="quote_id" type="string" required>
  The quote ID from `quote`.
</ParamField>

<ParamField body="confirm_token" type="string" required>
  The `confirm_token` from `saved_verify`.
</ParamField>

## order\_status

Where a quote or order stands: awaiting payment, ordered, in production or shipped.

<Accordion title="What the agent is told">
  Where a JLCPCB quote or reviewed sourcing request stands: ready, awaiting payment or staff quote, ordered, in production or shipped (with tracking).
</Accordion>

<ParamField body="quote_id" type="string" required>
  The quote ID from `quote`.
</ParamField>

## jlcpcb\_capabilities

JLCPCB's materials, the 35 documented customization services and the `jlc_options` fields.

<Accordion title="What the agent is told">
  Lists JLCPCB bare-board material families, common values, the 35 documented customization services and the jlc\_options object accepted by the quote tool. Call it when a board needs advanced fabrication selections. Availability and fees are confirmed by a live quote.
</Accordion>

No parameters.

## buy\_link

A permanent buy link for a partner site's Buy button.

<Accordion title="What the agent is told">
  For a partner site's Buy button: prepare a board ahead of time and get a permanent buy link. Upload the board's files with the upload tool first (KiCad project or Gerber zip, plus a BOM for assembly), then call this with the upload\_id, the board's name and its page URL. Set assembly=true if the board can be ordered assembled. The shopper opening the link picks the quantity and delivery city, gets a live price and checks out in Central.
</Accordion>

<ParamField body="upload_id" type="string" required>
  The `upload_id` from `upload`.
</ParamField>

<ParamField body="project_name" type="string" required>
  A name for the board, shown on the order.
</ParamField>

<ParamField body="source_url" type="string">
  The board's page, shown to shoppers.
</ParamField>

<ParamField body="assembly" type="boolean">
  Assemble the boards.
</ParamField>

<ParamField body="layers" type="integer">
  Copper layers, when the files don't state them.
</ParamField>

<ParamField body="thickness_mm" type="number">
  Finished thickness in mm.
</ParamField>

<ParamField body="surface_finish" type="string" />

<ParamField body="solder_mask" type="string" />

<ParamField body="copper_oz" type="integer">
  Outer copper weight in oz.
</ParamField>

<ParamField body="material" type="string">
  The laminate; `jlcpcb_capabilities` lists JLCPCB's materials.
</ParamField>

<ParamField body="board" type="string">
  Which `.kicad_pcb` to use when the upload holds more than one.
</ParamField>

<ParamField body="skip_board_checks" type="boolean">
  Quote a KiCad board with unrouted connections or shorts anyway.
</ParamField>

<ParamField body="itar" type="boolean">
  Set when the design is ITAR-controlled; it is then refused before anything is read.
</ParamField>

## design\_check

The uploaded board checked the way a fab would, with no quote or order.

<Accordion title="What the agent is told">
  While a board is being designed: checks the uploaded board files (upload them with the upload tool first) the way a fab would, in seconds, with no quote or order: the Gerbers and drills against JLCPCB's limits (outline, drills, annular rings, trace and spacing, mask, silkscreen), each partner fab's estimated verdict (JLCPCB, PCBWay, Bay Area Circuits, Summit Interconnect: can\_build, cannot\_build with the failed limits, or not\_fully\_checked with what couldn't be proved), and for a KiCad board KiCad's own design-rule check: unrouted connections and shorts as must\_fix, the rest grouped by kind (a warning when it breaks JLCPCB's limit, a note when it only breaks the board's own rules). Relay the fab verdicts as an estimate from each fab's published limits, not the fab's own review: JLCPCB's engineers check the files again after an order, and ProvenMetal's team reviews custom quotes. When Summit Interconnect is listed or chosen, tell the user its lead times are not very reliable, so plan with margin or ask ProvenMetal. Pass boards (how many will be built) and the BOM's parts are checked too, as parts\_check does. With a BOM, the part-level checks ProvenMetal runs on orders (datasheets, package fit, footprints against the parts) also run, behind real orders and at a limited pace: they come back in part\_checks on a later call (status checking with retry\_after\_s until then). findings come worst first: must\_fix, then warning, then note. Pass copper\_oz and thickness\_mm when the board isn't JLCPCB's standard 1 oz and 1.6 mm. Upload again and call this after each round of edits.
</Accordion>

<ParamField body="upload_id" type="string" required>
  The `upload_id` from `upload`.
</ParamField>

<ParamField body="boards" type="integer">
  How many boards will be built, to check the BOM's parts. 1 to 100000.
</ParamField>

<ParamField body="copper_oz" type="number">
  Outer copper weight in oz. 0.5 to 6.
</ParamField>

<ParamField body="thickness_mm" type="number">
  Finished thickness in mm. 0.2 to 6.
</ParamField>

<ParamField body="board" type="string">
  Which `.kicad_pcb` to use when the upload holds more than one.
</ParamField>

<ParamField body="wait_s" type="integer" default="15">
  Seconds to wait for the distributors' answer. 0 to 50.
</ParamField>

<ParamField body="itar" type="boolean">
  Set when the design is ITAR-controlled; it is then refused before anything is read.
</ParamField>

## parts\_check

A part list checked for the build quantity, with no files.

<Accordion title="What the agent is told">
  While a board is being designed: checks its parts for the build quantity the way ProvenMetal builds it (assembled at JLCPCB; a part JLCPCB lacks is bought from Digi-Key, Mouser or LCSC). Call it whenever parts are added or changed, with every BOM line from the schematic or design code: reference, quantity per board, mpn and manufacturer, or lcsc, or value and footprint for a resistor, capacitor or inductor. Nothing is uploaded or ordered. Each part comes back ok (in stock and priced, with its stock, lead time and lifecycle when known), check (its package or identity needs a look; why says what), problem (can't be bought for this quantity; why says what was searched, with any in-stock similar\_part to offer the user) or checking. JLCPCB's stock answers in about two seconds; parts it lacks come back from the distributors within wait\_s, else as checking with retry\_after\_s: call again with the same parts then. Choose parts by what it says; never search distributor sites yourself.
</Accordion>

<ParamField body="boards" type="integer" required>
  How many boards will be built. 1 to 100000.
</ParamField>

<ParamField body="parts" type="object[]">
  BOM lines: `reference`, `quantity` (per board), and `mpn` with `manufacturer`, or `lcsc`, or `value` with `footprint` for a passive.
</ParamField>

<ParamField body="bom_csv" type="string">
  A BOM file's text, instead of parts.
</ParamField>

<ParamField body="wait_s" type="integer" default="20">
  Seconds to wait for the distributors' answer. 0 to 50.
</ParamField>

<ParamField body="itar" type="boolean">
  Set when the design is ITAR-controlled; it is then refused before anything is read.
</ParamField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.