Read the profile
The agent asks the store's fixed address what it offers, before it sends anything else.
profile = httpx.get(f"{STORE}/.well-known/ucp").json()["ucp"]
endpoint = next(s["endpoint"] for s in profile["services"]["dev.ucp.shopping"]
if s["transport"] == "mcp")
assert "dev.ucp.shopping.catalog.search" in profile["capabilities"]const profile = (await (await fetch(`${STORE}/.well-known/ucp`)).json()).ucp;
endpoint = profile.services["dev.ucp.shopping"].find((s: any) => s.transport === "mcp").endpoint;
if (!profile.capabilities["dev.ucp.shopping.catalog.search"]) throw new Error("no catalogue search");GET /.well-known/ucp HTTP/1.1 Host: flowers.ucpsandbox.com Accept: application/json
200, JSON: release, services, capabilities
{
"ucp": {
"version": "2026-08-25",
"services": {
"dev.ucp.shopping": [
{
"transport": "rest",
"endpoint": "https://flowers.ucpsandbox.com/ucp"
},
{
"transport": "mcp",
"endpoint": "https://flowers.ucpsandbox.com/mcp"
}
]
},
"capabilities": {
"dev.ucp.shopping.catalog.search": "…",
"dev.ucp.shopping.catalog.lookup": "…",
"dev.ucp.shopping.cart": "…",
"dev.ucp.shopping.checkout": "…",
"dev.ucp.shopping.fulfillment": "…",
"dev.ucp.shopping.order": "…"
},
"payment_handlers": {
"dev.mock.payment_handler": "…"
}
}
}What the agent knows now. Release 2026-08-25, an MCP endpoint, catalogue search and checkout declared, one payment handler. Enough to go on.
