{"name":"partguys","description":"Quote and order 3D printed parts from PartGuys (SLS nylon and FDM). Prices are the same as partguys.io.","auth":"Send the API key as `Authorization: Bearer pg_live_...` (or pg_test_... for test mode) on every call. Add `X-PartGuys-Source: mcp` so PartGuys can tell MCP calls apart.","base_url":"https://hskihhpzveqtassiijkt.supabase.co/functions/v1/partguys-api","mcp_url":"https://partguys.io/mcp","mcp_url_with_api_key":"https://hskihhpzveqtassiijkt.supabase.co/functions/v1/partguys-api/mcp","install":"Hosted MCP server, no code needed: claude mcp add --transport http partguys https://hskihhpzveqtassiijkt.supabase.co/functions/v1/partguys-api/mcp --header \"Authorization: Bearer pg_test_...\"","flow":"get_catalog, then upload_model (or create_upload_link when the file cannot be sent whole), then get_quote, then get_shipping_options, then place_order once the person confirms the total (charges the card on file, or returns a checkout link), then get_order to follow it. Test keys never make real orders.","tools":[{"name":"partguys_get_catalog","description":"List what can be ordered: technologies, materials, colours, finishes, black dye, production speeds with ship days, and FDM nozzle and infill options. Call this before quoting so the options you send are valid.","input_schema":{"type":"object","properties":{}},"http":{"method":"GET","path":"/v1/catalog"}},{"name":"partguys_upload_model","description":"Send a 3D model (STL, 3MF, OBJ or PLY, up to 50 MB) and get it measured: size, volume and a file_id to quote with. Give either content_base64 with filename, or a public https url. If you cannot send the whole file exactly as it is (for example it is too large for a tool call), do not simplify, rebuild or approximate it: use partguys_create_upload_link instead. If the part comes back tiny and warns about units, upload again with units set to inches.","input_schema":{"type":"object","properties":{"filename":{"type":"string","description":"With its extension, e.g. bracket.stl."},"content_base64":{"type":"string","description":"The file's bytes, base64 encoded."},"url":{"type":"string","description":"A public https link to the file, instead of content_base64."},"units":{"type":"string","enum":["mm","inches","meters"],"description":"What the model was drawn in. Leave out to measure in mm."}}},"http":{"method":"POST","path":"/v1/files","body":"json"}},{"name":"partguys_create_upload_link","description":"Get a private link where the person uploads their model files themselves on partguys.io. Use this whenever a file cannot be sent whole with partguys_upload_model. When the person has several such files, make one link for all of them by passing their names in filenames (up to 20). Show the upload_url to the person, ask them to say when it is done, then call partguys_get_upload with the id to get the file_id (or file_ids for several files). The link expires in an hour.","input_schema":{"type":"object","properties":{"filename":{"type":"string","description":"The file's name, shown on the upload page (one file)."},"filenames":{"type":"array","minItems":1,"maxItems":20,"items":{"type":"string"},"description":"Several files: every file's name. One link then takes all of them."},"units":{"type":"string","enum":["mm","inches","meters"],"description":"What the models were drawn in, if known."}}},"http":{"method":"POST","path":"/v1/uploads","body":"json"}},{"name":"partguys_get_upload","description":"Check an upload link: waiting (not uploaded yet), done (with the file and its file_id, ready to quote) or expired. A link made for several files also lists files and file_ids, and is partial while some are still missing; after it expires it shows done with the files that arrived.","input_schema":{"type":"object","required":["upload_id"],"properties":{"upload_id":{"type":"string"}}},"http":{"method":"GET","path":"/v1/uploads/{upload_id}","path_params":["upload_id"]}},{"name":"partguys_get_quote","description":"Price one or more uploaded files with options. Returns the price per part and per line, quantity discounts, the total, and a ship-by date. Shipping and tax are added when ordering. A quote is held for 14 days.","input_schema":{"type":"object","required":["lines"],"properties":{"lines":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["file_id","technology","material"],"properties":{"file_id":{"type":"string","description":"From uploading the model."},"quantity":{"type":"integer","minimum":1,"maximum":10000,"default":1},"technology":{"type":"string","description":"SLS or FDM. See the catalog."},"material":{"type":"string","description":"e.g. PA12, PLA, PETG, ASA. See the catalog (PA12-GF is only for parts too large for PA12)."},"color":{"type":"string","description":"One of the material's colours in the catalog. Defaults to its standard colour."},"finishes":{"type":"array","items":{"type":"string"},"description":"Finishes from the catalog, e.g. [\"Polish\"]."},"black_dye":{"type":"boolean","description":"Dye the parts black, where the catalog says black_dye_available."},"speed":{"type":"string","enum":["economy","priority","rush"],"default":"economy","description":"Production speed. Not every material offers every speed (see the catalog). Rush has a minimum order value."},"nozzle_mm":{"type":"string","description":"FDM only. From the catalog's nozzle options."},"infill_percent":{"type":"integer","description":"FDM only. From the catalog's infill options."}}}}}},"http":{"method":"POST","path":"/v1/quotes","body":"json"}},{"name":"partguys_get_shipping_options","description":"Shipping options and prices for a quote to an address, with the option PartGuys would pick by default.","input_schema":{"type":"object","required":["quote_id","ship_to"],"properties":{"quote_id":{"type":"string"},"ship_to":{"type":"object","description":"Where to ship. US addresses only.","required":["name","street1","city","state","zip"],"properties":{"name":{"type":"string","description":"Person to ship to (or use company)."},"company":{"type":"string"},"street1":{"type":"string"},"street2":{"type":"string"},"city":{"type":"string"},"state":{"type":"string","description":"Two-letter state code, e.g. FL."},"zip":{"type":"string","description":"5-digit ZIP or ZIP+4."},"country":{"type":"string","enum":["US"],"default":"US"},"phone":{"type":"string","description":"For the carrier. Optional."},"email":{"type":"string","description":"For delivery updates from the carrier. Optional."}}}}},"http":{"method":"POST","path":"/v1/quotes/{quote_id}/shipping","body":"json","path_params":["quote_id"]}},{"name":"partguys_place_order","description":"Order a quote. Call it first without confirmed_total_cents: nothing is ordered and it returns the total (items, shipping, tax) and how it will be paid. Show that to the person and only after they confirm, call it again with confirmed_total_cents. If the account has a card on file it is then charged at once and the order starts (status paid); otherwise, or with payment set to checkout, the order comes back with a checkout_url for the person to pay. If a saved card is declined, the order comes back with payment_error and a checkout_url. Ordering the same quote again returns the same open order.","input_schema":{"type":"object","required":["quote_id","ship_to"],"properties":{"quote_id":{"type":"string"},"ship_to":{"type":"object","description":"Where to ship. US addresses only.","required":["name","street1","city","state","zip"],"properties":{"name":{"type":"string","description":"Person to ship to (or use company)."},"company":{"type":"string"},"street1":{"type":"string"},"street2":{"type":"string"},"city":{"type":"string"},"state":{"type":"string","description":"Two-letter state code, e.g. FL."},"zip":{"type":"string","description":"5-digit ZIP or ZIP+4."},"country":{"type":"string","enum":["US"],"default":"US"},"phone":{"type":"string","description":"For the carrier. Optional."},"email":{"type":"string","description":"For delivery updates from the carrier. Optional."}}},"shipping_option":{"type":"string","description":"An id from get_shipping_options. Leave out for the default."},"reference":{"type":"string","description":"Your own reference, e.g. a PO or job number. Shown to PartGuys."},"payment":{"type":"string","enum":["card_on_file","checkout"],"description":"card_on_file charges the account's saved card now (the default when one is saved). checkout returns a payment link instead."},"confirmed_total_cents":{"type":"integer","description":"The total in cents the person confirmed. Leave it out first: nothing is ordered and the total to show them comes back. Then send it to place the order. If it no longer matches, nothing is ordered."},"require_confirmation":{"type":"boolean","description":"Calling POST /v1/orders directly: send true with no confirmed_total_cents to get the total without ordering. The hosted MCP server always does this."},"success_url":{"type":"string","description":"https page to send the buyer to after paying. ?order_id= is added."},"cancel_url":{"type":"string","description":"https page to send the buyer to if they cancel."}}},"http":{"method":"POST","path":"/v1/orders","body":"json"}},{"name":"partguys_get_order","description":"An order's status (awaiting_payment, paid, in_production, ready_to_ship, shipped, delivered, on_hold, cancelled, refunded), order number, estimated ship and delivery dates, and tracking once shipped.","input_schema":{"type":"object","required":["order_id"],"properties":{"order_id":{"type":"string"}}},"http":{"method":"GET","path":"/v1/orders/{order_id}","path_params":["order_id"]}},{"name":"partguys_list_orders","description":"Recent orders for this key's mode, newest first.","input_schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"default":25}}},"http":{"method":"GET","path":"/v1/orders","query":["limit"]}},{"name":"partguys_cancel_order","description":"Cancel an order that has not been paid yet. A paid order cannot be cancelled here; contact PartGuys.","input_schema":{"type":"object","required":["order_id"],"properties":{"order_id":{"type":"string"}}},"http":{"method":"POST","path":"/v1/orders/{order_id}/cancel","path_params":["order_id"]}}]}