untappd-mcp 1.10.0 → 1.10.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.
@@ -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.10.0"
10
+ "version": "1.10.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.10.0",
18
+ "version": "1.10.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.10.0",
4
+ "version": "1.10.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/dist/bundle.js CHANGED
@@ -35675,7 +35675,7 @@ function toolAnnotations(opts = {}) {
35675
35675
  }
35676
35676
 
35677
35677
  // src/version.ts
35678
- var VERSION = "1.10.0";
35678
+ var VERSION = "1.10.1";
35679
35679
 
35680
35680
  // src/client.ts
35681
35681
  import { dirname, join } from "path";
package/dist/version.js CHANGED
@@ -3,4 +3,4 @@
3
3
  // json's `extra-files`), and `versionSyncTest` guards that it stays equal to
4
4
  // package.json. Import VERSION wherever the version is needed rather than
5
5
  // re-declaring it.
6
- export const VERSION = '1.10.0'; // x-release-please-version
6
+ export const VERSION = '1.10.1'; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "untappd-mcp",
3
- "version": "1.10.0",
3
+ "version": "1.10.1",
4
4
  "mcpName": "io.github.chrischall/untappd-mcp",
5
5
  "description": "Untappd MCP server for Claude — developed and maintained by AI (Claude Code)",
6
6
  "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/chrischall/untappd-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "1.10.0",
9
+ "version": "1.10.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "untappd-mcp",
14
- "version": "1.10.0",
14
+ "version": "1.10.1",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -40,6 +40,95 @@ Run `untappd_healthcheck` to confirm login works.
40
40
 
41
41
  Most user tools default `username` to your configured account when omitted.
42
42
 
43
+ ## Response shape (`view`)
44
+
45
+ Twelve of this server's 45 tools take `view: "compact" | "full"`, and
46
+ **`compact` is the DEFAULT** — the slim rung is what you get without asking
47
+ for it.
48
+
49
+ **If you were told to pass `compact: true`, that advice is stale.** It used to
50
+ be true: the projection shipped as an opt-in boolean defaulting to `false`,
51
+ and the tool descriptions asked the caller to please turn it on. An efficiency
52
+ you have to request is one that mostly is not requested — and the caller
53
+ paying for the fat record was the one least able to know a slim rung existed.
54
+ So it flipped. The old parameter is gone; it is not declared anywhere, so zod
55
+ drops the unknown key and the call succeeds. You get the compact rung — right
56
+ answer, wrong reason. **The same silence bites the other way**: `compact:
57
+ false` no longer buys you the full record either. It is dropped identically
58
+ and you still get compact. `view: "full"` is the only way back.
59
+
60
+ Compact comes in two tiers here, and they are not the same thing:
61
+
62
+ **A hand-written field projection — 8 tools.**
63
+
64
+ - Check-ins (`untappd_activity_feed`, `untappd_user_checkins`,
65
+ `untappd_beer_activity`, `untappd_venue_activity`,
66
+ `untappd_local_checkins`): each ~5 KB record becomes `{checkin_id,
67
+ created_at, user, rating, comment, beer{bid, name, style, abv}, brewery,
68
+ venue, toasts, comments, has_photo}`. A default page of 25 was upwards of
69
+ 100 KB to learn what someone drank.
70
+ - `untappd_search_beer`: each ~1.2 KB match becomes `{bid, name, style, abv,
71
+ ibu, brewery, checkin_count, have_had}` — the long `beer_description` and
72
+ the nested brewery record go.
73
+ - `untappd_user_wishlist`: the same beer core plus `added_at`.
74
+ - `untappd_user_beers`: the same beer core plus `your_count`, `your_rating`,
75
+ `global_rating`, `last_had`.
76
+
77
+ **An upstream request for less — 4 tools.** `untappd_user_info`,
78
+ `untappd_beer_info`, `untappd_brewery_info` and `untappd_venue_info` forward
79
+ `compact=true` to Untappd's own endpoint, which drops the embedded
80
+ activity/list blocks server side. **There is no local projection on these**:
81
+ the entity's own fields are byte-identical on both rungs. What compact saves
82
+ is Untappd's embedded blocks — and the bandwidth, not just the context. Do not
83
+ expect a shorter beer record from `untappd_beer_info`; expect the recent-
84
+ activity block to be absent.
85
+
86
+ The projectors are **drift-safe**. Each keys off a documented container
87
+ (`checkins.items`, `beers.items`); if that array is not where it is expected —
88
+ this is a reverse-engineered API — the projector warns on stderr and returns
89
+ the RAW response rather than an empty or wrong one. A short answer is never
90
+ silently manufactured.
91
+
92
+ `view: "full"` returns Untappd's response untouched. There is deliberately
93
+ **no `raw` rung**: nothing here re-serialises or normalises a payload, so
94
+ `full` already IS the upstream response and a third value would silently alias
95
+ one that exists.
96
+
97
+ ### The 33 tools without `view`
98
+
99
+ Each for its own reason — and none of them will tell you it ignored the
100
+ parameter, because an undeclared key is dropped by zod without a warning:
101
+
102
+ - **The 11 confirm-gated writes** (`untappd_checkin`, `untappd_toast`,
103
+ `untappd_add_comment`, the two deletes, the wishlist pair, the four friend
104
+ actions) answer with a dry-run preview or a receipt. Nothing in a receipt is
105
+ decoration.
106
+ - **`untappd_sync_checkins` / `untappd_sync_user_beers`** answer with sync
107
+ PROGRESS — pages walked, `another_run_needed`, `backfill_complete`. Slimming
108
+ a progress report is how you lose the field that says it is not finished.
109
+ - **The five cache tools** (`untappd_cache_has_had`, `…_has_had_many`,
110
+ `…_not_had`, `untappd_cache_query`, `untappd_top_not_had`) answer from the
111
+ local SQLite mirror in a shape this repo already wrote — a verdict plus the
112
+ `freshness` block that says whether a "not found" might be a false negative.
113
+ There is no upstream payload behind them to project away from.
114
+ - **`untappd_checkin_info`** exists to return the FULL record for one check-in
115
+ — photos, badges earned, toasts, comments. The ~5 KB the check-in projection
116
+ removes is exactly what you called this tool to get.
117
+ - **`untappd_venue_menu`** is already its own hand-written projection, with a
118
+ per-call page budget and a resumable `next_section_offset` contract. A
119
+ second projection on top of it would fight the first.
120
+ - **`untappd_resolve`, `untappd_open_url`, `untappd_healthcheck`** return a
121
+ verdict or a diagnostic.
122
+ - **The remaining ten reads** — `untappd_trending`, `untappd_notifications`,
123
+ `untappd_brewery_beers`, `untappd_search_brewery`, `untappd_search_venue`,
124
+ `untappd_user_badges`, `untappd_user_friends`, `untappd_user_venues`,
125
+ `untappd_pending_friends`, `untappd_venue_by_foursquare` — hand back
126
+ Untappd's payload as it arrived. No projector has been written for their
127
+ shapes, so there is no rung to ask for and **no slim option exists**.
128
+ `untappd_brewery_beers` is the one worth budgeting for: it returns a beer
129
+ list, which is the shape the beer projectors handle, but it is not wired to
130
+ one — a 50-beer page arrives as 50 full records.
131
+
43
132
  ## Write tools (confirm-gated — these post to your public account)
44
133
 
45
134
  Each returns a dry-run preview and makes NO network call unless called with