untappd-mcp-server
This server exposes the Untappd v4 read API as MCP tools for AI agents, covering search, venues, beers, breweries, users, feeds, and aggregated stats — plus built-in OAuth authentication.
Search & lookup: venues (
venue_search), breweries (search_brewery), and beers (search_beer), with optional location awareness and pagination/sorting.Venue insights: venue info, recent check-ins (a live proxy for "what's on tap"), and Foursquare venue ID resolution.
Beer insights: beer details, public check-in feeds, and globally trending beers.
Brewery insights: brewery details and global check-in feeds for all its beers.
User data: profile/stats, activity feed, distinct checked-in beers, wishlist, badges, and friends.
Activity feeds: global pub feed (requires elevated key), local feed by geolocation, and authenticated friend feed.
Check-in details: extended check-in info including badges, toasts, and comments.
Composite/aggregation tools: user stats at a venue, venue-search-then-stats, user beer/style/brewery/rating breakdowns, and badge summaries — with rate-limit awareness and truncation.
Authentication: interactive OAuth (
authenticate_untappd) and auth status/validation (get_auth_status), unlocking token-gated tools and user-scoped rate limits.Operational notes: rate limit status is returned with every call; the server is read-only and requires Untappd API credentials.
Allows searching for venues, breweries, and beers, retrieving venue and brewery info and recent check-in feeds, and looking up user activity on Untappd.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@untappd-mcp-server what's on tap at Supreme Brewing?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
untappd-mcp-server
A Model Context Protocol (MCP) server that exposes the Untappd API as tools for AI agents — 27 tools covering the full Untappd v4 read API, plus built-in interactive OAuth authentication. Search venues, breweries, and beers; check what's on tap via check-in feeds; explore user badges, friends, wish lists, and drinking history; and aggregate stats — all from any MCP-compatible client.
Prerequisites
Node.js 20+
Untappd API credentials (
client_idandclient_secret) from untappd.com/apiOptional: an Untappd OAuth access token to unlock authenticated tools — obtainable in-chat via the
authenticate_untappdtool ornpx untappd-mcp-server auth(see Interactive Authentication)
Related MCP server: MCP API Server
Quick Start
Via npx (zero install)
UNTAPPD_CLIENT_ID=xxx UNTAPPD_CLIENT_SECRET=yyy npx untappd-mcp-serverPowerShell
$env:UNTAPPD_CLIENT_ID = "your_client_id"
$env:UNTAPPD_CLIENT_SECRET = "your_client_secret"
npx untappd-mcp-serverClaude Desktop
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"untappd": {
"command": "npx",
"args": ["untappd-mcp-server"],
"env": {
"UNTAPPD_CLIENT_ID": "your_client_id",
"UNTAPPD_CLIENT_SECRET": "your_client_secret",
"UNTAPPD_ACCESS_TOKEN": "optional_oauth_token",
"UNTAPPD_USERNAME": "optional_default_username"
}
}
}
}Tools
Tools marked 🔑 token require an access token (UNTAPPD_ACCESS_TOKEN env var or interactive authentication).
Authentication Tools
authenticate_untappd
Interactively authenticate with Untappd via OAuth: opens your browser to Untappd's approve page, captures the redirect on a temporary localhost listener, and saves the access token — the 🔑 tools work immediately, no restart. Prerequisite: your Untappd app's Callback URL must be set to exactly http://localhost:8737/callback (or your UNTAPPD_REDIRECT_URL).
Parameter | Type | Required | Description |
| integer | No | How long to wait for browser approval (default 180, max 600) |
get_auth_status
Report authentication status: token presence, source (env var or token file), file path, and whether the 🔑 tools are unlocked. Free by default; validate: true verifies the token with one API call.
Parameter | Type | Required | Description |
| boolean | No | Verify the token against the API with one call (default false) |
Search & Lookup
venue_search
Search for venues (breweries, bars, restaurants) by name with optional location awareness.
Parameter | Type | Required | Description |
| string | Yes | Search query (venue name) |
| number | No | Latitude for location-aware results |
| number | No | Longitude for location-aware results |
search_brewery
Search for breweries by name.
Parameter | Type | Required | Description |
| string | Yes | Brewery name search query |
| integer | No | Offset for pagination |
search_beer
Search for beers by name.
Parameter | Type | Required | Description |
| string | Yes | Beer name search query |
| integer | No | Pagination offset |
| string | No | Sort order: |
Venue
get_venue_info
Retrieve detailed information and recent check-ins for a venue.
Parameter | Type | Required | Description |
| integer | Yes | Untappd venue ID |
| boolean | No | If true, returns venue info only (no checkins, media, top beers) |
get_venue_checkins
Retrieve the recent check-in feed for a venue. This is the primary tool for determining what's currently on tap — recent check-ins act as a live signal for available beers.
Parameter | Type | Required | Description |
| integer | Yes | Untappd venue ID |
| integer | No | Number of results (max 25, default 25) |
| integer | No | Return results older than this checkin ID |
| integer | No | Return only checkins newer than this ID |
get_venue_foursquare_lookup
Resolve a Foursquare venue ID to its Untappd venue — the bridge between Foursquare/location data and Untappd venue tools.
Parameter | Type | Required | Description |
| string | Yes | Foursquare venue ID in v2 MD5-hash format (v3 numeric IDs will not work) |
Beer
get_beer_info
Retrieve detailed information for a specific beer.
Parameter | Type | Required | Description |
| integer | Yes | Untappd beer ID |
| boolean | No | If true, returns beer info only |
get_beer_checkins
Retrieve the recent public check-in feed for a specific beer — what people are saying about it right now, and where they're drinking it.
Parameter | Type | Required | Description |
| integer | Yes | Untappd beer ID |
| integer | No | Results per page (max 50, default 25) |
| integer | No | Return results older than this checkin ID |
| integer | No | Return only checkins newer than this ID |
get_trending_beers
Retrieve globally trending beers (macro and micro brew lists, by recent check-in velocity). No parameters.
Brewery
get_brewery_info
Retrieve detailed information, beer list, and recent check-ins for a brewery.
Parameter | Type | Required | Description |
| integer | Yes | Untappd brewery ID |
| boolean | No | If true, returns brewery info only |
get_brewery_checkins
Retrieve the recent public check-in feed for a brewery — all its beers being checked in globally.
Parameter | Type | Required | Description |
| integer | Yes | Untappd brewery ID |
| integer | No | Results per page (max 50, default 25) |
| integer | No | Return results older than this checkin ID |
| integer | No | Return only checkins newer than this ID |
User
get_user_info
Retrieve profile and stats for an Untappd user.
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| boolean | No | If true, returns user info only (no checkins, media, recent brews) |
get_user_activity
Retrieve the recent check-in activity feed for a user.
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| integer | No | Number of results (max 25, default 25) |
| integer | No | Return results older than this checkin ID |
| integer | No | Return only checkins newer than this ID |
get_user_distinct_beers
Retrieve the unique beers a user has checked in, with flexible sort ordering. sort=checkin with limit=1 is the single-call pattern for "most-checked-in beer".
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| integer | No | Pagination offset |
| integer | No | Results per page (max 50, default 25) |
| string | No |
|
get_user_wishlist
Retrieve beers on a user's wish list.
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| integer | No | Pagination offset |
| integer | No | Results per page (max 50, default 25) |
| string | No |
|
get_user_badges
Retrieve a user's earned badges (pages of 50, most recent first).
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| integer | No | Pagination offset (pages of 50) |
get_user_friends
Retrieve a user's friend list (public accounts only).
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| integer | No | Pagination offset |
| integer | No | Results per page (max 50, default 25) |
Activity Feeds
get_global_feed
Retrieve the global public check-in feed (The Pub). High rate-limit cost for the data returned — prefer min_id polling to fetch only new check-ins. Note: standard API keys are typically not authorized for /thepub — Untappd returns "You are not authorized to call this method from this key" unless your key has elevated access (get_local_feed is not restricted).
Parameter | Type | Required | Description |
| integer | No | Results per page (max 50, default 25) |
| integer | No | Return results older than this checkin ID |
| integer | No | Return only checkins newer than this ID |
get_local_feed
Retrieve the public check-in feed near a geographic point.
Parameter | Type | Required | Description |
| number | Yes | Latitude |
| number | Yes | Longitude |
| integer | No | Radius in miles (default 25, max 50) |
| integer | No | Results per page (max 50, default 25) |
| integer | No | Return results older than this checkin ID |
| integer | No | Return only checkins newer than this ID |
get_friend_feed 🔑 token
Retrieve the friend check-in feed for the authenticated user.
Parameter | Type | Required | Description |
| integer | No | Results per page (max 50, default 25) |
| integer | No | Return results older than this checkin ID |
| integer | No | Return only checkins newer than this ID |
Checkin
get_checkin_info
Retrieve extended details for a specific check-in, including badges earned, toasts, and comments.
Parameter | Type | Required | Description |
| integer | Yes | Untappd check-in ID |
Composite / Aggregation
These tools make multiple API calls (1 per page scanned — 50 beers/badges, 25 check-ins). They pre-check the remaining rate limit before starting and stop early — setting truncated: true in the response — if the budget runs low.
get_user_stats_at_venue
Get a user's check-in stats at a specific venue — visit count, last visit, average rating, top beers — by scanning their recent check-in feed. Untappd's API has no venue-history endpoint, so the stats cover the scanned window (max_pages × 25 check-ins), not all time.
Parameter | Type | Required | Description |
| integer | Yes | Untappd venue ID |
| string | No | Untappd username (defaults to |
| integer | No | Max feed pages to scan at 25 check-ins/page (default 5 = 125 check-ins) |
search_venue_then_get_user_stats
Search for a venue by name, then get the user's check-in stats at the top match.
Parameter | Type | Required | Description |
| string | Yes | Venue search query |
| string | No | Untappd username (defaults to |
| number | No | Latitude for location-aware search |
| number | No | Longitude for location-aware search |
| integer | No | Max feed pages to scan at 25 check-ins/page (default 5 = 125 check-ins) |
get_user_beer_stats
Aggregate a user's distinct beer history into style, brewery, and rating breakdowns — top styles, top breweries, average personal vs global ratings, highest-rated, and most-checked-in.
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| integer | No | Max pages to scan at 50 beers/page (default 10 = 500 beers) |
get_user_badge_summary
Retrieve all badges for a user (paginating to completion) with a structured summary.
Parameter | Type | Required | Description |
| string | Yes | Untappd username |
| integer | No | Max pages to scan at 50 badges/page (default 10 = 500 badges) |
Rate Limiting
The Untappd API allows 100 calls per hour per API key (per access token when authenticated). Every tool response includes the current rate limit status:
{
"rateLimit": {
"limit": 100,
"remaining": 97
}
}Composite tools call assertRateLimitSufficient before starting pagination and stop early with truncated: true rather than exhausting the budget. If the limit is exceeded, the Untappd API returns a 429 error which is surfaced as: Rate limit exceeded. Limit: 100, Remaining: 0. Resets hourly.
Authentication
Mode | Env Vars | Unlocks |
Public |
| All public tools |
Authenticated | + |
|
When an access token is configured (env var or saved token file), the server prefers it for all calls — rate limits become user-scoped and /user endpoints return richer data. UNTAPPD_USERNAME provides a default username for authenticated user tools.
The server exits on startup if neither a client id/secret pair nor an access token is configured.
Interactive Authentication
You don't need to obtain an access token manually — the server can run Untappd's OAuth flow for you.
One-time prerequisite: in your Untappd app settings at untappd.com/api, set the Callback URL to exactly:
http://localhost:8737/callback(or the value of UNTAPPD_REDIRECT_URL if you override it — it must be a localhost http URL, and the two must match exactly or Untappd rejects the flow).
In chat: ask your agent to run the authenticate_untappd tool. Your browser opens to Untappd's approve page; once you approve, the token is saved and the 🔑 tools work immediately — no restart needed.
In a terminal:
npx untappd-mcp-server auth # run the interactive flow
npx untappd-mcp-server auth --status # show current auth status
npx untappd-mcp-server auth --clear # delete the saved token(In the repo: npm run auth.)
Storage & precedence: the token is saved to ~/.untappd-mcp-server/token.json (override with UNTAPPD_TOKEN_PATH). If UNTAPPD_ACCESS_TOKEN is set it always wins over the file. Untappd tokens do not expire.
Security note: the token is stored in plaintext with 0600 permissions on macOS/Linux; on Windows protection relies on your user-profile ACLs. Delete it any time with auth --clear. Tool outputs only ever include a masked form of the token.
Development
npm install
npm run build
npm test # unit tests (mocked API — no rate limit cost)
npm run smoke # live smoke test against the real API (~25 calls, ~26 with a token)The smoke test uses your UNTAPPD_* env vars, skips authenticated tools when no access token is set, and aborts if the remaining rate limit drops below 5. Filter to a single tool with npm run smoke -- --only=tool_name.
Testing with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.jsKnown Limitations
No tap list data — actual tap lists require an Untappd for Business subscription. Venue check-in feeds serve as a real-time proxy.
No venue events — Untappd's public API has no events endpoint, and the Eventbrite search API that could have bridged the gap was discontinued; deferred to v3.
No venue-history endpoint — the v4 API has no per-user venue history;
get_user_stats_at_venuescans the recent check-in feed instead, so its stats cover a window (max_pages× 25 check-ins), not all time.Rate limit: 100/hour — minimise redundant calls; every response surfaces
rateLimit.remaining.Feed limit caps — tools accept
limitup to 50, but the API caps some feeds at 25 server-side.Global feed requires an elevated key —
/thepub(get_global_feed) is not authorized for standard API keys; the local feed works with any key.Foursquare lookup requires v2 IDs — the MD5-hash format; Foursquare v3 numeric IDs will not work.
Venue IDs required — use
venue_searchfirst to resolve a venue name to an ID.Public check-ins only — private user accounts are not visible.
Read-only — write operations (check-in, toast, comment, wish-list management) are deferred to v3.
MCP client timeouts — some MCP clients cap tool-call duration below the
authenticate_untappddefault of 180s; pass a smallertimeout_secondsif your client times out first, or usenpx untappd-mcp-server authin a terminal instead.
License
MIT
Available Tools
27 toolsauthenticate_untappdA
Interactively authenticate the user with Untappd via OAuth to unlock get_friend_feed, user-scoped rate limits, and richer /user data. Opens the user's browser to Untappd's login/approve page and blocks until they approve (up to timeout_seconds). PREREQUISITE: the user's Untappd API app (untappd.com/api) must have its Callback URL set to exactly http://localhost:8737/callback (or the UNTAPPD_REDIRECT_URL value). Requires UNTAPPD_CLIENT_ID + UNTAPPD_CLIENT_SECRET. The token is saved to disk and used immediately — no server restart needed.
Inputs: timeout_seconds.
get_auth_statusA
Report Untappd authentication status: whether an access token is configured, its source (UNTAPPD_ACCESS_TOKEN env var or the saved token file), the token file path, and whether the authenticated tools are unlocked. Free (no API call) by default; set validate:true to verify the token with one authenticated API call (costs 1 rate-limit call).
Inputs: validate.
get_beer_checkinsB
Retrieve the recent public check-in feed for a specific beer
Inputs: bid (required), limit, max_id, min_id.
get_beer_infoC
Retrieve detailed information for a specific beer
Inputs: bid (required), compact.
get_brewery_checkinsB
Retrieve the recent public check-in feed for a brewery (all its beers, globally)
Inputs: brewery_id (required), limit, max_id, min_id.
get_brewery_infoC
Retrieve detailed information and recent check-ins for a specific brewery
Inputs: brewery_id (required), compact.
get_checkin_infoA
Retrieve extended details for a specific check-in, including badges earned, toasts, and comments
Inputs: checkin_id (required).
get_friend_feedC
Retrieve the friend check-in feed for the authenticated user (requires UNTAPPD_ACCESS_TOKEN)
Inputs: limit, max_id, min_id.
get_global_feedA
Retrieve the global public check-in feed (The Pub). High rate-limit cost for the data returned — prefer min_id polling to fetch only new check-ins. Note: standard API keys may not be authorized for this endpoint (Untappd returns 'not authorized to call this method from this key')
Inputs: limit, max_id, min_id.
get_local_feedB
Retrieve the public check-in feed near a geographic point (The Pub — Local)
Inputs: lat (required), lng (required), limit, max_id, +2 more.
get_trending_beersA
Retrieve globally trending beers on Untappd (macro and micro brew lists, by recent check-in velocity)
Inputs: no named parameters.
get_user_activityB
Retrieve the recent check-in activity feed for a specific Untappd user
Inputs: username (required), limit, max_id, min_id.
get_user_badgesA
Retrieve a user's earned badges (returned in pages of 50, most recent first)
Inputs: username (required), offset.
get_user_badge_summaryB
Retrieve all badges for a user (paginating to completion) with a structured summary (costs 1 API call per 50 badges)
Inputs: username (required), max_pages.
get_user_beer_statsA
Aggregate a user's distinct beer history into style, brewery, and rating breakdowns (paginates the API — costs 1 call per 50 beers scanned)
Inputs: username (required), max_pages.
get_user_distinct_beersA
Retrieve the unique beers a user has checked in, with flexible sort ordering
Inputs: username (required), sort, limit, offset.
get_user_friendsB
Retrieve a user's friend list (public accounts only)
Inputs: username (required), limit, offset.
get_user_infoC
Retrieve profile and stats for a specific Untappd user by username
Inputs: username (required), compact.
get_user_stats_at_venueA
Get a user's check-in stats at a specific venue — visit count, last visit, average rating, top beers — by scanning their recent check-in feed (1 API call per 25 check-ins scanned; the stats cover the scanned window, not all time)
Inputs: venue_id (required), username, max_pages.
get_user_wishlistC
Retrieve beers on a user's wish list
Inputs: username (required), sort, limit, offset.
get_venue_checkinsA
Retrieve the recent check-in feed for a specific venue. Primary tool for 'what's on tap right now' use case.
Inputs: venue_id (required), limit, max_id, min_id.
get_venue_foursquare_lookupA
Resolve a Foursquare venue ID to its Untappd venue (bridge between Foursquare data and Untappd venue tools)
Inputs: foursquare_id (required).
get_venue_infoB
Retrieve detailed information and recent check-ins for a known venue
Inputs: venue_id (required), compact.
search_beerC
Search for beers by name
Inputs: q (required), sort, offset.
search_breweryC
Search for breweries by name
Inputs: q (required), offset.
search_venue_then_get_user_statsA
Search for a venue by name, then get the user's check-in stats at the top match (1 search call + a scan of the user's recent check-in feed at 25/page)
Inputs: q (required), lat, lng, username, +1 more.
venue_searchA
Search for venues (breweries, bars, restaurants) by name, with optional location awareness
Inputs: q (required), lat, lng.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
Most tools have distinct purposes, but there is some overlap, e.g., get_user_badge_summary vs get_user_badges, and venue_search combined with search_venue_then_get_user_stats may cause confusion. Descriptions help, but a few boundaries are fuzzy.
Tool names predominantly follow a 'verb_noun' pattern (get_*, search_*), with only 'authenticate_untappd' being a slight deviation. Overall consistent and predictable.
27 tools is on the high side, approaching the upper limit of what feels manageable. The domain is broad, but some tools could be merged (e.g., get_user_badge_summary and get_user_badges).
Covers most read-only operations for users, venues, beers, breweries, and check-ins. Missing interactive features like toasting or commenting, but those may be out of scope. Light dead end: get_global_feed warns it may not work for standard keys.
Maintenance
Related MCP Connectors
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Hosted MCP server for live public-data APIs and Skills for AI agents.
The official Model Context Protocol server for Ambee. It gives any MCP-compatible AI assistant — Claude, ChatGPT, Cursor, VS Code, Ollama, and more direct access to live air quality, pollen, and weather data. To get started, including information on signing up and obtaining your Ambee key, check out the Ambee documentation on https://docs.ambeedata.com
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol (MCP) server that creates a bridge between AI language models and the Trakt.tv API, allowing LLMs to access real-time entertainment data and personal Trakt viewing history.52MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables AI assistants to make HTTP requests (GET, POST, PUT, DELETE) to external APIs through standardized MCP tools.42MIT
- AlicenseNot gradedqualityDmaintenanceModel Context Protocol server that standardizes tool discovery, execution, and context management for AI applications.MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server that exposes the Scryfall Magic: The Gathering API as tools for LLM clients, enabling card search, images, prices, sets, rulings, symbology, catalogs, and bulk data access.18150 npmMIT