Skip to main content

Open connector

AimoGuard is the door Valio Aimo can offer to any buying system. We use open standards on purpose: a documented web API, an open connector (MCP), public schemas, and public keys so prices and orders can be verified.

Offer payloadcontract example values{ "availability": { "availableDate": "2026-11-17", "stockBasis": "supplier_unconfirmed", "salesBlock": false }, "customer": "100123", "evidence": { "reliability": { "value": 0.97, "source": "product" }, "labels": ["GOODS_FROM_FINLAND_BLUE_SWAN"], "allergenDataStatus": "declared" }, "expiresAt": "2026-11-16T09:29:02+02:00", "issuer": "valio-aimo-gateway", "offerId": "ofr_01JD8Q3W6K", "price": { "unitNet": 0.01, "taxRate": 13.5, "currency": "EUR" }, "productId": "463038", "quantity": 50, "salesUnit": "KI"}Compact JWSeyJhbGciOiJFZERTQSJ9.eyJhdmFpbGFiaWxpdHkiOnsi…(edited).k3Jv…9wQheader: alg EdDSA, kidpayload: the offer, base64urlEd25519 signatureGET /.well-known/jwks.json{ "keys": [ { "kty": "OKP", "crv": "Ed25519", "kid": "gw-ed25519-1", "x": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo" } ] }Verifierany outside agent, script or auditorsignature over header.payload✗kid is in the JWKS✓expiresAt in the future-product and quantity match the line-403 order blocked · offer signature invalid
6/6Rejected. The signature no longer matches the bytes. The gateway answers 403 with “offer signature invalid”, and the attempt lands in the audit log.

The path in six steps​

  1. Discover the door (where to find keys, docs, and rules)
  2. Search or look up products
  3. Request a quote → receive signed offers (valid up to 15 minutes)
  4. Optional dry-run of kitchen rules → order alone / ask / stop
  5. Place the order (with signed approvals if needed) → signed confirmation
  6. Read the audit trail

Sensitive calls prove the kitchen’s permission slip and that the caller holds the right key.

For other software​

Connect a compatible client to the open connector endpoint. The operations match the web API (search, quote, check, order, audit). If a language model must not hold private keys, run a small wallet helper that signs on its behalf.

Second-system demo and setup notes live in the repo (gateway/MCP.md).

Quick checks​

curl -s "$GATEWAY_URL/.well-known/agent-interface.json"
curl -s -X POST "$GATEWAY_URL/v1/products/search" \
-H "Content-Type: application/json" \
-d '{"query": "lactose-free milk", "limit": 3}'

Proof: 29 of 29 attack cases refused against a live door.