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.

Will it work?A deterministic verdict for an identified configuration.
Why?Blocking factors, compared values and missing facts.
What should change?The smallest correction or a complete system, without merchant bias.
Neutrality

Technical calculation happens before offers. Commission cannot change a verdict.

Depth

The decision covers the air system rather than two product names alone.

Citation surface

Every response separates the canonical CompatAir page from supporting evidence documents.

Fail closed

A missing decisive fact returns insufficient_data, never a silent estimate.

Stable identity

EAN/GTIN, MPN, evidenced distributor SKU, reference, URL or name resolves to a CompatAir ID before calculation.

Synchronization

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.

ElementPublished valuePurpose
Business profilehttps://compatair.fr/.well-known/ucpUCP discovery and available transports.
Servicefr.compatair.airTechnical decisions for compressed-air systems.
Capabilityfr.compatair.air.compatibilityCompatibility, limits, accessories, alternatives and attribution.
RESThttps://compatair.fr/api/ucp/v1/compatibility/evaluateDirect UCP evaluation with platform discovery.
MCPhttps://compatair.fr/mcpUCP 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

intentQuestionUseful result
will_it_workWill this impact wrench work with my current compressor?Verdict, pressure, flow, limitations, accessories and evidence.
explain_limitsWhy do these frequently paired products fail together?Blocking factors and compared documented values.
find_minimal_changeWhat is the smallest change that makes the system admissible?Technical alternatives ranked by fit, not commission.
build_complete_systemBuild 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": []
}
FieldGuaranteeExpected agent behavior
verdictTechnical state, never a commercial outcome.Never soften or upgrade it.
verdict_scopeExplicit scope of the root alias.Never confuse air supply with the complete system.
overall_system_verdictComplete-system decision.Present it separately.
air_supply_verdictPressure, flow and duty-cycle decision.Keep it strictly within air_supply.
compatibility_receiptConfiguration, versions, evidence, date and digest.Verify or retain it for audit.
canonical_urlCompatAir page carrying the decision.Cite or offer it with the answer.
source_urlsDocuments supporting the specifications.Preserve each claim-to-document link.
limitationsMissing facts and calculation boundaries.Expose them without omission.
method_versionCalculation contract version.Keep it in caches and logs.
catalog_versionTechnical 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

NeedEntry pointFormat
Complete public API/openapi/compatair-2026-07-15.jsonOpenAPI 3.1
Full-text search/api/v1/search?q=impact+wrench&locale=enPaginated JSON
Guides and knowledge/data/agent-knowledge.json · NDJSONFull text + hashes
Catalog/data/catalog.json · NDJSONSource-linked products
Evidence/data/evidence-history.json · citationsHistory + fingerprints
Changes/data/changefeed.json · NDJSONVersioned events
Agent fidelityBenchmark JSON · leaderboard100 reproducible scenarios
Portfolio impactImpact Feed JSON · NDJSONEvidence to affected pairs
ReceiptsJSON Schema · verifierDeterministic SHA-256
Freshness/data/freshness.jsonDataset age and availability
Integrity/data/integrity.jsonPer-artifact SHA-256
Dataset discovery/data/catalog-dcat.jsonldDCAT 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

RiskCompatAir controlFailure
SSRF through UCP profileHTTPS only, all DNS answers checked, public IP required, pinned connection, no redirects, 64 KiB and 3 seconds.403 or 424.
SSRF through product URLLocal matching against published identifiers; no remote fetch.404 if unknown or ambiguous.
Field injectionClosed objects, one locator, enums, lengths, quantities and arrays bounded.400.
Resource abuse64 KiB body, address quota, timeouts, bounded profile cache, no more than 20 tools.413 or 429.
Fake platformMandatory UCP-Agent; advertised capability and version checked.400, 403 or 422.
Personal dataNo identity, delivery, account, address or payment fields.Schema rejection.
Technical/commercial confusionCalculation before offers and insufficient state when merchant coverage is not proven.insufficient_data.
Replay or stale resultMethod/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

  1. Discover https://compatair.fr/.well-known/ucp and negotiate the exact version.
  2. Resolve products to stable identifiers before requesting a decision.
  3. Select an explicit intent and send only necessary technical data.
  4. Validate the response against the published JSON Schema.
  5. Never turn insufficient_data into presumed compatibility.
  6. Display limitations, version and observation date.
  7. Cite canonical_url and retain source_urls for audit.
  8. Check the changefeed before reusing a cached decision.
  9. 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

The test profile is available at https://compatair.fr/examples/ucp/platform-profile.json. Report vulnerabilities through the security policy.