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

# Review invoices with Vori MCP

> Find invoices awaiting review, resolve product matches, manage recurring ignores, and preview and apply selected cost and price changes.

Use Vori's Model Context Protocol (MCP) tools to work through invoice cost changes with your AI assistant. You can match an unrecognized item to your catalog, remember recurring bottle-deposit charges to ignore, and review cost, shelf-price, and margin changes before applying selected lines.

Start with [Connect to Vori MCP (mcp.vori.com)](/mcp/introduction) to connect your client. Vori MCP is in alpha. If newly available tools do not appear, reconnect or restart your client to refresh its tool list.

### Access and identifiers

The tools use your Vori account's invoice permissions for the invoice's store:

| Permission | Tools |
| - | - |
| Read invoices | `list_invoices`, `get_invoice_by_id`, `list_invoice_review_lines`, `preview_invoice_commit` |
| Update invoices | `update_invoice_review_line`, `reset_invoice_review_line`, `ignore_invoice_lines_forever`, `undo_ignore_invoice_lines_forever`, `set_invoice_line_retail_price`, `commit_invoice_changes` |

Read tools let you inspect and preview changes without applying them to your catalog. An account with the Read-only role cannot use the update tools. Review operations use the invoice's active revision and check your access to its store.

Use the Vori `invoiceId` returned as `id` by `list_invoices`. This is different from `invoiceNumber`, the vendor's printed invoice number. Use `revisionRowId` from `list_invoice_review_lines` when editing or selecting a line; its `id` and `lineNumber` are different identifiers. Pass IDs as strings.

### Review an invoice with your assistant

1. Ask for invoices waiting for review in your store. The assistant can call `list_invoices` with `processingStatus: "READY"` and your `storeId`.
2. Ask what needs a decision on an invoice. `list_invoice_review_lines` returns matching diagnoses, candidate products, previous and new costs, retail prices, margins, and the cost or price changes each line would apply.
3. Resolve each line you want to apply. Match a catalog product, correct a case size or quantity, ignore a recurring non-product charge, or stage a shelf price. Read the review lines again after editing to see the recalculated result.
4. Ask for a preview of the selected lines. Review the proposed product changes and any inventory adjustments before approving them.
5. Apply only the approved lines with the same selection and cost/inventory options. Leave `markInvoiceAsDone: false` while another line still needs a decision.

For example, you can ask: "Show the invoices waiting for review. Match the oat milk line to the product I select, remember the bottle-deposit line as an ignore, and show me the cost and margin changes. Preview the lines I approve and leave the unusual changes for me to review."

For shelf pricing, give your assistant the price endings, thresholds, and rounding you want for the current review. For example: "Propose prices ending in .99, avoid .09 endings, and show me the resulting margins before applying them." The assistant chooses a price from your instructions and passes that amount to `set_invoice_line_retail_price` for each line.

<Warning>
  Review the preview before approving a commit. `commit_invoice_changes` writes
  to the live catalog, queues affected product tags, and locks the applied cost
  or inventory changes. Resetting a review line does not undo applied changes.
  Remembered ignores also take effect when you call the ignore tool; use the
  undo-ignore tool to remove them.
</Warning>

### Find invoices and read review lines

#### `list_invoices`

Returns invoices newest first. All inputs are optional:

* `storeId`, `storeVendorId`, and `invoiceNumber` filter by store, store vendor, and exact printed invoice number.
* `processingStatus` accepts `READY` (waiting for review), `PROCESSING`, `DONE`, or `REJECTED`.
* `take` defaults to 25 and accepts 1-50; `skip` defaults to 0. Increase `skip` to request the next page.

The result is `{ invoices, hasMore }`. Each invoice includes `id`, `createdAt`, `updatedAt`, `storeId`, `storeVendorId`, `storeFileUuid`, `invoiceNumber`, `total`, `billingDate`, `processingStatus`, `rejectionNotes`, and `lineItemCount`. `total` is a decimal string in dollars. If you omit `storeId`, results cover the stores you can access.

#### `get_invoice_by_id`

Takes `invoiceId`. Returns the invoice header above with `lineItems` instead of `lineItemCount`. Each line includes `revisionRowId`, `barcode`, `itemCode`, `description`, `shippedQuantity`, `shippedUnitOfMeasure`, `storeProductId`, `storeVendorProductId`, and `isSkipped`. Use the review-lines tool for cost changes and matching diagnoses.

#### `list_invoice_review_lines`

Takes `invoiceId`, optional `status` (`review`, `ignored`, or `unchanged`), and `take`/`skip`. `take` defaults to 100 and accepts 1-200; `skip` defaults to 0. Lines are sorted by line number.

The result includes `invoiceId`, `revisionId`, `invoiceLineItemSetId`, `count`, `statusCounts`, and `lines`. `count` counts all lines matching your filter; `statusCounts` counts each status across the whole invoice. Page through until you have read `count` matching lines.

Each review line includes:

* Its `revisionRowId`, `lineNumber`, status, description, barcode, item code, matched product IDs, and candidate products. Candidates distinguish existing records (`source: "DATABASE"`) from proposed records (`source: "DRAFT"`).
* A nullable `diagnosis` with `code`, `displayName`, and `description`, plus `costChangeType`.
* Quantity, case size, invoice cost, previous/new unit cost, current/previous/new retail price, and current/previous/new/target margin percentages, with the associated units.
* `skipCostChange`, `skipInventoryChanges`, `hasUserChanges`, cost/inventory commit timestamps, and `commitImpact: { cost, price }`.

