UCP Checker
UCP Score

UCP Score for webagentic.labdx.org

Nearly there

81 out of 100, grade B: nearly there. The missing 19 points are spread across Discovery and Conformance and Capabilities. One spec break on the status page isn't counted in the score.

Discovery 90Conformance 77Capabilities 77release 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).
90−3 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.
77−9.2 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.
77−6.9 pts
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
+7
1Repair declared transport endpoints
One or more declared transport endpoints did not respond when probed.
A declared endpoint that does not answer stops an agent at that step, even though the profile itself validates. Connection refused, DNS failure, TLS errors, and 5xx responses all fall here. See the Full Check Breakdown below for the specific endpoints that failed.
Capabilities · effort medium
part of +9
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 +9
3Add id to each payment handler
A payment handler is missing the required "id" field.
The id field uniquely identifies the handler instance for token routing. Required by the spec.
Conformance · effort low
{
  "id": "my-google-pay-prod",
  "version": "2026-08-25"
}
part of +9
4Add version to each payment handler
A payment handler is missing the required "version" field.
Handler versions evolve independently of the profile. Agents pin their token request format to a specific handler version.
Conformance · effort low
"version": "2026-08-25"
part of +9
5Fix broken spec or schema URLs
One or more spec/schema URLs declared in the profile do not resolve.
Spec and schema URLs let agents validate request/response shapes before sending. When they 404 or time out, runtime validation degrades to "best effort" and strict agents reject the integration entirely. Common cause: copy-pasting a placeholder URL during initial profile setup. See the Full Check Breakdown for the specific URLs that failed.
Conformance · effort low
part of +9
6Publish the public keys agents use to check your messages
Your UCP profile lists no public keys, so an agent cannot confirm that a message really came from your store.
Agents use these keys to check that checkout messages really came from you. A store that takes payment through the agent needs them. A store that sends the buyer to its own checkout page can manage without them for now.
Conformance · effort medium
{
  "keys": [
    {
      "kty": "EC",
      "crv": "P-256",
      "x": "<base64url x>",
      "y": "<base64url y>",
      "kid": "store-2026-10",
      "use": "sig",
      "alg": "ES256"
    }
  ],
  "ucp": { ... }
}

Create a P-256 (ES256) key pair: ES256 is the one algorithm every UCP agent must be able to check. Add the public key to a "keys" list at the top level of your UCP profile, as in the example, with its own "kid", and keep the private key on your server. The spec recommends a new key every 90 days: publish the new one next to the old, sign with it, and remove the old key a week later.

part of +3
7Publish Organization schema (JSON-LD) on the homepage
No Organization-typed JSON-LD detected on your homepage.
Organization schema gives agents a structured representation of your brand identity: name, logo, social profiles, contact info, founding date. Agents use this to verify you are who you claim to be and to link your profile data to a recognizable entity.
Discovery · effort medium
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "OnlineStore",
  "name": "Yourstore",
  "url": "https://yourstore.com",
  "logo": "https://yourstore.com/logo.png",
  "sameAs": [
    "https://twitter.com/yourstore",
    "https://www.instagram.com/yourstore"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "+1-800-000-0000",
    "contactType": "Customer Service"
  }
}
</script>

Drop into <head> or end of <body>. Use OnlineStore (more specific) when the entire site is an ecommerce store; Organization is the generic fallback.

part of +9
8Move 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.

part of +3
9Add Open Graph meta tags to the homepage
OG tags missing or incomplete on your homepage.
OG tags give agents and link unfurlers (Slack, iMessage, ChatGPT) a clean title, description, and image to represent your store. Without them, shares show garbled fallback text.
Discovery · effort low
<meta property="og:title" content="Yourstore | short tagline">
<meta property="og:type" content="website">
<meta property="og:url" content="https://yourstore.com/">
<meta property="og:description" content="One-sentence description of what you sell.">
<meta property="og:image" content="https://yourstore.com/og-cover.jpg">
<meta property="og:site_name" content="Yourstore">

Add inside <head>. og:title and og:type are the minimum; og:url, og:description, and og:image are strongly recommended.

