sf-beverage-skus
MCP serverDev toolsSF coffee, matcha, and chai catalog API: 439 SKUs across 13 merchants, prices in cents.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use sf-beverage-skus to search skus
Install sf-beverage-skus
The server’s own address, for the clients that take one directly. Or connect ahel once and every client you use reads it from one address, with the account kept on ahel rather than in each client’s config.
Claude Code
claude mcp add --transport http --scope user sf-beverage-skus 'https://sf-beverage-skus.luff.workers.dev/mcp'Run it once in your project, then open /mcp to approve any sign-in the server asks for.
Claude Desktop
https://sf-beverage-skus.luff.workers.dev/mcpAdd a custom connector in Settings, paste this address, and approve the sign-in.
Cursor
cursor://anysphere.cursor-deeplink/mcp/install?name=sf-beverage-skus&config=eyJ1cmwiOiJodHRwczovL3NmLWJldmVyYWdlLXNrdXMubHVmZi53b3JrZXJzLmRldi9tY3AifQ==Open the link and Cursor adds the server at that address.
ChatGPT
https://sf-beverage-skus.luff.workers.dev/mcpIn Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.
Codex
codex mcp add sf-beverage-skus --url 'https://sf-beverage-skus.luff.workers.dev/mcp'Run it once, then sign in with codex mcp login sf-beverage-skus if the server asks for an account.
From the project's README
As published by pratikgajjar/sf-beverage-skus in README.md.
SKU-level coffee, matcha, and chai catalog for San Francisco. CC0-1.0. Pilot dataset for agent-native restaurant commerce. Schema: v2 (see SCHEMA.md).
The price formula
total_cents = sku.price_cents + SUM(selected option.price_delta_cents)
Money is integer cents everywhere. Divide by 100 for dollars.
Quick start (DuckDB)
SELECT m.name AS merchant, i.name AS item, s.size_name,
s.price_cents/100.0 AS price
FROM read_parquet('parquet/skus.parquet') s
JOIN read_parquet('parquet/items.parquet') i USING (item_id)
JOIN read_parquet('parquet/merchants.parquet') m USING (merchant_id)
WHERE i.category = 'matcha' AND i.name ILIKE '%latte%'
ORDER BY s.price_cents LIMIT 10;
Tables
| Table | Rows | Contents |
|---|---|---|
merchants | 13 | merchants (stable slug IDs) |
locations | 13 | storefronts: address + lat/lon (12/13 geocoded) |
items | 238 | beverages (coffee 160, matcha 54, chai 24) |
skus | 439 | the sellable unit: item x size, price in cents |
option_groups | 536 | customization groups with min/max/required |
options | 2453 | choices with price_delta_cents added to the SKU price |
templates | 27 | reusable option-group bundles |
price_observations | 342 | append-only price history per refresh |
IDs are deterministic hierarchical slugs
(starbucks--caffe-latte--tall, ...--tall--milk--oat).
Provenance
Mixed sources, all read-only (no orders, sign-ins, or payments):
DoorDash, Square, Toast storefronts. price_observations.parquet records
checked_at and source_url per observation; sku_id is null when the
match was not confident. Aggregator prices may differ from walk-in prices.
Write paths
ingest.py— item/template records in, idempotent upsert on deterministic IDs.update_prices.py— price-refresh records in; appends history, updatesskus.price_centsonly on confident matches.geocode.py,query.py— location backfill; geo + item search.
Tools it offers (3)
What this server listed when ahel dialed its public endpoint in Oct 2026, with no key and no account of yours. The names are the server’s own.
search_skusget_skuprice_order
Advanced
- Delivery
- sf-beverage-skus MCP server → your ahel connector (mcp.ahel.ai) → your AI.
- Item type
- mcp-server
- Key
io-github-pratikgajjar-sf-beverage-skus- Source
- github.com/pratikgajjar/sf-beverage-skus
- Hosted endpoint
https://sf-beverage-skus.luff.workers.dev/mcp
github.com/pratikgajjar/sf-beverage-skus