brewers-almanack 0.1.0 → 0.1.2

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/README.md CHANGED
@@ -1,6 +1,7 @@
1
+ <!-- mcp-name: io.github.gregario/brewers-almanack -->
1
2
  <p align="center">
2
3
  <h1 align="center">Brewers Almanack</h1>
3
- <p align="center">A brewing knowledge MCP server — beer styles, ingredients, off-flavour diagnosis, water chemistry, and recipe guidance for AI assistants.</p>
4
+ <p align="center">A brewing knowledge MCP server: beer styles, ingredients, off-flavour diagnosis, water chemistry, and recipe guidance for AI assistants.</p>
4
5
  </p>
5
6
 
6
7
  <p align="center">
@@ -9,14 +10,17 @@
9
10
  <a href="https://github.com/gregario/brewers-almanack/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT Licence"></a>
10
11
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg" alt="Node.js 18+"></a>
11
12
  <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-compatible-purple.svg" alt="MCP Compatible"></a>
13
+ <a href="https://glama.ai/mcp/servers/gregario/brewers-almanack"><img src="https://glama.ai/mcp/servers/gregario/brewers-almanack/badges/score.svg" alt="brewers-almanack MCP server"></a>
12
14
  </p>
13
15
 
14
16
  ---
15
17
 
16
- Ask your AI assistant about beer styles, diagnose off-flavours, build recipes, match water profiles, and pair food — all backed by real brewing data, not hallucinations.
18
+ Ask your AI assistant about beer styles, diagnose off-flavours, build recipes, match water profiles, and pair food (all backed by real brewing data, not hallucinations).
17
19
 
18
20
  **6 tools. Zero config. Works with every MCP-compatible IDE.**
19
21
 
