Documentation

UCP CLI

ucp-pp-cli

Install

npx -y @mvanhorn/printing-press-library install ucp

Installs the CLI binary and the agent skill for Claude Code, Codex, Cursor, Gemini CLI, Copilot, and more. Add --cli-only or --skill-only for one half. Requires Node.

Documentation

A Go CLI for Google's Universal Commerce Protocol — talk to UCP merchants over REST or MCP, search across them in parallel, build carts, and prep checkout drafts that an AP2 CLI can authorize.

UCP-pp-cli is the terminal-grade tool the official Python and JS SDKs don't ship. It speaks both REST and MCP transports so it works against real merchants like checkout.coffeecircle.com (Shopify-hosted, MCP-only) and the bundled mock. Local SQLite holds carts, checkout sessions, and a merchant directory, enabling cross-merchant search, capability diffs, and price-drift watch loops nothing else offers today.

Created by @beetz12 (david).

Real-Merchant Compatibility

v0.1 supports two interaction patterns against UCP merchants:

CommandReal merchants (e.g. checkout.coffeecircle.com)Bundled mock (mock serve)
check <domain>✅ Works against any merchant publishing /.well-known/ucp
search / cart / checkout prep⚠️ Requires REST transport. Most public real merchants advertise MCP-only — those are deferred to v0.2 (MCP client + hosted agent profile + ECDSA-P256 signing)✅ Full end-to-end flow

Known real merchants that publish a UCP manifest today: checkout.coffeecircle.com (Shopify-hosted, MCP-only). Etsy and Wayfair have UCP-powered checkout via Google AI Mode but their endpoints are gated to approved Google agents. v0.2 will add MCP transport client support to unlock real-merchant transactions.

Authentication

UCP has no global API key. Each merchant declares its own auth shape; the CLI identifies itself via the UCP-Agent: profile="<url>" header and signs requests with a per-agent ECDSA-P256 key. Run ucp profile init once to generate your profile. For account-linked flows, ucp auth link <merchant> walks an OAuth 2.0 flow per merchant (v1: print-mode — agent pastes the redirect URL back).

Quick Start

Real shopping in 3 commands — no mock, no setup, no API key.

# List the dog/pet merchants seeded in the registry
ucp-pp-cli merchants list --rope-toys

# Search bark.co for rope toys (returns real products)
ucp-pp-cli search "rope toy" --merchant bark.co --limit 5 --json

# Add a real product to a local cart and prep a checkout draft
ucp-pp-cli cart add --merchant bark.co --sku BRK-001 --title "Corn Dog Tug" --price 999 --qty 1
ucp-pp-cli checkout prep --cart $(ucp-pp-cli cart list --json | jq -r '.[0].id') --json

The CLI ships with a seeded registry of 58 Grade-A UCP merchants (Shopify-hosted, verified 2026-05-24). Browse with ucp-pp-cli merchants list or filter with --category pet|fashion|beauty|....

Unique Features

These capabilities aren't available in any other tool for this API.

Cross-merchant discovery

  • check — Fetch /.well-known/ucp for any domain and return a graded report covering schema validity, advertised transports, and capability coverage — works against any merchant publishing a UCP manifest, including MCP-only Shopify-hosted stores.

    Lets an agent screen a domain for UCP viability without standing up an SDK or hand-rolling manifest parsing.

    ucp-pp-cli check checkout.coffeecircle.com --json
    

Reachability mitigation

  • mock serve — Spawn a UCP-compliant reference merchant locally (pure-Go, no external runtime) so ucp check, search, cart, and checkout prep flows work end-to-end without a third-party UCP merchant or extra language toolchains.

    Lets an agent verify its UCP integration without coordinating with a live merchant or waiting for Google AI Mode approval.

    ucp-pp-cli mock serve --port 8080
    

Recipes

Boot a UCP test environment from scratch

ucp-pp-cli mock serve --port 8080  # run in background with & or a separate terminal
ucp-pp-cli profile init
ucp-pp-cli check 127.0.0.1:8080 --json

Three commands to a working UCP-merchant-agent pair — useful for tests and demos.

End-to-end search-to-checkout against the mock merchant

ucp-pp-cli mock serve --port 8080  # run in background with & or a separate terminal
ucp-pp-cli search "coffee" --merchant 127.0.0.1:8080 --limit 5 --json
ucp-pp-cli cart add --merchant 127.0.0.1:8080 --sku coffee_001 --title "Coffee" --price 1500 --qty 2
ucp-pp-cli cart list --json
ucp-pp-cli checkout prep --cart <cart-id> --json

Full buy-side flow from product discovery to a checkout draft, entirely local.

Validate a real UCP merchant manifest

ucp-pp-cli check checkout.coffeecircle.com --json

Fetches and validates the merchant's /.well-known/ucp manifest. Note: Shopify-hosted merchants like coffeecircle.com advertise MCP-only transport; REST calls will fail until v0.2 adds MCP transport client support.

Usage

Run ucp-pp-cli --help for the full command reference and flag list.

Commands

checkout

Operations on checkout

  • ucp-pp-cli checkout - POST /checkout

Output Formats

# Human-readable table (default in terminal, JSON when piped)
ucp-pp-cli checkout

