Skip to main content
Glama
@millwork/solver-mcp

@millwork/solver-mcp

Official
by millworkdev

@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 --help

npm 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 --help

Related 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

SOLVERAPI_API_KEY

yes

Tenant API key held by the server process and sent as bearer authentication.

SOLVERAPI_BASE_URL

yes

API base including /v1; the production value is https://api.getmillwork.dev/v1.

SOLVERAPI_MAX_RETRIES

no

Network/5xx retry limit. Default: 2. It never widens the safe retry boundary.

SOLVERAPI_REFUSE_BASELINE_SUBMIT

no

When 1 or true, a live solver_submit without verifier_id is refused. Echo is not refused. Default: off.

SOLVERAPI_RETRY_BACKOFF_MS

no

Exponential-backoff base in milliseconds. Default: 500.

The transport contract is exact:

command: solver-mcp
arguments: none
transport: stdio
stdout: MCP JSON-RPC only
stderr: diagnostics

Use 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_submit and solver_disconnect_verifier_connection, which may retry only with the same caller-owned, non-empty idempotency key and the same request bytes; and

  • 8 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 tools
solver_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

    A3.7/5.0

    Scored across 18 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count4/5

    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.

    Completeness3/5

    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

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers