{"server":{"name":"io.github.greencore-solutions/cpg-knowledge-graph","_meta":{"io.modelcontextprotocol.registry/publisher-provided":{"note":"This address began as the CPG Knowledge Graph (2026) and now serves the A2A Grocery door; records at a2a-grocery.ai, passports at a2a-passport.ai.","setup":"https://a2a-grocery.ai/setup","title":"A2A Grocery — the agentic hub for retail grocery procurement","tools":19,"health":"https://mcp.cpgknowledgegraph.ai/health.json","also_at":"https://mcp.a2a-grocery.ai/mcp","contact":"mcp@a2a-grocery.ai","keyring":"https://a2a-grocery.ai/.well-known/jwks.json","support":"https://a2a-grocery.ai/support","one_liner":"A2A Grocery — the agentic commerce hub for retail grocery, at its original address","publisher":"GreenCore Solutions Corp.","transport":"streamable-http","agent_card":"https://mcp.cpgknowledgegraph.ai/.well-known/agent-card.json","tool_names":["resolve_jurisdiction","resolve_actor","gate_transaction","search_cleared_items","get_item","verify_gtin","get_label_and_claims","compare_items","find_verified_buyer","find_verified_supplier","get_product_documents","log_audit","get_price","get_availability","create_order_intent","a2a_handoff","get_market_status","get_notification_requirements","get_enforcement_watch"],"description":"Agent-to-Agent (A2A) + Model Context Protocol (MCP) hub for retail grocery. 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. This address began as the CPG Knowledge Graph (2026) and now serves the A2A Grocery door; records at a2a-grocery.ai, passports at a2a-passport.ai.","documentation":"https://a2a-grocery.ai/docs","publisher_url":"https://gsc-em.com","registry_entry_of_record":"io.github.greencore-solutions/a2a-grocery"}},"icons":[{"src":"https://a2a-grocery.ai/icon.svg","sizes":["any"],"theme":"light","mimeType":"image/svg+xml"},{"src":"https://a2a-grocery.ai/icon-512.png","sizes":["512x512"],"theme":"light","mimeType":"image/png"},{"src":"https://a2a-grocery.ai/icon-512-dark.png","sizes":["512x512"],"theme":"dark","mimeType":"image/png"}],"title":"A2A Grocery — the agentic hub for retail grocery procurement","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://mcp.cpgknowledgegraph.ai/mcp","type":"streamable-http"}],"version":"1.3.0","repository":{"url":"https://github.com/greencore-solutions/a2a-grocery","source":"github"},"websiteUrl":"https://a2a-grocery.ai","description":"A2A Grocery — the agentic commerce hub for retail grocery, at its original address"},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-10-05T05:20:19.834425Z","publishedAt":"2026-10-05T05:20:19.834425Z","statusChangedAt":"2026-10-05T05:20:19.834425Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://mcp.cpgknowledgegraph.ai/mcp","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2026-07-28"],"stateless":true},"health":{"reachable":true,"uptime_30d":0.96666664,"latency_ms_p50":494,"consecutive_failures":0,"last_probe_at":"2026-10-20T07:30:15.836Z","last_ok_at":"2026-10-20T07:30:15.836Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"a2a_handoff","title":"A2A Handoff","description":"Hand the buyer to the right agent over Agent-to-Agent (A2A): with an allow decision the order intent goes to the counterparty's agent (envelope + card URL); with a deny, the market agent of the ship-to — a referral, never a sale to a consumer.","annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"compare_items","title":"Compare Items","description":"Compare items, variants and pack sizes side by side (two to eight GTINs or catalogue ids).","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"create_order_intent","title":"Create Order Intent","description":"Open an order between two agents: an order intent for a cleared item after the gate; the intent carries reason_code + rule_set_version and settles by x402 on a2a-x402.ai.","annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"find_verified_buyer","title":"Find Verified Buyer","description":"Retail buyer desks for this market: banner records (banner, parent group, channel discounter · e-commerce · local · in-store · traditional, local format, cited POS count or NULL, buyer desk by department) with their claim status — verified first, then claimed, then listed. Filters: channel, department. Takes the decision_id of an allow decision.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"find_verified_supplier","title":"Find Verified Supplier","description":"Verified makers, brand owners, private-label owners, distributors and importers for this item or category in a market: maker records with their claim status — verified first, then claimed, then listed. Takes the decision_id of an allow decision.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"gate_transaction","title":"Gate Transaction","description":"Allow or deny, with the reason and the rule. Takes an item (GTIN or catalogue id; optional), the ship-to market, the actor class and, when no record exists yet, the product type, ingredients and claims. Returns one of twelve reason codes (ALLOW · REQUIRE_NOTIFICATION · REQUIRE_RESPONSIBLE_PERSON · DENY_NOT_PERMITTED_HERE · DENY_INGREDIENT_BANNED · DENY_INGREDIENT_LIMIT · DENY_CLAIM · DENY_MARKET · DENY_ACTOR_CLASS · DENY_UNLICENSED_AGENT · DENY_NO_GTIN · DENY_NOT_VERIFIED), the rule-set version, the source page and a decision_id for the downstream tools.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_availability","title":"Get Availability","description":"In stock, and where: the availability block of an item (banners on the shelf of record, product URLs read live at load, POS counts where the banner record carries a cited one) once gate_transaction has answered allow (decision_id).","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_enforcement_watch","title":"Get Enforcement Watch","description":"Recalls, withdrawals and food-safety alerts, dated: enforcement events by market, category, brand or since a date, each with its source page.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_item","title":"Get Item","description":"Product record from gtinfetch.ai (signed); hub layer: seat, market, claim, price, availability. One item by GTIN (EAN in European copy), fully resolved: temperature, department → super category → category, attribute lanes, pack, brand and maker, market, claim status, market status, availability; after the gate also ingredients, allergens, claims, origin, certificates, variants and offers.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_label_and_claims","title":"Get Label And Claims","description":"What the label must say, and which claims are allowed: the labelling requirements of the market (food information, allergens, origin, nutrition) and the claims rules of record (nutrition and health claims, organic, free-from), each with its source page. Optional claims are checked against the rules.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_market_status","title":"Get Market Status","description":"Is this product type a food here, and under which regime? Product type by market: food, special class (novel food, food supplement, infant formula, fortified, organic-certified, alcohol excise) or not permitted — with the rule-set version and the regulator's page.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_notification_requirements","title":"Get Notification Requirements","description":"What must be filed before sale in a market: the food business registration or import notification scheme, the food business operator of record, and, for a product type in a special class, the extra step (novel-food authorisation, organic certification, supplement notification) — each with its source page.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_price","title":"Get Price","description":"The price for this buyer: the price basis (list · contract · promotion window) from the maker's offers on the record, once gate_transaction has answered allow (decision_id). Plain $ on human surfaces. Tiers buy services, never rank.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"get_product_documents","title":"Get Product Documents","description":"Certificates and paper: the documents on an item record (organic certificate, PDO/PGI, halal, kosher, specification, allergen statement, origin declaration, lot where it applies), each a URL with its read date and source class; decision_id required.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"log_audit","title":"Log Audit","description":"Write a line to the audit record for a gate decision, an order intent or a handoff (returns the line id).","annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"resolve_actor","title":"Resolve Actor","description":"Who is asking? Maker, brand owner, private label, distributor, importer, broker or retail buyer (trade only); auditor (read-only); agent (inherits the class of the credential it presents — none returns DENY_UNLICENSED_AGENT). The consumer is never the counterparty. Returns communication_class: trade_information or public.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"resolve_jurisdiction","title":"Resolve Jurisdiction","description":"Where is this going? Resolve a ship-to (e.g. 'DE', 'US-CA', 'UK', 'FR', 'EU-NL', 'JP') to one of the 20 markets and its rule set (14 rule sets; the seven EU markets share one food-law set with national riders). UK is the label; machine fields carry the ISO code GB.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"search_cleared_items","title":"Search Cleared Items","description":"Find items cleared for this market: validated SKU records in a market (query by product name, brand, maker or category; filters: temperature ambient · chilled · frozen · fresh, attribute lane organic · free-from · plant-based · artisan · origin · premium, department). Only validated rows are served; each item carries its claim status, market status and source class.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"},{"name":"verify_gtin","title":"Verify Gtin","description":"Product record from gtinfetch.ai (signed); hub layer: seat, market, claim, price, availability. Is this GTIN real, and whose is it? Check-digit validation, the GS1 prefix, and the validated record(s) that carry it on this hub with their brand, maker and claim status.","annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-10-20T07:30:15.836Z"}],"dev.protogrid/trust":{"score":97,"components":{"hygiene":100,"liveness":99,"freshness":100,"provenance":90},"drivers":["+repository","+namespace-matches-repo","+website","+reachable","+uptime-97%","+updated-15d-ago"],"flags":[],"blocked":false,"computed_at":"2026-10-20T08:16:33.341Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":90,"label":"strong","components":{"auth":null,"hygiene":100,"protocol":88,"stability":75,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"supports 2026-07-28 (server/discover)","status":"pass","category":"protocol"},{"id":"protocol.stateless","detail":"answers without a session","status":"pass","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"tools/list declares ttlMs 0, so clients re-fetch it on every use","status":"warn","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"descriptions are concise","status":"pass","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"19 of 19 tools declare readOnlyHint or destructiveHint","status":"pass","category":"hygiene"},{"id":"tools.directory_hints","detail":"every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint","status":"pass","category":"hygiene"},{"id":"tools.token_cost","detail":"about 2,988 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"35 tool changes in 30 days","status":"warn","category":"stability"},{"id":"stability.rug_pull","detail":"no tool changed its meaning under the same name","status":"pass","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["~protocol.list_ttl","~stability.changes"],"flags":[],"tool_count":19,"token_estimate":2988,"tools_hash":"d9c84f81c91783b6500fbbb80e06e3f3","tools_changed_at":"2026-10-16T03:28:06.367Z","computed_at":"2026-10-20T08:26:04.529Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"io.github.greencore-solutions/cpg-knowledge-graph","aliases":["io.github.greencore-solutions/a2a-grocery"],"alias_count":1,"repository_key":"github:greencore-solutions/a2a-grocery","owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/io.github.greencore-solutions%2Fcpg-knowledge-graph/tools","arguments":{"name":"io.github.greencore-solutions/cpg-knowledge-graph"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/io.github.greencore-solutions%2Fcpg-knowledge-graph/connection?target=mcpServers","arguments":{"name":"io.github.greencore-solutions/cpg-knowledge-graph","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}