22
+ [![Brewers almanack MCP server](https://glama.ai/mcp/servers/gregario/brewers-almanack/badges/card.svg)](https://glama.ai/mcp/servers/gregario/brewers-almanack)
23
+
20
24
  ## Install
21
25
 
22
26
  ```bash
@@ -131,16 +135,16 @@ Add to `settings.json`:
131
135
  ## Example Conversations
132
136
 
133
137
  **"What hops work in a Belgian Dubbel?"**
134
- > Searches ingredients for hops that complement Belgian styles — returns varieties like Styrian Goldings and Saaz with alpha acid ranges, aromas, and substitutes.
138
+ > Searches ingredients for hops that complement Belgian styles, returning varieties like Styrian Goldings and Saaz with alpha acid ranges, aromas, and substitutes.
135
139
 
136
- **"My beer tastes like butter — what went wrong?"**
140
+ **"My beer tastes like butter, what went wrong?"**
137
141
  > Diagnoses diacetyl: identifies the compound, explains causes (incomplete fermentation, premature racking), and gives prevention steps (diacetyl rest, healthy yeast pitch).
138
142
 
139
143
  **"Suggest a recipe for a West Coast IPA"**
140
144
  > Builds a complete recipe: pale malt base with crystal malt, Centennial/Cascade hop schedule with dry hop additions, American ale yeast, and a Burton-style water profile.
141
145
 
142
146
  **"What food pairs well with a stout?"**
143
- > Returns pairing suggestions — oysters, chocolate desserts, grilled meats — with principles explaining why each pairing works (complement, contrast, or cleanse).
147
+ > Returns pairing suggestions (oysters, chocolate desserts, grilled meats) with principles explaining why each pairing works (complement, contrast, or cleanse).
144
148
 
145
149
  ## Data Sources
146
150
 
@@ -161,7 +165,7 @@ See [ROADMAP.md](ROADMAP.md) for planned features: brewing calculators, recipe i
161
165
 
162
166
  ## Contributing
163
167
 
164
- Contributions are welcome — especially data contributions. More hop varieties, yeast strains, regional water profiles, and food pairings make the server more useful for everyone.
168
+ Contributions are welcome, especially data contributions. More hop varieties, yeast strains, regional water profiles, and food pairings make the server more useful for everyone.
165
169
 
166
170
  ```bash
167
171
  git clone https://github.com/gregario/brewers-almanack.git
@@ -181,4 +185,4 @@ See [ROADMAP.md](ROADMAP.md) for areas where contributions are most needed.
181
185
 
182
186
  ## Licence
183
187
 
184
- [MIT](LICENSE)
188
+ [MIT](LICENSE)
package/dist/index.js CHANGED
@@ -1,8 +1,18 @@
1
1
  #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
2
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
4
  import { createServer } from "./server.js";
4
- console.error("Brewers Almanack v0.1.0 — brewing knowledge MCP server");
5
- const server = createServer();
5
+ const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
6
+ console.error(`Brewers Almanack v${pkg.version} — brewing knowledge MCP server`);
7
+ const server = createServer(pkg.version);
6
8
  const transport = new StdioServerTransport();
7
9
  await server.connect(transport);
10
+ process.on("SIGINT", async () => {
11
+ await server.close();
12
+ process.exit(0);
13
+ });
14
+ process.on("SIGTERM", async () => {
15
+ await server.close();
16
+ process.exit(0);
17
+ });
8
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;AAExE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3F,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAEjF,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function createServer(): McpServer;
2
+ export declare function createServer(version?: string): McpServer;
3
3
  //# sourceMappingURL=server.d.ts.map
package/dist/server.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { registerTools } from "./register-tools.js";
3
- export function createServer() {
3
+ export function createServer(version) {
4
4
  const server = new McpServer({
5
5
  name: "brewers-almanack",
6
- version: "0.1.0",
6
+ version: version ?? "0.0.0",
7
7
  });
8
8
  registerTools(server);
9
9
  return server;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IACH,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO,IAAI,OAAO;KAC5B,CAAC,CAAC;IACH,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -28,7 +28,7 @@ function formatYeast(yeast) {
28
28
  `## ${yeast.name} (Yeast)`,
29
29
  `Producer: ${yeast.producer} | Code: ${yeast.code}`,
30
30
  `Type: ${yeast.type} | Form: ${yeast.form}`,
31
- `Temp: ${yeast.tempMin}-${yeast.tempMax}°F`,
31
+ `Temp: ${yeast.tempMin}-${yeast.tempMax}°C`,
32
32
  `Attenuation: ${yeast.attenuationMin}-${yeast.attenuationMax}%`,
33
33
  `Flocculation: ${yeast.flocculation}`,
34
34
  `Flavour: ${yeast.flavourProfile}`,
@@ -10,28 +10,99 @@ function findStyle(query) {
10
10
  return results.length > 0 ? results[0] : null;
11
11
  }
12
12
  function selectMalts(styleName, category, tags) {
13
- // Pick a base malt
13
+ // Pick a base malt. For Pilsner/lager-pale styles prefer Pilsner Malt;
14
+ // for English styles prefer Maris Otter; otherwise default to 2-Row.
15
+ // Uses a mix of tag checks (preferred — explicit) and case-insensitive
16
+ // word matches against name+category. Avoid bare substring checks like
17
+ // .includes("red") because they false-match "lagered" etc.
14
18
  const baseMalts = MALTS.filter((m) => m.type === "base");
15
- const base = baseMalts[0]; // Default to first base malt (typically Pale Malt)
16
- // Pick specialty malts based on style character
19
+ const tagsLower = tags.map((t) => t.toLowerCase());
20
+ const nameCat = (styleName + " " + category).toLowerCase();
21
+ const hasWord = (s, word) => new RegExp(`\\b${word}\\b`, "i").test(s);
22
+ const isPilsnerLike = tagsLower.includes("pilsner-family") ||
23
+ tagsLower.includes("pale-lager-family") ||
24
+ hasWord(nameCat, "pilsner") ||
25
+ hasWord(nameCat, "pils") ||
26
+ hasWord(nameCat, "helles") ||
27
+ /k(ö|o)lsch/i.test(nameCat);
28
+ const isEnglish = hasWord(nameCat, "english") ||
29
+ hasWord(nameCat, "british") ||
30
+ hasWord(nameCat, "esb") ||
31
+ /\bmild\b/i.test(styleName);
32
+ const isWheat = tagsLower.includes("wheat-beer-family") ||
33
+ hasWord(nameCat, "wheat") ||
34
+ hasWord(nameCat, "hefeweizen") ||
35
+ hasWord(nameCat, "weiss") ||
36
+ hasWord(nameCat, "weissbier") ||
37
+ hasWord(nameCat, "witbier");
38
+ let base = baseMalts.find((m) => m.name === "2-Row Pale Malt") ?? baseMalts[0];
39
+ if (isPilsnerLike) {
40
+ base = baseMalts.find((m) => m.name === "Pilsner Malt") ?? base;
41
+ }
42
+ else if (isEnglish) {
43
+ base = baseMalts.find((m) => m.name === "Maris Otter") ?? base;
44
+ }
45
+ else if (isWheat) {
46
+ base = baseMalts.find((m) => m.name === "Wheat Malt") ?? base;
47
+ }
48
+ // Pick specialty malts based on style character. Use tag/word checks,
49
+ // not bare substring matches, to avoid picking up "red" inside "lagered".
17
50
  const specialtyMalts = MALTS.filter((m) => m.type !== "base");
18
- const lower = (category + " " + styleName + " " + tags.join(" ")).toLowerCase();
19
- const selected = specialtyMalts.filter((m) => {
20
- const mLower = (m.name + " " + m.flavour + " " + m.description).toLowerCase();
21
- // Match dark styles with roasted/dark malts
22
- if (lower.includes("stout") || lower.includes("porter")) {
23
- return m.type === "roasted" || mLower.includes("chocolate") || mLower.includes("roast");
24
- }
25
- if (lower.includes("amber") || lower.includes("red") || lower.includes("brown")) {
51
+ const isDark = tagsLower.includes("dark-color") ||
52
+ tagsLower.includes("stout-family") ||
53
+ tagsLower.includes("dark-lager-family") ||
54
+ hasWord(nameCat, "stout") ||
55
+ hasWord(nameCat, "porter") ||
56
+ hasWord(nameCat, "schwarzbier") ||
57
+ hasWord(nameCat, "dunkel") ||
58
+ hasWord(nameCat, "dunkles");
59
+ if (isDark) {
60
+ // Prefer actual roasted-type malts; fall back to crystals with roast
61
+ // character only if no roasted malts qualify.
62
+ const roasted = specialtyMalts.filter((m) => m.type === "roasted").slice(0, 2);
63
+ return { base, specialty: roasted };
64
+ }
65
+ const isAmber = tagsLower.includes("amber-color") ||
66
+ tagsLower.includes("amber-ale-family") ||
67
+ tagsLower.includes("amber-lager-family") ||
68
+ hasWord(nameCat, "amber") ||
69
+ hasWord(nameCat, "red") ||
70
+ hasWord(nameCat, "brown") ||
71
+ hasWord(nameCat, "märzen") ||
72
+ hasWord(nameCat, "marzen") ||
73
+ hasWord(nameCat, "vienna") ||
74
+ hasWord(nameCat, "altbier");
75
+ if (isAmber) {
76
+ const selected = specialtyMalts.filter((m) => {
77
+ const mLower = (m.name + " " + m.flavour + " " + m.description).toLowerCase();
26
78
  return m.type === "crystal" || mLower.includes("caramel");
27
- }
28
- if (lower.includes("wheat")) {
29
- return mLower.includes("wheat");
30
- }
31
- // Default: pick a crystal malt for body
32
- return m.type === "crystal";
33
- }).slice(0, 2);
34
- return { base, specialty: selected.length > 0 ? selected : specialtyMalts.slice(0, 1) };
79
+ }).slice(0, 2);
80
+ return { base, specialty: selected };
81
+ }
82
+ if (isWheat) {
83
+ // Wheat styles already have a wheat-malt base; add at most one specialty
84
+ // grain (e.g. flaked wheat or flaked oats) for character.
85
+ const selected = specialtyMalts.filter((m) => {
86
+ const mLower = (m.name + " " + m.flavour + " " + m.description).toLowerCase();
87
+ return mLower.includes("wheat") || mLower.includes("oat");
88
+ }).slice(0, 1);
89
+ return { base, specialty: selected };
90
+ }
91
+ // Pale styles (American IPA, American Pale Ale, Bohemian/German Pils,
92
+ // Helles, Kölsch, Blonde Ale, Cream Ale, etc.): keep it base-malt-led.
93
+ // Crystal malts in IPAs/pilsners are not idiomatic — leave specialty empty
94
+ // and let the consumer scale base to 100%.
95
+ const isPale = tagsLower.includes("pale-color") ||
96
+ hasWord(nameCat, "pale") ||
97
+ hasWord(nameCat, "ipa") ||
98
+ hasWord(nameCat, "blonde") ||
99
+ hasWord(nameCat, "cream") ||
100
+ isPilsnerLike;
101
+ if (isPale) {
102
+ return { base, specialty: [] };
103
+ }
104
+ // Unknown/other styles: default to base-only rather than guessing crystal.
105
+ return { base, specialty: [] };
35
106
  }
36
107
  function selectHops(styleName) {
37
108
  // Find hops whose styles array includes this style
@@ -73,15 +144,24 @@ function selectWater(styleName) {
73
144
  styleName.toLowerCase().includes(bf.toLowerCase())));
74
145
  return matching.length > 0 ? matching[0] : null;
75
146
  }
147
+ // Unit conversions for grain weight calculation.
148
+ // Malt potential is conventionally expressed in PPG (points per pound per
149
+ // gallon at 100% mash efficiency). To work consistently in metric we convert
150
+ // the imperial PPG yield into a metric "points per kg per litre" yield.
151
+ const LITRES_PER_US_GALLON = 3.785411784;
152
+ const KG_PER_POUND = 0.45359237;
153
+ // 37 PPG (typical 2-Row pale malt) → ~308.8 points per kg per litre.
154
+ const POINTS_PER_KG_PER_LITRE_AT_37_PPG = (37 * LITRES_PER_US_GALLON) / KG_PER_POUND;
76
155
  function calculateGrainWeight(ogTarget, batchLitres, efficiency = 0.72) {
77
- // Simplified grain weight calculation
78
- // OG points = (OG - 1) * 1000, e.g. 1.065 -> 65
156
+ // OG points: (OG - 1) * 1000. e.g. 1.065 → 65 gravity points per litre.
79
157
  const ogPoints = (ogTarget - 1) * 1000;
80
- // Points needed for batch
158
+ // Total gravity-points needed across the whole batch (litre-points).
81
159
  const totalPoints = ogPoints * batchLitres;
82
- // Base malt potential ~37 points per kg per litre at 100% efficiency
83
- const pointsPerKg = 37 * efficiency;
84
- return totalPoints / pointsPerKg;
160
+ // Effective yield per kg of grain across the whole batch volume,
161
+ // assuming a 37 PPG base malt at the given mash efficiency.
162
+ // Result is in litre-points per kg of grain.
163
+ const yieldPerKg = POINTS_PER_KG_PER_LITRE_AT_37_PPG * efficiency;
164
+ return totalPoints / yieldPerKg;
85
165
  }
86
166
  export function registerSuggestRecipe(server) {
87
167
  server.registerTool("suggest_recipe", {
@@ -116,15 +196,23 @@ export function registerSuggestRecipe(server) {
116
196
  const yeast = selectYeast(matchedStyle.name, matchedStyle.tags);
117
197
  const water = selectWater(matchedStyle.name);
118
198
  const totalGrainKg = calculateGrainWeight(ogTarget, batch_size_litres);
119
- const baseKg = (totalGrainKg * 0.85).toFixed(1);
199
+ // When specialty malts are present, hold base ≈ 85% and split the
200
+ // remaining 15% across specialty grains. With no specialty (e.g. pale
201
+ // styles like American IPA / Pilsner) the base malt provides 100%.
202
+ const baseFraction = malts.specialty.length > 0 ? 0.85 : 1.0;
203
+ const baseKg = (totalGrainKg * baseFraction).toFixed(2);
120
204
  const specialtyKg = malts.specialty.length > 0
121
- ? (totalGrainKg * 0.15 / malts.specialty.length).toFixed(1)
205
+ ? (totalGrainKg * 0.15 / malts.specialty.length).toFixed(2)
122
206
  : "0";
123
207
  // Determine mash temp based on style character
124
208
  const tags = matchedStyle.tags.join(" ").toLowerCase();
125
209
  const isDry = tags.includes("bitter") || tags.includes("hoppy") || matchedStyle.name.toLowerCase().includes("ipa");
126
210
  const mashTemp = isDry ? "65°C (149°F) — lower for drier finish" : "67°C (153°F) — higher for fuller body";
127
- const fermTemp = `${yeast.tempMin}-${yeast.tempMax}°F (${Math.round((yeast.tempMin - 32) * 5 / 9)}-${Math.round((yeast.tempMax - 32) * 5 / 9)}°C)`;
211
+ // Yeast tempMin/tempMax are stored in °C (see src/data/yeasts.ts —
212
+ // ales 18–23, lagers 9–15, kveik 25–40). Convert °C → °F for display.
213
+ const fermTempFMin = Math.round(yeast.tempMin * 9 / 5 + 32);
214
+ const fermTempFMax = Math.round(yeast.tempMax * 9 / 5 + 32);
215
+ const fermTemp = `${yeast.tempMin}-${yeast.tempMax}°C (${fermTempFMin}-${fermTempFMax}°F)`;
128
216
  const lines = [
129
217
  `# Recipe: ${matchedStyle.name}`,
130
218
  `Batch size: ${batch_size_litres} litres | Target OG: ${ogTarget.toFixed(3)} | IBU: ${ibuTarget} | ABV: ~${abvTarget}%`,
@@ -1 +1 @@
1
- {"version":3,"file":"suggest-recipe.js","sourceRoot":"","sources":["../../src/tools/suggest-recipe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"suggest-recipe.js","sourceRoot":"","sources":["../../src/tools/suggest-recipe.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brewers-almanack",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A brewing knowledge MCP server — beer styles, ingredients, off-flavour diagnosis, water chemistry, and recipe guidance for AI brewing assistants",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -25,15 +25,23 @@
25
25
  "node": ">=18.0.0"
26
26
  },
27
27
  "keywords": [
28
- "mcp", "brewing", "beer", "homebrew", "bjcp", "recipe",
29
- "model-context-protocol", "hops", "malt", "yeast"
28
+ "mcp",
29
+ "brewing",
30
+ "beer",
31
+ "homebrew",
32
+ "bjcp",
33
+ "recipe",
34
+ "model-context-protocol",
35
+ "hops",
36
+ "malt",
37
+ "yeast"
30
38
  ],
31
39
  "mcpName": "io.github.gregario/brewers-almanack",
32
40
  "author": "gregario",
33
41
  "license": "MIT",
34
42
  "repository": {
35
43
  "type": "git",
36
- "url": "https://github.com/gregario/brewers-almanack"
44
+ "url": "git+https://github.com/gregario/brewers-almanack.git"
37
45
  },
38
46
  "dependencies": {
39
47
  "@modelcontextprotocol/sdk": "^1.12",