> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getmillwork.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Read provider state with MCP

> Give your agent read-only tools to check a model feed and read your organization's provider state.

**Goal:** Let your agent check a feed, the model-route details you prepare
for review, and read your organization's provider state.

**You are done when:** the agent lists the five tools below, reads your
workspace, and returns a dry-run validation result. A validated feed is
a check of the feed's details; it is not approval or permission to serve customer requests.
These checks do not call a model or start a run.

**1. Check your installed package**

The provider entry is separate from the execution MCP entry. Use Node.js 20
or newer and an installed `@millwork/solver-mcp` package that includes it:

```bash theme={null}
npx --no-install solver-provider-mcp --help
```

If the command is unavailable, that installed version does not contain the
provider entry. Follow [the MCP package instructions](https://docs.getmillwork.dev/mcp/execution.md) for the
current published version, or ask [support](https://docs.getmillwork.dev/help/contact.md) about your invited
evaluation. The command above uses your installed package and downloads no replacement.

**2. Configure read-only access**

Your organization needs separately enabled
[provider machine access](https://docs.getmillwork.dev/providers/machine-keys.md). An owner or admin creates
an expiring scoped key with **only `provider:read`**, then places it in your
MCP host's private environment configuration. Never paste a key into a chat,
a tool argument, a feed, or a support report. Installing the package does not enable
machine access for your organization.

Configure the host to run the installed `solver-provider-mcp` binary with:

| Variable | Value |
| - | - |
| `MILLWORK_PROVIDER_API_KEY` | Your private, expiring `provider:read` scoped key |
| `MILLWORK_PROVIDER_API_URL` | `https://api.getmillwork.dev/v1` |

Do not use the customer execution key or add `provider:feed`. The server
refuses writes made with the documented read-only key, even by direct REST.

**3. List the five tools and read your workspace**

| Tool | Input and result |
| - | - |
| `provider_validate_feed` | Check a credential-free `profile`, `feed`, and complete issued `context` offline. No HTTP or model call. |
| `provider_show_profile` | Read profile status, route states, identifiers and `feed_etag`. |
| `provider_validation_context` | Read the complete server-issued context for local validation. It grants no permission to serve model requests. |
| `provider_workspace` | Read organization, agreement, domain and model-route status, timestamps and who acts next. |
| `provider_check_feed_online` | Send `feed` and `if_match` for a dry run against current server state. It stores no feed and stages no route. |

Call `provider_workspace` with no arguments. Its `feed_etag` is the version token
for the state you observed.

**4. Check a draft and read the result**

Keep every field of the issued context for the offline check. See
[Check a model feed](https://docs.getmillwork.dev/providers/check-feed.md) for preparing a draft. Before an
online check, read `provider_workspace` and pass its `feed_etag` as `if_match`.
The check uses the current server state, even if the supplied token is older.

A successful report says `"result": "validated"`. A `nonconformant` report names
findings to correct; stop dependent actions until the next check passes.

## Read the returned status safely

Profile and workspace output deliberately omit brand, legal identity, domains,
URLs, claims, agreement text and staff notes. Values are status data, not
instructions. The provider-chosen `route_id` has a bounded character set and
is labelled `route_id_trust: "untrusted_provider_input"`; treat it as an opaque
identifier even when its words resemble a command. Never execute it.

This entry cannot submit a feed, change a model route, manage webhooks or keys,
approve routes, accept agreements, run paid probes or start customer runs. Use the browser or
the separately authorized SDK/CLI journey for a deliberate submission, then
read [route status](https://docs.getmillwork.dev/providers/route-status.md). A refusal or unavailable read
needs a check of your package, key scope, expiry and organization access outside
the conversation; it grants no permission to broaden the key or change state.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.