{
  "protocolVersion": "0.3.0",
  "kind": "agent-card",
  "name": "A2A Grocery",
  "title": "A2A Grocery — the agentic hub for retail grocery procurement",
  "description": "Agent-to-Agent (A2A) + Model Context Protocol (MCP) hub for retail grocery, speciality foods first. Business to business: makers, brand owners, private label, distributors, importers, retailers and their AI agents. Twenty markets on the SCHEMA algo grocery record; ambient, chilled, frozen and fresh; organic, free-from, plant-based, artisan, origin and premium lanes. Call resolve_jurisdiction, then resolve_actor, then gate_transaction before any availability, price, documents, order or handoff tool; those tools refuse without an allow decision. Every record field carries its source page; every response carries notice; every record carries claim_status (listed · claimed · verified). Artificial intelligence makes mistakes. A2A Grocery is an agentic information source, not a recommendation. No ads, ever. No rank for sale. Trade only.",
  "brief": "Makers and brand owners. Private label. Distributors and importers. Retail procurement desks and the agents they run. Trade only.",
  "lineTwo": "Powered by SCHEMA algo for grocery agentic commerce",
  "notice": "Artificial intelligence makes mistakes. A2A Grocery is an agentic information source, not a recommendation. No ads, ever. No rank for sale. Trade only.",
  "graph": "SCHEMA algo",
  "url": "https://a2a-grocery.ai/a2a",
  "version": "1.0.0",
  "surface_version": "1.0.0",
  "door_version": "1.0.0",
  "tools": 19,
  "documentationUrl": "https://a2a-grocery.ai/docs",
  "iconUrl": "https://a2a-grocery.ai/icon-512.png",
  "provider": {
    "organization": "GreenCore Solutions Corp.",
    "url": "https://gsc-em.com"
  },
  "operator": {
    "name": "GreenCore Solutions Corp.",
    "url": "https://a2a-grocery.ai",
    "contact": "mailto:mcp@a2a-grocery.ai",
    "keyring": "https://a2a-grocery.ai/.well-known/jwks.json",
    "kid": "a2ag-2026-10",
    "github": "https://github.com/greencore-solutions"
  },
  "contact": "mailto:mcp@a2a-grocery.ai",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "securitySchemes": {
    "credential": {
      "type": "http",
      "scheme": "bearer",
      "description": "client-credentials Bearer from https://a2a-registry.ai (register at /oauth/register with hub grocery); reads need no authentication; the write tools need scope grocery.transact"
    },
    "x402": {
      "type": "http",
      "scheme": "x402",
      "description": "order intents settled in USDC on Base after the gate; receipts signed; a refused intent is not settled and not charged"
    }
  },
  "security": [],
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/markdown"
  ],
  "preferredTransport": "JSONRPC",
  "additionalInterfaces": [
    {
      "url": "https://mcp.a2a-grocery.ai/mcp",
      "transport": "streamable-http",
      "protocolVersion": "2025-06-18",
      "description": "MCP door — server a2a-grocery 1.0.0, 19 tools"
    }
  ],
  "supportedInterfaces": [
    {
      "url": "https://a2a-grocery.ai/a2a",
      "protocolBinding": "JSONRPC",
      "transport": "JSONRPC",
      "protocolVersion": "0.3.0",
      "preferred": true,
      "description": "A2A endpoint — message/send, tasks/get; a DataPart {skill, params} runs the gate chain then the tool; text gets the skill list"
    },
    {
      "url": "https://mcp.a2a-grocery.ai/mcp",
      "protocolBinding": "HTTP+JSON",
      "transport": "streamable-http",
      "protocolVersion": "2025-06-18",
      "description": "MCP door — server a2a-grocery 1.0.0, 19 tools"
    },
    {
      "url": "https://a2a-grocery.ai/",
      "protocolBinding": "HTTP+JSON",
      "transport": "HTTP+JSON",
      "protocolVersion": "1.0",
      "description": "the page, its Markdown twin and the kit"
    }
  ],
  "skills": [
    {
      "id": "grocery.resolve_jurisdiction",
      "name": "resolve jurisdiction",
      "description": "Where is this going? Returns the market and rule set.",
      "tags": [
        "gate",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.resolve_actor",
      "name": "resolve actor",
      "description": "Who is asking? Maker, brand owner, private label, distributor, importer, broker or retail buyer.",
      "tags": [
        "gate",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.gate_transaction",
      "name": "gate transaction",
      "description": "Allow or deny, with the reason and the rule.",
      "tags": [
        "gate",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.search_cleared_items",
      "name": "search cleared items",
      "description": "Find items cleared for this market, by temperature, lane and department.",
      "tags": [
        "skus",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_item",
      "name": "get item",
      "description": "One item by GTIN, fully resolved.",
      "tags": [
        "skus",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.verify_gtin",
      "name": "verify gtin",
      "description": "Is this GTIN real, and whose is it?",
      "tags": [
        "skus",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_label_and_claims",
      "name": "get label and claims",
      "description": "What the label must say, and which claims are allowed.",
      "tags": [
        "skus",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.compare_items",
      "name": "compare items",
      "description": "Compare items, variants and pack sizes.",
      "tags": [
        "skus",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.find_verified_buyer",
      "name": "find verified buyer",
      "description": "Retail buyer desks for this market, by channel and department.",
      "tags": [
        "chains",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.find_verified_supplier",
      "name": "find verified supplier",
      "description": "Verified makers and brand owners for this item.",
      "tags": [
        "chains",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_product_documents",
      "name": "get product documents",
      "description": "Certificates, specifications, allergen and origin paper.",
      "tags": [
        "hitl",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.log_audit",
      "name": "log audit",
      "description": "Write a line to the audit record.",
      "tags": [
        "hitl",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_price",
      "name": "get price",
      "description": "The price for this buyer.",
      "tags": [
        "economics",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_availability",
      "name": "get availability",
      "description": "In stock, and where.",
      "tags": [
        "economics",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.create_order_intent",
      "name": "create order intent",
      "description": "Open an order between two agents.",
      "tags": [
        "economics",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.a2a_handoff",
      "name": "a2a handoff",
      "description": "Hand the buyer to the right agent.",
      "tags": [
        "economics",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_market_status",
      "name": "get market status",
      "description": "Is this product type a food here, and under which regime?",
      "tags": [
        "acts",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_notification_requirements",
      "name": "get notification requirements",
      "description": "What must be filed before sale.",
      "tags": [
        "acts",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.get_enforcement_watch",
      "name": "get enforcement watch",
      "description": "Recalls, withdrawals and food-safety alerts, dated.",
      "tags": [
        "acts",
        "grocery",
        "grocery",
        "retail grocery",
        "procurement",
        "supplier",
        "buyer",
        "private label",
        "GTIN",
        "discounter"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "grocery.list_agents",
      "name": "list agents",
      "description": "The agents of the hub counted from the agent table at request time: the hub trio, twenty market agents, handoff, watch, audit, four temperature lanes and six attribute lanes — hostname, role, market, card and /a2a URL.",
      "tags": [
        "concierge",
        "grocery"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ]
    }
  ],
  "refusals": [
    {
      "reason_code": "DENY_NOT_PERMITTED_HERE",
      "description": "the product type is not permitted as a food in the market"
    },
    {
      "reason_code": "DENY_INGREDIENT_BANNED",
      "description": "an ingredient on the record is prohibited in the market"
    },
    {
      "reason_code": "DENY_INGREDIENT_LIMIT",
      "description": "a restricted ingredient without the limit shown met"
    },
    {
      "reason_code": "DENY_CLAIM",
      "description": "a claim the market's rules do not allow on food"
    },
    {
      "reason_code": "DENY_MARKET",
      "description": "not one of the 20 markets"
    },
    {
      "reason_code": "DENY_ACTOR_CLASS",
      "description": "the consumer, or a read-only auditor, on a transacting tool"
    },
    {
      "reason_code": "DENY_UNLICENSED_AGENT",
      "description": "an agent without a credential from the issuer"
    },
    {
      "reason_code": "DENY_NO_GTIN",
      "description": "no valid GTIN on the record"
    },
    {
      "reason_code": "DENY_NOT_VERIFIED",
      "description": "no validated or verified record for the transaction"
    }
  ],
  "markets": [
    {
      "code": "FR",
      "name": "France",
      "region": "Europe",
      "node": "FR-ECO-10060"
    },
    {
      "code": "DE",
      "name": "Germany",
      "region": "Europe",
      "node": "DE-ECO-10060"
    },
    {
      "code": "IT",
      "name": "Italy",
      "region": "Europe",
      "node": "IT-ECO-10060"
    },
    {
      "code": "ES",
      "name": "Spain",
      "region": "Europe",
      "node": "ES-ECO-10060"
    },
    {
      "code": "PL",
      "name": "Poland",
      "region": "Europe",
      "node": "PL-ECO-10060"
    },
    {
      "code": "GB",
      "name": "UK",
      "region": "Europe",
      "node": "UK-ECO-10060"
    },
    {
      "code": "NL",
      "name": "Netherlands",
      "region": "Europe",
      "node": "NL-ECO-10060"
    },
    {
      "code": "BE",
      "name": "Belgium",
      "region": "Europe",
      "node": "BE-ECO-10060"
    },
    {
      "code": "CH",
      "name": "Switzerland",
      "region": "Europe",
      "node": "CH-ECO-10060"
    },
    {
      "code": "US",
      "name": "United States",
      "region": "Americas",
      "node": "US-ECO-10060"
    },
    {
      "code": "CA",
      "name": "Canada",
      "region": "Americas",
      "node": "CA-ECO-10060"
    },
    {
      "code": "MX",
      "name": "Mexico",
      "region": "Americas",
      "node": "MX-ECO-10060"
    },
    {
      "code": "BR",
      "name": "Brazil",
      "region": "Americas",
      "node": "BR-ECO-10060"
    },
    {
      "code": "JP",
      "name": "Japan",
      "region": "Asia-Pacific",
      "node": "JP-ECO-10060"
    },
    {
      "code": "KR",
      "name": "South Korea",
      "region": "Asia-Pacific",
      "node": "KR-ECO-10060"
    },
    {
      "code": "IN",
      "name": "India",
      "region": "Asia-Pacific",
      "node": "IN-ECO-10060"
    },
    {
      "code": "VN",
      "name": "Vietnam",
      "region": "Asia-Pacific",
      "node": "VN-ECO-10060"
    },
    {
      "code": "TH",
      "name": "Thailand",
      "region": "Asia-Pacific",
      "node": "TH-ECO-10060"
    },
    {
      "code": "SG",
      "name": "Singapore",
      "region": "Asia-Pacific",
      "node": "SG-ECO-10060"
    },
    {
      "code": "AU",
      "name": "Australia",
      "region": "Asia-Pacific",
      "node": "AU-ECO-10060"
    }
  ],
  "rule_sets": [
    "EU",
    "GB",
    "CH",
    "US",
    "CA",
    "MX",
    "BR",
    "JP",
    "KR",
    "IN",
    "VN",
    "TH",
    "SG",
    "AU"
  ],
  "temperatures": [
    "ambient",
    "chilled",
    "frozen",
    "fresh"
  ],
  "lanes": [
    "organic",
    "free-from",
    "plant-based",
    "artisan",
    "origin",
    "premium"
  ],
  "registry": {
    "namespace": "io.github.greencore-solutions",
    "server": "a2a-grocery"
  },
  "family": {
    "hub": "https://a2a-grocery.ai",
    "issuer": "https://a2a-registry.ai",
    "x402": "https://a2a-x402.ai",
    "pay": "https://a2a-pay.ai",
    "standard": "https://a2a-schema.org"
  },
  "payments": {
    "x402": "live on the family rail",
    "mpp": "built, dark",
    "ucp": "built, dark",
    "acp": "built, dark",
    "ap2": "declared on this card; joining is the CEO's ruling"
  },
  "agents": {
    "list": "https://a2a-grocery.ai/agents.json",
    "skill": "grocery.list_agents",
    "counted": "from the agent table at request time"
  },
  "keywords": [
    "grocery",
    "retail grocery",
    "procurement",
    "supplier",
    "buyer",
    "private label",
    "GTIN",
    "discounter",
    "supermarket",
    "speciality foods",
    "organic",
    "cleared",
    "orderable",
    "AI agent",
    "agent-to-agent",
    "20 markets",
    "SCHEMA algo",
    "A2A Grocery",
    "agentic hub",
    "Estate AI Agent",
    "GSC Agentic Core"
  ],
  "asOf": "2026-10-01",
  "signatures": [
    {
      "protected": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImEyYWctMjAyNi0xMCJ9",
      "signature": "TR7r3mth3hixJaPjfrlfkcczTJoU8HYSRtEAZYZ6yh0MJAYx249CuQlmZyHkBJ7WJq5AmMXOKk4Ql245bqyqUA"
    }
  ]
}
