emf-bar-mcp
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
emf-bar-mcp
A small, public MCP server over the EMF Camp bar API, built for a low‑context voice model: fuzzy drink discovery by one or two keywords, the bar each drink is served at, and live stock — while touching the upstream API as little as possible.
Discovery is free. The whole menu (124 drinks) and which bar carries each one is pulled in one call to
/api/stocktypes.jsonat container start, then refreshed slowly in the background.find_drinksandlist_barsnever hit the network.Live checks are cheap and targeted.
check_stockreads one drink via/api/stocktype/<id>.json;whats_on_tapreads the two on‑tap endpoints. Both sit behind short TTL caches, so a burst of voice traffic collapses to one upstream request.
The paste‑into‑a‑prompt guide for the voice model is PROMPT.md.
Live instance: https://emf-bar-mcp-37viybmxjq-ew.a.run.app/mcp — Cloud Run (llm-voice, europe‑west1), public, scale‑to‑zero. Health: /health.
Quick start
npm install
npm start # HTTP server on http://0.0.0.0:8787/mcp (default)
# or
npm run stdio # stdio transport, for desktop MCP clientsHealth check: curl localhost:8787/health
Docker
docker build -t emf-bar-mcp .
docker run -p 8787:8787 emf-bar-mcpRelated MCP server: bar-assistant-mcp
Connecting a client
Streamable HTTP (remote / public) — point your MCP client at http://<host>:8787/mcp.
stdio (e.g. Claude Desktop claude_desktop_config.json):
{
"mcpServers": {
"emf-bar": { "command": "node", "args": ["/abs/path/to/emf-bar-mcp/src/index.js"], "env": { "MCP_TRANSPORT": "stdio" } }
}
}Tools
Tool | Args | Live call? | Returns |
| — | no | The 3 bars (slug, name, drink count, map link) |
|
| no | Ranked drinks: |
|
| 1 |
|
|
| 1 (cached) | Casks/kegs/ciders pouring now, each with |
|
| 1 (cached) |
|
Every tool returns a short spoken‑style content string and machine‑readable
structuredContent. check_stock returns a candidates list when a name is ambiguous.
On sale vs in stock. EMF only serves some draught beers/ciders at a time ("not all draught
beers and ciders are on sale at the same time"). The API models this: a product is on sale when it
has a stockline (a place to buy it), and in stock when base_units_remaining > 0. So a cask in
the cellar can be in stock but not on sale. check_stock.status surfaces the three cases —
on_sale, in_stock_not_on_sale, out_of_stock — and find_drinks hides not‑on‑sale drinks unless
include_unavailable: true.
Bar names are fuzzy: robotarms/"Robot Arms"/"main bar", cybar/"Cybar"/"Null Sector",
spacebar/"SpaceBAR"/"space bar" all resolve.
Configuration (env vars)
Var | Default | Purpose |
|
|
|
|
| HTTP bind |
|
| Upstream API base |
|
| Background catalog refresh interval |
|
| Per‑drink live‑stock cache TTL |
|
| On‑tap cache TTL |
|
| Opening‑times cache TTL |
|
| Upstream request timeout |
How it works
startup + every CATALOG_REFRESH_MS
/api/stocktypes.json ───────────────► catalog cache (drinks, tags, bar placement, Fuse index)
│
find_drinks / list_bars ◄──────────────────┘ (0 upstream calls)
check_stock ──► /api/stocktype/<id>.json (TTL STOCK_TTL_MS)
whats_on_tap ──► /api/on-tap.json + /api/cybar-on-tap.json (TTL ONTAP_TTL_MS)Discovery matching is deterministic (keyword/synonym/style/flavour tags derived from each drink, including "hoppy"/"gluten free"/"alcohol free"), with a Fuse.js fuzzy fallback for typos and mis‑transcriptions. The HTTP transport is stateless (a fresh MCP server per request; the catalog cache is a shared singleton), so it scales and hosts simply.
The upstream /api/stocktypes.json is flagged expensive — do not poll; this server honours that
by pulling it only at start‑up and on the slow refresh timer, never per request.
Notes
Not affiliated with EMF; uses the public read‑only bar API. Data © EMF.
Node ≥ 18 (uses global
fetch). MIT licensed.
This server cannot be deployed
Maintenance
Related MCP Connectors
DrinkedIn's main MCP server: find validated bars and restaurants near a place, plan an evening, look up cocktail recipes, and query licensed bar data built from official liquor-licence registers and venues' own websites, paid per query over x402. For a free, simple night-out planner, use DrinkedIn Night Out. For people of legal drinking age where they are; DrinkedIn does not sell or serve alcohol.
MCP server for the Émile wine cellar — list, add, recommend, scan and search 100k+ wines.
MCP server for real-time product search by barcode (EAN, UPC, GTIN) or keyword on ean-search.org
Public MCP server for discovering open jobs. Search, filter, and get application links.
Related MCP Servers
- MIT
- AlicenseBqualityDmaintenanceMCP server for Bar Assistant that enables searching cocktails, managing ingredients, shelves, shopping lists, and collections via natural language.41MIT
- AlicenseAqualityAmaintenanceAn MCP server that interfaces with Untappd's mobile API to search beers, breweries, venues, and user data, and to post check-ins, toasts, and comments using your own account.49734 npmMIT
- AlicenseNot gradedqualityBmaintenanceMCP server for Untappd connectivity, enabling beer search with optional limit, offset, and sorting.MIT