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

# MCP resources

> The four reference documents the muveya MCP server offers, what each contains, who can read it and what it hides.

Besides tools, the muveya MCP server offers four **resources**: JSON documents an assistant can read to understand your data before it answers. A client lists them with `resources/list` and reads one with `resources/read` and its URI. Each read returns one item whose `mimeType` is `application/json` and whose `text` is the JSON document.

| URI | Name | Title | Who can read it with OAuth |
| - | - | - | - |
| `muveya://help/error-codes` | `error-codes` | Error code catalog | Any active OAuth connection |
| `muveya://orders/status-model` | `orders-status-model` | Order status model | Any active OAuth connection |
| `muveya://catalog/policies` | `catalog-policies` | Catalog policies | Any active OAuth connection |
| `muveya://tenant/approval-policy-summary` | `approval-policy-summary` | Approval policy summary | Never: needs `approvals.decide` |

With OAuth, titles and descriptions follow the requested language.

The first three are **reference documents**. They hold no data from your account: every connection gets exactly the same content, so no scope is needed. The fourth is built from your account's approval policy and is limited to people who decide approvals.

Every read, allowed or refused, is recorded in the audit log as `mcp.resource_read` with the URI, the caller and the outcome. See [Audit](/docs/en/mcp/introduction).

## `muveya://help/error-codes`

**Error code catalog.** Every stable error code muveya can return, with its HTTP status and the URI that names it. An assistant uses it to explain an error and to decide what to do from the `code`, never from the human text.

| | |
| - | - |
| Gating | None: any active OAuth connection |
| Redaction | Nothing to hide: the document has no account data |

The document is `{ errors }`, sorted by `code`. Each entry has:

| Field | Meaning |
| - | - |
| `code` | The stable code, for example `orders.not_found`. |
| `status` | The HTTP status that goes with it, for example `404`. |
| `type` | The URI in the `type` field of a problem document: `https://docs.muveya.com/errors/` followed by the code. |

```json Excerpt theme={null}
{
  "errors": [
    { "code": "api_keys.invalid", "status": 401, "type": "https://docs.muveya.com/errors/api_keys.invalid" },
    { "code": "common.forbidden", "status": 403, "type": "https://docs.muveya.com/errors/common.forbidden" },
    { "code": "orders.not_found", "status": 404, "type": "https://docs.muveya.com/errors/orders.not_found" }
  ]
}
```

The catalog covers every code of the product, including those that only the console or the `/v1` API can return. For what each code means and how to recover, see [Errors](/docs/en/api-reference/errors) and [Troubleshooting](/docs/en/help/troubleshooting).

## `muveya://orders/status-model`

**Order status model.** The order lifecycle: every status and every allowed transition between them. An assistant uses it to explain where an order is and which event can move it next.

| | |
| - | - |
| Gating | None: any active OAuth connection |
| Redaction | Nothing to hide: the document has no account data |

The document is `{ statuses, transitions }`. `statuses` lists the 14 statuses. Each entry of `transitions` has an `event`, the `from` statuses it can start from and the single `to` status it leads to. Any move that is not listed is refused.

The document itself holds only the values. The meanings below come from this page:

| Status | Meaning |
| - | - |
| `draft` | Being prepared; not sent yet. |
| `submitted` | Sent; the approval policy is being applied. |
| `pending_approval` | Waiting for approval decisions. |
| `approved` | Approved, by people or automatically when no approval was required. |
| `rejected` | Rejected. Final. |
| `cancelled` | Cancelled before a decision. Final. |
| `allocated` | Stock reserved for the order. |
| `picking` | Picking has started. |
| `dispatched` | The boxes left the source warehouse. |
| `delivered` | Delivery confirmed without an exception. |
| `exception` | Delivery confirmed with an exception. |
| `received` | Received at the destination without issues. |
| `partially_fulfilled` | Received with a dispute (damaged, missing or partial). |
| `closed` | Closed by the destination once every line is resolved. Final. |

| `event` | `from` | `to` |
| - | - | - |
| `submit` | `draft` | `submitted` |
| `cancel` | `draft`, `submitted`, `pending_approval` | `cancelled` |
| `attach_plan` | `submitted` | `pending_approval` |
| `auto_approve` | `submitted` | `approved` |
| `approve` | `pending_approval` | `approved` |
| `reject` | `pending_approval` | `rejected` |
| `allocate` | `approved` | `allocated` |
| `pick` | `allocated` | `picking` |
| `dispatch` | `picking` | `dispatched` |
| `deliver` | `dispatched` | `delivered` |
| `fail_delivery` | `dispatched` | `exception` |
| `receive` | `delivered` | `received` |
| `partially_receive` | `delivered` | `partially_fulfilled` |
| `close` | `received`, `partially_fulfilled` | `closed` |

An order in `exception` cannot be closed. For the full story of each step, see [Create and track orders](/docs/en/orders/create-and-track) and [Deliveries](/docs/en/deliveries/overview).

