Skip to main content
Glama

Agentic Fabrication Network (AFN)

Get fabrication quote

get_fabrication_quote

Get ranked, purchasable offers (price, ETA, preview image) for fabricating a physical item from a design file. process=fdm_print for 3D printing a model (STL/OBJ/PLY/3MF/AMF/STEP/IGES), process=cnc or process=sheetmetal for machined/bent metal parts (STEP, IGES, DXF), process=decal for stickers/decals from artwork (any common image or design file — PNG/JPG/HEIC/TIFF/GIF/BMP/WEBP/AVIF/SVG/PDF/AI/EPS/PSD/CDR, auto-converted). A .ufp file (UFP part container: the design plus saved spec/constraints in one) is accepted anywhere a design file is — its saved intent applies automatically and anything the user states now wins. If the user just drops a file and asks for a price, omit process — UFP routes it. Provide the design either as design_file (an image/file the user attached or you generated — preferred) or file_url (a public URL). REORDERS: if the user has a UFP part number (from a receipt email or a previous session, looks like UFP-… or part_…), pass it as part_number INSTEAD of any file — the stored design and spec are reused and re-shopped across all current vendors. Locked parts additionally require share_key (from the owner's share link). Returns offers across vendors like Google Flights returns flights.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
cutNoDecal cut style — pass the user's words verbatim ("triangle", "die cut", "circle"). Known: contour|square|oval|kiss_cut; anything else gets closest-match offers with a substitution note. Omit to compare the main options
sizeNoPrint size — pass the user's words verbatim ("letter", "24x36", "half letter"). Cards are 3.5x2; flyers 8.5x5.5|8.5x11|11x17; posters 12x18 through 36x48. Unknown sizes get closest-match offers
bendsNoSheet-metal bend lines, each as TWO POINTS in the part's own mm frame (flat DXF parts use z=0: a bend from (0,12.7) to (76.2,12.7) is p1 [0,12.7,0], p2 [76.2,12.7,0]). angle_deg is the target bend angle (90 = a right-angle flange), direction "up"/"down" is the fold direction relative to the flat pattern, radius_mm the requested inside radius (omit it — the shop resolves to its tooling and reports what it used). Pass these when the user articulates WHERE the bends go; a bare "it has 2 bends" is bend_count, not this.
colorNoONLY a color the user actually asked for — NEVER pick one for them. fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye ("black", "dark blue") — vendor-resolved; elastomer_print: Elastomer part color — VCJ parts ship raw; asks resolve with an honest substitution note; cnc: Colour for cnc: with finish anodized it is the anodize colour, otherwise the stock's own colour (black Delrin, clear acrylic). Colour WORDS only; each maker resolves the shade and says what it landed on; laser_cut: Colour of the flat stock for laser_cut (black, clear, natural…). Colour WORDS only; each maker quotes the materials it stocks in that colour and drops the ones that cannot be it; print: Print color ask ("full color", "black and white"). Vendors that only price full color note the substitution; apparel: Garment color for apparel ("black", "heather gray") — vendor-resolved
paperNoPaper stock — free-form ("matte", "glossy", "recycled", "14pt"). Resolved to the closest stock the vendor runs
sidesNosingle|double sided printing (defaults: cards double, flyers/posters single)
unitsNosheetmetal: DXF drawing units: "mm" (default) or "in". STEP files carry their own units; laser_cut: DXF drawing units: "mm" (default) or "in"
finishNocnc: CNC surface finish: standard|anodized|polished|bead_blasted (default standard); sheetmetal: as_cut (default) | deburred | anodized | powder_coat — anodized is aluminum-only; powder coat protects mild steel for outdoor use
insertsNoPEM-style hardware inserts pressed into holes of a sheet-metal part — one record per hole. `insert` is the species (nut | flush_nut | standoff | blind_standoff | stud) and `thread` its size ("M4", "1/4-20"); both are required. When known, add length_mm (standoff/stud post length), the hole's center (located_at_mm, part's own mm frame), its axis, the drilled diameter, and `points` — the signed unit vector the insert's functional side faces (flip = negate). Pass these when the user asks for press-in nuts/standoffs/studs; vendors with a hardware service price them.
processNoWhat to fabricate. If the user just drops a file and asks for a price, OMIT this — UFP detects the file type (artwork, mesh — STL/OBJ/PLY/3MF/AMF, BREP — STEP/IGES, DXF) and routes it to every process that can make it; the response's routing.also_possible lists processes UFP can't quote yet
productNoprint: Print product kind: business_cards|flyers|posters. Omit to quote every kind the artwork fits; apparel: apparel: t_shirt|hoodie|long_sleeve|tank_top (free-form — "tee", "crewneck" resolve to the closest product)
shore_aNoNumeric Shore A durometer ask (10-95, e.g. 40). Resolved to the NEAREST stocked durometer with a substitution note — never a silent swap
tappingNoTapped (threaded) holes for a sheet-metal part — one record per hole the user wants threads cut into. `thread` is the callout in the user's words ("M6", "M4 x 0.7", "1/4-20") and is all that's required; when known, add the hole's center in the part's own mm frame (located_at_mm), its unit axis, the pre-tap drilled diameter, and depth_mm so the shop taps the right hole. Pass these when the user asks for threaded/tapped holes; vendors with a tapping service price them.
vendorsNoOnly these specific vendors/makers ("just quote Slant 3D") — an INCLUDE list of vendor names as they appear on offers. Friendly names accepted ("A3D", "slant 3d"); unmatched names are reported, never an error. Usually OMIT: pass it only when the user explicitly names the vendors they want
calloutsNoDimensions you read off the user's drawing that matter ("hole_diameter 6.5mm ±0.1"). The tightest tolerance prunes vendors that cannot hold it.
deadlineNoLatest acceptable delivery date, ISO YYYY-MM-DD
file_urlNoPublic URL of the design file — only when the design lives at a URL
materialNoONLY a material the user actually asked for — NEVER guess or default one (a silent "pla" on a bare file drop prunes every maker that does not stock it; OMIT instead and each process quotes across its stocked materials so every maker can bid). fdm_print: pla|petg|asa (free-form — "abs", "polycarbonate" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); powder_print: Powder-bed nylon: nylon_12|nylon_12_smooth|nylon_11|nylon_12_gf|nylon_12_esd|nylon_12_white|nylon_pa2200|nylon_12_sls|tpu (free-form — "PA12", "glass filled" resolve to the closest stocked powder); elastomer_print: Jetted elastomer: tepu_30a|tepu_50a (free-form — "TPU", "soft rubber" resolve to the closest stocked durometer); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — "steel", "5052", "stainless" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — "plexiglass", "birch" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — "chrome" etc. gets closest matches)
width_inNoDecal width in inches (default 3)
food_safeNoMust be vendor-certified food safe
height_inNoDecal height in inches (default 3)
high_tempNoMust tolerate sustained heat (vendor heat-resistance claim)
placementNoPrint placement for apparel: front (default) | back | front_back
processesNoOnly quote these fabrication processes — a constraint that narrows the auto-routing fan. Friendly terms accepted ("sheet metal", "3d printing", "cnc", "laser"); unmappable terms are reported, never an error. Usually OMIT: auto-routing quotes every process that can make the file. Pass it only when the user explicitly limits the process
share_keyNoShare key for a LOCKED part — the k=… value from the owner's share link (…/part/UFP-…?k=KEY). Required with part_number when the part is locked; omit otherwise
bend_countNoNumber of bends in the design (bend lines must be in the file). Prices CNC bending; omit for flat parts
quantitiesNoQuantities the user actually wants — pass [1] or [2] if that's the ask. Vendors with a higher minimum quote AT their minimum and the offer notes it (requested_quantity). Default: 25 for decals, 1 for prints; a part_number reorder defaults to the quantity last purchased
ships_fromNoOnly vendors that ship from these countries/regions ("only US vendors", "keep it domestic") — an INCLUDE list. Friendly terms accepted ("US", "Europe", "Germany", "China", "UK"); unmappable terms are reported, never an error. Vendors whose origin is unknown or whose network is worldwide (origin not guaranteed) are excluded, each with a note saying why. Usually OMIT: pass it only when the user explicitly limits where vendors ship from
design_fileNoThe design file itself (user-attached or generated image/STL). ChatGPT supplies the file reference automatically when the user attached a file — just bind the attachment here. Other clients may pass a data: URL (base64) or a public https URL string. Preferred over file_url.
metal_alloyNoMetal AM alloy: stainless_316l|stainless_17_4ph|titanium_ti64|aluminum_alsi10mg|inconel_718|cobalt_chrome|tool_steel_h13|copper (free-form asks like "Ti-6Al-4V" resolve to the closest stocked powder)
part_numberNoUFP part number from a previous paid order (UFP-… or part_…). Reorders: replaces design_file/file_url entirely; any other fields provided override the stored spec
ship_to_zipNoDestination US ZIP code, exactly as the user stated it. OMIT if the user has not given one — NEVER guess or invent a ZIP. Without it, prices come back all-in with shipping to an assumed central-US destination, flagged on routing.ship_to
submersibleNoMust survive submersion in water
metal_finishNoMetal AM post-processing: as_printed|bead_blast|machined_critical|polished|heat_treated (as_printed keeps support witness marks)
requirementsNoVerbatim context terms from the user — materials, finishes, certifications, tolerances ("UV resistant", "anodized: red", "iso 13485", "tolerance: 0.1mm"). UFP applies what it can and reports what it could not; unresolvable terms are logged for vendor sourcing. Do not interrogate the user to fill this — pass what they said.
thickness_inNosheetmetal: Sheet thickness in inches (e.g. 0.063 = 14 ga aluminum). Quoted at the nearest stocked thickness; omit for ~16 ga default; laser_cut: Nominal thickness in inches; quoted at the vendor's nearest stocked thickness. Omit for the material's common stock
outdoor_ratedNoMust survive outdoor exposure
powder_finishNoPowder post-processing: as_printed (raw powder surface) | vapor_polished | polished
max_budget_usdNoHard budget cap in USD, all-in
attachment_urlsNoAdditional files for the SAME part — the PDF drawing next to the STEP, spec sheets, BOMs. Pass everything the user gave you; UFP works out which file is the part and which are supporting documents.
elastomer_finishNoElastomer post-processing: as_printed (VCJ parts ship raw — the whole lane today)
metal_technologyNoMetal AM process: laser_powder_bed (SLM/DMLS/LPBF)|binder_jet|ebm. Omit to let the vendor pick its default for the alloy
min_vendor_starsNoOnly vendors whose displayed review rating is at least this many stars (1-5). Vendors with no reviews yet are excluded — the filter demands demonstrated quality
powder_technologyNoPowder process: mjf (HP Multi Jet Fusion) | sls (laser sintering). Omit to let the vendor pick its default lane for the material
min_vendor_reviewsNoOnly vendors with at least this many verified-purchase reviews
proven_spec_ordersNoOnly vendors with at least N completed orders for this exact process+material — "a vendor that prints PC reliably"
elastomer_technologyNoElastomer process: vapor_cure_jetting (VCJ). Omit to let the vendor pick its default lane for the material

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / color / description
      Previous value: -"ONLY a color the user actually asked for — NEVER pick one for them. fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; elastomer_print: Elastomer part color — VCJ parts ship raw; asks resolve with an honest substitution note; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"New value: +"ONLY a color the user actually asked for — NEVER pick one for them. fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; elastomer_print: Elastomer part color — VCJ parts ship raw; asks resolve with an honest substitution note; cnc: Colour for cnc: with finish anodized it is the anodize colour, otherwise the stock's own colour (black Delrin, clear acrylic). Colour WORDS only; each maker resolves the shade and says what it landed on; laser_cut: Colour of the flat stock for laser_cut (black, clear, natural…). Colour WORDS only; each maker quotes the materials it stocks in that colour and drops the ones that cannot be it; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"
  2. Changed2 schema fields changed
    • addedInput schema / properties / bends / items / properties / face_id
      Added value: +{
      +  "type": "integer"
      +}
    • addedInput schema / properties / bends / items / properties / source
      Added value: +{
      +  "enum": [
      +    "detected",
      +    "user"
      +  ],
      +  "type": "string"
      +}
  3. Changed4 schema fields changed
    • addedInput schema / properties / bends
      Added value: +{
      +  "description": "Sheet-metal bend lines, each as TWO POINTS in the part's own mm frame (flat DXF parts use z=0: a bend from (0,12.7) to (76.2,12.7) is p1 [0,12.7,0], p2 [76.2,12.7,0]). angle_deg is the target bend angle (90 = a right-angle flange), direction \"up\"/\"down\" is the fold direction relative to the flat pattern, radius_mm the requested inside radius (omit it — the shop resolves to its tooling and reports what it used). Pass these when the user articulates WHERE the bends go; a bare \"it has 2 bends\" is bend_count, not this.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle_deg": {
      +        "exclusiveMaximum": 180,
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "direction": {
      +        "enum": [
      +          "up",
      +          "down"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "maxLength": 32,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "line": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "p1": {
      +            "items": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "number"
      +              }
      +            ],
      +            "maxItems": 3,
      +            "minItems": 3,
      +            "type": "array"
      +          },
      +          "p2": {
      +            "items": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "number"
      +              }
      +            ],
      +            "maxItems": 3,
      +            "minItems": 3,
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "p1",
      +          "p2"
      +        ],
      +        "type": "object"
      +      },
      +      "radius_mm": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "line",
      +      "angle_deg",
      +      "direction"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • changedInput schema / properties / finish / description
      Previous value: -"cnc: CNC surface finish: standard|anodized|polished|bead_blasted (default standard); sheetmetal: as_cut (default) | deburred | powder_coat — powder coat protects mild steel for outdoor use"New value: +"cnc: CNC surface finish: standard|anodized|polished|bead_blasted (default standard); sheetmetal: as_cut (default) | deburred | anodized | powder_coat — anodized is aluminum-only; powder coat protects mild steel for outdoor use"
    • addedInput schema / properties / inserts
      Added value: +{
      +  "description": "PEM-style hardware inserts pressed into holes of a sheet-metal part — one record per hole. `insert` is the species (nut | flush_nut | standoff | blind_standoff | stud) and `thread` its size (\"M4\", \"1/4-20\"); both are required. When known, add length_mm (standoff/stud post length), the hole's center (located_at_mm, part's own mm frame), its axis, the drilled diameter, and `points` — the signed unit vector the insert's functional side faces (flip = negate). Pass these when the user asks for press-in nuts/standoffs/studs; vendors with a hardware service price them.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "axis": {
      +        "items": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "number"
      +          }
      +        ],
      +        "maxItems": 3,
      +        "minItems": 3,
      +        "type": "array"
      +      },
      +      "depth_mm": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "drilled_diameter_mm": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "face_id": {
      +        "type": "integer"
      +      },
      +      "hole": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "insert": {
      +        "enum": [
      +          "nut",
      +          "flush_nut",
      +          "standoff",
      +          "blind_standoff",
      +          "stud"
      +        ],
      +        "type": "string"
      +      },
      +      "length_mm": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "located_at_mm": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "number"
      +          },
      +          "y": {
      +            "type": "number"
      +          },
      +          "z": {
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "z"
      +        ],
      +        "type": "object"
      +      },
      +      "points": {
      +        "items": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "number"
      +          }
      +        ],
      +        "maxItems": 3,
      +        "minItems": 3,
      +        "type": "array"
      +      },
      +      "thread": {
      +        "maxLength": 32,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "insert",
      +      "thread"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 200,
      +  "type": "array"
      +}
    • addedInput schema / properties / tapping
      Added value: +{
      +  "description": "Tapped (threaded) holes for a sheet-metal part — one record per hole the user wants threads cut into. `thread` is the callout in the user's words (\"M6\", \"M4 x 0.7\", \"1/4-20\") and is all that's required; when known, add the hole's center in the part's own mm frame (located_at_mm), its unit axis, the pre-tap drilled diameter, and depth_mm so the shop taps the right hole. Pass these when the user asks for threaded/tapped holes; vendors with a tapping service price them.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "axis": {
      +        "items": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "number"
      +          }
      +        ],
      +        "maxItems": 3,
      +        "minItems": 3,
      +        "type": "array"
      +      },
      +      "depth_mm": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "drilled_diameter_mm": {
      +        "exclusiveMinimum": 0,
      +        "type": "number"
      +      },
      +      "face_id": {
      +        "type": "integer"
      +      },
      +      "hole": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "located_at_mm": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "x": {
      +            "type": "number"
      +          },
      +          "y": {
      +            "type": "number"
      +          },
      +          "z": {
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y",
      +          "z"
      +        ],
      +        "type": "object"
      +      },
      +      "thread": {
      +        "maxLength": 32,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "thread"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 200,
      +  "type": "array"
      +}
  4. Changed6 schema fields changed
    • changedInput schema / properties / color / description
      Previous value: -"ONLY a color the user actually asked for — NEVER pick one for them. fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"New value: +"ONLY a color the user actually asked for — NEVER pick one for them. fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; elastomer_print: Elastomer part color — VCJ parts ship raw; asks resolve with an honest substitution note; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"
    • addedInput schema / properties / elastomer_finish
      Added value: +{
      +  "description": "Elastomer post-processing: as_printed (VCJ parts ship raw — the whole lane today)",
      +  "type": "string"
      +}
    • addedInput schema / properties / elastomer_technology
      Added value: +{
      +  "description": "Elastomer process: vapor_cure_jetting (VCJ). Omit to let the vendor pick its default lane for the material",
      +  "type": "string"
      +}
    • changedInput schema / properties / material / description
      Previous value: -"ONLY a material the user actually asked for — NEVER guess or default one (a silent \"pla\" on a bare file drop prunes every maker that does not stock it; OMIT instead and each process quotes across its stocked materials so every maker can bid). fdm_print: pla|petg|asa (free-form — \"abs\", \"polycarbonate\" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); powder_print: Powder-bed nylon: nylon_12|nylon_12_smooth|nylon_11|nylon_12_gf|nylon_12_esd|tpu (free-form — \"PA12\", \"glass filled\" resolve to the closest stocked powder); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — \"steel\", \"5052\", \"stainless\" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — \"plexiglass\", \"birch\" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — \"chrome\" etc. gets closest matches)"New value: +"ONLY a material the user actually asked for — NEVER guess or default one (a silent \"pla\" on a bare file drop prunes every maker that does not stock it; OMIT instead and each process quotes across its stocked materials so every maker can bid). fdm_print: pla|petg|asa (free-form — \"abs\", \"polycarbonate\" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); powder_print: Powder-bed nylon: nylon_12|nylon_12_smooth|nylon_11|nylon_12_gf|nylon_12_esd|nylon_12_white|nylon_pa2200|nylon_12_sls|tpu (free-form — \"PA12\", \"glass filled\" resolve to the closest stocked powder); elastomer_print: Jetted elastomer: tepu_30a|tepu_50a (free-form — \"TPU\", \"soft rubber\" resolve to the closest stocked durometer); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — \"steel\", \"5052\", \"stainless\" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — \"plexiglass\", \"birch\" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — \"chrome\" etc. gets closest matches)"
    • changedInput schema / properties / process / enum
      Previous value: -[
      -  "fdm_print",
      -  "resin_print",
      -  "powder_print",
      -  "metal_print",
      -  "cnc",
      -  "sheetmetal",
      -  "laser_cut",
      -  "decal",
      -  "print",
      -  "apparel"
      -]New value: +[
      +  "fdm_print",
      +  "resin_print",
      +  "powder_print",
      +  "metal_print",
      +  "elastomer_print",
      +  "cnc",
      +  "sheetmetal",
      +  "laser_cut",
      +  "decal",
      +  "print",
      +  "apparel"
      +]
    • addedInput schema / properties / shore_a
      Added value: +{
      +  "description": "Numeric Shore A durometer ask (10-95, e.g. 40). Resolved to the NEAREST stocked durometer with a substitution note — never a silent swap",
      +  "exclusiveMinimum": 0,
      +  "type": "number"
      +}
  5. Changed2 schema fields changed
    • changedInput schema / properties / color / description
      Previous value: -"fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"New value: +"ONLY a color the user actually asked for — NEVER pick one for them. fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"
    • changedInput schema / properties / material / description
      Previous value: -"fdm_print: pla|petg|asa (free-form — \"abs\", \"polycarbonate\" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); powder_print: Powder-bed nylon: nylon_12|nylon_12_smooth|nylon_11|nylon_12_gf|nylon_12_esd|tpu (free-form — \"PA12\", \"glass filled\" resolve to the closest stocked powder); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — \"steel\", \"5052\", \"stainless\" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — \"plexiglass\", \"birch\" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — \"chrome\" etc. gets closest matches)"New value: +"ONLY a material the user actually asked for — NEVER guess or default one (a silent \"pla\" on a bare file drop prunes every maker that does not stock it; OMIT instead and each process quotes across its stocked materials so every maker can bid). fdm_print: pla|petg|asa (free-form — \"abs\", \"polycarbonate\" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); powder_print: Powder-bed nylon: nylon_12|nylon_12_smooth|nylon_11|nylon_12_gf|nylon_12_esd|tpu (free-form — \"PA12\", \"glass filled\" resolve to the closest stocked powder); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — \"steel\", \"5052\", \"stainless\" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — \"plexiglass\", \"birch\" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — \"chrome\" etc. gets closest matches)"
  6. Changed5 schema fields changed
    • changedInput schema / properties / color / description
      Previous value: -"fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"New value: +"fdm_print: Filament color for fdm_print (e.g. black, red); resin_print: Resin color for resin_print (e.g. gray, white, black); powder_print: Powder part color: raw gray/white, or a dye (\"black\", \"dark blue\") — vendor-resolved; print: Print color ask (\"full color\", \"black and white\"). Vendors that only price full color note the substitution; apparel: Garment color for apparel (\"black\", \"heather gray\") — vendor-resolved"
    • changedInput schema / properties / material / description
      Previous value: -"fdm_print: pla|petg|asa (free-form — \"abs\", \"polycarbonate\" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — \"steel\", \"5052\", \"stainless\" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — \"plexiglass\", \"birch\" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — \"chrome\" etc. gets closest matches)"New value: +"fdm_print: pla|petg|asa (free-form — \"abs\", \"polycarbonate\" asks resolve to the closest stocked filament with a substitution note); resin_print: standard|tough|high_temp|high_detail resin (free-form asks resolve to the closest supported resin); powder_print: Powder-bed nylon: nylon_12|nylon_12_smooth|nylon_11|nylon_12_gf|nylon_12_esd|tpu (free-form — \"PA12\", \"glass filled\" resolve to the closest stocked powder); cnc: aluminum_6061|aluminum_7075|stainless_304|titanium|brass|acetal|delrin|abs|nylon_pa6|peek|acrylic (free-form asks resolve to the closest supported stock); sheetmetal: mild_steel|aluminum_5052|stainless_304 (free-form — \"steel\", \"5052\", \"stainless\" resolve; unknown asks get closest-match offers). Omit to compare the defaults; laser_cut: acrylic|plywood|mdf|delrin|uhmw|hdpe|g10|carbon_fiber|mild_steel|aluminum_5052|stainless_304 (free-form — \"plexiglass\", \"birch\" resolve; unknown asks get closest-match offers); decal: vinyl|holographic|transparent|glitter (free-form — \"chrome\" etc. gets closest matches)"
    • addedInput schema / properties / powder_finish
      Added value: +{
      +  "description": "Powder post-processing: as_printed (raw powder surface) | vapor_polished | polished",
      +  "type": "string"
      +}
    • addedInput schema / properties / powder_technology
      Added value: +{
      +  "description": "Powder process: mjf (HP Multi Jet Fusion) | sls (laser sintering). Omit to let the vendor pick its default lane for the material",
      +  "type": "string"
      +}
    • changedInput schema / properties / process / enum
      Previous value: -[
      -  "fdm_print",
      -  "resin_print",
      -  "metal_print",
      -  "cnc",
      -  "sheetmetal",
      -  "laser_cut",
      -  "decal",
      -  "print",
      -  "apparel"
      -]New value: +[
      +  "fdm_print",
      +  "resin_print",
      +  "powder_print",
      +  "metal_print",
      +  "cnc",
      +  "sheetmetal",
      +  "laser_cut",
      +  "decal",
      +  "print",
      +  "apparel"
      +]
  7. Changed1 schema field changed
    • addedInput schema / properties / vendors
      Added value: +{
      +  "description": "Only these specific vendors/makers (\"just quote Slant 3D\") — an INCLUDE list of vendor names as they appear on offers. Friendly names accepted (\"A3D\", \"slant 3d\"); unmatched names are reported, never an error. Usually OMIT: pass it only when the user explicitly names the vendors they want",
      +  "items": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 16,
      +  "type": "array"
      +}
  8. Changed1 schema field changed
    • addedInput schema / properties / ships_from
      Added value: +{
      +  "description": "Only vendors that ship from these countries/regions (\"only US vendors\", \"keep it domestic\") — an INCLUDE list. Friendly terms accepted (\"US\", \"Europe\", \"Germany\", \"China\", \"UK\"); unmappable terms are reported, never an error. Vendors whose origin is unknown or whose network is worldwide (origin not guaranteed) are excluded, each with a note saying why. Usually OMIT: pass it only when the user explicitly limits where vendors ship from",
      +  "items": {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 8,
      +  "type": "array"
      +}
  9. Changed5 schema fields changed
    • addedInput schema / properties / metal_alloy
      Added value: +{
      +  "description": "Metal AM alloy: stainless_316l|stainless_17_4ph|titanium_ti64|aluminum_alsi10mg|inconel_718|cobalt_chrome|tool_steel_h13|copper (free-form asks like \"Ti-6Al-4V\" resolve to the closest stocked powder)",
      +  "type": "string"
      +}
    • addedInput schema / properties / metal_finish
      Added value: +{
      +  "description": "Metal AM post-processing: as_printed|bead_blast|machined_critical|polished|heat_treated (as_printed keeps support witness marks)",
      +  "type": "string"
      +}
    • addedInput schema / properties / metal_technology
      Added value: +{
      +  "description": "Metal AM process: laser_powder_bed (SLM/DMLS/LPBF)|binder_jet|ebm. Omit to let the vendor pick its default for the alloy",
      +  "type": "string"
      +}
    • changedInput schema / properties / process / enum
      Previous value: -[
      -  "fdm_print",
      -  "resin_print",
      -  "cnc",
      -  "sheetmetal",
      -  "laser_cut",
      -  "decal",
      -  "print",
      -  "apparel"
      -]New value: +[
      +  "fdm_print",
      +  "resin_print",
      +  "metal_print",
      +  "cnc",
      +  "sheetmetal",
      +  "laser_cut",
      +  "decal",
      +  "print",
      +  "apparel"
      +]
    • changedInput schema / properties / ship_to_zip / description
      Previous value: -"Destination US ZIP code, exactly as the user stated it. OMIT if the user has not given one — NEVER guess or invent a ZIP. Without it, delivery dates come back labeled as estimated for a default US destination"New value: +"Destination US ZIP code, exactly as the user stated it. OMIT if the user has not given one — NEVER guess or invent a ZIP. Without it, prices come back all-in with shipping to an assumed central-US destination, flagged on routing.ship_to"
  10. Changed1 schema field changed
    • changedInput schema / properties / quantities / description
      Previous value: -"Quantities the user actually wants — pass [1] or [2] if that's the ask. Vendors with a higher minimum quote AT their minimum and the offer notes it (requested_quantity). Default: 25 for decals, 1 for prints"New value: +"Quantities the user actually wants — pass [1] or [2] if that's the ask. Vendors with a higher minimum quote AT their minimum and the offer notes it (requested_quantity). Default: 25 for decals, 1 for prints; a part_number reorder defaults to the quantity last purchased"
  11. First observed

TDQS

A4.6/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses non-obvious behaviors: UFP auto-routing, reorder override semantics, locked-part share_key requirement, closest-match substitution behavior, vendor-minimum quoting, and default quantities. It does not explicitly mention caching, retries, or the response envelope, but it adds substantial transparency beyond what annotations would typically convey.

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

Conciseness4/5

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

The description is long but dense — nearly every sentence carries routing logic or process-specific semantics. It front-loads the core purpose and process-to-file-format mapping, then branches into reorders, file sources, and vendor filtering. It could be tightened by moving some enum details to the schema, but given the tool's complexity it is appropriately structured and not padded.

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

Completeness4/5

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

The description covers the main decision paths: which process, which file source, whether to use a part_number, locked-part access, vendor/shipping filters, and shipping destination. It lacks an explicit description of the full output shape beyond 'ranked, purchasable offers (price, ETA, preview image)', but no output schema exists and the tool's core decision logic is well covered.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds high-value guidance beyond the schema: it explains UFP's auto-applied intent, the precedence of part_number over files, the design_file preference, ship_to_zip omission rule, and default behavior for several parameters. For a 47-parameter tool, this strategic guidance is genuinely useful and not redundant with the schema.

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

Purpose5/5

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

The description starts with a specific verb phrase — 'Get ranked, purchasable offers (price, ETA, preview image) for fabricating a physical item from a design file' — and clearly identifies the resource (design file) and output (ranked offers). It distinguishes itself from siblings like preview_quote, poll_quote, and finalize_quote by framing this as the entry point that returns purchasable vendor offers.

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

Usage Guidelines5/5

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

Gives explicit when-to-use and when-not-to-use guidance for multiple branches: omit process when the user just drops a file, pass part_number instead of a file for reorders, use design_file rather than file_url, and 'usually OMIT' vendors/processes/ships_from unless the user explicitly names them. This routing guidance is unusually rich and specific.

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