← The evidence ledger
Evidence row 568848
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint b64a8316-3f42-4876-8347-43c2f44b6bd0
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 54a60022be9188221aa3bda06442d1e3c85643a8f23432662156af60845842c1
- Leaf
- 0x17435f3e7bed68b2313e66461c98aa26882b75deeed2305cc276cc8bac97e6cc
What was observed
{
"count": 43,
"tools": [
{
"description": "The recent conversation between this organisation and its Aeroz agent, across the dashboard, MCP and email. Use it to see what has already been asked and answered before asking again.",
"inputSchema": {
"properties": {
"limit": {
"description": "Turns to return (default 20, max 60).",
"type": "number"
}
},
"type": "object"
},
"name": "agent_conversation"
},
{
"description": "Ask this organisation's dedicated Aeroz agent a question in plain language and get a grounded answer. Use it for anything a human at the business would ask their account manager: \"what do we still need to do\", \"when is our deadline\", \"what is Aeroz waiting on\", \"what is not being monitored\", \"how do we go live\". It also looks up lots, units, holds and shipments (\"where is lot X\", \"which units of Y are on hold\", \"what shipped to Z last week\") in this company's own records, within this key's read scopes, and answers \"how do I…\" and compliance questions from Aeroz's help topics. The answer carries `grounded`: `records` means it was read from the company's records (the records are in `chips`); `knowledge` means it came from an Aeroz help topic (sections in `citations`; compliance answers are readiness signals, not legal determinations); `computed` means it was read directly from the account's own data; `model` means a model composed it from that data and every date and figure was checked against it; `declined` means the agent does not hold what the question needs and said so — relay that honestly rather than filling the gap yourself. Asking refreshes the account's onboarding state and records the question and answer in the conversation (see agent_conversation). It sends nothing outside Aeroz and changes no product, shipment or passport data.",
"inputSchema": {
"properties": {
"question": {
"description": "The question, as the person asked it (at most 2000 characters).",
"type": "string"
}
},
"required": [
"question"
],
"type": "object"
},
"name": "ask_agent"
},
{
"description": "Bind an Aeroz chip to a graded collectible slab (PSA, CGC, SGC, BGS, TAG). The chip UID, grader, cert number, grade and card identity are signed together, so the chip vouches for exactly this label: a label moved to another holder, or a cert reprinted on a copy, shows as \"binding broken\" on a buyer's tap. For PSA, the cert is cross-checked against PSA's own record when PSA_API_TOKEN is configured; a disagreement flags the item. `grader_check` is match, mismatch, not_found, unavailable (nobody looked), or unverified_identity (the grade agrees but the grader's record does not confirm the card). A chip that has ever been bound to a graded item is refused (use a new chip), and so is a grader cert already bound to another chip — for a re-holdered slab, retire the old binding with record_provenance first. Returns the public verify URL to encode in the slab's QR. This does NOT grade the card and does not claim the card was unaltered before sealing — never present it as either.",
"inputSchema": {
"properties": {
"back_image_url": {
"maxLength": 500,
"type": "string"
},
"card_number": {
"maxLength": 32,
"type": "string"
},
"category": {
"enum": [
"trading_card",
"coin",
"comic",
"memorabilia",
"other"
],
"maxLength": 40,
"type": "string"
},
"cert_number": {
"maxLength": 64,
"type": "string"
},
"front_image_url": {
"maxLength": 500,
"type": "string"
},
"grade": {
"description": "As printed: \"10\", \"9.5\", \"8 OC\", \"Authentic\", \"Authentic Altered\".",
"maxLength": 32,
"type": "string"
},
"grader": {
"enum": [
"psa",
"cgc",
"sgc",
"bgs",
"tag",
"other"
],
"type": "string"
},
"public": {
"description": "Resolvable by a public tap (default true).",
"type": "boolean"
},
"sealed_at": {
"type": "string"
},
"sealed_by": {
"maxLength": 120,
"type": "string"
},
"set_name": {
"maxLength": 120,
"type": "string"
},
"subject": {
"maxLength": 120,
"type": "string"
},
"title": {
"description": "e.g. \"2003 Topps Chrome LeBron James #111\"",
"maxLength": 240,
"type": "string"
},
"uid": {
"description": "Chip UID bonded to the slab (at most 64 characters, as verify_chip accepts).",
"maxLength": 64,
"type": "string"
},
"variety": {
"maxLength": 120,
"type": "string"
},
"year": {
"maxLength": 12,
"type": "string"
}
},
"required": [
"uid",
"grader",
"cert_number",
"grade",
"title"
],
"type": "object"
},
"name": "bind_graded_item"
},
{
"description": "The full picture of this business as Aeroz holds it: declared product categories with their mandate dates and whether each date is fixed or provisional, onboarding state, open findings, and — importantly — which recall sources are NOT being monitored. Use this to orient before answering anything about the account. Never present an empty findings list as evidence of safety without also reporting coverage_gaps.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "business_brief"
},
{
"description": "Sweep this organisation's units and report which regulatory checks are failing across the portfolio, how many units each affects, and examples to open. This is the tool for \"which of my units have a broken custody chain\", \"what is failing right now\", \"what will not pass on 18 February\" and \"how are we doing overall\". Counts are exact for the units swept; the response says when it hit its cap rather than implying it saw everything. An empty findings list means nothing failed among the units swept — it does not mean the organisation is compliant.",
"inputSchema": {
"properties": {
"limit": {
"description": "Units to sweep, default 100, maximum 300.",
"type": "number"
},
"pack": {
"description": "Optional: \"dscsa\" or \"dpp\". Omit to sweep under every pack.",
"type": "string"
},
"status": {
"description": "Optional: only units in this state (in_transit, in_stock, dispensed, recalled...).",
"type": "string"
}
},
"type": "object"
},
"name": "chain_readiness"
},
{
"description": "Check whether a specific unit is subject to an active recall, from the register: reads only, verifies no signature and spends no chip answer. Returns known (on the register), recalled, and the recall reason, severity, date and id when one applies. recalled:null means the status is UNKNOWN (the UID is not on the register, or the register could not be read) — never report that as \"not recalled\". This says nothing about whether the item is genuine; use verify_chip for that. Use whenever a unit is about to be shipped, sold, dispensed, or installed. A sandbox key answers its seeded sandbox chips first and any other UID from the register (register:true).",
"inputSchema": {
"properties": {
"uid": {
"description": "The chip UID of the unit to check.",
"type": "string"
}
},
"required": [
"uid"
],
"type": "object"
},
"name": "check_recall"
},
{
"description": "Mark a manual onboarding step complete on behalf of this organisation. Only steps the customer owns and that Aeroz cannot verify automatically can be set this way; an automatically verified step will refuse, because a self-report that contradicts the platform data is worse than no report. Pass the step key from onboarding_status.",
"inputSchema": {
"properties": {
"key": {
"description": "The step key, e.g. \"gs1_prefix\" or \"carrier_chosen\".",
"type": "string"
},
"note": {
"description": "What was done, for the audit trail.",
"type": "string"
}
},
"required": [
"key"
],
"type": "object"
},
"name": "complete_onboarding_step"
},
{
"description": "Register one product, by the same rules as POST /v1/products. Recall watch needs a GTIN, NDC or UPC. Returns the passport gap for its category when there is one; that is a readiness signal, not a legal determination.",
"inputSchema": {
"properties": {
"brand": {
"type": "string"
},
"category": {
"description": "For example pharma, batteries, textiles.",
"type": "string"
},
"description": {
"type": "string"
},
"dpp_fields": {
"type": "object"
},
"gtin": {
"description": "Checked by its check digit.",
"type": "string"
},
"lot_numbers": {
"items": {
"type": "string"
},
"type": "array"
},
"ndc": {
"type": "string"
},
"product_name": {
"type": "string"
},
"sku": {
"type": "string"
},
"upc": {
"type": "string"
}
},
"required": [
"product_name"
],
"type": "object"
},
"name": "create_product"
},
{
"description": "Register a shipment of physical items under a sensitivity profile so Aeroz can watch it in transit. Profiles: cold_chain (2–8 °C, mean kinetic temperature), frozen (≤ −15 °C), ambient_crt (15–30 °C, MKT ≤ 25), fragile (shock, tilt), high_value (light = container opened, dwell, chip-verified custody at every handoff), standard (movement only). Origin and destination need decimal-degree coordinates. Items may carry a chip uid, GTIN, lot and serial. Returns the shipment id and the thresholds that will judge it.",
"inputSchema": {
"properties": {
"carrier": {
"type": "string"
},
"destination": {
"properties": {
"label": {
"type": "string"
},
"lat": {
"type": "number"
},
"lng": {
"type": "number"
}
},
"required": [
"lat",
"lng"
],
"type": "object"
},
"items": {
"items": {
"properties": {
"description": {
"type": "string"
},
"gtin": {
"type": "string"
},
"lot_number": {
"type": "string"
},
"quantity": {
"type": "number"
},
"serial": {
"type": "string"
},
"uid": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"origin": {
"properties": {
"label": {
"type": "string"
},
"lat": {
"type": "number"
},
"lng": {
"type": "number"
}
},
"required": [
"lat",
"lng"
],
"type": "object"
},
"planned_arrive": {
"description": "ISO 8601",
"type": "string"
},
"planned_depart": {
"description": "ISO 8601",
"type": "string"
},
"profile": {
"enum": [
"cold_chain",
"frozen",
"ambient_crt",
"fragile",
"high_value",
"standard"
],
"type": "string"
},
"reference": {
"description": "Your own reference (PO, ASN, waybill).",
"type": "string"
},
"thresholds": {
"description": "Optional overrides of the profile defaults (temp_min_c, temp_max_c, mkt_max_c, shock_crit_g, dwell_max_min, …).",
"type": "object"
}
},
"required": [
"origin",
"destination"
],
"type": "object"
},
"name": "create_shipment"
},
{
"description": "Assess how ready a product category is for an EU Digital Product Passport, against the delegated act that applies to it. Returns the required data fields, which are present, and which are missing. IMPORTANT: this is a readiness signal, not a legal compliance determination — never report its output as confirmation that a product is compliant.",
"inputSchema": {
"properties": {
"category": {
"description": "Product group, e.g. \"batteries\", \"textiles\", \"iron_steel\", \"furniture\", \"tyres\", \"aluminium\".",
"type": "string"
}
},
"required": [
"category"
],
"type": "object"
},
"name": "dpp_readiness"
},
{
"description": "Resolve anything a scanner or a person can produce — a chip UID, a GS1 Digital Link URI, or a GTIN plus serial — to a unit, and return its history and verdicts. This is the tool for \"what is this thing in front of me\". An identifier that resolves to nothing is NOT the same as one that fails verification: the first means we have never seen it, the second means we have and it did not check out. Report them differently.",
"inputSchema": {
"properties": {
"gtin": {
"type": "string"
},
"serial": {
"type": "string"
},
"uid": {
"description": "Chip UID read from a tap.",
"maxLength": 64,
"type": "string"
},
"upi": {
"description": "Unique product identifier — usually a GS1 Digital Link URL.",
"type": "string"
}
},
"type": "object"
},
"name": "find_unit"
},
{
"description": "The columns import_products reads, in the template's order, with the template's sample rows (a fictional company's products, not real data), the row limit and the rule for matching rows to existing products.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_import_template_columns"
},
{
"description": "Read the PUBLIC view of a published Digital Product Passport hosted by Aeroz, by its GS1 Digital Link (e.g. https://id.aeroz.io/01/09506000134352/21/ABC123) or its passport id (dpp_...). Returns the signed passport fields everyone may see, the version and its date, recall status and the item's links. Fields restricted to repairers, recyclers or authorities are listed as withheld, never shown. This reads the record only: it does NOT prove the physical item in front of you is genuine — use verify_chip with a fresh chip tap for that. A link from another resolver is refused, not fetched. Works without an API key. Passports of sandbox organisations are not public in production.",
"inputSchema": {
"properties": {
"date": {
"description": "Optional: the passport as it stood on this ISO-8601 date (with dpp_id).",
"type": "string"
},
"digital_link": {
"description": "A GS1 Digital Link on id.aeroz.io (query string is ignored).",
"type": "string"
},
"dpp_id": {
"description": "A passport id, dpp_ followed by 26 characters.",
"type": "string"
},
"version": {
"description": "Optional: a specific version (with dpp_id).",
"type": "number"
}
},
"type": "object"
},
"name": "get_passport"
},
{
"description": "Return this organisation's Aeroz verification volume and outcome breakdown over a recent period. Use for reporting on scan volume, authentication failure rates, and trend. The buckets — authentic, recalled (any tap whose answer carried a recall, verified or not), mismatched (failed static or SUN signature), not_found, unverified (no or unchecked signature, test tag, held or disabled unit) and other — always sum to total.",
"inputSchema": {
"properties": {
"days": {
"description": "Days to look back (default 30, max 365).",
"type": "number"
}
},
"type": "object"
},
"name": "get_usage"
},
{
"description": "A graded item as Aeroz holds it: grader, cert, grade, identity, whether the grader's own record matched, how many times it has been verified by tap, and its full provenance chain (sealed, sold, consigned, vaulted, shipped, verified…). Use for \"is this slab the one that was sealed\", \"where has it been\", \"has anyone tried to pass off a copy\". Report what this proves AND what it does not.",
"inputSchema": {
"properties": {
"item_id": {
"type": "string"
}
},
"required": [
"item_id"
],
"type": "object"
},
"name": "graded_item"
},
{
"description": "Add or update many products at once, by the same rules as POST /v1/products/import: at most 5,000 rows, each row the fields of create_product. Send `dry_run: true` first: it checks every row and writes nothing. A real import writes nothing while any row has a problem. Each row comes back as create, update, unchanged or conflict.",
"inputSchema": {
"properties": {
"dry_run": {
"description": "true checks and writes nothing. Default false.",
"type": "boolean"
},
"rows": {
"description": "One object per product.",
"items": {
"type": "object"
},
"type": "array"
}
},
"required": [
"rows"
],
"type": "object"
},
"name": "import_products"
},
{
"description": "List the Aeroz compliance agents available to this organisation and which are currently enabled. Use this to explain monitoring coverage or to find an agent worth enabling.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_agents"
},
{
"description": "The systems Aeroz can connect to (WMS, ERP, commerce, EPCIS). Each has a tier and `tier_means` in words: `live` moves data today, `credentials` only checks your sign-in, `bridge` needs an on-site agent, `guided` means an Aeroz engineer finishes the hookup. Do not describe a guided connector as automatic.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_connectors"
},
{
"description": "List findings raised by the Aeroz compliance agents watching this organisation — recall hits, DPP data gaps, regulatory changes, dwell anomalies, and clone detections. Use this to answer \"what needs my attention\".",
"inputSchema": {
"properties": {
"limit": {
"description": "Maximum findings to return (default 25, max 200).",
"type": "number"
},
"severity": {
"description": "Filter by severity.",
"enum": [
"info",
"warn",
"critical"
],
"type": "string"
}
},
"type": "object"
},
"name": "list_findings"
},
{
"description": "List this organisation's chip-bound graded items, optionally by status (sealed | active | flagged | retired).",
"inputSchema": {
"properties": {
"limit": {
"type": "number"
},
"status": {
"type": "string"
}
},
"type": "object"
},
"name": "list_graded_items"
},
{
"description": "This company's connected systems, each with its `status` and `status_means`. Only `connected` is proven; `unverified` means stored but not yet proven, which is not the same as working.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_integrations"
},
{
"description": "This company's registered products (archived ones left out). An empty list means recall watch has nothing to match against, not that all is clear.",
"inputSchema": {
"properties": {
"limit": {
"description": "Optional. How many to return, 1 to 500, default 100.",
"type": "number"
}
},
"type": "object"
},
"name": "list_products"
},
{
"description": "List the seeded sandbox chips for this organisation, with the UID and signature to pass to verify_chip, one per scenario: authentic, recalled, signature_mismatch (listed with a deliberately WRONG signature) and not_found (a UID that is not on the register). Sandbox only — use when building or testing an integration before physical chips ship.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_sandbox_chips"
},
{
"description": "List this organisation's shipments, optionally by status (planned | in_transit | delivered | exception | cancelled).",
"inputSchema": {
"properties": {
"limit": {
"type": "number"
},
"status": {
"type": "string"
}
},
"type": "object"
},
"name": "list_shipments"
},
{
"description": "Recent webhook deliveries, newest first, each with every attempt and the receiver's answer. A `pending` delivery has a `next_attempt_at`: it is being retried, not lost. Needs the `webhooks:read` scope.",
"inputSchema": {
"properties": {
"endpoint_id": {
"description": "Optional. Only deliveries to this endpoint.",
"type": "string"
},
"limit": {
"description": "Optional. 1 to 50, default 25.",
"type": "number"
},
"status": {
"description": "Optional. pending, sending, delivered, failed or cancelled.",
"type": "string"
}
},
"type": "object"
},
"name": "list_webhook_deliveries"
},
{
"description": "This company's webhook endpoints: the address (query string hidden), the events each receives, and its health in words. Never shows a signing secret. Needs the `webhooks:read` scope.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_webhook_endpoints"
},
{
"description": "Every event Aeroz can send to a webhook, with a description and an example payload (sample values from a fictional company, not real data), how deliveries are signed, and the retry schedule.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_webhook_events"
},
{
"description": "Record sensor readings for a shipment — position, temperature, humidity, shock, tilt, light, battery — up to 500 per call. Aeroz judges the whole recent stream against the lane's thresholds immediately and returns the assessment and any findings raised. A shipment in `planned` moves to `in_transit` on its first reading. Readings from a logger read out at the dock are accepted after `delivered` if they fall inside the journey (departure − 60 min to arrival + 60 min); a cancelled shipment accepts none. Each logger (`source`) is judged on its own; the assessment reports the worst logger and every logger in temp.by_source, plus unobserved minutes. More than 500 readings, future readings and duplicates are refused or ignored and counted.",
"inputSchema": {
"properties": {
"readings": {
"items": {
"properties": {
"at": {
"description": "ISO 8601; defaults to now",
"type": "string"
},
"battery_pct": {
"type": "number"
},
"humidity_pct": {
"type": "number"
},
"lat": {
"type": "number"
},
"light_lux": {
"type": "number"
},
"lng": {
"type": "number"
},
"shock_g": {
"type": "number"
},
"temp_c": {
"type": "number"
},
"tilt_deg": {
"type": "number"
}
},
"type": "object"
},
"type": "array"
},
"shipment_id": {
"type": "string"
}
},
"required": [
"shipment_id",
"readings"
],
"type": "object"
},
"name": "log_telemetry"
},
{
"description": "Return everything the Aeroz agent has built for this organisation: the regulatory calendar with only ADOPTED dates, the passport scaffold per product showing exactly which fields are missing, the identifier audit, the GS1 route, monitoring coverage, integration readiness, and the pre-filled audit scope. Each block carries a confidence — `computed` is derived from this account's own data and needs no review; `sourced` and `drafted` came from outside the platform or involved judgement and are cited. Use this to answer almost any question about what this business needs to do. Report a block's confidence when you rely on it, and never present a `drafted` block as settled.",
"inputSchema": {
"properties": {
"block": {
"description": "Optional. One of: calendar, passport, identifiers, gs1, coverage, integration, audit_scope, packet, profile, regimes, contacts, carrier.",
"type": "string"
}
},
"type": "object"
},
"name": "my_section"
},
{
"description": "Return only the single most important next action and how to complete it. Use when the user asks what to do next and does not want the whole checklist.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "onboarding_next_step"
},
{
"description": "Report where this organisation stands in Aeroz onboarding: current stage, percentage complete, health, the single next action, and every open step with which side owns it. Use this to answer \"what do we still need to do\", \"why are we not live yet\", or \"what is Aeroz waiting on\". Steps marked side=\"aeroz\" are Aeroz's obligation, not the customer's — say so plainly rather than presenting them as homework.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "onboarding_status"
},
{
"description": "Compute and rank routes for a shipment at a departure time, scored for its sensitivity profile: traffic-aware duration and delay, ambient heat or cold along the way against the lane's ceiling, and rain, snow or gusts. Lower score is better and only comparable within one computation. The best route is marked chosen. The response says plainly when routing or weather data was unavailable and the ranking is time-only — relay that; a straight-line estimate is not a traffic-aware route.",
"inputSchema": {
"properties": {
"depart_at": {
"description": "ISO 8601; defaults to the planned departure or now",
"type": "string"
},
"shipment_id": {
"type": "string"
}
},
"required": [
"shipment_id"
],
"type": "object"
},
"name": "plan_route"
},
{
"description": "Record a custody event on a shipment: pickup, checkpoint, handoff, delivered, exception or note. Pass the chip `uid` (and `signature`) read at the handoff and Aeroz verifies it on the spot, turning a signature on a form into proof of presence. On a high_value lane a handoff without a verified chip raises a finding, and so does a chip that is not among the shipment's items (even an authentic one: `verify_result` is then uid_not_in_shipment; `chip_verify_result` is the chip's own verdict). `pickup` moves the shipment to in_transit and must come before `delivered` (logged telemetry also counts as departure), and `delivered` closes it. A delivered or cancelled shipment is final: it accepts only `note` events.",
"inputSchema": {
"properties": {
"actor": {
"type": "string"
},
"kind": {
"enum": [
"pickup",
"checkpoint",
"handoff",
"delivered",
"exception",
"note"
],
"type": "string"
},
"lat": {
"type": "number"
},
"lng": {
"type": "number"
},
"location": {
"type": "string"
},
"note": {
"type": "string"
},
"occurred_at": {
"type": "string"
},
"shipment_id": {
"type": "string"
},
"signature": {
"type": "string"
},
"uid": {
"type": "string"
}
},
"required": [
"shipment_id",
"kind"
],
"type": "object"
},
"name": "record_custody"
},
{
"description": "Append an event to a graded item's chain: sold, consigned, vaulted, withdrawn, shipped, received, flagged, retired, note. Events are append-only and, when public, appear on the buyer's tap page. `flagged` marks the item and needs a `note` saying why. `retired` ends the binding (the slab was re-holdered or destroyed) and needs a `note` saying why: the chip stops vouching for any label and the grader cert is freed to be bound to a new chip. A retired item accepts only `note` events.",
"inputSchema": {
"properties": {
"actor": {
"maxLength": 120,
"type": "string"
},
"item_id": {
"type": "string"
},
"kind": {
"enum": [
"sold",
"consigned",
"vaulted",
"withdrawn",
"shipped",
"received",
"flagged",
"retired",
"note"
],
"type": "string"
},
"location": {
"maxLength": 200,
"type": "string"
},
"note": {
"maxLength": 2000,
"type": "string"
},
"occurred_at": {
"description": "ISO 8601; not in the future, not before the item was sealed",
"type": "string"
},
"public": {
"type": "boolean"
}
},
"required": [
"item_id",
"kind"
],
"type": "object"
},
"name": "record_provenance"
},
{
"description": "Search this company's records the way the dashboard search bar does: products (name, SKU, GTIN, NDC), lots, units (chip ID, serial), tags (UID, EPC), shipments (reference, carrier, places), holds and cases, partners (name, GLN), locations, recalls, integrations and webhooks by name, plus Aeroz help topics. Paste an identifier as-is — a GTIN, NDC, GLN, lot, chip ID, GS1 Digital Link, element string or EPC URN is parsed and exact matches come first (`match: identifier`). Each area needs its own read scope; areas this key cannot read are listed in `skipped` — say so rather than reading an empty group as \"none\". Each hit has `href`, the dashboard screen it opens. To answer a question, use ask_agent.",
"inputSchema": {
"properties": {
"limit": {
"description": "Hits per group (default 5, max 25).",
"type": "number"
},
"q": {
"description": "What to look for (at most 300 characters).",
"type": "string"
}
},
"required": [
"q"
],
"type": "object"
},
"name": "search"
},
{
"description": "Send a signed `ping` to one webhook endpoint now and return the receiver's answer (HTTP status and body). A real request to the customer's address; it is not retried. Needs the `webhooks:write` scope.",
"inputSchema": {
"properties": {
"endpoint_id": {
"description": "The endpoint id (whe_...), from list_webhook_endpoints.",
"type": "string"
}
},
"required": [
"endpoint_id"
],
"type": "object"
},
"name": "send_webhook_test"
},
{
"description": "The sensitivity profiles Aeroz can judge a shipment against and the exact thresholds each applies, plus whether traffic and weather providers are configured for this deployment.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "shipment_profiles"
},
{
"description": "Everything Aeroz holds about one shipment: profile and thresholds, status, items, custody events with their chip verification, the telemetry assessment (min/max/mean temperature, mean kinetic temperature, minutes out of range, peak shock, whether an excursion is open), the ranked routes, and open findings. Use for \"where is it\", \"is the cold chain intact\", \"was it ever opened\". An open excursion on a cold-chain lane means the load must be quarantined on arrival pending QA — say so.",
"inputSchema": {
"properties": {
"shipment_id": {
"type": "string"
}
},
"required": [
"shipment_id"
],
"type": "object"
},
"name": "shipment_status"
},
{
"description": "Test one connected system now and return the real result, including the remote server's own error text. Changes its status to what the test proved. Pulls no data.",
"inputSchema": {
"properties": {
"integration_id": {
"description": "The integration id (int_...), from list_integrations.",
"type": "string"
}
},
"required": [
"integration_id"
],
"type": "object"
},
"name": "test_integration"
},
{
"description": "The whole history of one serialized unit: every custody hop from commissioning to dispensing, whether the append-only log has been tampered with, and what each regulation makes of it. Use this to answer \"where has this been\", \"who handled it\", \"is its record trustworthy\" and \"does this unit pass DSCSA / the EU passport rules\". Every failing check cites the clause it enforces — quote the clause, not just the verdict. IMPORTANT: verdicts are readiness signals, never a legal compliance determination, and the response says so. Never report one as confirmation that a product is compliant.",
"inputSchema": {
"properties": {
"pack": {
"description": "Optional: \"dscsa\" or \"dpp\". Omit to judge under every pack.",
"type": "string"
},
"unit_id": {
"description": "The unit id (cun_...). Use find_unit first if you only have a scan.",
"type": "string"
}
},
"required": [
"unit_id"
],
"type": "object"
},
"name": "trace_unit"
},
{
"description": "Verify a physical item by its Aeroz chip: the UID plus whatever signature the tap carried. Same answer as GET /v1/verify. Use this before trusting any claim about a physical unit — a database record proves a record exists, not that the object in front of you is the one it describes. Read `proof` and `proves`: proof \"presence\" means the chip answered a fresh one-time SUN challenge (picc_data + cmac) and was physically there at this tap; proof \"identity\" means the static `t` signature is the one Aeroz issued for this UID, which a copied tag also carries. verified:false with reason \"no_signature\" (recognised:true) proves NOTHING about the item — only that the number is on the register. \"signature_unchecked\" means the signature was not compared (not a mismatch). A failed signature returns NO product data. Each call records the tap and spends the chip's one-time answer, so pass each SUN tap once. A sandbox key answers its seeded sandbox chips as fixtures (mode \"sandbox\" with a _warning) and any other UID from the register (mode \"sandbox\", register:true), so a sandbox company can check the test tags it minted.",
"inputSchema": {
"properties": {
"cmac": {
"description": "SUN: the `cmac` (or `c`) parameter from the same tap URL.",
"type": "string"
},
"picc_data": {
"description": "SUN: the encrypted `picc_data` (or `e`) parameter from an NTAG 424 tap URL. Send with `cmac`.",
"type": "string"
},
"signature": {
"description": "The static signature from the tag payload (the `t` parameter). Proves identity, not presence.",
"type": "string"
},
"tap_url": {
"description": "Alternatively, the full https tap URL the phone opened (on an Aeroz host). uid, t, picc_data/e and cmac/c are read from it.",
"type": "string"
},
"uid": {
"description": "The chip UID read from the NFC tag or QR payload. Optional when SUN parameters or a tap_url carry it.",
"type": "string"
}
},
"type": "object"
},
"name": "verify_chip"
},
{
"description": "Check a passport credential (a vc+jwt issued by Aeroz) against Aeroz's published signing keys. Returns valid:true with the issuer, product id, passportVersion and validFrom when the signature checks out and the credential is an Aeroz Digital Product Passport, or valid:false with the reason (including \"revoked by the issuer\" and \"not an Aeroz passport credential\"). A valid result means Aeroz issued exactly this content and has not revoked it; it does not mean the passport is the latest version — compare passportVersion with get_passport. Works without an API key.",
"inputSchema": {
"properties": {
"jwt": {
"description": "The compact vc+jwt credential.",
"type": "string"
}
},
"required": [
"jwt"
],
"type": "object"
},
"name": "verify_passport_credential"
},
{
"description": "Where a product's or a lot's units are, by last known place: sites, partners, scans and shipments in transit, each with how the place is known. Units with no recorded place are counted and listed, never placed. Give `product` (a product id), `lot`, or both.",
"inputSchema": {
"properties": {
"lot": {
"description": "A lot number.",
"type": "string"
},
"product": {
"description": "A product id, from list_products.",
"type": "string"
},
"status": {
"description": "Optional. in_transit, at_site or on_hold.",
"type": "string"
}
},
"type": "object"
},
"name": "where_is"
}
]
}What the leaf hashes
{"body":"54a60022be9188221aa3bda06442d1e3c85643a8f23432662156af60845842c1","id":568848,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793139129518332,"prev":null,"subject":"b64a8316-3f42-4876-8347-43c2f44b6bd0","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (273461 rows).
- 0x174423d2a1291427f1b44ed4cda00a25f5e2bdcde7c1f7e1fe9dd4410a9f2a0d
- 0xbd1fd8243b30dac840dbec7ab32a95811e15c7cb6916516f9bedb6f94e0b0a79
- 0xabd45a9ea41eb5309280e30aaab9a16ac56d760520a4d9c64a7e8410e14df98f
- 0x5698cd42d842904cb2b6035d4b3fd986e5b44193f374ba8cd55c9a7ebadb9abe
- 0x6b19db6cd610c5e480eaee74f76888ba4db66989bc17c66e225526be31edeafa
- 0xa095c27670161acb5dd707958ff15c74506e73c3dc32346963daa4f5cb58d0cd
- 0x6f6817e058c4e4adaf9e7c72757d4a329050a6d1dd41fabd7f3ba69a456a9ba2
- 0x117449d700d06c1eba454efc673d96b628b1212b923ec723dce9d6a4a0e55969
- 0x0df1fb44427357e58307d84a45e03c9e706b5fb01395347b3ee655f25e9ed366
- 0x861995f66b2c7dda0fe888eaf41c09c8b0fb9e6b5ea3c1a3eea03360981ac42f
- 0xf79d4220a9fc71105fb136100defea9d0ad81dbe57947e6220e673f633a3e805
- 0x7afa806e5533c63e57a18fda23b38702b370e8b298a35edc0c1de641c8ffcaec
- 0xca0b37bb3b043ccf0f24c50fccd9c2f22b7e5290df49886008fc2ff55380fdd1
- 0x2064e3a2b01d0d12d5079bf720a0d0125e9703c55e92de54ad40c302469ec047
- 0x6913cb48392acb8dc5c940dcdb6e6fc889d544f85dff11da249551a5f027e688
- 0x518b93854db03dc9fc938883abf30da6eaae5ae0d4336903968fd32a7df8c71b
- 0x22c1fb9487ee0b9732fa017a0cc321eb27a60c08450d112f755089796e12cb1c
- 0xa20d48798a34aba12eb9c7297722982d910f06c148f5e27ac59307422964a585
- 0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699
- Day root
- 0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795
- Chained
- 0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4
- Published
- On Arc Testnet, block 69414147: 0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4