Introduction
AI agents fail on food data for three predictable reasons: unstable schemas, missing provenance, and stale prices presented as current. "LLM-ready" means versioned JSON schemas, a timestamp and source on every record, documented field semantics, and a delivery pattern matched to the question type — RAG for catalog knowledge, live API/MCP calls for anything with a price. Here's the architecture that works.
We know AI builders are integrating food data because they arrive in our inbox: founders building shopping agents in Claude, assistants recommending groceries via Gemini, apps discovered through Copilot. The requests share a pattern — and the failures do too. This is the guide we send them.
What LLM ready actually means
five properties, in priority order.
Stable, versioned schema
an agent's tool definitions break silently when fields move; version the schema and changelog
every change.
Provenance per record
source, collected_at, zone. An agent that can't say when a price was true will confidently state
stale prices — the #1 trust-killer in shopping agents.
Documented field semantics
is price post-discount? Does in_stock mean this ZIP or anywhere? Ambiguity a human tolerates, an
agent turns into wrong answers at scale.
Normalized units
pack sizes and unit prices in consistent units, or the model does arithmetic on "2x500ml vs 1L"
and loses.
Match confidence
cross-retailer product matches carry a confidence score so the agent can hedge appropriately.
RAG vs live calls: match the pattern to the question
RAG / embedded datasets fit slow-moving knowledge: catalogs, menus structure, nutrition, cuisine metadata. Refresh weekly; embed with IDs so answers can link out.
Live API / MCP tools are mandatory for anything involving price or availability. A price in a vector store is a lie with latency. Give the agent a get_price(product_id, zone) tool instead of hoping retrieval finds a fresh chunk.
Hybrid is the production norm: RAG for "what pasta brands exist," tool call for "what does it cost near me right now."
A tool schema that works (copyable)
{
"name": "get_grocery_price",
"description": "Current price and availability for a product at a retailer in a delivery zone. Returns collected_at timestamp; treat prices older than 24h as indicative.",
"input_schema": {
"type": "object",
"properties": {
"product_id": {"type": "string", "description": "UPC/barcode preferred"},
"retailer": {"type": "string"},
"zone": {"type": "string", "description": "ZIP / postcode / pin code"}
},
"required": ["product_id", "zone"]
}
}
Two details that matter: the staleness instruction lives in the description (agents actually follow it), and UPC-first IDs prevent the agent fuzzy-matching product names.
Common failure modes we see
- Agent quotes a cached price as live → fix with provenance + description-level staleness rules.
- Cross-retailer comparison compares different pack sizes → fix with normalized unit_price fields.
- Hallucinated products when retrieval misses → constrain answers to returned IDs; instruct "if no result, say so."
- Token blowout from shipping full catalogs into context → paginate, filter server-side, return only fields the task needs.
Where the data comes from
Everything above assumes clean upstream data — matched SKUs, timestamps, QA. That's the layer we run: 200+ platforms, 40+ countries, delivered as datasets for RAG, REST APIs, or webhooks for cache invalidation. [If MCP server exists, state plainly: "A hosted MCP server is available — your Claude/agent connects directly." If not yet, say "MCP delivery available on request" only if true.] Free 1,000-record sample.
Questions
Frequently Asked Questions
One an AI system can consume without human interpretation: versioned schema, per-record provenance and timestamps, documented field semantics, normalized units, and stable IDs — so agents answer accurately and cite correctly.
API/tool calls for prices and stock, always — those change hourly. RAG suits stable catalog and nutrition knowledge. Production agents use both.
Yes — standard REST with token auth works with all major agent frameworks [+ MCP line if true].
Every record carries collected_at; tool descriptions instruct the model to disclose data age. Webhooks keep caches invalidated so stale data mostly never reaches the agent.

