UCP Checker
UCP Score

UCP Score for medicube.sa

Ready for UCP agents

94 out of 100, grade A: ready for UCP agents. The missing 6 points are spread across Discovery and Conformance. 2 spec breaks on the status page aren't counted in the score.

Discovery 95Conformance 88Capabilities 100release 2026-04-08

How the score is made

three areas, weighted
Discovery 30%
Can a UCP agent find and read the profile: HTTPS, an answer at /.well-known/ucp, robots.txt allowing it, and five files outside UCP (llms.txt, sitemap, Open Graph, Organization schema, viewport).
95−1.5 pts
Conformance 40%
Does the profile follow the spec: valid against its release (counted three times), a dated release, keys published, few warnings, spec and schema links that resolve.
88−4.8 pts
Capabilities 30%
What an agent can do here: how many capabilities, checkout, at least one service, payment handlers, and services that answer our check.
100full marks
A85–100Ready for UCP agents
B70–84Nearly there
C50–69Partly ready
D30–49Hard for UCP agents
F0–29Not ready

Raise the score

fixes that move the number
part of +5
1Name capabilities the way the spec does
A capability is not named in the spec's dotted form (e.g. dev.ucp.shopping.checkout).
Capabilities are named like reversed web addresses so that names never collide: "checkout" is ambiguous; "dev.ucp.shopping.checkout" is not.
Conformance · effort low
"capabilities": {
  "dev.ucp.shopping.checkout": [...]
}
part of +5
2Name payment handlers the way the spec does
A payment handler is not named in the spec's dotted form (e.g. com.google.pay).
Handlers are named like reversed web addresses (com.google.pay, com.stripe.terminal) so every store declaring the same payment method names it the same way, and an agent can recognise it.
Conformance · effort low
"payment_handlers": {
  "com.google.pay": [...]
}
part of +5
3Use YYYY-MM-DD for handler version
A payment handler version is not in YYYY-MM-DD format.
Handler versions follow the same date-based format as everything else in UCP.
Conformance · effort low
"version": "2026-08-25"
part of +5
4Move to the latest UCP protocol version
Your profile declares a valid but older protocol version. A newer one is published.
Older versions stay valid (agents use the version you declare), but newer abilities (embedded checkout, agent payment mandates, linked customer accounts, card authentication, payment terms and store location lookup) only work against the latest version. The profile itself barely changes: the signing keys move to a root-level "keys" list, and the rest of the update is in what capabilities can say.
Conformance · effort low
"ucp": {
  "version": "2026-08-25",
  ...
},
"keys": [ ... ]   // beside "ucp", not inside it

Set the version to 2026-08-25 and publish your public keys as a root-level "keys" list. The older "signing_keys" field is still accepted, but "keys" is the one every verifier reads.

+2
5Publish a /llms.txt brand brief
No /llms.txt file detected at the root of your domain.
llms.txt is an emerging convention (analogous to robots.txt) that lets you give AI agents a hand-written brief about your brand, product categories, return policy, and crawl preferences. Strict UCP agents do not require it, but recommendation/discovery agents increasingly read it for context.
Discovery · effort low
# llms.txt
# Public brief for AI agents about Yourstore

# About
One or two sentences on what you sell, who you sell to, and any defining context (founded, mission, sustainability stance, etc.).

# Product Categories
- Category one
- Category two
- Category three

# Policies
- Returns: e.g. 30 days, full refund
- Shipping: e.g. Free over $30, 3-5 business days
- Any other policy worth surfacing (cruelty-free, vegan, made-to-order, etc.)

# Agent Capabilities
- UCP profile: /.well-known/ucp
- Supported flows: cart, checkout, tokenized payment, etc.
- Anything explicitly NOT supported (e.g. "no subscription products via agent")

# Contact
[email protected]

Save as /llms.txt at your site root. Plain text, written for an LLM audience. The format is informal: these section headings are a working convention, not a spec. Replace the placeholders with your own brand details and update when policies or product lines change.

Every check

