The services that can build this cat feeder aren't Agent native enough; the one that's Agent native enough can't build this cat feeder.
"Agent native" is not "has an API," nor "has MCP." It comes down to two things: for the step that must be performed by a human (payment, legal declaration, quality sign-off), is it written as a state in the protocol; and for every other step, can a caller with no human interface walk through it on its own. I used this yardstick to measure a dozen manufacturing services on a real order chain, and only Slant 3D's public MCP reached the highest level. Of the two domestic services, one has matching capabilities but its interfaces cover only half the order; the other has complete interfaces but the things it can sell don't match.
high reasoning level passed KiCad DRC 5/5. Everything that got stuck involved a counterparty, money, or liability.POST charges it.--yes; Beisen has an official CLI and 14 Skills, all currently read-only; Alipay and WeChat Pay leave every payment for a human to confirm in the App.The one that's Agent native enough doesn't do circuit boards or SMT, and its enclosures are only FDM shipped from the US. The physical goods haven't arrived, so this article evaluates the order-placement chain, not delivery.
This piece is written before the goods arrive. As of the night of October 19, a 66×60 mm cat feeder control board has been paid for at JLC, and the order with SMT is still waiting for me to confirm component polarity; the enclosure has never been printed, the firmware has never been flashed, and the cat has not eaten a single pellet. So what follows evaluates not "a cat feeder built by an Agent," but the order chain along its path: how far the Agent can walk on its own, and which step requires a human to press the button.
The task was defined as follows: have an Agent team build an automatic feeder for a cat — enclosure, circuit board, firmware, App all included — with the human only confirming at the spending gates. The team's three Agent tracks (circuit, enclosure, firmware + App) run on Z.ai's open-source ZCode, with GLM-5.3 as the model. The board that was ordered is rev A, from my own pipeline: a script generates the spec into a KiCad board, auto-routes, and passes DRC; the ZCode team rebuilt it from the same reference spec in round one, and produced rev B (adding motor current sensing) in round two — rev B was not ordered because LCSC part numbers for the components hadn't been verified. Design and files are in the public repo fxp/cat-feeder (the repo stores only design and files, not payment or production records). Progress on the software side was good; §02 gives the numbers. What truly took time was the segment that turns design into money and into shipping labels.
I measured that segment once. The yardstick was written down before I started; §01 explains it.
Everyone uses the term "Agent native"; first I'll explain how this article uses it.
Consider a few existing formulations. Netlify's Mathias Biilmann proposed AX (Agent Experience), broken into three actions: can the agent discover what the service can do, can it reliably invoke it, and can it recover from errors. Anthropic's engineering blog discusses how to write tools for agents: make a small number of workflow-oriented tools rather than wrapping CRUD, and error messages should tell the agent what to do next. The MCP specification's tools section states that execution errors should use isError to provide feedback that lets the model self-correct, while "there should always be a human in the loop who can reject the call." These three sources describe the same kind of thing: machine-readable contracts, errors that point the way, and explicit human nodes. None provides a certification checklist, and Netlify's framework is still the vendor's framing.
My own yardstick is more homespun. Before starting, I had written a fulfillment interface in the proposal — for a manufacturer to plug in, it would need to implement six verbs: capability query, validation, quoting, order placement (with payment proof), tracking, and cancellation. That was for writing adapters; I didn't expect it to become a yardstick. Later, as orders went out one by one, I added two things learned from the orders: entry point (how to get a key, is there a test environment, do the terms allow machine use) and where the human steps in (payment, legal declaration, quality sign-off).
So the working definition for this article is:
A service is Agent native when every state transition can be completed by a caller with no human interface, relying on public, machine-readable conventions; and the transitions that must be performed by a human — payment, legal commitment, quality sign-off — are written as states in the protocol (a pending order, a checkout link), rather than hidden in some checkbox in the UI.
This is stricter than "has an API," and stricter than "can be automated by a browser." Unfolded into a five-rung ladder:
| Level | What it looks like | Example in this article |
|---|---|---|
| L0 | Only a website, no machine entry point | — |
| L1 | Website can be driven by a browser Agent: it works, but every step is guessing at the UI | JLC's SMT ordering |
| L2 | Has an API, but keys require approval or offline issuance, or the lifecycle is missing a piece (file ingestion, validation, cancellation) | JLC Open Platform, ZaoHaoWu, PCBWay, etc. |
| L3 | Self-service key acquisition, machine-readable contract, complete lifecycle from quoting to cancellation | Slant 3D's REST API |
| L4 | Entry point purpose-built for Agents: typed tools, read-only/destructive annotations, structured validation output, pending-approval objects | Slant 3D's public MCP |
This is my grading, not an industry standard. The L4 row was written to reflect the best practices I've read, so Slant ranking first involves some circularity; whether it's truly "best" depends on the item-by-item facts in Table 2, not just this level. The six verbs plus two supplements become the columns of each table in §05–§07; §08 switches to a more general question (what has this service prepared for Agents) to measure another batch of platforms.
First I'll present the control group, because every "stuck" later must be viewed against it.
The team is three real Agent tracks (circuit, enclosure, firmware + App), running on ZCode, conversing via a team bus and a versioned shared contract. Numbers from the two real runs:
| Round 1 | Round 2 | |
|---|---|---|
| New bus messages this round | 25 | 21 (cumulative 46) |
| Contract version | to v14 | to v24 (cumulative) |
| Tool calls | 192 | 226 |
| Call failures | 0 | 0 |
| Three tracks simultaneously active | 350 s | 460 s |
Round 1 wall-clock: 1,749 s; Round 2: 2,754 s, input 19.2 M tokens, output 0.26 M. The same PCB task was repeated individually five times: GLM-5.3 at reasoningLevel=high routed successfully 5/5, KiCad DRC 0 errors 0 unconnected; the default max tier only 3/5, with both failures due to reasoning timeout — one hitting the 1,500 s ceiling, the other severed by the upstream after 653 s on the first request.
"0 call failures" counts only the calls themselves, excluding domain errors: across those five runs there were 141 MCP calls, about 10% returning domain errors (illegal spec, DRC failure), all understood and fixed by the model — not a single pipeline issue.
Outputs were independently verified after the fact, without trusting the Agent's own reports: kicad-cli pcb drc on the exported board gave 0 errors 0 unconnected; firmware host tests 21 items 517 assertions passed, pio run compiled; App on simulator 33/33. Never flashed, never on a real phone; enclosure assembly checks used a box-estimation method, and of 32 parts, 30 had estimated dimensions. DRC passing doesn't mean the circuit is correct: a local small model reversed an LED on the first try, and DRC reported nothing.
These numbers make one point: when the counterparty is kicad-cli, headless Blender, PlatformIO, or similar local tools, the Agent almost never gets stuck. Their common trait: file in, file out, exit code speaks — no account, no money, no legal consequences. KiCad's official entry point for automation follows the same pattern: kicad-cli is primarily for reading and exporting; the IPC API in KiCad 9 and 10 can only connect to a running GUI, and only the PCB editor can load plugins. We stayed on the command line throughout; once, opening the KiCad GUI with a button on the real machine, we were blocked by macOS quarantine attributes.
Even the Agent's own "brain" has a step only a human can do: the first spike run exhausted the BigModel account balance (error code 1113), and the re-run happened only after I topped it up.
So when I say "got stuck" later, I always mean this class: has a counterparty, has money, has liability.
JLC is where real money was spent this time. Three orders totaling ¥361.99: one v1 board (no fiducials), one v2 board (with fiducials, prepped for SMT), plus the SMT order attached to v2. The v1 was actually a duplicate order: a board without fiducials won't be converted for SMT by the platform — a rule I discovered only after placing the order.
I first checked every step against the open platform. Interface coverage looks like this:
| Order step | Open platform | What was actually done |
|---|---|---|
| Pricing | Endpoint; tested with real account, works | Endpoint |
| File ingestion | Only accepts a public URL for JLC to download; no upload endpoint | Web upload |
| Create PCB order | Endpoint exists (not actually called; every success was a real order) | Web |
| Create SMT order | None; SMT endpoints only query BOM components, orders, progress, and incoming parts | Web, seven steps |
| Validation (DFM) | None | Checked during web upload; ~4 hours after payment, human goes to order list to confirm component polarity |
| Payment | Order creation sets isAdvancePayment=false; endpoint does not charge prepayment | Human pays on web: top up first, then combined payment |
| Tracking | Endpoint exists (not actually called) | Web order list |
| Cancel | None among the 14 PCB endpoints | Web; cancellation after payment incurs an engineering fee; no changes accepted after production starts |
On the entry-point side there are a few things, each defensible on its own:
403 Request IP source invalid is returned — a home network's outgoing IP change breaks it, and so does using a proxy.So the real orders were placed through an Agent-driven browser in my logged-in account. This path worked, and also let me see what "L1" feels like:
<div>s and <span>s, not buttons; popups and onboarding guides swallow clicks; refreshing the page resets the form.What bothers me most are two places where "the machine should have spoken, but no one did."
First, component orientation. In JLC's component library, SOT-23 (3-pin) and SOT-223 at 0° differ from KiCad by 180° — visible only in the SMT preview, not caught by DRC, and not exposed in the API. I found Q1 and U2 reversed in the preview, rotated each 180° in the web editor, and only then added offsets for these two footprints in the generator. Whether other footprints have the same offset, I haven't verified — every order requires a human eye on the preview.
Second, "can this design be SMT'd?" This is as clear-cut a validation question as they come, and the answer is a rule written on a help page — yet there's no corresponding endpoint. I paid for a duplicate order because of this.
To be fair, JLC doesn't lack Agent awareness. Its EDA team has put a whole row of Agent-facing things on GitHub: easyeda-client-cli (the client's built-in CLI, runnable as an MCP server), easyeda-api-skill, a WebSocket gateway extension, and a local "order check" extension that runs JLC DFM rules. JLC has done part of the PCB-process validation, placing it in the EDA client's extensions rather than the open platform's endpoints; whether SMT rules (fiducials, component orientation) are covered, I haven't checked.
JLCPCB's own two AI design blog posts (September 18, October 14) both discuss how to let an Agent operate the editor; where they mention ordering, it's about exporting Gerber, BOM, and pick-and-place, then uploading to JLCPCB for instant quoting after design verification. Neither post mentions an ordering endpoint.
One layer deeper: EasyEDA's extension API has four ordering methods — placePcbOrder, placeSmtComponentsOrder, placeComponentsOrder, and place3DShellOrder — all marked BETA, "do not use in production." They run the order check first, and if conditions are met, open the order page in a new tab and generate order data; the docs don't say they make payment. The CLI, its --mcp mode, and Skills can all reach them. I haven't run them; these methods would produce real order data. So JLC has connected the Agent to the canvas and to the cashier's door; the quoting and ordering endpoints are on open.jlc.com, which has no CLI, MCP, or Skill.
JLC's open platform itself isn't crude: signatures match the official example byte-for-byte, every response carries a J-Trace-ID, and business error codes are clear. It feels designed for a different kind of caller: someone who knows what they want to order and is willing to fill in the last few steps on the web. The Agent needs the reverse: before knowing the outcome, every step should have a machine-readable answer.
ZaoHaoWu (I also refer to it as Hi3D here; this correspondence was confirmed only by the integration partner — hi3d.ai's homepage brand wall includes ZaoHaoWu's logo, and its static assets are hosted on zaohaowu.net, but there's no official page explaining the relationship. Hi3D itself has a separate self-service developer API, which is a different matter — see §08) is another kind of L2.
A fair disclaimer first: it sells figurines, not manufacturing capability. I'm measuring it because the task needed a high-precision enclosure printing outlet, and it was the only domestic outlet I had with a test environment.
Its strengths are specific. There is an independent test environment (api-test.zaohaowu.com), and the entire path works: Basic auth exchanges for a 24-hour token; image-to-image submission goes from PROCESSING to SUCCESS in about 20 seconds; order/create carries a requestId for idempotency; order/fulfillment/batch queries fulfillment, with order statuses 0–7 and fulfillment statuses each enumerated; after order/cancel, the order reads "closed" and the fulfillment order reads "cancelled." Create, query, cancel — three verbs all passed on the real interface. When errors occur, it also speaks up: a forged image URL is rejected with 1003 Image URL invalid, please upload image first, a non-portrait photo with 5003 Please upload a portrait photo — both with readable reasons.
The gaps are equally specific:
price in order/create is pass-through, not validated; prices come from a product catalog provided offline by the vendor. The Agent can't get a bindable "how much will this cost" number.imageUrl must be an image the vendor itself recognizes — object photos and renderings can't go in. It can't handle the cat feeder enclosure.modelId, productId, skuId all are. Test credentials against the production domain return 40001; I still haven't obtained the production set.1000 System exception, not "not found."I wrote a six-item requirements list for this (printable products with self-submitted models, model submission method, quoting, production credentials, payment method, size and review limits), which I haven't sent yet. Until they reply and I've placed a real order, I won't say "the Agent placed an order through Hi3D's API." All I can say is: in the test environment, create, query, and cancel passed.
The two domestic services side by side form an interesting complement: JLC's capabilities match but its interfaces are incomplete; ZaoHaoWu's interfaces are complete but its capabilities don't match.
Slant 3D is an FDM print farm in Boise, Idaho; its FAQ states that it prints in the US and ships from the US. In my original proposal I noted it as "the only one with self-service key acquisition," wrote an adapter against its OpenAPI, but never called it with a real key, and later didn't include it in the chain: it doesn't do circuit boards, and enclosures are US-shipped FDM. Coming back to read it this time, I found it had already added a second door.
Door one, REST API. The OpenAPI 3.0.3 spec (about forty operations) has this description: "This spec is for automated tools and AI Agents." It includes an x-agent-hints block that compresses the order flow into one line: upload file → draft order → process order → fulfillment → webhook. The draft order is explained as "price first, then process," the process order as "start production and charge," and cancellation is limited to "not yet started." The docs site also says the webhook carries an HMAC-SHA256 signature, retries every minute on failure, up to ten times. Among the manufacturing APIs I've read, this is one of the most complete lifecycles.
Its other side is equally blunt. Keys can only be generated by a human in a web session (POST /apiKey doesn't accept Bearer); once a human binds a card on the account page, POST /orders/{id} charges it in one shot. The spec has no idempotency key and no sandbox. This leaves the gate to the caller: Slant guarantees drafts don't charge; whether to charge is your program's decision.
Door two, public MCP. This is the segment I most want to talk about. https://www.slant3d.com/mcp requires no key, no login. The llms.txt says "AI agents can quote and order real 3D-printed parts in two ways," and the FAQ has a dedicated question: "Can an AI agent order a 3D print?" The answer is Yes.
I had the Agent run a read-only plus quoting test against it (October 20; no order placed, no address or email entered):
initialize and tools/list worked normally. 10 tools, each annotated: quote_raw_pricing is read-only; quote_set_quantity is marked as not touching the external world; list_* is marked idempotent.quote_upload_part: upload a self-generated 20 mm cube (base64). One call returned: quote_id, bounding box, volume, and per-unit price, subtotal, setup fee, and lead time for 1, 100, and 1000 units (1 unit 3–5 business days, 100 units 5–7, 1000 units 2–3 weeks), plus print_feedback — running nine checks (mesh, flat orientation, chamfer, bottom text, wall thickness, thin column, spider-like, supports, support area), yielding one severity: warning suggestion to "add 1 mm bottom chamfer," and stating "can be ordered as-is." The response includes both text and structuredContent, plus a next_steps line telling the Agent which tool to call next.quote_set_quantity: change to 5 units, get back new per-unit price and lead time.quote_id returns isError: true with just "Unknown quote_id."; an 18-byte garbage STL is rejected at the input validation layer, returning a validation array as-is.I didn't call quote_shipping_options (requires name, address, email — I don't want to write personal info into a public service) or quote_checkout (requires email, generates a Stripe checkout link). Per their tool descriptions: shipping is saved on the quote; after paying via the checkout link, the order automatically enters the print farm and the customer receives a confirmation email. So shipping and checkout were read from descriptions, not tested.
It got four things right:
quote_id threads upload, quantity change, shipping, and checkout into one line — exactly what Anthropic's article means by "make workflow-oriented tools."quote_checkout returns a payment link for a human to pay. The Agent knows when to stop and what to hand off to whom.What it didn't get right: MCP has no tracking or cancellation — those two verbs are only in REST; error messages are too sparse — Unknown quote_id. doesn't tell the Agent what to do next; in the same response, part price $1.37 and per-unit price $2.77 coexist with unexplained field semantics (I couldn't figure out the difference); cancellation and refund rules are scattered across the spec, docs site, and user agreement with wording that is not entirely consistent — the spec says cancel before start, the docs site says cancel triggers refund, the user agreement says fees are non-refundable after start.
And its boundaries: the user agreement is a 2023 short document that doesn't mention API, automation, or AI; materials are PLA, PETG, carbon-fiber PETG, and OPM; printing and shipping are in the US; international shipping I haven't verified.
At this point, two questions have merged into one: at which step does the human appear, and in what form.
On my side I built a gate: the model has no "place order" tool, only quote and prepare-order-card; ordering can only go through an endpoint that issues a confirmation token, binding order intent, quote, vendor, price, file sha256, shipping address, and user; confirmation also requires a fresh WebAuthn (designed as Touch ID; real-device Touch ID not yet verified). This is my design. It requires the other side to hand me something bindable: a quote with an ID, price, and validity period, or a pending-payment order.
What the other side hands over looks like this:
| Service | Pending-approval object | Who approves, how | What public docs say it binds |
|---|---|---|---|
| Slant 3D · MCP | quote_id | Human opens Stripe checkout link and pays | Quote total; whether file hash and address are bound — not stated |
| Slant 3D · REST | DRAFT order | No third party: Process directly charges the card on file | Gate is on the caller |
| JLC | Pending-payment order (SMT order holds inventory for 7 days) | Human pays at web checkout | Not stated |
| PCBWay | Cart order, pending-payment package | Partner account balance or credit, or redirect to payment page for human | Not stated |
| OSH Park | Pending-payment order after checkout | Human pays after receiving email; API doesn't accept credit cards | Not stated |
| ZaoHaoWu | Order (test environment: placing an order = "already paid") | Undocumented | price is pass-through, not bound |
| My own gate | Order intent | Human confirms in UI, passes WebAuthn once | Quote, file sha256, address, user |
The rightmost column — almost none of the vendors' public materials answer it.
The 2026 payment protocols have already laid the vocabulary. UCP's checkout state has requires_escalation, at which point the merchant must provide a continue_url and at least one message with severity requires_buyer_input or requires_buyer_review: when to stop and hand the link to the buyer is stated by a status field, not by guessing. ACP's session has pending_approval, plus quote_id, purchase_order_number, and payment terms. Stripe's wallet for agents requires the spending reason to be written as human-readable text, pending approval in Link, expiring after 30 minutes, retry with idempotency key, plus a never-charge test mode. The MCP spec also says there should always be a human in the loop who can reject the call. Related background in previous pieces: UCP, Agent Onboarding Gates (identity & payment), Offline Agentic Commerce (physical commerce).
But they all target catalog items: a shopping cart, a final price. In existing flows, I haven't found a "upload file, get price, then approve" custom-part example; ACP's schema has quote_id, UCP allows omitting payment during "generate quote, manage cart" — both leave hooks but no examples. Among the manufacturing service docs I've read, none mentions implementing any of these protocols. Among the services I've read, Slant's path from quote_id to checkout link is the only one that's public, keyless, callable right now, and used for custom parts.
Legal declarations are the other half of the same problem. JLC makes it a UI checkbox — opening and closing the reading popup auto-checks it, turning "read" into "agree," and an Agent in a loop reads it once and signs it. Shapeways goes to the other extreme: the model-upload endpoint has two required boolean fields, hasRightsToModel and acceptTermsAndConditions, for the caller to declare they have rights to the model and accept the terms. Written as fields, a machine can see them — but one line of code makes a commitment on behalf of a human, which is exactly what I want to prohibit. UCP's approach is worth copying: make "requires buyer review" a state; until that state is resolved, the flow doesn't proceed.
One more dimension: the more convenient, the looser. Lining up payment methods, there are three kinds:
The third kind is most convenient for the Agent, and also the loosest delegation. In physical-world APIs, defaults often speak louder than endpoints: Printful v2 makes orders start as drafts, requiring a separate confirm call to charge; Printify's new-store default auto-approves orders after 24 hours, entering production without an API call; Mouser's order endpoint has SubmitOrder=false, returning a summary without submitting. The Agent runtime side is the same: in ZCode's spike, -p mode defaults to yolo — on a disposable mock service, the Agent confirms an order with one curl line; user-level hooks can be bypassed four ways, and the Agent can even modify its own hooks; only the OS sandbox blocked every attempt. So the gate must live in a process the Agent can't reach — you can't rely on the service to place it for you, nor on the runtime.
Among catalog-type physical services, some already expose the full Agent path: Shippo's hosted MCP uses OAuth, no key copying; every docs page has an Agent instruction block; the docs state that buying a shipping label charges the account, and write operations require confirmation before execution. But a shipping label isn't a custom part — there's no "upload geometry, get price" step.
On the domestic payment side, "human pays" is done more thoroughly. Alipay's buyer-side alipay-bot and Skill require the Agent to show the order summary to the user, submit the payment, then stop and wait for the human to pay in the App; the merchant-side restricted key requires the primary account to enable it, uploading a public key requires SMS or payment password, and then checking off the allowed tools — unchecked tools can't be called. "Delegated payment," which lets the Agent directly charge within a pre-authorized limit, has its total, frequency, and validity set by the user in the App first; the Skill notes that contacting BD is required to enable it, still invitation-only. WeChat Pay's "per-transaction confirmation mode" requires a human to scan and enter the payment password for every order; the AI-specific card's funds are isolated from the main account. These two have productized the "pending-approval object" and "spending limit" described earlier.
The two tables below put what I read and tested together. ★ marks what I personally tested or practiced; the rest comes from public materials read on October 20, 2026; docs visible only after login I didn't read — written as "not seen" or "unknown," which doesn't mean they don't exist.
Table 1 · Entry points & contracts
| Service | Level | How to get key | Test environment | Contract | Entry point for Agent |
|---|---|---|---|---|---|
| Slant 3D · MCP ★ | L4 | Public, no key needed | — | Tool schema, with read-only/idempotent/destructive annotations | Itself |
| Slant 3D · REST | L3 | Self-service registration; key can only be generated in a web session, 3 per account | Not seen | OpenAPI 3.0.3, self-described "for automated tools and AI Agents" | Spec has x-agent-hints |
| ZaoHaoWu ★ (test env) | L2 | AK/SK issued offline | Yes, full path walkable | Feishu doc, blank flowcharts | None |
| JLC Open Platform ★ | L2 | Personal registration; key shown once; outbound IP whitelist | No | PDF doc in console | None; llms.txt points to web form |
| PCBWay | L2 | Email approval, for partners with their own website | Vague (examples call it sandbox) | Auto-generated help page, plus a 2018 PDF | No official (third-party MCP wrapper exists) |
| JLCPCB International / JLC3DP | L2 | Application + approval, for enterprises & distributors; 3D ordering tier has an unpublished monthly order volume threshold | Not seen | No OpenAPI, only Java SDK | No official |
| OSH Park | L2 | Contact support to enable | Not seen | Ruby gem; docs page returns 404 | None |
| Craftcloud | L2 | Couldn't find entry point | Order body has isTestOrder flag | Swagger 2.0, no auth declaration, no upload | None |
| Shapeways | L2 | Self-service, OAuth2, API free | Not seen | Human-readable docs, no OpenAPI | None |
| Xometry | — | Supplier-side API only; apply by email | Not seen | Supplier API has OpenAPI and llms.txt | Docs face Agents, but serve suppliers; no public buyer-side API found |
| Protolabs / Hubs / Fictiv | — | No public API found (Fictiv has only cXML Punchout) | — | — | None |
Table 2 · Order lifecycle
| Service | Validation | Quoting | File ingestion | Pending-approval state | Who pays | Tracking | Cancel |
|---|---|---|---|---|---|---|---|
| Slant 3D · MCP ★ | Yes: nine checks, graded, with suggestions | Yes, quote_id, three quantity tiers with lead times | base64 or https URL | quote_id | Human, Stripe link | No | No |
| Slant 3D · REST | Partial: file metrics; manual review before start | Pricing endpoint; draft order includes shipping | Pre-signed upload + confirmation | DRAFT to Process | Human binds card first, then charge on call | Polling + signed webhook | Yes, before start |
| ZaoHaoWu ★ | Partial: review flag, error codes with reasons | No, price pass-through | Only vendor-approved images | Undocumented | Undocumented | Yes ★ | Yes ★ |
| JLC ★ | No (assembly rules are on the web) | Yes ★ | Public URL, no upload | Pending-payment order | Human, web checkout | Polling (not called) | Not in the list |
| PCBWay | Manual review after ordering | Yes, no ID, no validity period | URL or base64 | Cart to pending-payment package | Partner credit, or redirect page for human | Polling | Yes, mainly before payment |
| JLCPCB International / JLC3DP | Partial: Gerber pre-parse; 3D file parse includes "unavailability reason" | Yes, shape undisclosed | Upload | Unknown | Prepaid balance (inferred) | Polling | Not in the list |
| OSH Park | Render preview, approval (for human or vision model) | Yes | Upload or URL | After checkout, wait for email payment | API doesn't accept credit cards, human pays | Polling | Yes, limited to early states |
| Craftcloud | No | Yes, priceId, quoteId, cart has expiresAt | Not in spec | Yes | Redirect checkout (human); invoice Net30 | Polling | Not on customer side |
| Shapeways | Partial: printable field | No quoting endpoint; model info has per-material prices | Byte upload, plus two boolean declarations | No, one-call ordering | Card on file, charge on call | Polling | No |
Reading these tables, a few observations:
The six verbs in §01 were designed for ordering. For a different class of service, the core actions change, and the question can be more general: what has this service prepared for Agents? This edition adds a batch of platforms: the already-mentioned JLC, Tripo3D, Hi3D, and Beisen, plus peers Feishu, DingTalk, Amap, Alipay, and WeChat Pay, and manufacturing-chain services not yet measured — LCSC, Huaqiu, Bambu Lab — with Meshy as a control. All use public materials from October 20, looking at seven things: official CLI, official MCP, official Skill, Agent-facing docs (llms.txt, Markdown), test environment, how write operations are approved, and whether the core action can be completed by the Agent on its own.
Verification was three-layered. For most domains I fetched llms.txt and .well-known manifests; for the main CLIs I checked npm registry info; for Hi3D's hosted MCP I connected and read the tool list — readable without credentials. The rest comes from each service's docs; login-gated docs weren't read, written as "not found" or "unknown."
Table 3 · Agent surfaces (2026-10-20 snapshot)
| Service | Level | CLI | Official MCP | Official Skill | Agent-facing docs | Test env | Write-approval method |
|---|---|---|---|---|---|---|---|
| Feishu | L4 | lark-cli, MIT, open source | Remote version in beta, covers cloud docs only; local version docs marked "not recommended" | 28 catalog | llms.txt; every page has .md | Test enterprise | High-risk writes return exit code 10 and confirmation_required, need --yes; --dry-run preview first |
| DingTalk | L3 | dws, Apache-2.0; requires admin enablement | Official remote server in AI marketplace; separate local dingtalk-mcp | Open platform's own skill.md, plus per-product skills | llms.txt first section speaks to Agents; 3,630 .md pages | Experience org, not an independent sandbox | README tells Agent to add --yes; constraints are text in skill.md |
| Beisen | L3 (CLI), L2 (OpenAPI) | beisen-cli, gray release; all methods read-only | Not found | 14 | CLI install guide is Markdown for Agents; no llms.txt | Not found | Write gate (exit code 10) designed and reserved; OpenAPI has no approval step |
| Tripo3D | L4 | tripo-cli: JSON lines, stable exit codes, --dry-run | tripo mcp ships with CLI, tool list not public | Built into npm package; separate Codex plugin | llms.txt; every page has .md | None | Device auth login approved by human; top-up by human, no top-up endpoint |
| Hi3D (own developer platform) | L3 | None | Hosted MCP: I read 2 tools, no annotations | None (has Blender plugin) | None (llms.txt is soft 404) | Trial resource pack | None: submitting a task deducts credits |
| Meshy (control) | L4 | meshy-cli | @meshy-ai/meshy-mcp-server | Codex plugin with two Skills | llms.txt, llms-full.txt, OpenAPI 3.1 | Changelog mentions test key | Browser auth login; credits pre-charged |
| JLC · Order side | L2 | None | None | None | llms.txt points to web form | None | Creating an order doesn't auto-charge; human pays on web |
| JLC · Design side (EasyEDA) | L3 | Client-bundled easyeda-pro | --mcp mode, stdio or http | easyeda-api-skill etc. | CLI docs say "For AI"; API is TS reference page | None | place*Order (BETA) only runs checks and opens order page |
| LCSC | L2 | None | None | None | llms.txt is a marketing page | None | OpenAPI includes ordering, requires approval; payment method undocumented |
| Huaqiu | L2 | None | None | None | None | Unknown | Announcement says API includes ordering and payment; docs are behind approval |
| Bambu Lab | L2 | Bambu Studio CLI, slicing only | None (community one exists) | None | None | None | Developer mode requires human to enable on machine; Local Server SDK requires application |
| Amap | L3 | amap-gui: drives a map window | Official hosted, 15 tools, read-only or link-generating | SKILL section | None | None (free quota) | N/A: ride-hailing only gives a link; human clicks |
| Alipay | L4 | Buyer-side alipay-bot | Local merchant-side @alipay/mcp-server-alipay | alipay/payment-skills | llms.txt; every page has .md | Sandbox | Each transaction paid by human in App; restricted key limits callable tools; delegated payment requires contacting BD |
| WeChat Pay | L3 | Read-only dev CLI | Not found | wechatpay-skills | llms.txt; every page has .md | Not found | "Per-transaction confirmation": each order requires scan + payment password |
Levels are rough judgments after reading that day's materials, using the ladder from §01. For the borderline cases, here's the reasoning: DingTalk's docs surface reaches L4, but write operations rely on text conventions, so L3; Alipay's buyer side has per-transaction human payment, the same design as Slant in §05, so L4 — the merchant-side MCP is local and unannotated; Tripo3D lacks OpenAPI and a test environment but still gets L4 because its Agent surface was purpose-built for Agents.
Reading this table, a few observations:
.md. The lowest tier is JLC, LCSC, Huaqiu, Bambu Lab, Hi3D, Amap: none, or only a marketing blurb. Beisen sits between the middle and lowest: the CLI has an Agent-facing Markdown install guide, but the open platform docs are a web app with no llms.txt.confirmation_required JSON; the Skill requires the Agent to show the operation to the user, wait for explicit consent, then add --yes; --dry-run previews without triggering the gate. Beisen's Skill contains the same envelope, but currently every CLI method is read-only — the gate is "reserved." DingTalk's CLI instructions tell the Agent to add --yes to skip confirmation; the constraint lives only as text in skill.md. Tripo3D and Meshy place the human at device-authorization login and top-up, with no per-transaction approval — the spending ceiling is the human's pre-charged balance. Alipay and WeChat Pay go the other way: every transaction is paid by a human in the App. This is the distinction from §06: one is a state, the other is an admonition./agent, and the endpoint path contains wmsc2agent — referring to the customer's business system integration, not an AI Agent.llms-full.txt, test key, and free printability analysis. It's not in the "domestic platforms" list; it's here to give the yardstick an upper bound for comparison.For service providers (each item has a counterexample from above):
quote_id; Craftcloud has quoteId and cart expiry; ZaoHaoWu doesn't)print_feedback; JLC's rules are on help pages and in previews)requires_escalation; counterexamples are JLC's auto-checked checkbox and Shapeways's boolean fields)Unknown quote_id. and 1000 System exception both fail this)confirmation_required; Beisen designed the envelope but hasn't shipped write methods; DingTalk's CLI instructions tell the Agent to just add --yes.For people building Agents:
curl line. The gate is the verifier, and verifiers are scarcer than generators — this is the main thread of "R&D in the AI Native Era", and this is another instance..md docs, then for MCP. This is my judgment after reading the §08 batch: the first three are more common, and can be verified locally.initialize and tools/list; EasyEDA's place*Order wasn't run; Beisen and Huaqiu's docs are behind gates; DingTalk dws's "official" status is based on DingTalk's own docs — its npm maintainer is a personal email; Feishu's remote MCP is in beta and I couldn't see tool annotations. This section is an October 20 snapshot; these entry points change weekly.This piece looks at the service side: whether the entry point is open. The reverse side is covered in a separate piece, "When Can the Agent Move Into the Browser?", which measures how many paths a browser tab lets the Agent walk out through: 14 model endpoints' preflight all passed, but among 31 public URLs only 11 let the page read directly, and installing dependencies and SSH require self-hosted relays. Read together: the service side's entry point may be open, but the Agent side still needs to be able to walk out.
One thing I want to watch for: when the protocols that write "the human" in will first produce a custom-part example.
llms.txt and MCP (October 20). Public parts in fxp/cat-feeder; the rest in private repos.