Skip to content

Universal Commerce Protocol (UCP)

Partle speaks UCP, the open agentic-commerce standard published by Google with Shopify in January 2026. An agent that speaks UCP can search and read Partle's catalog without knowing anything Partle-specific.

Capability profile

https://partle.rubenayla.xyz/.well-known/ucp

Fetch this first. It declares the protocol version, the transports, and the capabilities Partle serves. Partle implements the Catalog capability:

Capability What it does
dev.ucp.shopping.catalog.search Search the catalog by free text, price range and category
dev.ucp.shopping.catalog.lookup Fetch known products by id

Checkout, orders, payment handlers and identity linking are not offered, and the profile says so. Partle indexes products held by other stores and sends the buyer to the seller; it never takes payment. Each product carries the seller's own listing URL in metadata.source_url.

MCP binding

Endpoint: https://partle.rubenayla.xyz/ucp/mcp/ (Streamable HTTP). No authentication.

Tools: search_catalog, lookup_catalog, get_product. The request payload goes under catalog, protocol metadata under meta, and the UCP envelope comes back in result.structuredContent.

{
  "name": "search_catalog",
  "arguments": {
    "meta": {"ucp-agent": {"profile": "https://your-platform.example/agent.json"}},
    "catalog": {
      "query": "heavy duty masonry wall anchor",
      "filters": {"price": {"max": 5000}},
      "context": {"currency": "EUR"},
      "pagination": {"limit": 20}
    }
  }
}

This is a separate server from Partle's main MCP endpoint at /mcp/, which offers a larger Partle-specific toolset including writes. Use /mcp/ to publish products or manage inventory; use /ucp/mcp/ when you want standard UCP and nothing else. Connecting to the main server is covered in Connect your AI.

REST binding

Three POST endpoints, same envelope as the MCP binding:

Endpoint Body
POST /ucp/catalog/search query, filters, context, pagination
POST /ucp/catalog/lookup ids, optional filters and context
POST /ucp/catalog/product id, optional selected, preferences, filters and context
curl -X POST https://partle.rubenayla.xyz/ucp/catalog/search \
  -H 'content-type: application/json' \
  -d '{"query": "chemical anchor for brick", "pagination": {"limit": 3}}'

Things to know about the data

Prices are integers in minor currency units, as UCP requires: {"amount": 1290, "currency": "CHF"} means 12.90 CHF. That applies to filters.price on the way in as well. A price filter must include its denomination in context.currency; otherwise Partle returns the unfiltered catalog with an unsupported_price_filter warning rather than comparing amounts from different currencies.

Listings with no published price are not in the UCP catalog at all. UCP requires a price on every variant and a price_range on every product, and defines amount: 0 as free — so there is no way to say "price unknown". Rather than invent a price or emit products that fail schema validation, Partle leaves those listings out. A production query found 152,668 such rows on 2026-08-13; they remain on the website and on Partle's own MCP server at /mcp/, neither of which has that constraint. Asking for one by id returns ucp.status: "error" with an item_unavailable message and a link to its page.

Lookup responses carry correlation data that search responses don't. Each variant returned by /ucp/catalog/lookup has an inputs array naming which requested id resolved to it and how — always exact for Partle, since an id addresses the variant directly.

Every product has exactly one variant, sharing the product's id. Partle listings have no size or colour axis, but UCP requires at least one variant because that is what a checkout would reference. selected and preferences therefore cannot narrow the result; when either is present, the detail response returns the fixed product plus a fixed_variant informational message.

Pagination cursors are offsets into the current result order. They are opaque to clients, but the underlying catalog is live: products added, sold or re-ranked between requests can shift later pages. Consumers that need a fresh snapshot should restart from the first page.

Search is semantic. Queries are embedded and reranked rather than keyword-matched, so a description works better than a guess at the product's name, and cross-language queries work — an English query returns matching German and Spanish catalog entries.

Application-level failures come back as HTTP 200, with the outcome in ucp.status and a messages array, per the spec. A lookup of twenty ids where one has since been deleted returns the other nineteen with ucp.status: "success" plus a message about the missing one. A single-product request that resolves to nothing returns ucp.status: "error" and no product — the schema requires product on a successful detail response, so there is no "success with a message instead" shape. Reserve HTTP error handling for 4xx and 5xx, which mean the request itself was rejected.

Rate limits

100 requests per hour per IP, the same budget as the rest of Partle's public API. No key needed.