Skip to main content

Agentic Fabrication Network (AFN)

ai.agenticfabricationnetwork/ufpVersion 0.1.1

Turn designs into shipped parts: quote 3D printing, CNC, and decals, then check out.

Status

Responds377 msAnswered our handshake without sign-in.

Registry data may be out of date

We could not refresh it, so this page shows the last copy.
Last checked
Nov 14, 2026, 13:26 UTC
Latency
377 ms
Remotes responding
1 of 1
Sign-in
No sign-in
Hosting
Hosted outside the EU (detected)
Registry data as of
Nov 14, 2026, 22:14 UTC

Data from the official MCP Registry, checked by run.zero. How we check

Connect

Streamable HTTP
https://agenticfabricationnetwork.ai/mcpResponds377 ms
No sign-in

Claude Code

claude mcp add --transport http ufp https://agenticfabricationnetwork.ai/mcp

Claude Desktop and claude.ai

Settings > Connectors > Add custom connector
Name: ufp
Remote MCP server URL: https://agenticfabricationnetwork.ai/mcp

Cursor

{
  "mcpServers": {
    "ufp": {
      "url": "https://agenticfabricationnetwork.ai/mcp"
    }
  }
}

VS Code

code --add-mcp '{"name":"ufp","type":"http","url":"https://agenticfabricationnetwork.ai/mcp"}'

Built your own server? run.zero hosts MCP servers on European infrastructure.

Host your own MCP server on run.zero

Tools

22 tools