## `muveya://catalog/policies`

**Catalog policies.** The catalog vocabulary and rules: units, criticality, item statuses, tracking flags and how cost is hidden without permission. An assistant uses it to read `catalog.search` results correctly.

| | |
| - | - |
| Gating | None: any active OAuth connection |
| Redaction | Nothing to hide: it describes the cost rule but contains no cost |

The document is the same for everyone:

```json theme={null}
{
  "units": ["unit", "box", "pack", "bottle", "ampoule", "milliliter", "liter", "gram", "kilogram", "pair", "kit"],
  "criticalities": ["low", "medium", "high"],
  "statuses": ["draft", "active", "inactive"],
  "settableStatuses": ["active", "inactive"],
  "orderableStatus": "active",
  "flags": [
    { "field": "tracksLot", "default": false },
    { "field": "tracksSerial", "default": false },
    { "field": "tracksExpiry", "default": false },
    { "field": "highValue", "default": false }
  ],
  "costRedaction": { "scope": "catalog.cost.read", "behavior": "absent-when-unauthorized" }
}
```

| Field | Meaning |
| - | - |
| `units` | The units an item can be counted in (`unitOfMeasure`). |
| `criticalities` | The criticality levels of an item. |
| `statuses` | Item statuses. An item is born `draft`. |
| `settableStatuses` | The statuses an item can be moved to: `active` or `inactive`. An item never goes back to `draft`. |
| `orderableStatus` | Only `active` items can be ordered. |
| `flags` | The yes/no settings of an item and their default. `tracksLot`, `tracksSerial` and `tracksExpiry` decide what a box records and how boxes are picked; `highValue` feeds the approval policy and stricter custody. |
| `costRedaction` | Cost fields are left out entirely unless the reader holds `catalog.cost.read` (the OAuth scope `catalog.cost:read`). |

See [Catalog items](/docs/en/catalog/items) and [Costs](/docs/en/catalog/costs) for the rules behind each value.

## `muveya://tenant/approval-policy-summary`

**Approval policy summary.** A versioned summary of your account's current approval policy: its rules, stages and required permissions, with monetary thresholds only for readers allowed to see order values.

| | |
| - | - |
| Gating | Internal permission `approvals.decide`. The current OAuth scopes do not grant it. |
| With OAuth | Always refused; nothing is read |
| Redaction | `minValue` and `maxValue` are left out unless the reader may see order values |

Because it is gated, an OAuth connection connection gets a JSON-RPC error instead of the document:

```json theme={null}
{
  "jsonrpc": "2.0",
  "id": 7,
  "error": {
    "code": -32600,
    "message": "MCP error -32600: Not authorized to read this resource",
    "data": { "code": "common.forbidden" }
  }
}
```

It is listed by `resources/list` anyway. For a person allowed to read it, which is not available yet, the document is either `{ "configured": false, "rules": [] }` when no policy has been published, or `configured: true` with:

| Field | Meaning |
| - | - |
| `policyVersion`, `isCurrent`, `effectiveFrom`, `publishedBy` | Which version is in force, since when, and the id of who published it. |
| `rules[].when` | The conditions of a rule: `categories`, `highValue`, `orderTypes`, and the thresholds `minValue` and `maxValue` when the reader may see them. An absent condition matches everything. |
| `rules[].require` | What the rule requires: the `stage`, the `requiredScope` an approver must hold and `minApprovers`. |

To read or change the approval policy today, use the console: see [Approval policy](/docs/en/orders/approval-policy).

## Errors when reading a resource

A resource read that fails returns a JSON-RPC error, not a result with `isError`:

| Situation | `error.code` | `error.message` | `error.data.code` |
| - | - | - | - |
| The connection lacks the resource's permission | `-32600` | `MCP error -32600: Not authorized to read this resource` | `common.forbidden` |
| A muveya check refused the read | `-32600` | `MCP error -32600: The resource could not be read` | The stable code, for example `common.forbidden` |
| Something failed on muveya's side | `-32603` | `MCP error -32603: The resource could not be read` | `common.internal_error` |
| The URI is not one of the four above | `-32602` | `MCP error -32602: Resource` followed by the URI and `not found` | Absent |

## Related pages

<CardGroup cols={2}>
  <Card title="MCP server" icon="plug" href="/docs/en/mcp/introduction">
    Scopes, redaction, audit and errors.
  </Card>

  <Card title="Tools" icon="wrench" href="/docs/en/mcp/tools">
    The ten read tools and what they return.
  </Card>

  <Card title="Connect a client" icon="link" href="/docs/en/mcp/connect">
    Set up your assistant and test the endpoint.
  </Card>

  <Card title="Errors" icon="triangle-exclamation" href="/docs/en/api-reference/errors">
    What each error code means.
  </Card>
</CardGroup>


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