Every check

11 passed · 8 to fix
Agent Discovery · 6 of 8
6 OK
HTTPS, UCP profile reachable, AI bot access, llms.txt, sitemap.xml, 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
  • Mobile viewport meta · <meta name="viewport"> present
Problem
Open Graph tags
Missing or incomplete on homepage. Fix 9 above.
Discovery
Problem
Organization schema (JSON-LD)
Missing or incomplete on homepage. Fix 7 above.
Discovery
UCP Conformance · 2 of 5
2 OK
Profile passes schema validation, Protocol version present and well-formedShow
  • Profile passes schema validation · No structural errors
  • Protocol version present and well-formed · Version: 2026-04-08
To fix
Public keys published
No keys list at the top level of the profile. Fix 6 above.
Conformance
Problem
No validation warnings
4 warnings.
Conformance
Problem
Spec & schema URLs resolve (8)
Resolved with an unexpected content-type (8 of 8): https://universal-commerce-protocol.org/schemas/discovery.json, https://universal-commerce-protocol.org/schemas/products-search.json, https://universal-commerce-protocol.org/schemas/categories.json, https://universal-commerce-protocol.org/schemas/cart.json, https://universal-commerce-protocol.org/schemas/shipping-rates.json, ….
Conformance
Capability Coverage · 3 of 6
3 OK
Checkout capability, Transports declared, Payment handlersShow
  • Checkout capability · dev.ucp.shopping.checkout detected
  • Transports declared · MCP
  • Payment handlers · 1 handler registered
To fix
Capabilities declared
2 of 6 capability families detected: Checkout, Cart Management. A family counts once however many namespaces or extensions declare it.
Capabilities
Problem
MCP transport reachable
HTTP 404 on tools/list.
Capabilities
To fix
MCP transport reachable
Endpoint reachable but did not return a JSON-RPC tools/list response.
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

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 webagentic.labdx.org 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).
21 Oct
Found
Signatures directory /.well-known/http-message-signatures-directory
Keys for agents that sign their requests (Web Bot Auth).
21 Oct
Found
auth.md /auth.md
How an agent signs in, written for agents.
20 Oct
Found
ai-catalog.json /.well-known/ai-catalog.json
The earlier name for the ARD catalogue.
19 Oct
Found
MCP server card /.well-known/mcp/server-card.json
Describes the store's MCP server before an agent connects.
18 Oct
Found
Agent skills /.well-known/agent-skills/index.json
Ready-made instructions an agent can load to work with the store.
logistics-openapilogistics-agent-documentationwebmcp-logistics-tools
17 Oct
/.well-known/api-catalog as served 929 B
{
  "linkset": [
    {
      "anchor": "https://webagentic.labdx.org/",
      "links": [
        {
          "rel": [
            "service-desc"
          ],
          "href": [
            "https://webagentic.labdx.org/openapi.json"
          ],
          "type": "application/vnd.oai.openapi+json;version=3.1",
          "title": "OpenAPI da API de logística"
        },
        {
          "rel": [
            "service-doc"
          ],
          "href": [
            "https://webagentic.labdx.org/llms.txt"
          ],
          "type": "text/markdown",
          "title": "Documentação para agentes"
        },
        {
          "rel": [
            "related"
          ],
          "href": [
            "https://webagentic.labdx.org/mcp/rastro/index.php"
          ],
          "type": "application/json",
          "title": "Endpoint MCP remoto"
        }
      ]
    }
  ]
}
/.well-known/http-message-signatures-directory as served 539 B
{
  "keys": [
    {
      "kty": "RSA",
      "n": "zw38aQj7nT_-KjwSVUDKRQznmAGlsMxTJbgsPoNGMDfimt6fXzIE69WoR99bE_l-v80dMpzi3Ac9KnDJfuE6RBFC1hoLKTGohaa8ejYk4U582hPrhaWKaugEv9wovrAqsjnWiTRHv7alN3GW_EaAHuKppUsjypYQzaR3doCHEBKCF0osfwYYYHIaO0ziy5rhw_zA-DBWxICTjh_spK0IZkGLx2o0NkPtDIg4mMf9Qd1e9V9qIsH-47ywZ_tdP59Ciz2gdE_I6aQgC3uK1bDTJIWTpDfVEThh4QqGwEv31hu3uP19RVNrL6DcbcOJmJlXEeHjQJvi6b3nNLEwK3WxjQ",
      "e": "AQAB",
      "alg": "RS256",
      "use": "sig",
      "kid": "lz4QH1tTOHzsaGTDlIgPzOmyuKGC4LZmTE-i8yEZSMg"
    }
  ]
}
/auth.md as served 7.3 KB
# auth.md

