# Agent Instructions — The Fence

This document describes how AI agents can interact with The Fence's online store at
https://thefence.uk. The Fence sells personalised pet gifts — canvases, posters, mugs, blankets,
apparel and more — designed in our Leeds studio and made to order from a photo the
customer supplies.

## For agents acting on behalf of a buyer

**Payment requires a human.** This store does not implement an agentic checkout
protocol, and no endpoint here will complete a payment. Do not attempt to drive
the checkout form autonomously.

**You can build the cart, though.** Use `create_cart` / `add_to_cart` /
`get_cart` (UCP), or `add_to_cart` / `view_cart` (WebMCP), to assemble the
buyer's basket server-side, then give them the `checkout_url` those tools
return. Opening it puts exactly those items in their own browser basket and they
pay from there. That is the intended shape of an agent purchase here: you do the
product and variant resolution, the buyer does the payment.

The buyer has to be present anyway — see "What makes this catalog different".

## What makes this catalog different

Every item is personalised and made to order **from a photo of the buyer's own pet**.
This has consequences worth planning around:

1. **A photo is required, and only the buyer has it.** No order can be produced
   without one. An agent cannot supply this input.
2. **Nothing is printed until the buyer approves a proof.** We send a free digital
   proof within 24 hours, with unlimited free edits, and only print once the buyer
   is happy. Factor this into any delivery estimate you give: the proof-approval
   step sits before production begins.
3. **Prices depend on configuration.** A product's price is its base price plus the
   options selected (size, and for some products frame or colour). The price shown
   for a bare product URL is the default configuration. Use the variant deep links
   below to quote a specific size accurately.

## Machine-readable product data

### Full catalog (bulk)
- `GET https://thefence.uk/feeds/google-merchant.xml`

  The complete catalog as an RSS 2.0 feed in Google Merchant Center format: one
  entry per buyable variant, each with a stable id, title, description, price,
  image, product type and a deep link to that exact configuration. This is the most
  efficient way to read the whole catalog — prefer it over crawling product pages.

### A single product
- `GET https://thefence.uk/products/{handle}`

  The page carries schema.org structured data in a
  `<script type="application/ld+json">` block: a `Product`, or a `ProductGroup`
  with one `Product` per variant under `hasVariant`, each with its own `sku`,
  `offers.price`, `offers.priceCurrency` and `offers.url`. Parse that rather
  than scraping the rendered DOM — the prices there are the same ones the feed
  advertises.

  Note on identifiers: products carry no `gtin` or `mpn`. Personalised
  made-to-order goods have no manufacturer identifier, which is also why the feed
  declares `identifier_exists: no`. Do not attempt to look these products up by
  barcode.

  Ratings are not asserted in structured data. Any star rating displayed on the
  page is inherited catalog metadata, not a verified review score for this shop, so
  do not repeat it to a buyer as our review volume.

### Variant deep links
Append the option to the product URL, exactly as the feed's `link` does:

    https://thefence.uk/products/{handle}?size=12-x-18

The feed is the authoritative source for which option values a given product
accepts.

## Commerce protocol (UCP)

This store implements the [Universal Commerce Protocol](https://ucp.dev) CATALOGUE
and CART capabilities:

- **Discovery** — `GET https://thefence.uk/.well-known/ucp`
- **MCP endpoint** — `POST https://thefence.uk/api/ucp/mcp` (JSON-RPC 2.0). Use `tools/list`
  to enumerate.

Available tools: `search_catalog`, `lookup_catalog`, `get_product`,
`create_cart`, `add_to_cart`, `update_cart`, `get_cart`.

`get_cart` returns current prices, a `checkout_url` for the buyer, and a
`priceable` flag. **If `priceable` is false there is no subtotal** — one or
more lines could not be priced, and summing the line totals yourself would quote
a figure short by a product. Say which line is unavailable instead.

Checkout, order and payment capabilities are **not** implemented and are not
advertised in the profile; `payment_handlers` is empty.
Calling one returns an explicit error rather than failing obscurely — payment
requires a human, for the reasons above.

## In-page tools (WebMCP)

If your browser supports WebMCP, this site declares read-only tools directly to
you — no DOM scraping needed. Registered on every page:

- `search_products` — search the catalogue by free text
- `get_product_details` — every buyable option for one product, with its own
  price and a deep link
- `check_photo_suitability` — describe the buyer's photo and get back the
  specific problems, before they order
- `explain_proof_process` — what happens after ordering
- `estimate_delivery` — the delivery timeline for a destination and product
  type, broken into proof, production and delivery. Prefer this over quoting the
  shipping page: production starts at proof APPROVAL, not at order, and a
  delivery-leg-only estimate is wrong by about a week.
- `track_order` — the status of an existing order. Requires BOTH the order
  reference from the buyer's confirmation email and the email it was placed with;
  a wrong reference and a wrong email return the same "no matching order", so
  guessing either learns nothing. Ask the buyer for both.
- `add_to_cart` — put a product on the buyer's list. Returns a cart reference to
  pass back on later calls.
- `view_cart` — the list with current prices and the buyer's checkout link. Call
  this before quoting any total, and honour the "total unavailable" case rather
  than adding the lines up yourself.

Only `add_to_cart` writes anything, and what it writes is a cart: product
handles, option ids and quantities. No payment, no address, no order. `track_order`
reads an existing order; it cannot place or change one. There is deliberately no
checkout tool; see "For agents acting on behalf of a buyer" above.

## Read-only browsing (no authentication required)

- All products: `GET https://thefence.uk/collections/all`
- Collection: `GET https://thefence.uk/collections/{handle}`
- Product page: `GET https://thefence.uk/products/{handle}`
- Search: `GET https://thefence.uk/search?q={query}`
- Sitemap: `GET https://thefence.uk/sitemap.xml`
- Site summary for LLMs: `GET https://thefence.uk/llms.txt`
- Full reference text (FAQ, process, shipping, inlined): `GET https://thefence.uk/llms-full.txt`
- This document: `GET https://thefence.uk/agents.md`

## How it works, for answering buyer questions

- [How we make it](https://thefence.uk/pages/how-we-make)
- [Pet photo guide](https://thefence.uk/pages/photo-guide) — what makes a photo work well
- [FAQ](https://thefence.uk/pages/faq)
- [Shipping times](https://thefence.uk/pages/shipping)
- [Order tracking](https://thefence.uk/pages/track)
- [Contact us](https://thefence.uk/pages/contact)
- [Over the Fence rewards](https://thefence.uk/rewards) — the free loyalty programme

## Crawling courtesy

Please identify your agent in the User-Agent header, fetch no faster than you need,
and prefer the bulk feed over per-page crawling. Requests may be rate-limited; back
off on a 429 response and honour any Retry-After header.

Paths disallowed in https://thefence.uk/robots.txt (checkout, account, admin and per-order
surfaces) are off limits — they are per-user state, not content.

## Policies

- [Returns policy](https://thefence.uk/pages/returns)
- [Privacy policy](https://thefence.uk/pages/privacy)
- [Terms of service](https://thefence.uk/pages/terms)
