untappd-mcp 0.0.0
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 +29 -0
- package/.claude-plugin/plugin.json +16 -0
- package/.mcp.json +14 -0
- package/README.md +75 -0
- package/SKILL.md +47 -0
- package/dist/bundle.js +31806 -0
- package/dist/client.js +252 -0
- package/dist/index.js +29 -0
- package/dist/tools/beer.js +41 -0
- package/dist/tools/brewery.js +32 -0
- package/dist/tools/checkin.js +110 -0
- package/dist/tools/feed.js +30 -0
- package/dist/tools/user.js +108 -0
- package/dist/tools/utilities.js +27 -0
- package/dist/tools/venue.js +31 -0
- package/dist/version.js +6 -0
- package/package.json +55 -0
- package/server.json +50 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { textResult, toolAnnotations } from '@chrischall/mcp-utils';
|
|
3
|
+
import { client } from '../client.js';
|
|
4
|
+
export function registerVenueTools(server) {
|
|
5
|
+
server.registerTool('untappd_search_venue', {
|
|
6
|
+
title: 'Search Untappd venues',
|
|
7
|
+
description: 'Search Untappd for venues (bars, breweries, restaurants) by name. Returns matches with their venue id, ' +
|
|
8
|
+
'category, and location. Feed a venue id into untappd_venue_info for full detail. Read-only.',
|
|
9
|
+
annotations: toolAnnotations({ title: 'Search Untappd venues', readOnly: true, idempotent: true, openWorld: true }),
|
|
10
|
+
inputSchema: {
|
|
11
|
+
query: z.string().min(1).describe('Venue name to search for'),
|
|
12
|
+
limit: z.number().int().min(1).max(50).optional().describe('Max results (1–50, default 25)'),
|
|
13
|
+
},
|
|
14
|
+
}, async ({ query, limit }) => {
|
|
15
|
+
const data = await client.get('/search/venue', { q: query, limit });
|
|
16
|
+
return textResult(data);
|
|
17
|
+
});
|
|
18
|
+
server.registerTool('untappd_venue_info', {
|
|
19
|
+
title: 'Get Untappd venue detail',
|
|
20
|
+
description: 'Get full detail for a venue by its Untappd venue id: category, address, contact, rating, total check-ins, ' +
|
|
21
|
+
'and (unless compact) top beers and recent activity. Get an id from untappd_search_venue. Read-only.',
|
|
22
|
+
annotations: toolAnnotations({ title: 'Get Untappd venue detail', readOnly: true, idempotent: true, openWorld: true }),
|
|
23
|
+
inputSchema: {
|
|
24
|
+
venue_id: z.number().int().positive().describe('Untappd venue id'),
|
|
25
|
+
compact: z.boolean().optional().describe('Return a slimmer record without embedded activity (default false)'),
|
|
26
|
+
},
|
|
27
|
+
}, async ({ venue_id, compact }) => {
|
|
28
|
+
const data = await client.get(`/venue/info/${venue_id}`, { compact: compact ? 'true' : undefined });
|
|
29
|
+
return textResult(data);
|
|
30
|
+
});
|
|
31
|
+
}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Single source of truth for the server version. release-please bumps the
|
|
2
|
+
// string below via the version marker (registered in release-please-config
|
|
3
|
+
// json's `extra-files`), and `versionSyncTest` guards that it stays equal to
|
|
4
|
+
// package.json. Import VERSION wherever the version is needed rather than
|
|
5
|
+
// re-declaring it.
|
|
6
|
+
export const VERSION = '0.0.0'; // x-release-please-version
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "untappd-mcp",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"mcpName": "io.github.chrischall/untappd-mcp",
|
|
5
|
+
"description": "Untappd MCP server for Claude — developed and maintained by AI (Claude Code)",
|
|
6
|
+
"author": "Claude Code (AI) <https://www.anthropic.com/claude>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/chrischall/untappd-mcp.git"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"mcp",
|
|
14
|
+
"model-context-protocol",
|
|
15
|
+
"claude",
|
|
16
|
+
"ai",
|
|
17
|
+
"untappd",
|
|
18
|
+
"beer",
|
|
19
|
+
"breweries",
|
|
20
|
+
"checkins",
|
|
21
|
+
"beer-ratings"
|
|
22
|
+
],
|
|
23
|
+
"type": "module",
|
|
24
|
+
"bin": {
|
|
25
|
+
"untappd-mcp": "dist/index.js"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
".claude-plugin",
|
|
30
|
+
"SKILL.md",
|
|
31
|
+
".mcp.json",
|
|
32
|
+
"server.json"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc && npm run bundle",
|
|
36
|
+
"bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --external:dotenv --outfile=dist/bundle.js",
|
|
37
|
+
"dev": "node dist/index.js",
|
|
38
|
+
"test": "vitest run",
|
|
39
|
+
"test:watch": "vitest",
|
|
40
|
+
"test:coverage": "vitest run --coverage"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@chrischall/mcp-utils": "^0.12.0",
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
45
|
+
"dotenv": "^17.4.0",
|
|
46
|
+
"zod": "^4.4.2"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^25.5.2",
|
|
50
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
51
|
+
"esbuild": "^0.28.0",
|
|
52
|
+
"typescript": "^6.0.2",
|
|
53
|
+
"vitest": "^4.1.2"
|
|
54
|
+
}
|
|
55
|
+
}
|
package/server.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.chrischall/untappd-mcp",
|
|
4
|
+
"description": "Untappd MCP — search beers/breweries/venues, read check-ins & wishlists, post check-ins",
|
|
5
|
+
"repository": {
|
|
6
|
+
"url": "https://github.com/chrischall/untappd-mcp",
|
|
7
|
+
"source": "github"
|
|
8
|
+
},
|
|
9
|
+
"version": "0.0.0",
|
|
10
|
+
"packages": [
|
|
11
|
+
{
|
|
12
|
+
"registryType": "npm",
|
|
13
|
+
"identifier": "untappd-mcp",
|
|
14
|
+
"version": "0.0.0",
|
|
15
|
+
"transport": {
|
|
16
|
+
"type": "stdio"
|
|
17
|
+
},
|
|
18
|
+
"environmentVariables": [
|
|
19
|
+
{
|
|
20
|
+
"name": "UNTAPPD_USERNAME",
|
|
21
|
+
"description": "Your Untappd username or login email.",
|
|
22
|
+
"isRequired": true,
|
|
23
|
+
"format": "string",
|
|
24
|
+
"isSecret": false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "UNTAPPD_PASSWORD",
|
|
28
|
+
"description": "Your Untappd account password (used only for xauth login).",
|
|
29
|
+
"isRequired": true,
|
|
30
|
+
"format": "string",
|
|
31
|
+
"isSecret": true
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "UNTAPPD_CLIENT_ID",
|
|
35
|
+
"description": "Untappd mobile app client id (obtained by intercepting the app; see README).",
|
|
36
|
+
"isRequired": true,
|
|
37
|
+
"format": "string",
|
|
38
|
+
"isSecret": true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "UNTAPPD_CLIENT_SECRET",
|
|
42
|
+
"description": "Untappd mobile app client secret.",
|
|
43
|
+
"isRequired": true,
|
|
44
|
+
"format": "string",
|
|
45
|
+
"isSecret": true
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|