Issue reference
No shared-catalogue profile published
- UCP_PROFILE_MISSING
- Find products
- —
- Medium
What it means
tragent reports this at the “Find products” stage. The question there is “Can an agent find your products at all?” An agent has to reach your site and locate products by searching or browsing before anything else can happen.
What it does to an agent
Agents can usually carry on, but more slowly or less sure of what they found, and an unsure agent is likelier to recommend another store.
The Universal Commerce Protocol gives an agent a structured way to read a catalogue, build a basket and check out without scraping pages. A store announces what it supports with a profile at /.well-known/ucp: the protocol version, the capabilities it offers, and the service endpoints an agent calls.
Without a profile, an agent that speaks UCP has to fall back to driving your pages like a person, which is slower, costs more and fails more often. tragent treats a missing profile as a medium finding: it does not stop a browser agent, but it removes the most reliable path.
How to fix it
Publish a UCP profile so agents can discover your commerce capabilities instead of guessing them.
{
"ucp": {
"version": "2026-08-25",
"services": {
"dev.ucp.shopping": [
{ "version": "2026-08-25", "transport": "mcp", "endpoint": "https://shop.example/api/ucp/mcp" }
]
},
"capabilities": {
"dev.ucp.shopping.checkout": [{ "version": "2026-08-25" }]
}
}
}On your platform
Shopify
Shopify publishes the profile for stores on its platform, so a Shopify store should already answer at /.well-known/ucp. If it does not, check that the request is not blocked by an app proxy or a custom domain setup, and compare with your myshopify.com address.
WooCommerce
WooCommerce does not publish a UCP profile on its own. If you adopt UCP through a payments or commerce extension, it should serve the profile; confirm the address answers JSON with a 200 and that the endpoints it names resolve.
Headless or custom
Serve the profile as application/json from the origin root. Declare only capabilities you actually implement: an agent that trusts a capability and finds it missing stops negotiating.
In practice
Publishing a profile is a commitment to keep it true. Every capability you declare is one an agent will try, and every endpoint you name is one it will call. Start with the capabilities you already run in production, usually catalogue reads and checkout, and add others as you ship them, with the version of the specification each one follows.
The profile is read before anything else, often on every new conversation, so serve it from the edge with a short cache lifetime and make sure it answers quickly. It should be identical on every hostname a shopper might be given, the bare domain and www, and on the platform's own address if you have one, or agents get a different answer depending on which link they followed.
Check the fix
- curl -s https://your-store/.well-known/ucp and confirm it parses as JSON.
- Check it declares a version and at least one capability.
- Run the scan; the profile check should list the version and capabilities it read.
Run the check that reported UCP_PROFILE_MISSING again after the change. The scan needs no account; an issue found during an AI shopping test needs that test run again.
npx @tragent/cli scan https://your-store.comCommon mistakes
- Serving the storefront's HTML at /.well-known/ucp because the app answers every path.
- Copying an example profile with endpoints that do not exist on your domain.
- Publishing the profile on www but not on the bare domain an agent was given.