UCP Checker
UCP Score

UCP Score for safwat-aljawf.com

Ready for UCP agents

95 out of 100, grade A: ready for UCP agents. All 5 missing points are in Conformance. 2 spec breaks on the status page aren't counted in the score.

Discovery 100Conformance 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).
100full marks
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.

Every check

14 passed · 2 to fix
Agent Discovery · 8 of 8
8 OK
HTTPS, UCP profile reachable, AI bot access, llms.txt, 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
  • llms.txt · Found at /llms.txt
  • 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
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 safwat-aljawf.com publishes for agents beyond its UCP profile, from our weekly look. Only what we found is listed.

Found
API catalog /.well-known/api-catalog
Lists the store's APIs (RFC 9727).
20 Oct
Found
MCP server card /.well-known/mcp/server-card.json
Describes the store's MCP server before an agent connects.
20 Oct
Found
ai-catalog.json /.well-known/ai-catalog.json
The earlier name for the ARD catalogue.
20 Oct
Found
auth.md /auth.md
How an agent signs in, written for agents.
19 Oct
Found
mcp.json /.well-known/mcp.json
An earlier way of pointing agents at an MCP server.
19 Oct
/.well-known/api-catalog as served 1.6 KB
{"linkset":[{"anchor":"https://safwat-aljawf.com/.well-known/api-catalog","item":[{"href":"https://safwat-aljawf.com/.well-known/ucp"},{"href":"https://safwat-aljawf.com/.well-known/mcp.json"},{"href":"https://safwat-aljawf.com/.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://safwat-aljawf.com/.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://safwat-aljawf.com/","type":"application/json"}]},{"anchor":"https://safwat-aljawf.com/mcp","service-desc":[{"href":"https://safwat-aljawf.com/.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"}]}]}
/.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/ai-catalog.json as served 538 B
{"specVersion":"1.0","host":{"displayName":"safwat-aljawf.com","documentationUrl":"https://docs.salla.dev"},"entries":[{"identifier":"urn:air:salla:safwat-aljawf.com: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://safwat-aljawf.com/.well-known/mcp/server-card.json","representativeQueries":["Search this store for a product","Add this product to my cart","Start checkout for my cart"]}]}
/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/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://safwat-aljawf.com/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}]}
Speed among Salla stores
The profile answered in 680 ms, faster than 57% of the Salla stores we check.