untappd-mcp 2.5.2 → 2.6.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.
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { foodMeta } from './hints.js';
2
3
  import { confirmTokenParam, minifiedResult, toolAnnotations } from '@chrischall/mcp-utils';
3
4
  import { CONFIRM_FLOW, confirmWrite } from './confirm.js';
4
5
  const BidSchema = z.number().int().positive().describe('Untappd beer id (bid) — from untappd_search_beer');
@@ -7,6 +8,7 @@ export function registerWishlistTools(server, client) {
7
8
  title: 'Add a beer to your wishlist',
8
9
  description: `Add a beer to YOUR Untappd wishlist by its bid. Writes to your account. ${CONFIRM_FLOW}`,
9
10
  annotations: toolAnnotations({ title: 'Add a beer to your wishlist', readOnly: false, idempotent: true, openWorld: true, destructive: false }),
11
+ _meta: foodMeta('change', { aliases: ['want to try', 'save a beer'] }),
10
12
  inputSchema: z.object({
11
13
  bid: BidSchema,
12
14
  confirmToken: confirmTokenParam,
@@ -33,6 +35,7 @@ export function registerWishlistTools(server, client) {
33
35
  title: 'Remove a beer from your wishlist',
34
36
  description: `Remove a beer from YOUR Untappd wishlist by its bid. Writes to your account. ${CONFIRM_FLOW}`,
35
37
  annotations: toolAnnotations({ title: 'Remove a beer from your wishlist', readOnly: false, idempotent: true, openWorld: true, destructive: false }),
38
+ _meta: foodMeta('change'),
36
39
  inputSchema: z.object({
37
40
  bid: BidSchema,
38
41
  confirmToken: confirmTokenParam,
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 = '2.5.2'; // x-release-please-version
6
+ export const VERSION = '2.6.1'; // x-release-please-version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "untappd-mcp",
3
- "version": "2.5.2",
3
+ "version": "2.6.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": "2.5.2",
9
+ "version": "2.6.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "untappd-mcp",
14
- "version": "2.5.2",
14
+ "version": "2.6.1",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },
@@ -73,6 +73,16 @@ answer, wrong reason. **The same silence bites the other way**: `compact:
73
73
  false` no longer buys you the full record either. It is dropped identically
74
74
  and you still get compact. `view: "full"` is the only way back.
75
75
 
76
+ `untappd_activity_feed` also takes a third rung, `view: "brief"`: one line per
77
+ check-in, `<user>: <beer> (<brewery>) at <venue> — <ISO date | no date> —
78
+ <rated N | not rated>`, each at most 120 characters, answered inside the
79
+ untrusted-data envelope as `data: string[]` (the names are other Untappd
80
+ users'). A line starting `-- ` is a note, not a check-in: `-- none` for an
81
+ empty feed, `-- more` when an older page exists; a name that itself starts
82
+ with `-- ` or `\` is escaped with one leading `\`. It is the shape a
83
+ context-group host reads aloud (below); use it when you only need to say what
84
+ friends have been drinking.
85
+
76
86
  Compact comes in two tiers here, and they are not the same thing:
77
87
 
78
88
  **A hand-written field projection — 9 tools.**
@@ -245,3 +255,25 @@ owner-only (dir `0700`, file `0600`).
245
255
  Every cache read returns a `freshness` block reporting each source's completeness
246
256
  separately (plus `coverage_complete` and a `caveat` when incomplete), so you can
247
257
  flag a "not found" as possibly a false negative until the relevant sync finishes.
258
+
259
+ ## In context groups
260
+
261
+ On an mcp-host connector this server is a member of the **food** group (every
262
+ tool but `untappd_healthcheck` carries a `_meta.mint` hint with
263
+ `domain: "food"`). Its one canonical read is **`untappd_activity_feed`** for
264
+ **what's new** — the friend feed, answered with `view: "brief"`. It takes no
265
+ subject and no date range: Untappd has no listable set of the person's own
266
+ subjects (no children, properties or accounts to fan out over), so the group
267
+ asks it once, not once per person. Nothing here answers what's due or what's
268
+ on; every other read is a `lookup` (`untappd_notifications` is a non-canonical
269
+ what's-new), and the writes are `send` (toast, comment, friend request),
270
+ `change` (check-in, deletes, wishlist, favourites, friend accept/reject/remove)
271
+ or `other` (the cache syncs and the pickers, which refresh the local cache as
272
+ they read).
273
+
274
+ A compound ask looks like *"what's new with food — any new reservations, and
275
+ what have my friends been drinking?"*: the host answers the Untappd half from
276
+ the feed's brief lines beside the group's other members. This server calls the
277
+ Untappd API directly, so it never answers "needs your browser open"; if it is
278
+ not configured, the group reports it as unable to answer and
279
+ `untappd_healthcheck` says which credential is missing.