13 passed · 3 to fix
Agent Discovery · 7 of 8
7 OK
HTTPS, UCP profile reachable, AI bot access, sitemap.xml, Open Graph tags, Organization schema (JSON-LD), Mobile viewport metaShow
  • HTTPS · Profile URL uses https://
  • UCP profile reachable · HTTP 200
  • AI bot access · robots.txt allows /.well-known/ucp
  • sitemap.xml · Found at /sitemap.xml
  • Open Graph tags · og:title and og:type/url present
  • Organization schema (JSON-LD) · Organization-typed JSON-LD detected
  • Mobile viewport meta · <meta name="viewport"> present
Problem
llms.txt
HTTP 200 at /llms.txt. Fix 5 above.
Discovery
UCP Conformance · 3 of 4
3 OK
Profile passes schema validation, Protocol version present and well-formed, Public keys publishedShow
  • Profile passes schema validation · No structural errors
  • Protocol version present and well-formed · Version: 2026-04-08
  • Public keys published · Keys published at the top level
Problem
No validation warnings
11 warnings.
Conformance
Capability Coverage · 3 of 4
3 OK
Capabilities declared, Checkout capability, Transports declaredShow
  • Capabilities declared · 5 of 6 capability families detected: Checkout, Identity Linking, Cart Management, Order Management, Catalog. A family counts once however many namespaces or extensions declare it.
  • Checkout capability · dev.ucp.shopping.checkout detected
  • Transports declared · REST, MCP
To fix
Payment handlers
1 handler declared, not named the way the spec expects (e.g. com.google.pay), so agents cannot look it up.
Capabilities

Not in the score, but worth fixing first

spec breaks
Problem
The profile isn't served with the caching the spec requires
Served without a Cache-Control header. Spec level: MUST. Not part of the UCP Score.
on the status page
To fix
The profile has no ETag or Last-Modified header
Spec level: SHOULD. Not part of the UCP Score.
on the status page

The score measures what the profile declares across the three areas above. These break a rule in the spec that agents follow, so they can stop an agent before the score matters.

Files for agents

outside UCP · not part of the UCP Score

Files medicube.sa publishes for agents beyond its UCP profile, from our weekly look. Only what we found is listed.

Found
auth.md /auth.md
How an agent signs in, written for agents.
21 Oct
Found
ai-catalog.json /.well-known/ai-catalog.json
The earlier name for the ARD catalogue.
20 Oct
Found
mcp.json /.well-known/mcp.json
An earlier way of pointing agents at an MCP server.
20 Oct
Found
MCP server card /.well-known/mcp/server-card.json
Describes the store's MCP server before an agent connects.
19 Oct
Found
API catalog /.well-known/api-catalog
Lists the store's APIs (RFC 9727).
17 Oct
/auth.md as served 3.5 KB
# Salla auth.md

You are an agent. This service supports **OAuth 2.0 Authorization Code flow with PKCE (S256)** for agent registration and authentication: discover → authorize → authenticate → exchange → use → refresh → revoke. Follow the steps in order.

Examples use the base URL `https://accounts.salla.com`.

## Step 1 — Discover

Fetch the OAuth 2.0 Authorization Server metadata to learn all endpoints and capabilities:

```
GET https://accounts.salla.com/.well-known/oauth-authorization-server
```

The `agent_auth` block tells you:
- `skill` — the URL of this document.
- `register_uri` / `identity_endpoint` — where you begin the registration/authorization flow.
- `identity_types_supported` — this service uses `service_auth` (the user authenticates at the Salla Login Page).
- `service_auth.claim_uri` / `claim_endpoint` — where the user goes to authenticate.
- `revocation_uri` — where you POST to revoke a token.

You can also fetch Protected Resource Metadata from the resource server:

```
GET https://accounts.salla.com/.well-known/oauth-protected-resource/store/v1
```

## Step 2 — Register (Authorize with PKCE)

Generate a PKCE code pair:

1. Generate a random `code_verifier` (43–128 characters).
2. Compute `code_challenge = base64url(SHA256(code_verifier))`.
3. Use `code_challenge_method = S256`.

Then redirect the user to the authorization endpoint:

```
GET https://accounts.salla.com/oauth/authorize?
  response_type=code
  &client_id=salla-agent
  &redirect_uri=<your-callback-uri>
  &scope=openid profile offline_access
  &state=<random-state>
  &code_challenge=<your-code-challenge>
  &code_challenge_method=S256
```

