FloCafe
FloCafe is the free, local-first restaurant POS in the FloPOS ecosystem. Run orders, tables, kitchen display, and local data without a software subscription.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
AI agent that catches grocery shrinkflation and computes the hidden price-per-unit increase — Gemini + Google ADK + Elasticsearch via MCP. Live demo included.
翻訳待ち
Loading the full README.
Read the full README ↗A Gemini agent that checks whether a grocery product has shrunk and works out how much more you now pay per unit.
I built it for the Google Cloud Rapid Agent Hackathon (Elastic track) in three days, with Google ADK, Gemini, Elasticsearch and the Elastic MCP server.
Shrinkflation is when a product gets smaller and the price stays the same. It's an economic idea that has interested me for a long time. A lot of companies use it to make any tiny bit of extra profit they can, and a smaller bag at the same price is easy to miss. Capital One Shopping research estimates it has touched roughly a third of grocery items. The number that shows it is the price per ounce, so that's what this agent reports.
The agent is one Google ADK LlmAgent with six playbooks written into its prompt: product lookup, brand investigation, category analysis, shopping-list audit, trend dashboard and data discovery. Gemini picks the playbook. All data access goes through five read-only Elastic MCP tools: search, esql, list_indices, get_mappings and get_shards.
A product lookup is three tool calls:
search the products index (fuzzy multi_match) to get a product_id.esql over product_history for that id, computing price per unit at each point.search shrinkflation_alerts for the documented change and its source. Reddit-only reports are marked unverified.The answer leads with the effective price increase, meaning the change in price per unit. When the price holds, it's always larger than the shrinkage: 20% less product at the same price is 25% more per unit.
flowchart LR
U([Shopper]) -->|question| A["Google ADK LlmAgent<br/>Gemini Flash<br/>6 playbooks"]
A -->|MCP tool calls| M{{"Elastic MCP server<br/>search · esql · list_indices<br/>get_mappings · get_shards"}}
M --> ES[("Elasticsearch<br/>products · product_history<br/>shrinkflation_alerts · categories")]
P["data_pipeline.py<br/>curated seed table"] -->|JSON| ES
P -->|same JSON| X["Sleuth Explorer<br/>static site, GitHub Pages"]
A -->|sourced verdict| U
On Cloud Run it's two services: the official docker.elastic.co/mcp/elasticsearch image in HTTP mode, and this repo's FastAPI app (main.py), which serves the ADK chat UI and reaches MCP through ELASTIC_MCP_URL. Locally, with ELASTIC_MCP_URL unset, the agent spawns es_mcp_server.py, a small Python server with the same five tools over stdio, so you don't need Docker. Tool-by-tool details are in docs/architecture.md.
The full agent needs an Elasticsearch cluster and a Gemini key. Neither can be hosted publicly for free, and a public LLM endpoint would expose the key, so the live demo is a static page instead. It runs five of the six playbooks in plain JavaScript over the same JSON files the agent queries, and each panel shows the tool calls the agent would make. There's no LLM in it.
make index.multi_match with fuzziness: AUTO. It isn't Elasticsearch, so some queries rank differently.--allow-unauthenticated and the app allows any CORS origin. That was fine for a hackathon demo. Put auth in front of it before running it anywhere real.The demo needs no accounts:
git clone https://github.com/ShawnJoshua03/shrinkflation-sleuth && cd shrinkflation-sleuth
make setup # venv + dependencies
make serve # http://localhost:8080
This is the beginning of the README. Read the rest at the original. Read the full README ↗