You are an agent. This service supports **agentic registration**: discover → register → (claim if needed) → exchange for an access_token / AppKey → call API → handle revocation. Follow the steps in order; do not skip ahead.

Web Agentic provides parcel tracking tools via MCP (Model Context Protocol) and REST APIs. It supports anonymous public tracking, owner-authorized self-registration for AI agents, and contracted access tiers with higher limits.

## Step 1 — Discover

Discovery is two hops:

1. **Protected Resource Metadata (PRM)**:
```http
GET /.well-known/oauth-protected-resource
```
Response:
```json
{
  "resource": "https://webagentic.labdx.org/",
  "resource_name": "Web Agentic",
  "resource_documentation": "https://webagentic.labdx.org/auth.md",
  "authorization_servers": ["https://webagentic.labdx.org"],
  "scopes_supported": ["mcp:read", "mcp:tools", "tracking:public", "tracking:contract"],
  "bearer_methods_supported": ["header"]
}
```

2. **Authorization Server Metadata**:
```http
GET /.well-known/oauth-authorization-server
```
Response:
```json
{
  "issuer": "https://webagentic.labdx.org",
  "authorization_endpoint": "https://webagentic.labdx.org/keys_manager.html",
  "token_endpoint": "https://webagentic.labdx.org/mcp/rastro/users_api.php?action=token",
  "registration_endpoint": "https://webagentic.labdx.org/keys_manager.html",
  "revocation_endpoint": "https://webagentic.labdx.org/mcp/rastro/users_api.php?action=revoke",
  "scopes_supported": ["mcp:read", "mcp:tools", "tracking:public", "tracking:contract"],
  "bearer_methods_supported": ["header"],
  "agent_auth": {
    "skill": "https://webagentic.labdx.org/auth.md",
    "register_uri": "https://webagentic.labdx.org/keys_manager.html",
    "identity_endpoint": "https://webagentic.labdx.org/mcp/rastro/users_api.php?action=identity",
    "claim_endpoint": "https://webagentic.labdx.org/keys_manager.html",
    "events_endpoint": "https://webagentic.labdx.org/mcp/rastro/users_api.php?action=event",
    "identity_types_supported": ["anonymous", "identity_assertion", "service_auth"],
    "identity_assertion": {
      "assertion_types_supported": ["urn:ietf:params:oauth:token-type:id-jag", "verified_email"],
      "credential_types_supported": ["app_key", "bearer_token"]
    },
    "anonymous": {
      "credential_types_supported": ["app_key", "session"]
    },
    "events_supported": [
      "https://schemas.workos.com/events/agent/auth/identity/assertion/revoked"
    ]
  }
}
```

## Step 2 — Pick a method

Use this decision tree:

