Technical calculation happens before offers. Commission cannot change a verdict.
Decision layer for agentic commerce
CompatAir UCP
CompatAir does not replace a merchant or its checkout. It answers the question product discovery cannot settle: will this air system actually work, why, within which limits, and what is the smallest safe change?
- Capability
fr.compatair.air.compatibility- UCP
- 2026-04-08
- CompatAir
- 2026-07-15
- Transports
- REST · MCP Streamable HTTP
- State
- Read-only · no PII · no payment
- Discovery
/.well-known/ucp
The missing decision layer
A commerce agent finds products. CompatAir establishes a decision.
A catalog is only an input. CompatAir connects a use case, pressure, documented free-air delivery, duty cycle, compressor and distribution system, then publishes the decision and its evidence under a canonical URL.
The decision covers the air system rather than two product names alone.
Every response separates the canonical CompatAir page from supporting evidence documents.
A missing decisive fact returns insufficient_data, never a silent estimate.
EAN/GTIN, MPN, evidenced distributor SKU, reference, URL or name resolves to a CompatAir ID before calculation.
Versions, freshness, hashes and a changefeed invalidate stale decisions.
UCP discovery
A specialized service deliberately separated from checkout
The strict public identifier is fr.compatair.air.compatibility. The initial fr.compatair.compatibility name remains useful shorthand, but UCP requires reverse-domain.service.capability. The air segment therefore names the fr.compatair.air service.
| Element | Published value | Purpose |
|---|---|---|
| Business profile | https://compatair.fr/.well-known/ucp | UCP discovery and available transports. |
| Service | fr.compatair.air | Technical decisions for compressed-air systems. |
| Capability | fr.compatair.air.compatibility | Compatibility, limits, accessories, alternatives and attribution. |
| REST | https://compatair.fr/api/ucp/v1/compatibility/evaluate | Direct UCP evaluation with platform discovery. |
| MCP | https://compatair.fr/mcp | UCP tool inside an existing agent session. |
CompatAir does not advertise an A2A binding yet. An Agent Card will be published only with a real A2A endpoint, conformance tests and a demonstrated authorization boundary. An empty discovery URL would be a misleading promise.
Business intents
The request expresses a question, not a catalog query
intent | Question | Useful result |
|---|---|---|
will_it_work | Will this impact wrench work with my current compressor? | Verdict, pressure, flow, limitations, accessories and evidence. |
explain_limits | Why do these frequently paired products fail together? | Blocking factors and compared documented values. |
find_minimal_change | What is the smallest change that makes the system admissible? | Technical alternatives ranked by fit, not commission. |
build_complete_system | Build a complete system for these tools. | Compressor, hose, connectors, filtration, lubrication, limits and evidence. |
Resolve one product without guessing
Each reference accepts exactly one locator: id, compatair_id, ean, mpn, reference, url or name. Evaluation requires an exact match. Unknown or ambiguous products are rejected instead of being selected silently.
{
"ean": "4007430227911"
}A product URL is only a local identifier matched against published data. CompatAir never downloads it during evaluation.
REST
Test one UCP decision
A UCP platform identifies itself with UCP-Agent. The public sample profile can test the contract without owning a domain. Production integrations should publish their own HTTPS profile and advertise the exact CompatAir capability version they accept.
Complete requestcurl
curl --fail-with-body \
--request POST \
--url https://compatair.fr/api/ucp/v1/compatibility/evaluate \
--header 'Content-Type: application/json' \
--header 'UCP-Agent: profile="https://compatair.fr/examples/ucp/platform-profile.json"' \
--data '{
"ucp": { "version": "2026-04-08" },
"intent": "will_it_work",
"configuration": {
"compressor": { "id": "kaeser-eurocomp-epc-840-100" },
"tools": [{ "id": "einhell-tc-pe-150", "quantity": 1 }],
"mode": "successive"
},
"requested_outputs": [
"compatibility",
"mandatory_accessories",
"limits",
"alternatives",
"complete_configuration",
"attribution",
"evidence"
]
}'Request bodyJSON
{
"ucp": { "version": "2026-04-08" },
"intent": "will_it_work",
"configuration": {
"compressor": { "id": "kaeser-eurocomp-epc-840-100" },
"tools": [{ "id": "einhell-tc-pe-150", "quantity": 1 }],
"mode": "successive"
},
"requested_outputs": [
"compatibility",
"mandatory_accessories",
"limits",
"alternatives",
"complete_configuration",
"attribution",
"evidence"
]
}A platform profile is untrusted network input. CompatAir rejects HTTP, embedded credentials, custom ports, redirects and non-public addresses. It validates every DNS result and pins the selected address for the TLS connection.
MCP binding
Add a UCP decision to an agent that is already connected
The MCP server exposes evaluate_air_compatibility. The UCP body remains in arguments and the platform profile is placed under meta.ucp-agent.profile. REST and MCP apply the same profile validation and invoke the same deterministic engine.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "evaluate_air_compatibility",
"arguments": {
"meta": {
"ucp-agent": {
"profile": "https://compatair.fr/examples/ucp/platform-profile.json"
}
},
"ucp": { "version": "2026-04-08" },
"intent": "will_it_work",
"configuration": {
"compressor": { "id": "kaeser-eurocomp-epc-840-100" },
"tools": [{ "id": "einhell-tc-pe-150", "quantity": 1 }],
"mode": "successive"
},
"requested_outputs": [
"compatibility",
"mandatory_accessories",
"limits",
"alternatives",
"complete_configuration",
"attribution",
"evidence"
]
}
}
}See the full MCP documentation for ChatGPT, Claude, Gemini and agent SDK installation examples.
Output contract
A decision must travel with its citation
Every CompatAir response retains the same stable core. UCP adds the requested compatibility, mandatory accessories, limits, alternatives, complete configuration, attribution and evidence blocks.
{
"verdict": "insufficient_data",
"verdict_scope": "complete_air_system",
"verdict_schema_version": "2.0.0",
"overall_system_verdict": {
"schema_version": "2.0.0",
"scope": "complete_air_system",
"verdict": "insufficient_data",
"limitations": ["Network components remain unverified."]
},
"air_supply_verdict": {
"schema_version": "2.0.0",
"scope": "air_supply",
"verdict": "compatible",
"engine_verdict": "continuous",
"limitations": []
},
"canonical_url": "https://compatair.fr/calculateur/?...",
"product_urls": [],
"source_urls": [],
"method_version": "2026.07",
"catalog_version": "<content-derived version>",
"observed_at": "2026-07-15",
"limitations": [],
"next_actions": []
}| Field | Guarantee | Expected agent behavior |
|---|---|---|
verdict | Technical state, never a commercial outcome. | Never soften or upgrade it. |
verdict_scope | Explicit scope of the root alias. | Never confuse air supply with the complete system. |
overall_system_verdict | Complete-system decision. | Present it separately. |
air_supply_verdict | Pressure, flow and duty-cycle decision. | Keep it strictly within air_supply. |
compatibility_receipt | Configuration, versions, evidence, date and digest. | Verify or retain it for audit. |
canonical_url | CompatAir page carrying the decision. | Cite or offer it with the answer. |
source_urls | Documents supporting the specifications. | Preserve each claim-to-document link. |
limitations | Missing facts and calculation boundaries. | Expose them without omission. |
method_version | Calculation contract version. | Keep it in caches and logs. |
catalog_version | Technical snapshot queried. | Invalidate it when the changefeed reports a change. |
canonical_url and source_urls are distinct. The former makes the CompatAir decision citable. The latter proves the technical facts used. Robust integrations preserve both.
Enrichment, not transaction
Price and availability remain separate constraints
A request may include a maximum budget, a minimum merchant count and a country. The server proves these constraints only from fresh offers covering every component. Missing coverage yields a separate commercial_constraints scoped verdict of insufficient_data; it neither degrades nor upgrades the technical verdict, and no price or stock is fabricated.
{
"max_total_minor": 60000,
"currency": "EUR",
"minimum_merchants": 3,
"country": "FR"
}- Currently accepted currency: EUR.
- Currently accepted country: France.
- Minimum total includes observed price and shipping.
- Expired offers and non-allowlisted destinations are excluded.
- Affiliate commission never influences recommendation order.
- No cart, reservation, identity, payment or order mutation.
Machine-readable surface
Deep data that agents can search, verify and cite
| Need | Entry point | Format |
|---|---|---|
| Complete public API | /openapi/compatair-2026-07-15.json | OpenAPI 3.1 |
| Full-text search | /api/v1/search?q=impact+wrench&locale=en | Paginated JSON |
| Guides and knowledge | /data/agent-knowledge.json · NDJSON | Full text + hashes |
| Catalog | /data/catalog.json · NDJSON | Source-linked products |
| Evidence | /data/evidence-history.json · citations | History + fingerprints |
| Changes | /data/changefeed.json · NDJSON | Versioned events |
| Agent fidelity | Benchmark JSON · leaderboard | 100 reproducible scenarios |
| Portfolio impact | Impact Feed JSON · NDJSON | Evidence to affected pairs |
| Receipts | JSON Schema · verifier | Deterministic SHA-256 |
| Freshness | /data/freshness.json | Dataset age and availability |
| Integrity | /data/integrity.json | Per-artifact SHA-256 |
| Dataset discovery | /data/catalog-dcat.jsonld | DCAT 3 JSON-LD |
The agent knowledge manifest exposes translated and reviewed coverage separately. Automated output remains machine_translated_unreviewed; only a checked document can become human_reviewed.
Secure by reducing authority
The capability cannot buy, identify a person or mutate commerce state
| Risk | CompatAir control | Failure |
|---|---|---|
| SSRF through UCP profile | HTTPS only, all DNS answers checked, public IP required, pinned connection, no redirects, 64 KiB and 3 seconds. | 403 or 424. |
| SSRF through product URL | Local matching against published identifiers; no remote fetch. | 404 if unknown or ambiguous. |
| Field injection | Closed objects, one locator, enums, lengths, quantities and arrays bounded. | 400. |
| Resource abuse | 64 KiB body, address quota, timeouts, bounded profile cache, no more than 20 tools. | 413 or 429. |
| Fake platform | Mandatory UCP-Agent; advertised capability and version checked. | 400, 403 or 422. |
| Personal data | No identity, delivery, account, address or payment fields. | Schema rejection. |
| Technical/commercial confusion | Calculation before offers and insufficient state when merchant coverage is not proven. | insufficient_data. |
| Replay or stale result | Method/catalog versions, observation date, freshness and public changefeed. | Integrator invalidates its cache. |
CompatAir does not yet claim HTTP signature verification for this read-only capability. Any extension involving webhooks, private state or mutation will remain disabled until signatures, replay defense, key management and negative tests are demonstrated in production.
Integration contract
What a merchant agent must do correctly
- Discover
https://compatair.fr/.well-known/ucpand negotiate the exact version. - Resolve products to stable identifiers before requesting a decision.
- Select an explicit
intentand send only necessary technical data. - Validate the response against the published JSON Schema.
- Never turn
insufficient_datainto presumed compatibility. - Display limitations, version and observation date.
- Cite
canonical_urland retainsource_urlsfor audit. - Check the changefeed before reusing a cached decision.
- Keep checkout, identity, payment and orders outside CompatAir requests.
Demonstrable boundary
What exists now, and what does not
- The service covers only products and requirements in the published snapshot.
- An unknown URL is never scraped on demand.
- FAD is compared only at documented or safely interpolated pressures.
- Pressure losses and leaks are never invented when undocumented or unmeasured.
- Offers are never technical compatibility evidence.
- English agent guides carry a per-document status: unreviewed machine translation or human-reviewed translation. Exact coverage for each state is machine-readable.
- No A2A binding, webhook, checkout, identity, payment or order tracking is advertised.
- A result does not replace manufacturer instructions, loaded measurements or workplace safety obligations.
Contracts and normative sources
An inspectable surface, not a marketing promise
OpenAPI, OpenRPC and JSON Schema.
Complete OpenAPI for search, evidence, changefeed and compatibility.
llms.txt and llms-full.txt.
- Universal Commerce Protocol · 2026-04-08 overview
- Universal Commerce Protocol · HTTP message signatures
- Google Developers · UCP architecture
- Public UCP repository
- W3C · Data Catalog Vocabulary 3
The test profile is available at https://compatair.fr/examples/ucp/platform-profile.json. Report vulnerabilities through the security policy.