@millwork/solver-mcp
OfficialRun governed Millwork Solver workflows through a tenant-authenticated, write-capable MCP server exposing 28 solver_* tools over stdio.
Discover sources, source connections, model deployments, arms, proposals, and verifiers.
Start/poll private browser credential handoffs and create, test, and sync source connections.
Connect, test, inspect, continue, and disconnect output-check verifiers.
Enable certification-backed model deployments and register model, agent, or skill arms.
Submit governed executions with policy, budget, verifier, and idempotency key; poll status, cancel runs, fetch results, and retrieve content-free receipts.
List and inspect repair proposals, then approve or reject them.
Use safe reads that may retry, same-key idempotent mutations, and single-attempt write tools that require human confirmation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@millwork/solver-mcpList the connected model sources and show what this org can see."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@millwork/solver-mcp
@millwork/solver-mcp is the Millwork Solver execution MCP server. It gives an
approved assistant 28 tenant-authenticated solver_* tools over stdio. Some
tools read state. Others connect model sources, submit work, cancel a run, or
decide a proposal, so the server is write-capable.
Install
Requires Node 20 or Node 22.
npm install @millwork/solver-mcp
solver-mcp --helpnpm install @millwork/solver-mcp resolves the latest dist-tag. Pin an exact
version for reproducible application builds.
Or run it directly:
npx --yes @millwork/solver-mcp --helpRelated MCP server: Uten Agent Terminal MCP
Connect an output check
Discover solver_list_verifiers first. An empty page without next_cursor
returns a typed scaffold_output_check next action. Install
@millwork/solver@0.1.17 or later to scaffold and test an output check locally,
then deploy its HTTPS endpoint.
The build-and-connect guide
starts with Recipe 0 and shows the local test, deployment, and recovery path.
Register a credential-less endpoint with solver_connect_verifier and retest with
solver_test_verifier:
solver_connect_verifier({ access: "public", endpoint: "<https-url>",
name: "<name>", version: "<version>", idempotency_key: "<caller-owned-id>" })For a protected endpoint, connect with access: "managed", then use
solver_start_verifier_connection to obtain the private browser handoff.
Give its continue_url only to the intended person, and use
solver_inspect_verifier_connection and
solver_continue_verifier_connection to resume the same operation after
private key entry. Never put the endpoint key in chat or a tool argument.
Disconnecting requires separate host confirmation and
confirm_disconnect: true; it stops Millwork's use of the key but does not
revoke the key at the endpoint. Pass the returned verifier_id into
solver_submit only after choosing the check. Connecting a check is not
approval to run a task.
Configure stdio
Point the MCP client at the solver-mcp binary with no arguments. Supply
these environment variables through the client's secret-aware environment
configuration. Do not paste their values into a prompt, log, screenshot, or
support report.
Variable | Required | Meaning |
| yes | Tenant API key held by the server process and sent as bearer authentication. |
| yes | API base including |
| no | Network/5xx retry limit. Default: |
| no | When |
| no | Exponential-backoff base in milliseconds. Default: |
The transport contract is exact:
command: solver-mcp
arguments: none
transport: stdio
stdout: MCP JSON-RPC only
stderr: diagnosticsUse it with an assistant
Any MCP-capable assistant can use the same tool surface. Start with a read-only request:
Use solver_list_sources and solver_list_source_connections to show what this
organization can see. Do not call a tool that requires human confirmation.
Return tool names and safe counts only. Do not print credentials or customer
content.For a write-capable request, make the stop explicit:
Prepare a solver_submit call but do not run it yet. Show the exact budget,
verifier, data classes, and caller-owned idempotency key. Wait for my explicit
confirmation before one call. If the outcome is uncertain, inspect status with
a read tool; do not submit again under a new key unless I confirm that new
intent.Human confirmation is a client-side stop. The tenant API key still carries the server-side permissions assigned to it. Confirmation does not turn a tenant-wide machine key into a narrower credential.
A live solver_submit also requires the supported host-isolation profile. The
host, not the prompt or launch environment, owns the fixed attestation,
read-only admission ledger, and exact one-run approval channel. The first call
can return host_approval_required; after the host writes the returned approval
document to the named host-owned file, retry the exact same tool arguments and
idempotency key. Echo submissions remain free and do not require this approval.
Tool surface
The server registers exactly 28 solver_* tools; tools/list over stdio is
the authoritative surface, and every tool description states what the tool
maps to and whether it writes. No tool ever accepts or returns raw credential
material. Provider and protected-verifier setup use private browser handoffs;
the tools return short-lived continuation URLs and opaque operation references,
never raw keys.
Retry and recovery boundary
The 28 tools divide into:
13 safe reads that may retry network and 5xx failures;
7 same-key mutations, including
solver_submitandsolver_disconnect_verifier_connection, which may retry only with the same caller-owned, non-empty idempotency key and the same request bytes; and8 write-capable tools that make one attempt because they expose no caller-owned idempotency key.
For those eight tools, a network or 5xx failure is a failure, not an automatic
retry. The write might have applied before the response was lost. Inspect
state with a safe read or your existing dashboard recovery path, then ask for
explicit human intent before another write-capable tool call. Raising
SOLVERAPI_MAX_RETRIES does not make those writes replay-safe.
Backend failures use RFC 7807. The MCP error result keeps the parsed Problem
in structuredContent.problem; transport failures use network_error.
Support
Report problems on this repository's
issue tracker. Useful
evidence includes the tool name, retry boundary, attempt count, package and
Node versions, and the Problem type, title, status, instance, and
retry_after_s fields. Never include credentials or customer content: omit
your tenant API key, your provider key/account details, authorization
headers, task content, and tenant or resource identifiers.
Scope
This package is tenant-authenticated and write-capable. It is not a documentation-retrieval service and receives no tenant key from any other package. The Millwork documentation assistant is a separate, retrieval-only service with no execution authority.
Read-only provider entry
Packages containing solver-provider-mcp offer a separate provider-only registry:
provider_validate_feed, provider_show_profile, provider_validation_context,
provider_workspace, and provider_check_feed_online. The execution registry
and its authority contract remain separate. See provider MCP instructions.
Configure an expiring provider:read scoped key outside chat using
MILLWORK_PROVIDER_API_KEY and MILLWORK_PROVIDER_API_URL (including /v1).
The online check is a dry run; submission and webhook/write tools are absent.
Profile and workspace output omit provider prose and operator notes. Every
route_id is explicitly untrusted data, never an instruction. Package
publication does not enable provider machine access for an organization.
Available Tools
18 toolssolver_cancelA
Cancel a running execution (POST /v1/executions/{id}/cancel).
Inputs: execution_id (required).
solver_create_source_connectionA
Bind a source connection for your provider key/account from a COMPLETED handoff intent (POST /v1/source-connections). Takes only the opaque handoff_intent_id -- never credential material. A fresh connection is disabled until solver_test_source_connection passes; deployments then come from solver_sync_source_deployments.
Inputs: source_id (required), auth_scheme (required), display_name (required), source_scope (required), +1 more.
solver_enable_model_armA
Enable a certification-backed model deployment as an arm (POST /v1/arms with kind=model and model_deployment_id). Use the catalog entry's secretless arm_registration_template values; claims wider than the certified template are rejected.
Inputs: cost_class (required), display_name (required), capability_tags (required), data_class_grants (required), +1 more.
solver_list_armsB
List the tenant's registered arms (GET /v1/arms). Returns { arms, next_cursor }.
Inputs: kind, limit, cursor, status.
solver_list_model_deploymentsA
List the tenant's certification-backed model deployments (GET /v1/model-deployments). Enable one as an arm with solver_enable_model_arm.
Inputs: no named parameters.
solver_list_source_connectionsA
List this tenant's source connections with their test/rotation state (GET /v1/source-connections). auth_binding_ref is an opaque broker handle, never a secret.
Inputs: no named parameters.
solver_list_sourcesA
List the model sources this tenant can connect (GET /v1/model-source-profiles). Every source runs on your provider key/account by construction: each entry carries its protocol/auth profile versions and endpoint policy. No credential material is involved.
Inputs: no named parameters.
solver_poll_source_handoffA
Poll a credential handoff intent until the human completes it in the browser (GET /v1/source-credential-handoffs/{handoff_intent_id}). Answers the intent state only.
Inputs: handoff_intent_id (required).
solver_proposalsA
List pending repair proposals, or inspect one when proposal_id is set (GET /v1/proposals[/{id}]).
Inputs: arm_id, status, proposal_id.
solver_receiptA
Fetch the receipt for an execution -- route rationale, per-slice evals, cost (GET /v1/receipts/{execution_id}). Content-free: never returns task output.
Inputs: execution_id (required).
solver_register_armA
Register a model/agent/skill arm (POST /v1/arms). Returns the created arm, including its arm_id, status, and (for skill kind) artifact_hash.
Inputs: kind (required), display_name (required), capability_tags (required), data_class_grants (required), +7 more.
solver_resultA
Fetch the retention-bound result of a COMPLETED execution (GET /v1/executions/{id}/result): the final text plus the winner attempt's model provenance (requested vs resolved identity) when one exists.
Inputs: execution_id (required).
solver_review_proposalB
Approve or reject a repair proposal (POST /v1/proposals/{id}/approve|reject); the decision parameter selects which.
Inputs: decision (required), proposal_id (required), reason.
solver_start_source_handoffA
Start a hosted browser credential handoff for a source (POST /v1/source-credential-handoffs). Returns a continue_url for a HUMAN to complete in a browser against the credential broker -- this tool never accepts or returns a raw key, service-account JSON, cloud secret, or token. Poll with solver_poll_source_handoff until state=completed, then pass the handoff_intent_id to solver_create_source_connection.
Inputs: source_id (required), auth_scheme (required).
solver_statusA
Poll an execution's lifecycle state (GET /v1/executions/{id}).
Inputs: execution_id (required).
solver_submitA
Submit a task for governed execution (POST /v1/executions). Requires a unique request ID via idempotency_key (sent as the Idempotency-Key header) -- an MCP client cannot construct a valid call without it.
Inputs: task (required), policy (required), verifier_id (required), idempotency_key (required), +1 more.
solver_sync_source_deploymentsA
Discover and persist the connection-authorized, certification-backed deployments (POST /v1/source-connections/{id}/deployments/sync). Requires an ACTIVE (tested) connection; answers the synced deployment set. Discovery is not certification: unevidenced identities are never persisted.
Inputs: connection_id (required).
solver_test_source_connectionA
Run the live credential test on a source connection (POST /v1/source-connections/{id}/test). A passing test activates the connection; the wire reports test_state/test_error.
Inputs: connection_id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 18 tools
Most tools map cleanly to distinct lifecycle stages: source handoff, connection testing, deployment sync, arm registration, execution submission, and proposal review. The main ambiguity is between solver_enable_model_arm and solver_register_arm, which both create arms, and between solver_list_source_connections and solver_list_sources because their names are very close.
All tool names share the solver_ prefix and consistently use snake_case with clear action/resource stems. Minor inconsistency comes from noun-style names like solver_proposals, solver_status, solver_result, and solver_receipt, which deviate from the verb_noun pattern used elsewhere.
18 tools is slightly above the typical 3-15 range, but the count is reasonable for a governed execution platform spanning source connections, credential handoffs, arms, executions, and proposals. There are no obvious redundant or filler tools.
The core workflow is well covered: connect a source, sync deployments, register arms, submit executions, poll status, fetch results/receipts, and review proposals. However, there are notable lifecycle gaps: no way to list executions, disconnect or delete a source connection, or disable/delete an arm.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Connect AI assistants to your approved computer for files, commands, browser and desktop tasks.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Context and control for any AI. Agent identity, scoped access, and proof across tools.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables an LLM to control Solibri through 25 MCP tools, covering model inspection, rule checking, BCF issue handling, presentations, and Autorun batch verification, all restricted to a local workspace.25MIT
- AlicenseBqualityCmaintenanceEnables AI agents to run shell commands, execute Python code, read and write files, search text, and create or delete folders through MCP stdio tools.9MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to securely operate on a local workstation through MCP by exposing file, shell, and workspace management tools.10MIT
- AlicenseNot gradedqualityCmaintenanceEnables a family assistant to search documents, inspect, fill, edit, and sign files, manage scheduled work and runs, and perform web searches, with each tool gated by the caller's groups.1MIT