1. **You have a session tied to a user identity and can exchange it for an ID-JAG, audience-bound to this service** → [identity_assertion + id-jag](#identity_assertion--id-jag).
2. **You have only the user's email** → [service_auth](#service_auth). Claim ceremony required.
3. **You have neither or require instant public tracking** → [anonymous](#anonymous). No registration or credentials needed for public tracking. Optional claim ceremony when your owner provisions a persistent AppKey.

## Step 3 — Register

Before registering or provisioning credentials, an AI agent MUST ask its owner for explicit authorization and proceed only after confirmation.

### identity_assertion + id-jag

Mint the ID-JAG assertion with:
- `aud`: `https://webagentic.labdx.org/`
- `iss`: your provider issuer URL
- `email_verified: true`

POST the assertion to `agent_auth.identity_endpoint`:
```http
POST /mcp/rastro/users_api.php?action=identity
Content-Type: application/json

{
  "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "assertion": "<id_jag_token>"
}
```

### service_auth

For email-based agent authentication, submit user verification to `register_uri` (`https://webagentic.labdx.org/keys_manager.html`). Follow the claim process in Step 4.

### anonymous

Anonymous access is available immediately without registration.
- Scope: `tracking:public`
- Rate limit: 1 request every 30 seconds per IP
- Intranet tracking is unavailable anonymously.

To self-register a limited counter AppKey, complete the self-registration form at `register_uri` (`https://webagentic.labdx.org/keys_manager.html`). The counter key format is `mcp_sk_counter_<key>` with a rate limit of 1 request every 10 seconds.

## Step 4 — Claim (if required)

When transitioning from anonymous or completing `service_auth`:
1. The agent directs the owner to `claim_endpoint` (`https://webagentic.labdx.org/keys_manager.html`).
2. The owner authorizes the client creation.
3. The server associates the generated AppKey with the agent or customer account.

## Step 5 — Exchange for an access_token

For JWT/ID-JAG assertions, exchange at `token_endpoint`:
```http
POST /mcp/rastro/users_api.php?action=token
Content-Type: application/json

{
  "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "assertion": "<identity_assertion>"
}
```

For provisioned AppKeys, the key itself acts as the bearer token (`mcp_sk_<key>` or `mcp_sk_counter_<key>`).

## Step 6 — Call the API

Send the token or AppKey in the `Authorization` or `X-App-Key` header over HTTPS.

### MCP (Model Context Protocol) JSON-RPC

Endpoint: `POST https://webagentic.labdx.org/mcp/rastro/index.php`

**Registered Counter Client**:
```http
POST https://webagentic.labdx.org/mcp/rastro/index.php
Content-Type: application/json
Authorization: Bearer mcp_sk_counter_<key>

{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}
```

**Contracted Client (Tier 3 - SRO Intranet & Tabela)**:
```http
POST https://webagentic.labdx.org/mcp/rastro/index.php
Content-Type: application/json
X-App-Key: mcp_sk_<key>
X-Cartao-Postagem: <customer_posting_card>

{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"rastreamento_real_tabela","arguments":{"codigo":"NN074580571BR","app_key":"mcp_sk_<key>"}}}
```

**Anonymous Client**:
```http
POST https://webagentic.labdx.org/mcp/rastro/index.php
Content-Type: application/json

{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}
```

## Step 7 — Handle revocation

An administrator or owner can revoke credentials via `revocation_endpoint`:
```http
POST /mcp/rastro/users_api.php?action=revoke
Content-Type: application/json

{
  "token": "mcp_sk_<key>"
}
```
Or by deleting/disabling the key in `https://webagentic.labdx.org/keys_manager.html`. When receiving HTTP 401, clear stored credentials and re-execute Step 1.

---

## Admin Panel Authentication

The `keys_manager.html` panel uses an internal session authentication API:
- Endpoint: `POST /mcp/rastro/users_api.php?action=auth`
- Body: `{"username": "admin", "password": "<password>"}`
- Authenticated calls send: `Authorization: Bearer <session_token>`
- Administrative actions: `list` (GET), `delete` (DELETE), `logout` (POST).
- Do not use administrative credentials as agent API keys.

## Discovery Metadata Summary

- **Protected Resource Metadata**: `https://webagentic.labdx.org/.well-known/oauth-protected-resource`
- **OAuth Authorization Server**: `https://webagentic.labdx.org/.well-known/oauth-authorization-server`
- **OpenID Configuration**: `https://webagentic.labdx.org/.well-known/openid-configuration`
- **API Catalog (RFC 9727)**: `https://webagentic.labdx.org/.well-known/api-catalog`
- **MCP Discovery**: `https://webagentic.labdx.org/.well-known/mcp-discovery.json`
- **MCP Endpoint**: `https://webagentic.labdx.org/mcp/rastro/index.php`
- **AppKey Management**: `https://webagentic.labdx.org/keys_manager.html`
/.well-known/ai-catalog.json as served 1.9 KB
{
  "specVersion": "0.1.0",
  "host": {
    "name": "webagentic.labdx.org",
    "displayName": "Web Agentic Logistics",
    "url": "https://webagentic.labdx.org"
  },
  "entries": [
    {
      "identifier": "urn:air:webagentic.labdx.org:api:logistics-openapi",
      "displayName": "Logistics REST API",
      "description": "API REST para consulta de rastreamento e operações logísticas.",
      "type": "application/vnd.oai.openapi+json;version=3.1",
      "url": "https://webagentic.labdx.org/openapi.json",
      "representativeQueries": [
        "Consultar o status de uma encomenda pelo código de rastreio",
        "Descobrir os endpoints REST disponíveis para logística",
        "Obter o contrato OpenAPI da API de rastreamento"
      ]
    },
    {
      "identifier": "urn:air:webagentic.labdx.org:mcp:logistics-server",
      "displayName": "Logistics MCP Server",
      "description": "Servidor MCP remoto para ferramentas e recursos de logística.",
      "type": "application/json",
      "url": "https://webagentic.labdx.org/.well-known/mcp/server-card.json",
      "representativeQueries": [
        "Listar as ferramentas MCP de logística disponíveis",
        "Rastrear uma encomenda usando MCP",
        "Consultar recursos do servidor MCP logístico"
      ]
    },
    {
      "identifier": "urn:air:webagentic.labdx.org:webmcp:logistics-tools",
      "displayName": "Browser Logistics Tools",
      "description": "Ferramentas WebMCP para cálculo de frete, rastreamento e logística reversa no navegador.",
      "type": "text/javascript",
      "url": "https://webagentic.labdx.org/webmcp.js",
      "representativeQueries": [
        "Calcular o preço estimado de um frete no navegador",
        "Consultar o rastreamento de uma encomenda no navegador",
        "Encontrar o próximo passo para uma devolução logística"
      ]
    }
  ]
}
/.well-known/mcp/server-card.json as served 398 B
{
  "serverInfo": {
    "name": "WebAgentic Logistics MCP",
    "version": "1.0.0"
  },
  "description": "Servidor MCP remoto para rastreamento e operações logísticas.",
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://webagentic.labdx.org/mcp/rastro/index.php"
  },
  "capabilities": {
    "tools": true,
    "resources": false,
    "prompts": false
  }
}
/.well-known/agent-skills/index.json as served 1.2 KB
{
  "$schema": "https://agentskills.io/schemas/agent-skills-discovery-v0.2.0.json",
  "skills": [
    {
      "name": "logistics-openapi",
      "type": "application/vnd.oai.openapi+json;version=3.1",
      "description": "Descobre e utiliza a API REST de logística documentada em OpenAPI.",
      "url": "https://webagentic.labdx.org/openapi.json",
      "sha256": "sha256:191a00a597c23c331ac950e7f9098f64836ce5d79d211e057e7ec0cda63cc890"
    },
    {
      "name": "logistics-agent-documentation",
      "type": "text/markdown",
      "description": "Documentação operacional para agentes sobre as capacidades de logística, rastreio e roteirização.",
      "url": "https://webagentic.labdx.org/llms.txt",
      "sha256": "sha256:5ff4231e56d89cd3f0c5893c10081ac1de18539d6322e42f1616004b18971558"
    },
    {
      "name": "webmcp-logistics-tools",
      "type": "text/javascript",
      "description": "Ferramentas WebMCP para cálculo de frete, rastreamento e logística reversa no navegador.",
      "url": "https://webagentic.labdx.org/webmcp.js",
      "sha256": "sha256:2cdd4dc51a3e65d5290c5830b968457b4ce29903bfaf9ea55cc38f2765b3e6ce"
    }
  ]
}
Speed among Custom stores
The profile answered in 281 ms, faster than 70% of the Custom stores we check.