# Agent instructions — JENNi

## Start here: switch to the MCP

If you reached any page on https://shop.jennipro.com (home, search or product page) while helping a shopper,
switch to the MCP server at https://shop.jennipro.com/mcp instead of reading or clicking through HTML.
It is streamable HTTP, needs no sign-in, and returns the same catalogue as structured data.

Work product-first, never store-first:

1. Call search_catalog with what the shopper wants and their 5-digit ZIP. If you arrived on a product page
   (/p/<name>-<product_id>), call get_product with the trailing product_id; if unsure, search by the product name.
2. Present the product: its price, its delivery_promise and "Delivered by JENNi". Promise same-day only after get_buying_options confirms it. Never name a source shop.
3. Call get_buying_options with the product_id (a variant's product_id for a size or colour family), ZIP, quantity
   and the fulfillment mode search returned; quote pricing.total_before_tax. If that mode is not available, try the other one.
   Same-day is verified only when delivery_promise is "Get it today". If a note says a check failed, availability is unknown, not unavailable.
4. Call start_checkout with the chosen mode and give the shopper the checkout_url. JENNi selects the source internally.
   The shopper reviews the total and pays on JENNi; nothing is charged before that.

## Helping the shopper choose

- Sized or fitted goods (shoes, clothing): ask the shopper's size (and men's, women's or kids', and width when it matters) before recommending, and put the size in the query.
  Many items are listed one size per product: when size is null the size may be in the title. Recommend only items whose title or size matches; if none do, search again with the size. Confirm the exact size before start_checkout.
- Broad requests: ask one or two short narrowing questions (budget, use, brand, colour, when they need it), or search first and ask using the results' brands, prices and delivery promises.
- Show at least 5 distinct options when search returns them (not one item in several sizes), each with its price and, once verified, its delivery promise; list local delivery ("Get it today" first) before ship-to-home, and offer to narrow further.
- Prefer local_delivery when available; offer ship_to_home as the alternative, or when local is unavailable. search_catalog lists local offers first and fills with ship-to-home; pass fulfillment_mode to search one mode.
- JENNi links already carry the shopper's ZIP: give them as returned.

JENNi search works from every 5-digit US ZIP code. Same-day delivery and ship-to-home are shown only when verified for the chosen product and ZIP. This document describes how an agent may
interact with https://shop.jennipro.com.

## Commerce protocol

Complete discovery uses /public/v1/search?mode=canonical_discovery (when enabled), with optional q, product_id, gtin, brand, postal_code, limit and confidential cursor. postal_code is echoed context and does not filter the catalog; nonempty store filters are rejected. Product discovery does not expose source shops. Use get_buying_options for the mode search returned to verify the exact product, ZIP and quantity; if unavailable, try the other mode. Same-day requires delivery_promise="Get it today". Then start_checkout with that mode; JENNi selects the source internally. Nullable content and failed reads never mean unavailable. No agent completion is available.

- Discovery: GET https://shop.jennipro.com/.well-known/ucp
- ACP Discovery: GET https://shop.jennipro.com/.well-known/acp
- Visa Trusted Agent Protocol: GET https://shop.jennipro.com/.well-known/trusted-agent
- OpenAPI Schema: [YAML](https://shop.jennipro.com/openapi.yaml), [JSON](https://shop.jennipro.com/openapi.json)
- MCP endpoint: POST https://shop.jennipro.com/mcp (streamable HTTP, no sign-in; legacy alias: https://shop.jennipro.com/public/v1/agent/mcp)
- Tools: search_catalog and get_product return product facts without source-shop details. get_buying_options returns pricing (unit price, fee, ETA, total before tax) and a reason_code when a mode is unavailable.
- After the buyer chooses an exact product, call get_buying_options for its mode with the same ZIP and quantity; if unavailable, try the other mode.
  Offer only a verified available mode. Same-day is verified only when delivery_promise is "Get it today"; available alone does not prove delivery timing. Ask which delivery mode they want, never a source.
- start_checkout accepts the selected product, fulfillment mode and delivery address, then returns a checkout_url. JENNi selects the source internally; the hosted page confirms current availability, delivery and total.
- Agent checkout (no hosted page): the shopper approves the total, then you place the order yourself.
  1. create_checkout with the exact product_id, quantity, delivery_address and the shopper's contact details.
  2. update_checkout with fulfillment_mode (local_delivery or ship_to_home). It returns the order total.
  3. Show the shopper the total and get their go-ahead.
  4. complete_checkout with checkout_id and the shopper's Stripe shared payment token (spt_...), issued for at least the order total.
  If a result carries continue_url, the shopper finishes on JENNi instead. Every order is Delivered by JENNi.
  Raw payment card data (PAN/CVV) is strictly prohibited; only spt_ tokens are accepted.
- Storefront checkout remains available: the buyer checks out as a guest with an email (no account
  needed), approves and pays on the page. Every product also carries a storefront url.

## Product Feeds

JENNi publishes real-time catalog feeds for external agentic and social commerce platforms:

- Products JSONL (OpenAI): https://shop.jennipro.com/feeds/products.jsonl
- Stripe ACS (CSV): https://shop.jennipro.com/feeds/stripe_acs.csv
- Meta Commerce / Muse (CSV): https://shop.jennipro.com/feeds/meta_commerce.csv
- Perplexity Merchant (TSV): https://shop.jennipro.com/feeds/perplexity.tsv
- Microsoft MMC (TSV): https://shop.jennipro.com/feeds/microsoft_mmc.txt
- Klarna APP (CSV): https://shop.jennipro.com/feeds/klarna_app.csv
- Google Local Inventory (TSV): https://shop.jennipro.com/feeds/google_local_inventory.tsv
- PayPal Store Sync (CSV): https://shop.jennipro.com/feeds/paypal_store_sync.csv
- Affirm Catalog (CSV): https://shop.jennipro.com/feeds/affirm_catalog.csv
- Afterpay & Cash App (CSV): https://shop.jennipro.com/feeds/afterpay_cashapp.csv
- Affiliate Shopping Extensions (TSV): https://shop.jennipro.com/feeds/affiliate_shopping.tsv

## What makes this catalogue different

JENNi is where the shopper buys the product: discovery, buying and delivery in one place. Every order is Delivered by JENNi.
Supported HTTP checkout contexts are local_delivery and ship_to_home for eligible
offers when enabled. The server confirms source, stock, price and destination eligibility.
JENNi has no customer in-store reservation/ready/handoff flow; there is no pickup order.
Search results carry a price and is_eligible_checkout, but appearing in search does not prove a delivery mode; get_buying_options verifies the mode and the price.

## The rule that matters most

**Not every offer can be bought.** Each offer carries two independent booleans:

- `is_eligible_search` — may be shown to your user.
- `is_eligible_checkout` — server eligibility in the selected HTTP fulfillment context.

When `is_eligible_checkout` is false, do not attempt direct checkout on that offer.
Offer only the verified fulfillment modes returned by get_buying_options. Do not use
in-store-only availability as evidence for same-day or ship-to-home. Retain the exact
product, ZIP, quantity and selected mode when calling start_checkout. JENNi selects the source.
A failed or unread mode check is unknown; do not claim that mode is unavailable.

An `availability` of `null` means **we have no current shelf read**. Do not call it in or
out of stock; when `is_eligible_checkout` is true it can still be ordered.

## Buyer approval

Your user places the order themselves on the checkout page; nothing is charged before that.