Tools of Agentic Fabrication Network (AFN)
Read-only
Idempotent
Open world
add_to_cartPut one more part in a cart. Name it ONE way: quote_id (a quote you already have — its shops are not asked again, and the part arrives configured and picked exactly as that quote is), or file_id or file_url (a design that has no quote yet — it gets one ordinary quote, priced exactly as get_fabrication_quote would price it). A cart holds at most 24 parts. Returns the whole cart. HOW A CART WORKS: each part in a cart IS a quote — its material, finish, quantity, rules and its pick (selection) live on that part's quote, and nothing is kept twice. To change a part, call refine_quote on its quote_id and pass cart_item_id: the cart follows the part to the new quote by itself. To pick the option to order for a part, store the pick on its quote (refine_quote selection). The cart_id is the only key to the cart — whoever holds it can read and change it — so give it only to the user it belongs to, and never put it in a link you did not get from the network.NoNoNot declaredYes
check_offerRun the shop's manufacturability check on ONE offer whose manufacturability_check.status is "unchecked" (the price stands from the shop's own pricing, but no shop was asked for that material / finish yet) or still "checking". The network asks that shop once for exactly this option — its material, gauge, finish, quantity and the quote's destination — and lands the answer on the SAME offer: passed (orderable at the shown price; a status of "repriced" means exactly the same — the price shown is the shop's, never tell the user it changed) or failed (the shop could not confirm the part: the offer cannot be ordered and is no longer listed on the quote — the answer still carries it, with a plain message; tell the user and carry on with the offers that are listed). Call it when the user settles on such an offer and before create_checkout (checkout refuses an unchecked offer). Waits up to wait_s (default 45) for the shop; pending: true means the shop is still answering — re-read the quote shortly. Nothing else on the quote changes. On an instant-only quote (routing.instant_only true) no shop is asked: the offer comes back unchanged with a plain message — relay it, and quote the part again without instant_only if the user wants to order. On a lazy quote (routing.lazy true) this call is how a shop is asked at all: it asks the one shop of this offer, and the offer can be ordered once it passes. A shop's confirmation of an offer is good for 15 minutes: while it stands the offer carries confirmed_until (an ISO time) and can be ordered. After it the offer is NOT failed and NOT removed — it keeps its place and the price the shop last confirmed, and its manufacturability_check reads status "unchecked" with reason "confirmation_lapsed". CHOOSING STARTS THAT SHOP'S CHECK: when the user settles on an option and you store the pick, that one shop is asked again by itself (the answer's selection_match.check reads "running"), and create_checkout and checkout_cart ask it themselves too whenNoNoNot declaredYes
checkout_cartOrder every part of a cart with ONE payment link. Each part needs a pick that comes to exactly one option (its selection_match reads "one"). A part whose shop still has to confirm it (get_cart shows checkout.state "needs_check" or "checking") is confirmed by this call itself: its one shop is asked — or the ask already running is joined — and the call waits up to wait_s for the answers; no check_offer and no reconfirm read is needed first. Pass max_total_cents: the cart total_cents the user agreed to. ALL OR NOTHING: if any part cannot be ordered, nothing is created, nothing is charged, and the answer (cart_not_ready) names each such part and why — fix those and call again. Pass only_selected true to leave the parts with nothing picked in the cart and order the rest. Returns checkout_url — ONE secure payment page for the whole cart; give it to the user to pay. After payment AFN places one order per part with its own shop; each part ships by itself unless by_shop[].shipping.mode in the answer reads "combined" for its shop (then that shop takes its parts as one order and ships them together); each order sends its own confirmation email, and get_order_status with the checkout_id shows them all. idempotency_key: make up one unique string for this attempt and send the SAME string only to repeat the very same call — it then returns the same checkout and payment link, never a second set of orders. After ANYTHING changed (the address, the coupon, a part, a pick) make up a NEW string: the old one is refused (idempotency_key_reused), because its payment link is for the cart as it was. A part already paid for by itself is named in the refusal like any other part. When a shop's answer did not come inside wait_s, the cart is refused with that part named (offer_not_ready): send the SAME call again with the SAME idempotency_key (a refused call never uses its key) — it joins the asks already running and nothing is asked twice. When the cart's confirmed total is higher than the user NoNoNot declaredNo
create_cartStart a cart, for a user who wants several parts and one payment. Pass items to put parts in at once; each is named by quote_id (a quote you already have — its shops are not asked again), or by file_id or file_url (a design that has no quote yet — it gets one ordinary quote, priced exactly as get_fabrication_quote would price it). Returns the cart with its cart_id. HOW A CART WORKS: each part in a cart IS a quote — its material, finish, quantity, rules and its pick (selection) live on that part's quote, and nothing is kept twice. To change a part, call refine_quote on its quote_id and pass cart_item_id: the cart follows the part to the new quote by itself. To pick the option to order for a part, store the pick on its quote (refine_quote selection). The cart_id is the only key to the cart — whoever holds it can read and change it — so give it only to the user it belongs to, and never put it in a link you did not get from the network.NoNoNot declaredYes
create_checkoutCreate the order and get a hosted payment link for a chosen offer. Call this as soon as the user picks an offer + shipping speed. This tool takes NO personal details: never ask for — and never pass — a name, address, email, or phone; the secure payment page collects the shipping address, email, and phone (and billing) itself, even when the user volunteered them in chat. Returns checkout_url — AFN's order page (what is being made, by which shop, the all-in price) with a Continue to payment button to the secure hosted payment page; give the link to the user. UFP places the vendor order automatically after payment. An offer whose shop still has to confirm it (manufacturability_check.status "unchecked", or confirmed more than 15 minutes ago) is confirmed by this call itself, and one whose status is "checking" is waited for (the price is set; the shop is confirming it can make the part as drawn) — no separate check_offer call. Pass max_total_cents: the price the user agreed to (the offer's subtotal_cents plus the chosen shipping cost_cents). THE CHECKOUT RULE, enforced by the network for every client: an offer can be ordered only when the shop's own system has accepted this part at this price — its manufacturability check has passed, the price is the shop's own number (price_basis "vendor_api"), and no price confirmation is outstanding. That acceptance is good for 15 minutes (the offer's confirmed_until). THE CHECKOUT CONFIRMS WHAT NEEDS CONFIRMING ITSELF: when the option's shop has not confirmed it, or did more than 15 minutes ago, the checkout asks that ONE shop (it joins the ask already running when choosing the option started one) and waits up to wait_s for the answer; when the wait runs out first the answer is offer_not_ready with retry_after_s — send the SAME call again, it joins the ask and nothing is asked twice. THE PAY RULE: the same or a lower price goes straight to the payment link; a price the shop confirmed HIGHER than the user agreed to stops ONCE (price_wNoNoNot declaredNo
finalize_quoteONLY for the case where a quote response came back with an EMPTY board and told you to call this: waits for the vendors to answer (up to ~40s) and returns their offers as a full board. Call with just quote_id, immediately, and say nothing substantive before it. NEVER call it on a response that already listed offers — that board is final, and this would add nothing.NoYesNot declaredNo
fork_cartCopy a cart: the same parts in the same order, each configured and picked as it was. Use it when the user opens a shared cart, so that nothing they change reaches the cart it was copied from; work on the cart_id this returns from then on. By default the copy is a NEW cart; pass into_cart_id (an open cart the user already holds) to add the copied parts to that cart instead — one call, and that cart is the answer. Use it with for_link true when the user wants to share their own cart: the copy is then a shared cart (status "shared") that can only be read and copied, and its cart_id is the one to hand out — never hand out the cart_id of the cart the user is working on. Pass item_ids to copy only those parts (one part shared by itself is a cart of one). Each part of the answer says quoted_anew: true when a new quote was made for it, false when the shared quote was copied. WHAT EACH WAY COSTS IN SHOP CONTACT: no shop is asked to make any copy, and the answer comes back at once with every part priced. A for_link copy never contacts a shop, then or later. A copy with recheck false never contacts a shop either — use it when you only want to read what is in a shared cart. Any other copy (the default, for a user who opened a shared cart to act on it) asks nobody when the cart's answers are under 24 hours old: each part comes with its shops' answers as they stand. Only a part whose answers are older than 24 hours is asked about again after the copy answers — its shops, as an ordinary quote of that part would ask them, one part at a time — and if anyone got answers for this same part and request in the last 24 hours those are copied instead with nobody asked. Never copy the same cart twice to refresh it — read the copy you have. LIMITS: copies are limited per caller a minute and a day, and the quotes the re-check will really start count against the caller's quote limit (a part whose shops are already being asked, or are queued to be asked, for another copy of the same request stNoNoNot declaredYes
get_cartRead a cart: every part with its quote, the rules on it (constraints_asked), its pick (selection) and what the pick comes to — the shop, the price, the shipping speed and the arrival date — plus whether that option can be ordered right now (checkout.state: "ready"; "needs_check" = the shop has to confirm it first; "checking" = the shop is answering, read again shortly; "not_orderable" = pick another option; checkout.reason says why in a sentence and checkout.code says it as one word — on a "needs_check" part, "confirmation_lapsed" or "never_confirmed" mean reconfirm true will ask its one shop (and so will checkout_cart, by itself), "ask_limited" means the option is chosen and its shop is asked when the user pays, while "rechecking" (the part was copied from a shared cart and its shops are still being asked: read the cart again) and "shop_asks_off" (the network is not asking shops for this part right now) mean reconfirm true will start nothing for it). now is the network's own clock when the answer was made: work out the time left until checkout.confirmed_until from now, not from your own clock. by_shop groups the picked parts by the shop that makes them with subtotals and shipping, and total_cents is what the picked parts cost together. Parts with nothing picked are listed in unpicked_item_ids and are in no total. A plain read asks no shop. Pass reopen true when the user comes back to a cart: parts older than 24 hours are then asked about again, once, one part at a time (the answer's reopen says "asked", "none_needed", or "press_needed" — the old parts were already asked about again once and nothing was done to the cart since; pass pressed true only when the user asks for today's prices). picked.stale, picked.answered_at, picked.eta_days and picked.eta_approximate read as they do on an offer: when eta_approximate is true say "about N days", never the date. HOW LONG A PRICE HOLDS: a shop's confirmation of a picked option is good for 15 minutes. While it stands the paNoNoNot declaredYes
get_fabrication_quoteGet fabrication price and delivery offers for a design file or an existing AFN part number. Supports 3D printing, CNC machining, sheet metal, decals, print, and apparel. If the user just provides a file and asks for a price, omit process so AFN can route it to suitable makers. Provide the design as design_file (an attachment or generated file) or file_url (a public URL). For a reorder, pass the UFP part number as part_number instead of a file; locked parts also require share_key from the owner's share link. A .ufp part container is accepted as a design file, and its saved specification applies unless the user changes it. Some offers carry manufacturability_check: the price is set; the shop is confirming it can make the part as drawn (status "checking" for about expected_s seconds, then passed or failed; a status of "repriced" means passed — the price shown is the shop's, never say it changed) — present them as real prices; create_checkout on one that is still checking waits for the shop's answer and never orders a price the shop has not confirmed. Pass instant_only true only when the user wants instant prices without any shop being asked (a demo, a quick look): the quote comes back complete at once, every offer carries its instant price with manufacturability_check.status "unchecked", and nothing on that quote can be checked or ordered — check_offer answers without asking the shop and create_checkout refuses. Quotes made from it with refine_quote, and re-quotes of its .ufp part file, stay instant-only; to order, quote the same part again without instant_only. Pass lazy true when the user wants to look at prices now and have a shop asked only for the offer they pick: no shop is asked to make the quote, it comes back complete at once, and every offer carries our instant price with manufacturability_check.status "unchecked". Unlike instant_only, such a quote CAN be ordered: run check_offer on the offer the user picks (that asks its one shop), and create_checkout once tNoNoNot declaredYes
get_material_guideHonest, cited material intelligence for material-choice / strength / durability / heat / outdoor questions ("my PLA part broke, what's stronger?", "will this survive outdoors?"). Returns caveats-FIRST facts: published specs (tensile, heat-deflection, UV/outdoor, chemical) each tagged vendor-cited vs general engineering knowledge, "stronger/tougher/hotter than X" ladders (PLA→PETG→ABS/ASA→nylon/PC→metals), and finish/coating options. Call it BEFORE answering such a question, then relay the facts. It supplies FACTS ONLY — comparative specs and vendor-admitted caveats, never a fitness-for-purpose or safety guarantee (that stays your judgment boundary); name express vendor claims "advertised", not "certified".NoYesNot declaredNo
get_network_capabilitiesThe LIVE catalog of what the fabrication network can do RIGHT NOW — no quote needed. Returns the services ledger (tapping, inserts, welding, bending, finishes… with each shop's own size/material/thickness windows), the network's sheet gauge ladder, the stocked hardware combinations (species x thread) with stocked lengths and shop counts — the most-stocked length is the steering default for an unspecified length — the finish options with their stocked color menus, every colour the network can make a part in (network_catalog.colors: per colour family, how many shops stock a material in it and how many coat in it, with the shades — ask for one by passing the family word as `color` with no finish), the material groups a picker shows (network_catalog.material_groups: Plastics, Metals, Woods, Foams, Rubbers, Composites, Paper cork and fabric… with the stock families live under each and the words that ask for them), and per-process manufacturability rules. This is live state, not a spec sheet: it changes as connectors join, leave, or have capability branches toggled, so call it fresh when the user asks what's possible (materials, gauges, hardware, colors, services) rather than answering from memory.NoYesNot declaredNo
get_order_statusCheck status, ETA and tracking for a UFP order. Pass a checkout id (co_…, from checkout_cart) in order_id to get every order of that cart checkout at once — each part is its own order with its own shop, status and tracking. The answer carries status_url: a link the user can open or pass on to follow the order with no sign-in; it shows progress only (no price, no address, nothing that can change the order).NoYesNot declaredNo
get_price_curveHow the per-unit price moves with quantity for a quote you already have: for every shop on the board, the item price per unit at each quantity (default 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000; pass up to 16 of your own in 1..10000) from that shop's own pricing with the network's markup included, plus its arrival window — instant, no shop is contacted, nothing changes on the quote. Call it when the user asks what more or fewer pieces would cost ("what would 50 run me?", "any price breaks?"). The board's quoted price stays the ceiling at the chosen quantity (each option's `live` row); a null cell means that shop's pricing does not cover that quantity — refine_quote with the new quantities gets the real number. Present these as the shops' own pricing, never as an estimate; every order still passes the manufacturability check.NoYesNot declaredNo
get_shop_gaugesEvery sheet thickness (gauge) ONE named shop stocks right now, per material — read live off the shop's declared catalog, no quote needed. Call it when the user asks what thicknesses/gauges a specific maker carries ("what thicknesses does SendCutSend have in mild steel?"). For the whole network's ladder use get_network_capabilities instead. Never answer a gauge question from memory.NoYesNot declaredNo
leave_reviewRecord the user's verified-purchase review of how a UFP order turned out. YOUR JOB IS TO STRUCTURE THE FEEDBACK: turn what the user actually said into stars (1-5 overall) and facet scores — "the cut was sloppy" -> quality, "parts arrived 2 days late" -> timeliness, "wrong color" -> accuracy. Keep the optional comment to a short factual summary of their words; never embellish. ALWAYS draft the review (stars, facets, comment) and confirm it with the user BEFORE calling this tool — e.g. "I'll rate this 2 stars with timeliness 1 because it arrived 2 days late — send it?". One review per order: submitting again updates the existing review. If you do not have the order id from this conversation, ask the user for it (it is on their receipt email and order page); never guess one.YesNoNot declaredNo
poll_quoteINTERNAL — the offer board calls this to refresh itself while vendors finish pricing. Never call this yourself. The board you were given is already final for its turn; do not reach for refine_quote to look at it again either, that paints a duplicate board. An offer's manufacturability_check (status checking → passed | failed, expected_s; "repriced" reads as passed) means the price is set; the shop is confirming it can make the part as drawn; the board renders it.NoYesNot declaredNo
preview_quoteINTERNAL client rail — the routing half of refine_quote with NOTHING committed: takes the same arguments as refine_quote and answers how many distinct fabricators (and which process lanes) the network WOULD ask for the refined part, plus the exclusion notes, without creating a child quote, asking any vendor, superseding in-flight work, or logging demand. An expectation, never a promise — lanes can still decline once asked. Never call this to look at prices; it carries none. Use refine_quote to actually re-price.NoYesNot declaredNo
refine_quoteNarrow an existing quote with new constraints (destination ZIP the user just provided, deadline, outdoor/waterproof/heat/food-safety requirements, budget, vendor reliability, verbatim requirements terms, drawing callouts, a process filter — "no, I meant in sheet metal" → processes — a ship-from country filter — "only US vendors" → ships_from — or a vendor filter — "only show A3D Manufacturing" → vendors) — or CHANGE its spec: material, color, or quantities. Changing material/quantity is a spec change, not a narrowing — pass it via the material/color/quantities args, NOT as a requirements term; the affected lanes re-price with the new spec through warm vendor sessions. For side-by-side comparisons ("how does carbon steel compare?"), add a scenario label — labeled refines coexist instead of replacing each other (max 4). "Organize by" ("sort by cheapest", "soonest arrival on top", "most green first") is also this tool: sort_by for objective orders, sort_order + sort_label for orders you judged yourself from the previews — presentation only, instant, nothing re-prices. GOING BACK is also this tool: undo_last_step ALONE takes back exactly one refine step (the quote's steps[] names each step, newest first — the network restores the previous stored state exactly); clear removes whole constraints ("drop the deadline" → clear ["deadline"]); remove_requirements takes back individual requirements terms. Call with ONLY quote_id to re-read the quote (e.g. to pick up preview images that finished rendering). TO PLACE EXACTLY ONE ORDER WITH NO MISTAKES: (1) on get_fabrication_quote list only that shop in vendors and state the pick in selection — the shop, plus the material, finish and shipping speed wanted; (2) read selection_match on the quote: status "one" means exactly one option answers the pick, "many" means say more in the pick (color, thickness, quantity), "none" means nothing on the quote answers it; (3) call create_checkout with quote_id and selection true — it orders thatNoNoNot declaredNo
remove_from_cartTake one part out of a cart. The part's quote is untouched and can be put back with add_to_cart. Returns the whole cart. HOW A CART WORKS: each part in a cart IS a quote — its material, finish, quantity, rules and its pick (selection) live on that part's quote, and nothing is kept twice. To change a part, call refine_quote on its quote_id and pass cart_item_id: the cart follows the part to the new quote by itself. To pick the option to order for a part, store the pick on its quote (refine_quote selection). The cart_id is the only key to the cart — whoever holds it can read and change it — so give it only to the user it belongs to, and never put it in a link you did not get from the network.YesNoNot declaredNo
reopen_quoteUse when the user comes back to a part priced earlier (a saved quote_id), or when a quote carried answers_pending. A quote's answers are shown for 24 hours. Inside them this returns the same quote and asks nobody (reopened "same"). Past them it makes a NEW quote of the same file, configuration, rules and pick — work from the quote_id it returns: with the answers anyone got for this same part and request in the last 24 hours ("copied", nobody asked); else by asking the shops once ("asked" — the offers fill in like any new quote); else, when someone is asking about it right now, at our instant prices ("waiting": call this again after answers_pending.retry_after_s seconds). "press_needed" = this quote was itself made by reopening an old one and nothing was picked or changed on it since, so nobody is asked again by itself: pass pressed true only when the user asks for today's prices. A quote of a shared cart, a part already paid for, or instant prices only comes back as it reads. Do not use it to look at a board again. HOW OLD AN ANSWER IS: a shop's answer is shown for 24 hours, to everyone with the same request (the same design bytes with the same everything asked), so a quote of a part someone priced in the last 24 hours comes back complete at once with those answers and no shop is asked again. An offer says when its shop answered (answered_at). Past 15 minutes it reads stale: true — it is shown at that price and the shop confirms it again before anyone pays (check_offer, or checking out, asks that one shop). A shipping option of such an offer carries eta_approximate: true: say "about N days" from eta_days and never state its eta_date as a date, because no shop stands behind a date until it confirms again. If a quote carries answers_pending, someone else is asking the shops about this same request right now and these are our instant prices: call reopen_quote with that quote_id after retry_after_s seconds.NoNoNot declaredYes
reply_to_makerSend the user's answer to a question the maker (vendor) asked about a UFP order — get_order_status surfaces an open question when one is waiting. Confirm the answer with the user before sending. The network relays it: the maker sees plain text from the network account with the user's contact details and links stripped, so never include emails, phone numbers, or URLs the answer depends on.YesNoNot declaredNo
set_cart_item_quotePoint a part of a cart at another quote of the same part — for a part that was priced again with get_fabrication_quote. Changing a part with refine_quote needs no call here: pass cart_item_id to refine_quote and the cart follows by itself. Asks no shop. Returns the whole cart. HOW A CART WORKS: each part in a cart IS a quote — its material, finish, quantity, rules and its pick (selection) live on that part's quote, and nothing is kept twice. To change a part, call refine_quote on its quote_id and pass cart_item_id: the cart follows the part to the new quote by itself. To pick the option to order for a part, store the pick on its quote (refine_quote selection). The cart_id is the only key to the cart — whoever holds it can read and change it — so give it only to the user it belongs to, and never put it in a link you did not get from the network.NoNoNot declaredNo

Details

Registry status
Active
Published
Aug 7, 2026
Updated
Aug 7, 2026
Website
Not given
Repository
Not given
Categories (suggested)
E-commerceSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
GDPR
Not declared

Are you the operator? Claim this listing