Skip to main content
Glama

Make Parts Now: 3D Printing & CNC Machining Quotes

update_quote

Destructive

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.

Input Schema

NameRequiredDescriptionDefault
speedNoProduction speed: economy, standard, fast, faster, or fastest (FDM only). Faster speeds add a rush fee; get_capabilities lists each process's speeds.
ship_toNoUS shipping address: {name, line1, line2?, city, state, postal_code, country: 'US', phone?}
quote_idYesQuote id (qt_...) returned by create_quote
add_itemsNoParts to add, each {part_id, quantity (1-100000), notes?, config: {units, process, material, color?, finishes?, finish_color?, services?, infill?, layer_height?}}
po_numberNoYour purchase order number, printed on the quote and order
update_itemsNoChanges to existing items: [{item_id, quantity?, config?, notes?}]; config is merged into the item's config
contact_emailNoEmail for receipts and order updates; defaults to the account email
remove_item_idsNoItem ids (itm_...) to remove from the quote
shipping_optionNoShipping option id from the quote's shipping_options

Output Schema

NameRequiredDescriptionDefault
idYesQuote id (qt_...)
itemsYesLines: {id, position, part, config, quantity, notes, review_status, review_note, pricing, snapshot_url, action_needed?}
readyYesTrue when the quote can be paid
speedNoChosen production speed: economy, standard, fast, faster or fastest
tiersNoOne entry per speed: price, ship-by and arrive-by dates, eligibility
numberNoQuote number shown on the PDF and the website
statusNoopen, ordered or expired (discarded or past its date)
totalsNoTotals for the chosen speed, including total_before_tax
ship_toNoShipping address {name, company?, line1, line2?, city, state, postal_code, country, phone?}
blockingNoWhat stops the quote from being ready: {item_id, state, detail}
tax_noteNoSales tax is added at checkout
min_orderNoOrder minimum in dollars
po_numberNoYour purchase order number
share_urlNoThe quote's page on makepartsnow.com, to show a person the parts and prices
created_atNoISO 8601
expires_atNoISO 8601. Prices hold until then; a later read re-prices at live rates
next_stepsYesPlain-English instructions for what to do next
share_tokenNoToken of the quote's share link, {base}/quotes/share/{share_token}
needs_reviewNoTrue while a part waits for manual review; payment is blocked until then
contact_emailNoEmail for receipts and order updates
shipping_choiceNoId of the chosen shipping option
rate_set_versionNoVersion of the price list the quote was priced with
shipping_optionsNoCarrier options for ship_to; choose one with shipping_option
free_shipping_remainingNoDollars more to reach free shipping (0 when reached)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / share_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The quote's page on makepartsnow.com, to show a person the parts and prices",
      +  "title": "Share Url"
      +}
  2. Changed4 schema fields changed
    • addedOutput schema / description
      Added value: +"A priced quote. Fields can be added; none is removed or renamed within v1."
    • addedOutput schema / properties
      Added value: +{
      +  "blocking": {
      +    "anyOf": [
      +      {
      +        "items": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "What stops the quote from being ready: {item_id, state, detail}",
      +    "title": "Blocking"
      +  },
      +  "contact_email": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Email for receipts and order updates",
      +    "title": "Contact Email"
      +  },
      +  "created_at": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "ISO 8601",
      +    "title": "Created At"
      +  },
      +  "expires_at": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "ISO 8601. Prices hold until then; a later read re-prices at live rates",
      +    "title": "Expires At"
      +  },
      +  "free_shipping_remaining": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Dollars more to reach free shipping (0 when reached)",
      +    "title": "Free Shipping Remaining"
      +  },
      +  "id": {
      +    "description": "Quote id (qt_...)",
      +    "title": "Id",
      +    "type": "string"
      +  },
      +  "items": {
      +    "description": "Lines: {id, position, part, config, quantity, notes, review_status, review_note, pricing, snapshot_url, action_needed?}",
      +    "items": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "title": "Items",
      +    "type": "array"
      +  },
      +  "min_order": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Order minimum in dollars",
      +    "title": "Min Order"
      +  },
      +  "needs_review": {
      +    "anyOf": [
      +      {
      +        "type": "boolean"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "True while a part waits for manual review; payment is blocked until then",
      +    "title": "Needs Review"
      +  },
      +  "next_steps": {
      +    "description": "Plain-English instructions for what to do next",
      +    "items": {
      +      "type": "string"
      +    },
      +    "title": "Next Steps",
      +    "type": "array"
      +  },
      +  "number": {
      +    "anyOf": [
      +      {
      +        "type": "integer"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Quote number shown on the PDF and the website",
      +    "title": "Number"
      +  },
      +  "po_number": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Your purchase order number",
      +    "title": "Po Number"
      +  },
      +  "rate_set_version": {
      +    "anyOf": [
      +      {
      +        "type": "integer"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Version of the price list the quote was priced with",
      +    "title": "Rate Set Version"
      +  },
      +  "ready": {
      +    "description": "True when the quote can be paid",
      +    "title": "Ready",
      +    "type": "boolean"
      +  },
      +  "share_token": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Token of the quote's share link, {base}/quotes/share/{share_token}",
      +    "title": "Share Token"
      +  },
      +  "ship_to": {
      +    "anyOf": [
      +      {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Shipping address {name, company?, line1, line2?, city, state, postal_code, country, phone?}",
      +    "title": "Ship To"
      +  },
      +  "shipping_choice": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Id of the chosen shipping option",
      +    "title": "Shipping Choice"
      +  },
      +  "shipping_options": {
      +    "anyOf": [
      +      {
      +        "items": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Carrier options for ship_to; choose one with shipping_option",
      +    "title": "Shipping Options"
      +  },
      +  "speed": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Chosen production speed: economy, standard, fast, faster or fastest",
      +    "title": "Speed"
      +  },
      +  "status": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "open, ordered or expired (discarded or past its date)",
      +    "title": "Status"
      +  },
      +  "tax_note": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Sales tax is added at checkout",
      +    "title": "Tax Note"
      +  },
      +  "tiers": {
      +    "anyOf": [
      +      {
      +        "items": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "One entry per speed: price, ship-by and arrive-by dates, eligibility",
      +    "title": "Tiers"
      +  },
      +  "totals": {
      +    "anyOf": [
      +      {
      +        "additionalProperties": true,
      +        "type": "object"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Totals for the chosen speed, including total_before_tax",
      +    "title": "Totals"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "id",
      +  "items",
      +  "ready",
      +  "next_steps"
      +]
    • changedOutput schema / title
      Previous value: -"update_quoteDictOutput"New value: +"QuoteView"
  3. First observed

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, so the safety profile is covered structurally. The description adds one genuinely useful behavioral fact — config is merged into the item's existing config rather than replaced — but says nothing about re-pricing, editability windows, or what remove_item_ids/add_items imply for the quote state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the changeable fields, which is good. However the second sentence duplicates the schema's update_items description almost verbatim, so it consumes space without adding information beyond the merge note.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with an output schema and full schema coverage, the description is serviceable but incomplete at the conceptual level: it never mentions that items can be added (add_items) or removed (remove_item_ids), or that po_number/contact_email are settable, so an agent scanning only the description may miss that this tool also handles item add/remove.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all nine parameters, including the speed enum and the item shapes. The description largely restates schema content (speed values, ship_to, update_items shape) and adds only the merge-vs-replace nuance, landing at the baseline for a schema-complete tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'Change' plus the enumerated mutable fields (speed, ship_to, shipping_option, items) makes it clear this edits an existing quote rather than creating one. It doesn't explicitly name the quote resource or distinguish itself from discard_quote/get_quote in prose, but the field list is specific enough to identify the operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance: nothing states that the quote must already exist, must still be editable, or that this is the path to modify an existing quote versus create_quote or discard_quote. The agent must infer the call context from the required quote_id alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources