untappd-mcp 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +45 -0
- package/SKILL.md +29 -0
- package/dist/bundle.js +613 -47
- package/dist/cache/db.js +293 -0
- package/dist/cache/sync.js +202 -0
- package/dist/index.js +5 -0
- package/dist/tools/cache.js +174 -0
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
9
|
"description": "MCP server for Untappd — beers, breweries, venues, check-ins, wishlists, and your friend feed",
|
|
10
|
-
"version": "1.3.
|
|
10
|
+
"version": "1.3.1"
|
|
11
11
|
},
|
|
12
12
|
"plugins": [
|
|
13
13
|
{
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"displayName": "Untappd",
|
|
16
16
|
"source": "./",
|
|
17
17
|
"description": "MCP server for Untappd — search beers/breweries/venues, read profiles/check-ins/wishlists, and post check-ins, toasts, and comments",
|
|
18
|
-
"version": "1.3.
|
|
18
|
+
"version": "1.3.1",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "untappd-mcp",
|
|
3
3
|
"displayName": "Untappd",
|
|
4
|
-
"version": "1.3.
|
|
4
|
+
"version": "1.3.1",
|
|
5
5
|
"description": "MCP server for Untappd — search beers/breweries/venues, read check-ins and wishlists, and post check-ins, toasts, and comments",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Chris Hall",
|
package/README.md
CHANGED
|
@@ -33,6 +33,7 @@ it goes stale.
|
|
|
33
33
|
| `UNTAPPD_DEVICE_ID` | no | Stable device UUID the token is keyed to (a default is provided). |
|
|
34
34
|
| `UNTAPPD_UTV` | no | API version param (default `4.0.0`). |
|
|
35
35
|
| `UNTAPPD_USER_AGENT` | no | Override the User-Agent (default mimics the app). |
|
|
36
|
+
| `UNTAPPD_CACHE_DB` | no | Path to the local check-in cache SQLite file (default `~/.untappd-mcp/checkins.db`). Local/stdio only. |
|
|
36
37
|
|
|
37
38
|
Copy `.env.example` to `.env` and fill it in for local use.
|
|
38
39
|
|
|
@@ -81,6 +82,50 @@ Writes (confirm-gated — return a dry-run preview unless called with
|
|
|
81
82
|
`untappd_wishlist_add`, `untappd_wishlist_remove`, `untappd_delete_checkin`,
|
|
82
83
|
`untappd_add_friend`, `untappd_accept_friend`, `untappd_reject_friend`, `untappd_remove_friend`.
|
|
83
84
|
|
|
85
|
+
Local check-in cache (stdio/local only — needs a filesystem, so not available on
|
|
86
|
+
the remote connector): `untappd_sync_checkins`, `untappd_cache_has_had`,
|
|
87
|
+
`untappd_cache_has_had_many`, `untappd_cache_query`.
|
|
88
|
+
|
|
89
|
+
## Local check-in cache
|
|
90
|
+
|
|
91
|
+
The Untappd API only exposes paged, most-recent-first check-in lists (50 per
|
|
92
|
+
page) and has **no** "has this user ever had beer X?" lookup — answering that
|
|
93
|
+
from the API alone means paging an entire history (often 11k+ check-ins) against
|
|
94
|
+
a tight ~100-calls/hour rate limit. These tools maintain a local SQLite mirror
|
|
95
|
+
of a user's check-ins so the question is answered instantly, offline, with zero
|
|
96
|
+
API calls.
|
|
97
|
+
|
|
98
|
+
**Recommended workflow — sync first, then query:**
|
|
99
|
+
|
|
100
|
+
1. **Sync** with `untappd_sync_checkins` (omit `username` for your own account).
|
|
101
|
+
It is incremental (stops as soon as it reaches already-cached check-ins) and
|
|
102
|
+
resumable: while the initial backfill is incomplete it pages backwards up to
|
|
103
|
+
`max_pages` per call (default 10) and **persists progress after every page**,
|
|
104
|
+
so an interrupted run never loses data. The summary reports `rows_added`,
|
|
105
|
+
`pages_fetched`, a `backfill_percent` estimate, and `another_run_needed` — if
|
|
106
|
+
that is `true`, just call it again (and again) until it is `false`. That
|
|
107
|
+
covers both extending the backfill downwards and catching up a burst of new
|
|
108
|
+
check-ins too large for one run (`catchup_in_progress`). Spreading the work
|
|
109
|
+
across several runs keeps you under the rate limit.
|
|
110
|
+
2. **Query** the cache with no further API calls:
|
|
111
|
+
- `untappd_cache_has_had` — has the user had a beer, by exact `bid` or a
|
|
112
|
+
case-insensitive `beer_name` substring; returns count, best rating, last
|
|
113
|
+
date, and the matching check-ins.
|
|
114
|
+
- `untappd_cache_has_had_many` — cross-check a whole list of `bids` in one
|
|
115
|
+
call (e.g. a venue's menu) → had/not-had per beer.
|
|
116
|
+
- `untappd_cache_query` — filter cached check-ins by brewery, style,
|
|
117
|
+
`min_rating`, venue, and/or date range, with sorting and a limit.
|
|
118
|
+
|
|
119
|
+
Every read result carries a `freshness` block (`last_synced_at`,
|
|
120
|
+
`backfill_complete`, `backfill_percent`) and, when the backfill is
|
|
121
|
+
incomplete, a `caveat` — so a "not found" can be reported as possibly a false
|
|
122
|
+
negative for older history until the sync finishes.
|
|
123
|
+
|
|
124
|
+
Syncing **another** user goes through the same authed endpoint as
|
|
125
|
+
`untappd_user_checkins`, so Untappd's privacy rules apply: it only works if that
|
|
126
|
+
account is public or your friend. Otherwise the sync returns a clear error
|
|
127
|
+
telling you to add them as a friend first.
|
|
128
|
+
|
|
84
129
|
## Development
|
|
85
130
|
|
|
86
131
|
```sh
|
package/SKILL.md
CHANGED
|
@@ -45,3 +45,32 @@ Each returns a dry-run preview and makes NO network call unless called with
|
|
|
45
45
|
`untappd_search_beer`; optional `rating` 0–5 in 0.25 steps, `shout`, venue).
|
|
46
46
|
|
|
47
47
|
Photo attachment and wishlist add/remove are not yet supported.
|
|
48
|
+
|
|
49
|
+
## Local check-in cache (stdio/local only)
|
|
50
|
+
|
|
51
|
+
The API can't answer "has this user ever had beer X?" without paging their whole
|
|
52
|
+
history (50/page, rate-limited). These tools keep a local SQLite mirror so that
|
|
53
|
+
question is answered instantly with **no** API calls. `UNTAPPD_CACHE_DB` sets the
|
|
54
|
+
db path (default `~/.untappd-mcp/checkins.db`). Not available on the remote
|
|
55
|
+
connector (no filesystem).
|
|
56
|
+
|
|
57
|
+
**Sync first, then query:**
|
|
58
|
+
|
|
59
|
+
- `untappd_sync_checkins` — fetch check-ins into the cache. Incremental (stops at
|
|
60
|
+
already-cached check-ins) and resumable: while the backfill is incomplete it
|
|
61
|
+
pages backwards up to `max_pages` per call (default 10) and saves progress
|
|
62
|
+
after every page. If the returned `another_run_needed` is true, call it again
|
|
63
|
+
until it is false (covers both the backfill and catching up large bursts of
|
|
64
|
+
new check-ins). Omit `username` for your own account;
|
|
65
|
+
syncing another user needs their account public or a friend (friends-only, same
|
|
66
|
+
as `untappd_user_checkins`).
|
|
67
|
+
- `untappd_cache_has_had` — has the user had a beer? By exact `bid` or a
|
|
68
|
+
case-insensitive `beer_name` substring.
|
|
69
|
+
- `untappd_cache_has_had_many` — batch had/not-had for a list of `bids` in one
|
|
70
|
+
call (venue-menu cross-check).
|
|
71
|
+
- `untappd_cache_query` — filter cached check-ins by brewery, style, `min_rating`,
|
|
72
|
+
venue, and date range, with sort + limit.
|
|
73
|
+
|
|
74
|
+
Every cache read returns a `freshness` block (and a `caveat` when the backfill is
|
|
75
|
+
incomplete) so you can flag that a "not found" may be a false negative until the
|
|
76
|
+
sync finishes.
|