Make Parts Now: 3D Printing & CNC Machining Quotes
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Instant quotes and ordering for 3D printing and CNC machining: SLS, FDM, aluminum and brass parts.
| Author | com.makepartsnow |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2144 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Make Parts Now: 3D Printing & CNC Machining Quotes": {
"url": "https://makepartsnow.com/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (18)
get_capabilitiesread-onlyProcesses, materials, colors, finishes, services, speeds, file formats, limits and payment methods.
Hints: read-only yes · destructive no · idempotent yes · open-world no
create_agent_accountCreate an autonomous agent account and API key. accept_terms must be true (Terms of Sale + Agent Terms). ship_to: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}. The api_key is shown once.
Parameters:
name(required) — string — Name of the agent or app placing ordersemail(required) — string — Email that receives the account notice, receipts, and order problemsaccept_terms(required) — boolean — Must be true to accept the Terms of Sale and Agent Termsship_to— US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}callback_url— Public https URL for signed part, quote, and order webhooksorganization— string — Company or person operating the agent
Hints: read-only no · destructive no · idempotent no · open-world yes
get_accountread-onlyThe authenticated account: contact email, default ship_to, credit balance, spending limits.
Hints: read-only yes · destructive no · idempotent yes · open-world no
update_accountdestructiveChange the agent account's name, organization, email, default ship_to or callback_url; omitted fields stay. A new email or callback_url is emailed to the previous account email. Agent accounts only.
Parameters:
name— Name of the agent or app placing ordersemail— Email for the account notice, receipts, and order problemsship_to— US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}callback_url— Public https URL for signed part, quote, and order webhooks; empty string removes itorganization— Company or person operating the agent
Hints: read-only no · destructive yes · idempotent yes · open-world no
upload_partUpload a CAD file (STL, 3MF, OBJ, STEP) from an https URL or base64 content (filename required for base64). MCP requests are limited to 4 MB, so base64 works for files up to about 3 MB; use a URL or get_upload_url for larger files. no_controlled_data must be true: confirms the file has no CUI/ITAR/export-controlled data. Returns a part with status 'pending'; poll get_part until 'ready' (usually seconds), or pass wait_seconds.
Parameters:
no_controlled_data(required) — boolean — Must be true: confirms the file contains no CUI, ITAR, or export-controlled dataurl— Public https URL of the CAD file; we fetch it server-sidefilename— File name with extension (.stl, .3mf, .obj, .step); required with content_base64wait_seconds— integer — Seconds (0-30) to wait server-side for the analysis to finish before answering; 0 answers at oncecontent_base64— The file's bytes, base64-encoded (up to about 3 MB)idempotency_key— Same key on a retry returns the first result instead of creating another
Hints: read-only no · destructive no · idempotent no · open-world yes
get_upload_urlGet a one-time URL to HTTP PUT a large file directly (no auth header needed). Returns the part on upload.
Parameters:
filename(required) — string — File name with extension (.stl, .3mf, .obj, .step)no_controlled_data(required) — boolean — Must be true: confirms the file contains no CUI, ITAR, or export-controlled data
Hints: read-only no · destructive no · idempotent no · open-world no
get_partread-onlyPart status, measured geometry (mm), suggested units, DFM warnings, and processes that fit it. Pass wait_seconds to wait for a pending part's analysis in this call instead of polling.
Parameters:
part_id(required) — string — Part id (prt_...) returned by upload_part or get_upload_urlwait_seconds— integer — Seconds (0-30) to wait server-side for the analysis to finish before answering; 0 answers at once
Hints: read-only yes · destructive no · idempotent yes · open-world no
create_quoteCreate a quote. items: [{part_id, quantity, config: {units, process, material, color, finishes, finish_color, services, infill, layer_height}}]. See get_capabilities for valid ids. Returns prices, speed options with ship/arrival dates, and next_steps.
Parameters:
items(required) — array — Parts to quote, each {part_id, quantity (1-100000), notes?, config: {units, process, material, color?, finishes?, finish_color?, services?, infill?, layer_height?}}speed— Production speed: economy, standard, fast, faster, or fastest (FDM only). Faster speeds add a rush fee; get_capabilities lists each process's speeds.ship_to— US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}po_number— Your purchase order number, printed on the quote and ordercontact_email— Email for receipts and order updates; defaults to the account emailidempotency_key— Same key on a retry returns the first result instead of creating another
Hints: read-only no · destructive no · idempotent no · open-world no
get_quoteread-onlyCurrent pricing, speeds, shipping options, warnings and next_steps for a quote.
Parameters:
quote_id(required) — string — Quote id (qt_...) returned by create_quote
Hints: read-only yes · destructive no · idempotent yes · open-world no
list_quotesread-onlyYour quotes, newest first: id, number, status, item_count, expires_at and the last priced total_before_tax. Nothing is repriced; use get_quote for current prices. Use it to find quotes to discard when you hit the open-quote limit.
Parameters:
limit— integer — How many to return, newest first (1-200)status— string — Which quotes: 'open' (the default), 'expired' (discarded), 'ordered', or 'all'
Hints: read-only yes · destructive no · idempotent yes · open-world no
discard_quoteClose a quote you no longer need, so it stops counting toward the open-quote limit. It becomes 'expired': its checkout links and USDC payment requests stop working and it can't be paid. Discarding it again is harmless. An ordered quote, or one with a USDC payment received, can't be discarded.
Parameters:
quote_id(required) — string — Quote id (qt_...) returned by create_quote
Hints: read-only no · destructive no · idempotent yes · open-world no
update_quotedestructiveChange speed (economy|standard|fast|faster|fastest), ship_to, shipping_option, items. update_items: [{item_id, quantity?, config?, notes?}] where config is merged into the item's config.
Parameters:
quote_id(required) — string — Quote id (qt_...) returned by create_quotespeed— Production speed: economy, standard, fast, faster, or fastest (FDM only). Faster speeds add a rush fee; get_capabilities lists each process's speeds.ship_to— US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}add_items— Parts to add, each {part_id, quantity (1-100000), notes?, config: {units, process, material, color?, finishes?, finish_color?, services?, infill?, layer_height?}}po_number— Your purchase order number, printed on the quote and orderupdate_items— Changes to existing items: [{item_id, quantity?, config?, notes?}]; config is merged into the item's configcontact_email— Email for receipts and order updates; defaults to the account emailremove_item_ids— Item ids (itm_...) to remove from the quoteshipping_option— Shipping option id from the quote's shipping_options
Hints: read-only no · destructive yes · idempotent no · open-world no
create_checkout_linkdestructiveOption A: get a Stripe Checkout URL for a human to pay by card (tax added at checkout). Each new link stops earlier links for the same quote from working.
Parameters:
quote_id(required) — string — Quote id (qt_...) returned by create_quoteidempotency_key— Same key on a retry returns the first result instead of creating another
Hints: read-only no · destructive yes · idempotent no · open-world yes
pay_with_cryptodestructiveOption B: pay autonomously in USDC via x402 (agent accounts only). Call without payment_signature to get the payment requirements (amount, asset, pay_to, network); nothing is charged. Then sign an x402 'exact' payment and call again with payment_signature (the base64 PAYMENT-SIGNATURE value). If account credit covers the whole total, you get status 'credit_confirmation_required' and a credit_confirmation token instead; call again with confirm_credit to place the order.
Parameters:
quote_id(required) — string — Quote id (qt_...) returned by create_quoteuse_credit— boolean — Apply account credit before charging USDCconfirm_credit— The credit_confirmation token from the previous call, to place an order fully paid by account creditpayment_signature— Base64 x402 PAYMENT-SIGNATURE for the requirements from the first call; omit to get the requirements
Hints: read-only no · destructive yes · idempotent no · open-world yes
get_orderread-onlyOrder status, ship-by and arrive-by dates, tracking.
Parameters:
order_id(required) — string — Order id (ord_...) from list_orders or the paid quote
Hints: read-only yes · destructive no · idempotent yes · open-world no
list_ordersread-onlyOrders for this account, newest first. Filter by quote_id to check whether a checkout link was paid.
Parameters:
quote_id— Only orders for this quote id (qt_...)
Hints: read-only yes · destructive no · idempotent yes · open-world no
set_refund_preferenceFor USDC orders: receive refunds as 'usdc' (sent to the paying wallet) or 'credit' (account credit).
Parameters:
order_id(required) — string — Order id (ord_...) from list_orders or the paid quotemethod(required) — string — 'usdc' sends refunds to the paying wallet; 'credit' adds them to account credit
Hints: read-only no · destructive no · idempotent yes · open-world no
request_order_cancellationAsk the shop to cancel an order that hasn't shipped. A person reviews it; production may already have started. Asking again within 24 hours adds the reason without notifying the shop twice. The order.status_changed webhook and get_order show the outcome.
Parameters:
order_id(required) — string — Order id (ord_...) from list_orders or the paid quotereason(required) — string — Why the order should be canceled, for the person who reviews it
Hints: read-only no · destructive no · idempotent yes · open-world no
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.