**Client registration:**
- Pre-configured public client: `salla-agent` (no secret required, PKCE is the sole authentication mechanism).
- Agents must provide a `redirect_uri` they control (e.g. `http://localhost:<port>/callback` for local agents). While PKCE protects the flow regardless of the redirect target, using a URI you own prevents token interception.
- Confidential clients (with secrets) are also supported if pre-registered.

## Step 3 — Authenticate and Exchange

The user authenticates on the Salla Login Page. After login, the browser redirects to your `redirect_uri` with `?code=<auth-code>&state=<your-state>`.

Exchange the authorization code for tokens:

```
POST https://accounts.salla.com/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=<auth-code>
&redirect_uri=<your-callback-uri>
&client_id=salla-agent
&code_verifier=<your-code-verifier>
```

Response:

```json
{
  "access_token": "<token>",
  "token_type": "Bearer",
  "expires_in": 604800,
  "refresh_token": "<refresh-token>",
  "iss": "https://accounts.salla.com"
}
```

## Step 4 — Use the access token

```
GET https://accounts.salla.com/store/v1/products
Authorization: Bearer<access_token>
```

## Step 5 — Refresh

```
POST https://accounts.salla.com/oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token
&refresh_token=<refresh-token>
&client_id=salla-agent
```

## Revocation

```
POST https://accounts.salla.com/oauth/revoke
Content-Type: application/x-www-form-urlencoded

token=<access-or-refresh-token>
&client_id=salla-agent
```

Returns 200 with an empty body (RFC 7009).

## Introspection

```
POST https://accounts.salla.com/oauth/introspect
Content-Type: application/x-www-form-urlencoded

token=<access-token>
&client_id=salla-agent
```

