execution), and read its result and receipt.
It uses your organization API key. Configure your assistant to ask before
each change or paid request; the stop happens in your assistant, not in
Millwork.
For questions about using Millwork, connect the
documentation MCP, which searches and reads these docs.
Connect your assistant
Requires Node.js 20 or later and an organization API key. Add a local server to your assistant’s MCP settings:Check the connection
Ask your assistant:What it can do
The released0.2.16 package exposes 28 tools, including eight for output
checks. The installed tools/list is the exact inventory. Most tools call a
REST endpoint; lifecycle tools also return a safe next action after inspecting
the recorded operation. Tools that list your organization’s own items, such as
saved models, output checks, and provider connections, return the newest first,
as their REST endpoints do. A saved model is an option Millwork may run your
task on; the API calls it an arm, which is why several tool names carry
that word.
Reads need no confirmation. The 13 read-only tools change nothing, and
the server may retry one when the network or Millwork fails. Writes need your
confirmation. The server itself sends no confirmation flag; your assistant or its host enforces the
stop, so configure it to confirm every tool that is not a read. Writes with a
caller-owned request key can retry only that same request; other writes get
one attempt. If a response is lost, have your assistant inspect the current
state before you approve another attempt. The server reads your
organization API key from its own environment, sends it only to Millwork as
the bearer token, and never returns it in a tool result. Confirmation is a
stop in the assistant, not a narrower key: your API key keeps its full
permissions, so give the assistant only a key whose permissions you are
willing to let it use.
Connect a provider with your assistant
Have the assistant list available providers before asking you to obtain a key. OpenRouter asks you to approve access in the browser; key-entry providers use Millwork’s private setup page. Keep provider credentials out of the conversation. The assistant may hand you the setup link or open it in your normal system browser; keep that link out of shared logs, evidence and support material. For the guided CLI handoff, follow Finish browser approval yourself. A REST handoff ID and a CLI application ID name different resources; use the continuation for the flow you started. After the browser step, the assistant checks its state, tests the connection and refreshes its models with your approval. You approve any paid run separately. If a run fails, inspect that run before repeating setup. From version0.2.2, ask your assistant to disconnect a saved provider
connection only after it names the exact connection and affected saved models.
A disconnect requires the same request key (idempotency_key) and
connection_id if its response is uncertain and you approve retrying it.
It disables the Millwork connection and saved models; the provider key stays
active, and calls already sent can still be billed. For 0.2.0, or to replace
a key, follow the REST connection steps.
Connect an output check with your assistant
Inspect the installed MCPtools/list before choosing a connection path. The
pinned 0.2.16 release includes solver_list_verifiers,
solver_show_verifier, solver_connect_verifier, and
solver_test_verifier. They can register and test a credential-less HTTPS
endpoint without handwritten HTTP. For an older installation missing these
tools, use the CLI continuation below, then pass its returned verifier_id
into solver_submit.
For a credential-less HTTPS endpoint:
millwork verifier capabilities --json, then
follow Recipe 0.
Connect, replace, or restore a protected output check
For a protected endpoint, first inspect whether the installed server exposes the foursolver_*_verifier_connection lifecycle tools. When present, they
start, inspect, continue, and disconnect the protected connection while key
entry stays on Millwork’s private page. Otherwise use the private CLI flow in
Connect an output check.
Keep the key out of the conversation and every MCP input.
To connect a protected check, or replace or restore its key, use this order
with the same registered verifier_id:
- With host confirmation, call
solver_start_verifier_connectionwith theverifier_id, a supportedstop_choice, and a request key (idempotency_key). Keep itsintent_idandexpires_at. - Give its
continue_urlonly to the intended person. They enter the key on the private page. Do not ask them to paste the key into a conversation. - After private entry, with host confirmation, call
solver_continue_verifier_connectionwith thatverifier_id,operation_key: intent_id,intent_expires_at: expires_at, and a request key for this attempt. If the result is uncertain, inspect that sameoperation_keywithsolver_inspect_verifier_connection, then continue that operation until its read-backed state isdone. An expired intent needs a new start; a failed test needs a corrected key or endpoint.
Disconnect a protected output check
Disconnect is a separate action. Name the affected check and obtain separate host confirmation before callingsolver_disconnect_verifier_connection
with a new operation_key, its request key, and confirm_disconnect: true.
If its result is uncertain, inspect the same operation key before retrying.
Disconnect stops Millwork using the key; removing it at your endpoint is a
separate action. The tool table above identifies each
tool’s authority. Connecting, replacing, or restoring never approves a paid
run.
Use an output check on a run
To use a connected check, pass itsverifier_id to solver_submit, as
Run submission through the assistant
describes. Connecting a check is not approval to run a task. If you omit
verifier_id on solver_submit, Millwork uses the built-in output-presence
baseline, which is not a check of whether the answer is correct.
Run submission through the assistant
A run needs a saved model, not only a catalog entry. Ifsolver_list_arms
returns none that match your choice, have the assistant save that model with
solver_enable_model_arm first, copying the catalog entry’s registration
settings unchanged; a submission with no eligible saved model fails. To keep
the run on the model you chose, the assistant sets routing.required_arm_id to
that saved model’s arm_id.
solver_submit is the one tool that can cost money. Before a live call, have
the assistant prepare the exact task, saved model, data classes, model budget,
runtime limit, output check, available charge information, and request key.
Approval in chat is not paid-run authority.
If solver_submit returns host_approval_required, give the returned approval
document only to the host administrator. Retry the unchanged request and
request key only after the host approves it. Never create a new key to hide an
unknown result. If the installed server does not support this flow, stop and
report its installed version. Echo mode remains free and does not need this
approval.
With the installed schema, a call must carry:
- a request key, supplied by the assistant as
idempotency_keyand sent in theIdempotency-Keyheader, so a retry does not start the work twice; the server rejects a call without one before it reaches Millwork; - the task and policy, the same shape as
POST /v1/executions; Millwork keeps the saved models that fit your policy limits and picks one; and - the saved model as
routing.required_arm_idwhen you chose one explicitly; and - optionally an output check, a check applied to the run’s output, as
verifier_id. From version0.2.2this field is optional: leave it out and Millwork checks only that the run produced an output, which is not a check of whether the answer is correct. For a real check of the output, connect one with the installed@millwork/solverCLI (millwork verifier connect --endpoint <https-url> --access public --name <name> --version <version> --connect-only --json) and pass its id. Versions before0.2.2require the field.
execution_id and status. The
assistant then follows it with solver_status, reads the output with
solver_result when the run completes, and reads the receipt with
solver_receipt. Every one of those is read only.
A test run (the API calls it Echo) makes no model call and has no platform
fee or model cost. When the installed solver_submit schema offers
mode: "echo", use it for that free platform check. Otherwise use
Make your first API call, then let the assistant
follow it with the read-only tools. A live run is
charged the platform fee when Millwork accepts it. If you omit verifier_id,
the basic check confirms only that output exists; include your saved check when
you need your own correctness rules. Read Model access and billing before
approving a live run, and Errors and retries
for what each error means.
Use a coding assistant
Give an assistant one page and a short set of rules so it works with you and never sees a secret.
Documentation MCP
Search and read these docs, or send documentation feedback you approve.