Instant quotes and ordering for 3D printing and CNC machining: SLS, FDM, aluminum and brass parts.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer mpn_agent_... key from create_agent_account. Optional: browsing the catalog and signing up work without it.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create 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.
Name of the agent or app placing orders
Email that receives the account notice, receipts, and order problems
Must be true to accept the Terms of Sale and Agent Terms
US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}
Public https URL for signed part, quote, and order webhooks
Company or person operating the agent
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create 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.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name of the agent or app placing orders |
| email* | string | Email that receives the account notice, receipts, and order problems |
| ship_to | any | US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?} |
| accept_terms* | boolean | Must be true to accept the Terms of Sale and Agent Terms |
| callback_url | any | Public https URL for signed part, quote, and order webhooks |
| organization | string | Company or person operating the agent |
{
"type": "object",
"title": "create_agent_accountArguments",
"required": [
"name",
"email",
"accept_terms"
],
"properties": {
"name": {
"type": "string",
"title": "Name",
"description": "Name of the agent or app placing orders"
},
"email": {
"type": "string",
"title": "Email",
"description": "Email that receives the account notice, receipts, and order problems"
},
"ship_to": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Ship To",
"default": null,
"description": "US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}"
},
"accept_terms": {
"type": "boolean",
"title": "Accept Terms",
"description": "Must be true to accept the Terms of Sale and Agent Terms"
},
"callback_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Callback Url",
"default": null,
"description": "Public https URL for signed part, quote, and order webhooks"
},
"organization": {
"type": "string",
"title": "Organization",
"default": "",
"description": "Company or person operating the agent"
}
}
}Option 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.
| Argument | Type | Description |
|---|---|---|
| quote_id* | string | Quote id (qt_...) returned by create_quote |
| idempotency_key | any | Same key on a retry returns the first result instead of creating another |
{
"type": "object",
"title": "create_checkout_linkArguments",
"required": [
"quote_id"
],
"properties": {
"quote_id": {
"type": "string",
"title": "Quote Id",
"description": "Quote id (qt_...) returned by create_quote"
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Idempotency Key",
"default": null,
"description": "Same key on a retry returns the first result instead of creating another"
}
}
}Create 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.
| Argument | Type | Description |
|---|---|---|
| items* | array | Parts to quote, each {part_id, quantity (1-100000), notes?, config: {units, process, material, color?, finishes?, finish_color?, services?, infill?, layer_height?}} |
| speed | any | 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 | any | US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?} |
| po_number | any | Your purchase order number, printed on the quote and order |
| contact_email | any | Email for receipts and order updates; defaults to the account email |
| idempotency_key | any | Same key on a retry returns the first result instead of creating another |
{
"type": "object",
"title": "create_quoteArguments",
"required": [
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Items",
"description": "Parts to quote, each {part_id, quantity (1-100000), notes?, config: {units, process, material, color?, finishes?, finish_color?, services?, infill?, layer_height?}}"
},
"speed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Speed",
"default": null,
"description": "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": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Ship To",
"default": null,
"description": "US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}"
},
"po_number": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Po Number",
"default": null,
"description": "Your purchase order number, printed on the quote and order"
},
"contact_email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Contact Email",
"default": null,
"description": "Email for receipts and order updates; defaults to the account email"
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Idempotency Key",
"default": null,
"description": "Same key on a retry returns the first result instead of creating another"
}
}
}Close 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.
| Argument | Type | Description |
|---|---|---|
| quote_id* | string | Quote id (qt_...) returned by create_quote |
{
"type": "object",
"title": "discard_quoteArguments",
"required": [
"quote_id"
],
"properties": {
"quote_id": {
"type": "string",
"title": "Quote Id",
"description": "Quote id (qt_...) returned by create_quote"
}
}
}The authenticated account: contact email, default ship_to, credit balance, spending limits.
No arguments.
{
"type": "object",
"title": "get_accountArguments",
"properties": {}
}Processes, materials, colors, finishes, services, speeds, file formats, limits and payment methods.
No arguments.
{
"type": "object",
"title": "get_capabilitiesArguments",
"properties": {}
}Order status, ship-by and arrive-by dates, tracking.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | Order id (ord_...) from list_orders or the paid quote |
{
"type": "object",
"title": "get_orderArguments",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"title": "Order Id",
"description": "Order id (ord_...) from list_orders or the paid quote"
}
}
}Part 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.
| Argument | Type | Description |
|---|---|---|
| part_id* | string | Part id (prt_...) returned by upload_part or get_upload_url |
| wait_seconds | integer | Seconds (0-30) to wait server-side for the analysis to finish before answering; 0 answers at once |
{
"type": "object",
"title": "get_partArguments",
"required": [
"part_id"
],
"properties": {
"part_id": {
"type": "string",
"title": "Part Id",
"description": "Part id (prt_...) returned by upload_part or get_upload_url"
},
"wait_seconds": {
"type": "integer",
"title": "Wait Seconds",
"default": 0,
"maximum": 30,
"minimum": 0,
"description": "Seconds (0-30) to wait server-side for the analysis to finish before answering; 0 answers at once"
}
}
}Current pricing, speeds, shipping options, warnings and next_steps for a quote.
| Argument | Type | Description |
|---|---|---|
| quote_id* | string | Quote id (qt_...) returned by create_quote |
{
"type": "object",
"title": "get_quoteArguments",
"required": [
"quote_id"
],
"properties": {
"quote_id": {
"type": "string",
"title": "Quote Id",
"description": "Quote id (qt_...) returned by create_quote"
}
}
}Get a one-time URL to HTTP PUT a large file directly (no auth header needed). Returns the part on upload.
| Argument | Type | Description |
|---|---|---|
| filename* | string | File name with extension (.stl, .3mf, .obj, .step) |
| no_controlled_data* | boolean | Must be true: confirms the file contains no CUI, ITAR, or export-controlled data |
{
"type": "object",
"title": "get_upload_urlArguments",
"required": [
"filename",
"no_controlled_data"
],
"properties": {
"filename": {
"type": "string",
"title": "Filename",
"description": "File name with extension (.stl, .3mf, .obj, .step)"
},
"no_controlled_data": {
"type": "boolean",
"title": "No Controlled Data",
"description": "Must be true: confirms the file contains no CUI, ITAR, or export-controlled data"
}
}
}Orders for this account, newest first. Filter by quote_id to check whether a checkout link was paid.
| Argument | Type | Description |
|---|---|---|
| quote_id | any | Only orders for this quote id (qt_...) |
{
"type": "object",
"title": "list_ordersArguments",
"properties": {
"quote_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Quote Id",
"default": null,
"description": "Only orders for this quote id (qt_...)"
}
}
}Your 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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return, newest first (1-200) |
| status | string | Which quotes: 'open' (the default), 'expired' (discarded), 'ordered', or 'all' |
{
"type": "object",
"title": "list_quotesArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "How many to return, newest first (1-200)"
},
"status": {
"enum": [
"open",
"expired",
"ordered",
"all"
],
"type": "string",
"title": "Status",
"default": "open",
"description": "Which quotes: 'open' (the default), 'expired' (discarded), 'ordered', or 'all'"
}
}
}Option 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.
| Argument | Type | Description |
|---|---|---|
| quote_id* | string | Quote id (qt_...) returned by create_quote |
| use_credit | boolean | Apply account credit before charging USDC |
| confirm_credit | any | The credit_confirmation token from the previous call, to place an order fully paid by account credit |
| payment_signature | any | Base64 x402 PAYMENT-SIGNATURE for the requirements from the first call; omit to get the requirements |
{
"type": "object",
"title": "pay_with_cryptoArguments",
"required": [
"quote_id"
],
"properties": {
"quote_id": {
"type": "string",
"title": "Quote Id",
"description": "Quote id (qt_...) returned by create_quote"
},
"use_credit": {
"type": "boolean",
"title": "Use Credit",
"default": true,
"description": "Apply account credit before charging USDC"
},
"confirm_credit": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Confirm Credit",
"default": null,
"description": "The credit_confirmation token from the previous call, to place an order fully paid by account credit"
},
"payment_signature": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Payment Signature",
"default": null,
"description": "Base64 x402 PAYMENT-SIGNATURE for the requirements from the first call; omit to get the requirements"
}
}
}Ask 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.
| Argument | Type | Description |
|---|---|---|
| reason* | string | Why the order should be canceled, for the person who reviews it |
| order_id* | string | Order id (ord_...) from list_orders or the paid quote |
{
"type": "object",
"title": "request_order_cancellationArguments",
"required": [
"order_id",
"reason"
],
"properties": {
"reason": {
"type": "string",
"title": "Reason",
"maxLength": 1000,
"description": "Why the order should be canceled, for the person who reviews it"
},
"order_id": {
"type": "string",
"title": "Order Id",
"description": "Order id (ord_...) from list_orders or the paid quote"
}
}
}For USDC orders: receive refunds as 'usdc' (sent to the paying wallet) or 'credit' (account credit).
| Argument | Type | Description |
|---|---|---|
| method* | string | 'usdc' sends refunds to the paying wallet; 'credit' adds them to account credit |
| order_id* | string | Order id (ord_...) from list_orders or the paid quote |
{
"type": "object",
"title": "set_refund_preferenceArguments",
"required": [
"order_id",
"method"
],
"properties": {
"method": {
"enum": [
"usdc",
"credit"
],
"type": "string",
"title": "Method",
"description": "'usdc' sends refunds to the paying wallet; 'credit' adds them to account credit"
},
"order_id": {
"type": "string",
"title": "Order Id",
"description": "Order id (ord_...) from list_orders or the paid quote"
}
}
}Change 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.
| Argument | Type | Description |
|---|---|---|
| name | any | Name of the agent or app placing orders |
| any | Email for the account notice, receipts, and order problems | |
| ship_to | any | US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?} |
| callback_url | any | Public https URL for signed part, quote, and order webhooks; empty string removes it |
| organization | any | Company or person operating the agent |
{
"type": "object",
"title": "update_accountArguments",
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Name",
"default": null,
"description": "Name of the agent or app placing orders"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Email",
"default": null,
"description": "Email for the account notice, receipts, and order problems"
},
"ship_to": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Ship To",
"default": null,
"description": "US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}"
},
"callback_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Callback Url",
"default": null,
"description": "Public https URL for signed part, quote, and order webhooks; empty string removes it"
},
"organization": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Organization",
"default": null,
"description": "Company or person operating the agent"
}
}
}Change 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.
| Argument | Type | Description |
|---|---|---|
| speed | any | 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 | any | US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?} |
| quote_id* | string | Quote id (qt_...) returned by create_quote |
| add_items | any | Parts to add, each {part_id, quantity (1-100000), notes?, config: {units, process, material, color?, finishes?, finish_color?, services?, infill?, layer_height?}} |
| po_number | any | Your purchase order number, printed on the quote and order |
| update_items | any | Changes to existing items: [{item_id, quantity?, config?, notes?}]; config is merged into the item's config |
| contact_email | any | Email for receipts and order updates; defaults to the account email |
Upload 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.
| Argument | Type | Description |
|---|---|---|
| url | any | Public https URL of the CAD file; we fetch it server-side |
| filename | any | File name with extension (.stl, .3mf, .obj, .step); required with content_base64 |
| wait_seconds | integer | Seconds (0-30) to wait server-side for the analysis to finish before answering; 0 answers at once |
| content_base64 | any | The file's bytes, base64-encoded (up to about 3 MB) |
| idempotency_key | any | Same key on a retry returns the first result instead of creating another |
| no_controlled_data* | boolean | Must be true: confirms the file contains no CUI, ITAR, or export-controlled data |
{
"type": "object",
"title": "upload_partArguments",
"required": [
"no_controlled_data"
],
"properties": {
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Url",
"default": null,
"description": "Public https URL of the CAD file; we fetch it server-side"
},
"filename": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Filename",
"default": null,
"description": "File name with extension (.stl, .3mf, .obj, .step); required with content_base64"
},
"wait_seconds": {
"type": "integer",
"title": "Wait Seconds",
"default": 0,
"maximum": 30,
"minimum": 0,
"description": "Seconds (0-30) to wait server-side for the analysis to finish before answering; 0 answers at once"
},
"content_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Content Base64",
"default": null,
"description": "The file's bytes, base64-encoded (up to about 3 MB)"
},
"idempotency_key": {
"anyOf": [
{
"type": "string",
"maxLength": 255
},
{
"type": "null"
}
],
"title": "Idempotency Key",
"default": null,
"description": "Same key on a retry returns the first result instead of creating another"
},
"no_controlled_data": {
"type": "boolean",
"title": "No Controlled Data",
"description": "Must be true: confirms the file contains no CUI, ITAR, or export-controlled data"
}
}
}| remove_item_ids |
| any |
| Item ids (itm_...) to remove from the quote |
| shipping_option | any | Shipping option id from the quote's shipping_options |
{
"type": "object",
"title": "update_quoteArguments",
"required": [
"quote_id"
],
"properties": {
"speed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Speed",
"default": null,
"description": "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": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"title": "Ship To",
"default": null,
"description": "US shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}"
},
"quote_id": {
"type": "string",
"title": "Quote Id",
"description": "Quote id (qt_...) returned by create_quote"
},
"add_items": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
{
"type": "null"
}
],
"title": "Add Items",
"default": null,
"description": "Parts to add, each {part_id, quantity (1-100000), notes?, config: {units, process, material, color?, finishes?, finish_color?, services?, infill?, layer_height?}}"
},
"po_number": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Po Number",
"default": null,
"description": "Your purchase order number, printed on the quote and order"
},
"update_items": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
{
"type": "null"
}
],
"title": "Update Items",
"default": null,
"description": "Changes to existing items: [{item_id, quantity?, config?, notes?}]; config is merged into the item's config"
},
"contact_email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Contact Email",
"default": null,
"description": "Email for receipts and order updates; defaults to the account email"
},
"remove_item_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"title": "Remove Item Ids",
"default": null,
"description": "Item ids (itm_...) to remove from the quote"
},
"shipping_option": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Shipping Option",
"default": null,
"description": "Shipping option id from the quote's shipping_options"
}
}
}