Returns `{ "active": true, ... }` or `{ "active": false }`.
/.well-known/ai-catalog.json as served 520 B
{"specVersion":"1.0","host":{"displayName":"medicube.sa","documentationUrl":"https://docs.salla.dev"},"entries":[{"identifier":"urn:air:salla:medicube.sa:storefront-mcp","displayName":"Storefront MCP","description":"Browse products, manage carts, and start checkout on this store via MCP tools.","type":"application/mcp-server-card+json","url":"https://medicube.sa/.well-known/mcp/server-card.json","representativeQueries":["Search this store for a product","Add this product to my cart","Start checkout for my cart"]}]}
/.well-known/mcp.json as served 9.4 KB
{"version":"1.0","protocolVersion":"2025-06-18","serverInfo":{"name":"storefront","title":"Storefront MCP","version":"1.0.0","description":"Browse products, manage carts, and initiate checkout for any Salla store via MCP tools and resources."},"transport":{"type":"streamable-http","endpoint":"https://medicube.sa/mcp"},"capabilities":{"tools":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"logging":{}},"tools":[{"name":"catalog-brand-list","title":"List Brands","description":"List all store brands grouped by first character (Arabic or English alphabet). Returns a browsable brand directory.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{}}},{"name":"catalog-brand-retrieve","title":"Get Brand Details","description":"Retrieve full brand details by ID, including name, description, logo, banner, and SEO metadata.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"brand_id":{"type":"string","description":"Brand ID to fetch"}},"required":["brand_id"]}},{"name":"catalog-category-list","title":"List Categories","description":"List store categories. Returns the root list by default, or direct children when parent_id is provided.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"parent_id":{"type":"string","description":"If set, returns direct children of this category"}}}},{"name":"catalog-category-retrieve","title":"Get Category","description":"Retrieve a category by ID, including name, description, image, product count, and nested sub-categories.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"category_id":{"type":"string","description":"Category ID to fetch"}},"required":["category_id"]}},{"name":"catalog-product-list","title":"Browse Products","description":"Browse and filter products from the store catalog. Supports 16 source types (latest, brands, categories, search, offers, etc.) with pagination.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"source":{"type":"string","enum":["latest","brands","categories","search","offers","top-rated","recently","related","selected","tags","wishlist","sales","reorder","best_selling","json","landing-page"],"description":"Product source type"},"source_value":{"type":"string","description":"Source filter value (brand_id, category_id, keyword, etc.)"},"page":{"type":"integer","minimum":1,"description":"Page number"},"cursor":{"type":"string","description":"Cursor for pagination"},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Items per page"},"sort":{"type":"string","description":"Sort option"},"filterable":{"type":"boolean","description":"Include filter facets"}},"required":["source"]}},{"name":"catalog-product-search","title":"Search Products","description":"Search products by keyword. Matches product names, descriptions, and SKUs.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"keyword":{"type":"string","description":"Search keyword"},"page":{"type":"integer","minimum":1,"description":"Page number"},"cursor":{"type":"string","description":"Cursor for pagination"},"per_page":{"type":"integer","minimum":1,"maximum":100,"description":"Items per page"},"sort":{"type":"string","description":"Sort option"}},"required":["keyword"]}},{"name":"catalog-product-retrieve","title":"Get Product Details","description":"Retrieve full product details by ID, including images, videos, options, variants/SKUs with pricing, ratings, tags, and brand.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"product_id":{"type":"string","description":"Product ID to fetch"}},"required":["product_id"]}},{"name":"checkout-generate","title":"Create Cart","description":"Create a new empty shopping cart. Returns cart_id and checkout_url.","readOnly":false,"destructive":false,"idempotent":false,"inputSchema":{"type":"object","properties":{"include_items":{"type":"boolean","description":"Include cart line items in response"},"source":{"type":"string","description":"Optional source identifier"}}}},{"name":"checkout-retrieve","title":"Get Cart","description":"Retrieve current cart contents including items, quantities, pricing, applied coupons, and the checkout URL.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID"},"include_items":{"type":"boolean","default":true,"description":"Include cart line items"}},"required":["cart_id"]}},{"name":"checkout-proceed","title":"Proceed to Checkout","description":"Get the checkout URL to redirect the buyer to complete payment. Includes cart summary for confirmation.","readOnly":true,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID to proceed with"}},"required":["cart_id"]}},{"name":"checkout-assign","title":"Assign Cart to Account","description":"Link a guest cart to the authenticated buyer's account.","readOnly":false,"destructive":false,"idempotent":false,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID to assign"}},"required":["cart_id"]}},{"name":"checkout-coupon-apply","title":"Apply Discount Code","description":"Apply a coupon/discount code to the cart.","readOnly":false,"destructive":false,"idempotent":false,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID"},"coupon":{"type":"string","maxLength":100,"description":"Coupon code to apply"},"payment_method":{"type":"string","description":"Optional payment method for coupon validation"}},"required":["cart_id","coupon"]}},{"name":"checkout-coupon-remove","title":"Remove Discount Code","description":"Remove the applied coupon from the cart.","readOnly":false,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID"}},"required":["cart_id"]}},{"name":"checkout-item-add","title":"Add to Cart","description":"Add a product to the shopping cart by id, variant_id, or sku. Returns the full updated cart.","readOnly":false,"destructive":false,"idempotent":false,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID"},"identifier_type":{"type":"string","enum":["id","variant_id","sku"],"description":"How to identify the product"},"identifier":{"type":"string","description":"Product identifier value"},"quantity":{"type":"integer","minimum":1,"description":"Quantity to add"},"options":{"type":"array","items":{"type":"object"},"description":"Product options"},"notes":{"type":"string","description":"Notes for this cart item"},"amount":{"type":"number","description":"Custom price for flexible-amount products"},"bundle":{"type":"array","items":{"type":"object"},"description":"Bundle items"}},"required":["cart_id","identifier_type","identifier","quantity"]}},{"name":"checkout-item-update","title":"Update Cart Item","description":"Update a cart item's quantity or options by its internal cart item ID.","readOnly":false,"destructive":false,"idempotent":true,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID"},"item_id":{"type":"string","description":"Internal cart item ID"},"quantity":{"type":"integer","minimum":1,"description":"New quantity"},"identifier_type":{"type":"string","enum":["id","variant_id","sku"],"description":"Product identifier type"},"identifier":{"type":"string","description":"Product identifier value"},"options":{"type":"array","items":{"type":"object"},"description":"Updated product options"},"notes":{"type":"string","description":"Updated notes"},"amount":{"type":"number","description":"Updated custom amount"},"bundle":{"type":"array","items":{"type":"object"},"description":"Updated bundle items"}},"required":["cart_id","item_id","quantity"]}},{"name":"checkout-item-remove","title":"Remove from Cart","description":"Remove an item from the cart by its internal cart item ID.","readOnly":false,"destructive":true,"idempotent":true,"inputSchema":{"type":"object","properties":{"cart_id":{"type":"string","description":"Cart ID"},"item_id":{"type":"string","description":"Internal cart item ID to remove"}},"required":["cart_id","item_id"]}}],"resources":[{"uri":"store://info","name":"store-info","description":"Store name, description, currency, and locale settings","templated":false},{"uri":"store://brands","name":"store-brands","description":"All store brands grouped by first character","templated":false},{"uri":"store://categories","name":"store-categories","description":"Root category tree with subcategory counts","templated":false},{"uri":"store://products/latest","name":"store-products-latest","description":"Latest products from the store catalog","templated":false},{"uri":"store://brands/{id}","name":"store-brand-detail","description":"Single brand with logo, banner, description, and SEO metadata","templated":true},{"uri":"store://categories/{id}","name":"store-category-detail","description":"Category with nested sub-categories and product count","templated":true},{"uri":"store://products/{id}","name":"store-product-detail","description":"Full product details including images, options, variants, and pricing","templated":true},{"uri":"store://cart/{id}","name":"store-cart","description":"Cart contents with items, totals, coupons, and checkout URL","templated":true}]}
/.well-known/mcp/server-card.json as served 498 B
{"$schema":"https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json","version":"1.0","protocolVersion":"2025-06-18","serverInfo":{"name":"store","title":"Salla Store MCP Server","version":"1.0.0"},"description":"MCP server for managing shopping carts on a Salla store. Provides tools for cart generation, item management, and coupon application.","transport":{"type":"streamable-http","endpoint":"/mcp"},"capabilities":{"tools":{"listChanged":true},"logging":{}},"tools":["dynamic"]}
/.well-known/api-catalog as served 1.5 KB
{"linkset":[{"anchor":"https://medicube.sa/.well-known/api-catalog","item":[{"href":"https://medicube.sa/.well-known/ucp"},{"href":"https://medicube.sa/.well-known/mcp.json"},{"href":"https://medicube.sa/.well-known/mcp/server-card.json"},{"href":"https://docs.salla.dev/2129395m0"},{"href":"https://docs.salla.dev/1724365m0"},{"href":"https://docs.salla.dev/1945677m0"},{"href":"https://docs.salla.dev/422688m0"},{"href":"https://docs.salla.dev/422610m0"}]},{"anchor":"https://medicube.sa/.well-known/ucp","service-desc":[{"href":"https://ucp.dev/services/shopping/openapi.json","type":"application/json"}],"service-doc":[{"href":"https://ucp.dev/2026-04-08/specification/overview/","type":"text/html"}],"status":[{"href":"https://medicube.sa/","type":"application/json"}]},{"anchor":"https://medicube.sa/mcp","service-desc":[{"href":"https://medicube.sa/.well-known/mcp/server-card.json","type":"application/json"}]},{"anchor":"https://docs.salla.dev/2129395m0","service-doc":[{"href":"https://docs.salla.dev/2129395m0","type":"text/html"}]},{"anchor":"https://docs.salla.dev/1724365m0","service-doc":[{"href":"https://docs.salla.dev/1724365m0","type":"text/html"}]},{"anchor":"https://docs.salla.dev/1945677m0","service-doc":[{"href":"https://docs.salla.dev/1945677m0","type":"text/html"}]},{"anchor":"https://docs.salla.dev/422688m0","service-doc":[{"href":"https://docs.salla.dev/422688m0","type":"text/html"}]},{"anchor":"https://docs.salla.dev/422610m0","service-doc":[{"href":"https://docs.salla.dev/422610m0","type":"text/html"}]}]}
Speed among Salla stores
The profile answered in 809 ms, faster than 37% of the Salla stores we check.