# JSON for scripting and agents
ucp-pp-cli checkout --json

# Filter to specific fields
ucp-pp-cli checkout --json --select id,name,status

# Dry run — show the request without sending
ucp-pp-cli checkout --dry-run

# Agent mode — JSON + compact + no prompts in one flag
ucp-pp-cli checkout --agent

Agent Usage

This CLI is designed for AI agent consumption:

  • Non-interactive - never prompts, every input is a flag
  • Pipeable - --json output to stdout, errors to stderr
  • Filterable - --select id,name returns only fields you need
  • Previewable - --dry-run shows the request without sending
  • Explicit retries - add --idempotent to create retries when a no-op success is acceptable
  • Confirmable - --yes for explicit confirmation of destructive actions
  • Piped input - write commands can accept structured input when their help lists --stdin
  • Agent-safe by default - no colors or formatting unless --human-friendly is set

Exit codes: 0 success, 2 usage error, 3 not found, 4 auth error, 5 API error, 7 rate limited, 10 config error.

Health Check

ucp-pp-cli doctor

Verifies configuration, credentials, and connectivity to the API.

Configuration

Config file: ~/.config/ucp-pp-cli/config.toml

Static request headers can be configured under headers; per-command header overrides take precedence.

Environment variables:

NameKindRequiredDescription
API_TOKENper_callYesSet to your API credential.

Troubleshooting

Authentication errors (exit code 4)

  • Run ucp-pp-cli doctor to check credentials
  • Verify the environment variable is set: echo $API_TOKEN Not found errors (exit code 3)
  • Check the resource ID is correct
  • Run the list command to see available items

API-specific

  • ucp check returns HTTP 404 — The domain hosts a UCP docs site, not a UCP merchant. Confirm the merchant publishes /.well-known/ucp; many real-world UCP retailers (Etsy, Wayfair) are gated to approved Google/Microsoft agents and won't respond to unapproved profiles.
  • request fails with 'unsupported transport' — The merchant only advertises MCP (e.g., coffeecircle.com). Re-run with --transport mcp or omit; the CLI picks the negotiated intersection automatically.
  • checkout prep fails with 'missing identity_linking' — Run ucp auth link <merchant> first, or skip account-linking with --guest if the merchant allows guest checkout (declared in its manifest).
  • mock serve fails with 'address already in use' — Port 8080 is taken. Pass --port 9090 (or any free port) and update downstream commands to point at the new address.

Sources & Inspiration

This CLI was built by studying these projects and resources:

Generated by CLI Printing Press

v1.2 additions

  • Native UCP MCP-over-HTTP transport--transport mcp calls tools/call via JSON-RPC against *.myshopify.com/api/ucp/mcp endpoints with the agent profile URL in the JSON-RPC body. Default profile: https://www.igvita.com/ucp/profile.json. Override with --profile-url.
  • Real Shopify cart-add + AP2 envelopecheckout finalize --cart <id> calls anonymous https://<merchant>/cart/add.js for the first line item, then constructs the three AP2 mandates (intent, cart, payment) into a FinalizationEnvelope JSON. Payment completion is deferred — the envelope is meant to be piped into an external AP2 CLI (e.g. ap2-pp-cli) that holds the real Google Pay token and POSTs checkout-sessions/{id}/complete. Multi-item live cart-add is v1.3.

v1.3 adapters (non-UCP merchants)

For merchants that haven't enrolled in UCP, the CLI ships native adapters so the same search command works against them.

Etsy (Open API v3)

export ETSY_API_KEY=<your-key>  # https://www.etsy.com/developers/your-apps
ucp-pp-cli search "dog rope toy" --merchant etsy.com --limit 5 --json

eBay (Browse API)

export EBAY_APP_ID=<your-app-id>
export EBAY_CERT_ID=<your-cert-id>  # https://developer.ebay.com/my/keys
ucp-pp-cli search "dog rope toy" --merchant ebay.com --limit 5 --json

Both adapters return the same SearchHit shape as UCP/Shopify merchants, so the rest of the flow (cart, checkout prep) works identically.

Known Gaps (v1.3)

  • Payment completioncheckout finalize builds the envelope but does not sign mandates or call the merchant's POST /checkout-sessions/{id}/complete. Requires a real Google Pay token and an AP2 CLI with signing keys. Out of scope for v1.2.
  • Multi-item live cart-addcheckout finalize only adds the first line item live to the merchant; the rest live in the local cart and the AP2 cart_mandate. Multi-add in a single Shopify call is v1.3.
  • Cross-merchant carts — One cart, one merchant per the UCP cart capability spec. Optimizing a wishlist across N merchants is v1.3+.
  • Identity-linking OAuthauth link flow not implemented; live MCP requests use anonymous catalog reads only.
  • Webhook receiver / order watch loop — deferred to v1.3.
  • Rye aggregator evaluation — research deliverable (okt6).

The bundled ucp mock serve provides a pure-Go reference merchant for end-to-end testing of the REST flow without external dependencies (hidden from --help; use ucp-pp-cli mock serve --port N explicitly).

For agents: pass /documentation/ucp/agents.md to install this CLI from a prompt.