Cost, price, quantity, and margin values in review lines are decimal strings or `null`. Margin percentages use values such as `"35.00"` for 35%, rather than a fraction. A matching diagnosis or cost-change category helps you review a line; decide which lines are appropriate before applying them.

### Match, correct, ignore, or price a line

#### `update_invoice_review_line`

Takes `invoiceId`, `revisionRowId`, and at least one field to change:

| Field | Use |
| - | - |
| `storeProductId` | Select an existing catalog product, for example from `search_products` or a database candidate. Pass `null` to clear it. Changing this field clears the vendor-product mapping unless you also pass `storeVendorProductId`. |
| `storeVendorProductId` | Select a vendor product by its ID, including a proposed candidate's `ref_svp_...` ID. Pass `null` to clear it. |
| `skipCostChange` | Set `true` to leave the saved cost and retail price unchanged for this invoice; `false` restores eligibility. |
| `skipInventoryChanges` | Set `true` to exclude the line's quantity from inventory changes for this invoice; `false` restores eligibility. |
| `caseSize` | A positive decimal string for units per case, or `null` to clear it. |
| `detectedCost`, `shippedQuantity`, `invoicedWeight` | Non-negative decimal strings, or `null` to clear them. |
| `detectedCostUom`, `shippedQuantityUom` | Unit names such as `"case"`, `"each"`, or `"lb"`, or `null` to clear them. |

Only supplied fields change. The result is `{ revisionRowId, state }`; reread review lines for the reconciled view. Applied cost or inventory changes cannot be edited in that domain. Vori remembers a selected product mapping for future invoices once the line is applied.

#### `reset_invoice_review_line`

Takes `invoiceId` and `revisionRowId`. Discards the line's review edits, including mappings, corrected quantities, one-invoice skips, and staged price, then returns `{ revisionRowId }`. A line whose changes have already been applied cannot be reset. Use the separate undo-ignore tool for a remembered ignore.

#### `ignore_invoice_lines_forever`

Takes `invoiceId` and 1-500 `revisionRowIds`. Remembers non-product charges, such as California Redemption Value (CRV), bottle deposits, freight, and fees, for this invoice and future invoices for the same store vendor. Matching uses the line's barcode, item code, or description.

The result contains `ignoredRevisionRowIds` and `unidentifiedRevisionRowIds`. A line with no usable barcode, item code, or description cannot be remembered; inspect `unidentifiedRevisionRowIds` rather than assuming every requested line was ignored.

#### `undo_ignore_invoice_lines_forever`

Takes `invoiceId` and 1-500 `revisionRowIds`. Removes remembered ignores for those items so they can return to review on this and future invoices. Returns `{ restoredCount }`, the number of remembered skips removed.

#### `set_invoice_line_retail_price`

Takes `invoiceId`, `revisionRowId`, and `retailPrice`, a positive decimal string in dollars such as `"5.99"`. Optional `retailPriceUomId` specifies the unit the price is per; omit it to retain the matched product's pricing unit.

The line must match an existing catalog product. The price is staged and applies when you commit that line with `commitCostChanges: true`. The result includes `revisionRowId`, `storeProductId`, `retailPrice`, `retailPriceUomId`, and `errors`/`conflicts` arrays containing `{ type, message }`. Inspect both arrays, then reread and preview the line before applying it.

### Preview and apply selected changes

#### `preview_invoice_commit`

Takes `invoiceId` and these optional inputs, which are also accepted by `commit_invoice_changes`:

| Input | Default | Meaning |
| - | - | - |
| `revisionRowIds` | Every eligible line | Select 1-500 line IDs to review and apply only those lines. |
| `commitCostChanges` | `true` | Include cost and staged retail-price changes. |
| `commitInventoryChanges` | `false` | Include on-hand inventory changes from invoice quantities. |

Returns `{ invoiceId, revisionId, draftEntities, inventoryAdjustments }` without applying the changes to your catalog. Each draft entity includes its `id`, `revisionRowId`, `entityType`, `source` (`CREATE` or `UPDATE`), `entityId`, and proposed `fields`. Entity types are `STORE_PRODUCT`, `STORE_VENDOR_PRODUCT`, and `VENDOR_PRODUCT`.

Each inventory adjustment includes `revisionRowId`, the product's ID/name/barcode, `currentInventoryOnHand`, `resultingInventoryOnHand`, and `inventoryValue`.

For example, pass this selection to the preview tool, replacing the illustrative IDs with IDs returned by your tools:

```json theme={null}
{
  "invoiceId": "12345",
  "revisionRowIds": ["67890", "67891"],
  "commitCostChanges": true,
  "commitInventoryChanges": false
}
```

#### `commit_invoice_changes`

Takes the same inputs as the preview, plus optional `markInvoiceAsDone` (default `false`). After reviewing and approving the preview, commit with the same selected rows and cost/inventory options. Set `markInvoiceAsDone: true` only when you intend to move the whole invoice to `DONE`.

The call applies changes before returning. Use batches of `revisionRowIds` for large invoices. The result is `{ invoiceId, committed, errors }`; each error includes `revisionRowId`, `draftEntityId`, and `message`. `committed` is `true` when no errors were returned. If errors are returned, inspect them and reread the invoice before deciding what to apply next.


## Related topics

- [Connect to Vori MCP (mcp.vori.com)](/mcp/introduction.md)
- [Review and Sync Invoices as Bills](/accounting-integrations/invoice-review-and-bills.md)
- [Download UNFI Invoices for Cost Change Review](/cost-changes-and-smart-pricing/unfi-and-supervalu/how-to-download-unfi-invoices-for-cost-change-review.md)
