wellness-nourish 0.1.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/LICENSE +21 -0
- package/README.md +146 -0
- package/SECURITY.md +9 -0
- package/dist/cli/commands.d.ts +3 -0
- package/dist/cli/commands.js +467 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +153 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/nourish-prompts.d.ts +2 -0
- package/dist/prompts/nourish-prompts.js +17 -0
- package/dist/prompts/nourish-prompts.js.map +1 -0
- package/dist/providers/open-food-facts.d.ts +5 -0
- package/dist/providers/open-food-facts.js +141 -0
- package/dist/providers/open-food-facts.js.map +1 -0
- package/dist/providers/usda.d.ts +6 -0
- package/dist/providers/usda.js +157 -0
- package/dist/providers/usda.js.map +1 -0
- package/dist/resources/nourish-resources.d.ts +2 -0
- package/dist/resources/nourish-resources.js +26 -0
- package/dist/resources/nourish-resources.js.map +1 -0
- package/dist/schemas/common.d.ts +224 -0
- package/dist/schemas/common.js +224 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/services/agent-manifest.d.ts +27 -0
- package/dist/services/agent-manifest.js +80 -0
- package/dist/services/agent-manifest.js.map +1 -0
- package/dist/services/capabilities.d.ts +12 -0
- package/dist/services/capabilities.js +27 -0
- package/dist/services/capabilities.js.map +1 -0
- package/dist/services/config.d.ts +3 -0
- package/dist/services/config.js +32 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/connection-status.d.ts +13 -0
- package/dist/services/connection-status.js +34 -0
- package/dist/services/connection-status.js.map +1 -0
- package/dist/services/food-normalization.d.ts +3 -0
- package/dist/services/food-normalization.js +14 -0
- package/dist/services/food-normalization.js.map +1 -0
- package/dist/services/format.d.ts +13 -0
- package/dist/services/format.js +58 -0
- package/dist/services/format.js.map +1 -0
- package/dist/services/goals-store.d.ts +7 -0
- package/dist/services/goals-store.js +87 -0
- package/dist/services/goals-store.js.map +1 -0
- package/dist/services/hydration-store.d.ts +12 -0
- package/dist/services/hydration-store.js +96 -0
- package/dist/services/hydration-store.js.map +1 -0
- package/dist/services/intake-store.d.ts +15 -0
- package/dist/services/intake-store.js +170 -0
- package/dist/services/intake-store.js.map +1 -0
- package/dist/services/meal-estimator.d.ts +22 -0
- package/dist/services/meal-estimator.js +178 -0
- package/dist/services/meal-estimator.js.map +1 -0
- package/dist/services/nutrients.d.ts +4 -0
- package/dist/services/nutrients.js +31 -0
- package/dist/services/nutrients.js.map +1 -0
- package/dist/services/portion-engine.d.ts +4 -0
- package/dist/services/portion-engine.js +50 -0
- package/dist/services/portion-engine.js.map +1 -0
- package/dist/services/privacy-audit.d.ts +12 -0
- package/dist/services/privacy-audit.js +19 -0
- package/dist/services/privacy-audit.js.map +1 -0
- package/dist/services/summary.d.ts +28 -0
- package/dist/services/summary.js +84 -0
- package/dist/services/summary.js.map +1 -0
- package/dist/services/usage-guide.d.ts +12 -0
- package/dist/services/usage-guide.js +57 -0
- package/dist/services/usage-guide.js.map +1 -0
- package/dist/tools/nourish-tools.d.ts +2 -0
- package/dist/tools/nourish-tools.js +603 -0
- package/dist/tools/nourish-tools.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/examples/claude-desktop.json +13 -0
- package/examples/codex.json +13 -0
- package/examples/cursor.json +13 -0
- package/examples/hermes.md +18 -0
- package/examples/openclaw.md +18 -0
- package/examples/windsurf.json +13 -0
- package/fixtures/open-food-facts/barcode-peanut-butter.json +23 -0
- package/fixtures/usda/food-banana.json +16 -0
- package/fixtures/usda/search-banana.json +17 -0
- package/package.json +52 -0
- package/server.json +16 -0
- package/tsconfig.json +21 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 David Mosiah
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Wellness Nourish MCP
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Wellness Nourish is a local MCP server for nutrition search, barcode lookup, meal estimation, intake logging, hydration, goals, exports, and daily or weekly summaries. It runs over stdio by default for MCP clients and can also run a Streamable HTTP endpoint at `POST /mcp`.
|
|
6
|
+
|
|
7
|
+
The connector uses USDA FoodData Central as the primary food search provider. Open Food Facts is used for packaged-food barcode lookup when enabled. It does not provide hosted sync, photo analysis, recipe generation, or medical advice.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install
|
|
13
|
+
npm run build
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Run the MCP server over stdio:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm start
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Run Streamable HTTP locally:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
node dist/index.js --http
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Optional environment:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
FDC_API_KEY=your_usda_key
|
|
32
|
+
NOURISH_OFF_ENABLED=1
|
|
33
|
+
NOURISH_LOCAL_DIR=~/.wellness-nourish
|
|
34
|
+
NOURISH_MCP_PORT=3000
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Agents should never ask users to paste API keys, tokens, raw health exports, or private food logs into chat. Configure secrets through environment variables or local files.
|
|
38
|
+
|
|
39
|
+
## CLI Commands
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
nourish-mcp status
|
|
43
|
+
nourish-mcp doctor
|
|
44
|
+
nourish-mcp setup --client claude
|
|
45
|
+
nourish-mcp search banana
|
|
46
|
+
nourish-mcp barcode 0000000000000
|
|
47
|
+
nourish-mcp log --preview --meal breakfast "2 eggs and banana"
|
|
48
|
+
nourish-mcp log "2 eggs and banana"
|
|
49
|
+
nourish-mcp list 2026-05-05
|
|
50
|
+
nourish-mcp edit --entry intake_id --meal snack --notes "corrected"
|
|
51
|
+
nourish-mcp today --format markdown
|
|
52
|
+
nourish-mcp weekly --format markdown
|
|
53
|
+
nourish-mcp goals --set-calories 2200 --set-protein 120 --set-water 2500
|
|
54
|
+
nourish-mcp water 500 --date 2026-05-05
|
|
55
|
+
nourish-mcp water today --date 2026-05-05
|
|
56
|
+
nourish-mcp export --format csv
|
|
57
|
+
nourish-mcp clear-day 2026-05-05 --yes
|
|
58
|
+
nourish-mcp delete --entry intake_id
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
No arguments start the stdio MCP server. `--http` starts HTTP transport, `--version` prints the package version, and `--help` prints usage.
|
|
62
|
+
|
|
63
|
+
`log --preview` estimates without writing. Mutating MCP tools require explicit user intent; CLI commands are treated as explicit user actions, while destructive clear-day requires `--yes`.
|
|
64
|
+
|
|
65
|
+
The local estimator understands common lightweight portions such as `g`, `oz`, `cup`, `tbsp`, `tsp`, `slice`, `piece`, and `serving`. It still reports confidence and warnings because these are conservative tracking estimates, not lab-grade nutrition facts.
|
|
66
|
+
|
|
67
|
+
## MCP Client Config Examples
|
|
68
|
+
|
|
69
|
+
Ready-to-use examples live in `examples/`:
|
|
70
|
+
|
|
71
|
+
- `examples/claude-desktop.json`
|
|
72
|
+
- `examples/codex.json`
|
|
73
|
+
- `examples/cursor.json`
|
|
74
|
+
- `examples/windsurf.json`
|
|
75
|
+
- `examples/hermes.md`
|
|
76
|
+
- `examples/openclaw.md`
|
|
77
|
+
|
|
78
|
+
Claude Desktop style:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"mcpServers": {
|
|
83
|
+
"nourish": {
|
|
84
|
+
"command": "npx",
|
|
85
|
+
"args": ["-y", "wellness-nourish"],
|
|
86
|
+
"env": {
|
|
87
|
+
"FDC_API_KEY": "${FDC_API_KEY}",
|
|
88
|
+
"NOURISH_OFF_ENABLED": "1"
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Local build:
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"mcpServers": {
|
|
100
|
+
"nourish": {
|
|
101
|
+
"command": "node",
|
|
102
|
+
"args": ["/absolute/path/to/wellness-nourish/dist/index.js"],
|
|
103
|
+
"env": {
|
|
104
|
+
"NOURISH_LOCAL_DIR": "/absolute/path/to/.wellness-nourish"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Provider Attribution
|
|
112
|
+
|
|
113
|
+
USDA FoodData Central is the primary provider for generic food search and nutrient data. USDA data is public domain or otherwise provided by USDA FoodData Central terms; keep provider attribution with derived results.
|
|
114
|
+
|
|
115
|
+
Open Food Facts barcode data is licensed under the Open Database License (ODbL). Open Food Facts metadata has share-alike obligations, so agents and downstream tools should preserve attribution and license metadata when exporting or reusing packaged-food records.
|
|
116
|
+
|
|
117
|
+
## Privacy
|
|
118
|
+
|
|
119
|
+
Intake data is stored locally under `~/.wellness-nourish/intake.jsonl` unless `NOURISH_LOCAL_DIR` is set. Hydration is stored in `hydration.jsonl`, and goals are stored in `goals.json` in the same local directory. The connector does not require hosted accounts and does not send local intake logs to Delx Wellness. Provider lookups may contact USDA FoodData Central or Open Food Facts unless fixture mode is enabled.
|
|
120
|
+
|
|
121
|
+
Use `nourish-mcp export` to print the local JSONL export, `nourish-mcp export --format csv` for CSV, `nourish-mcp delete --entry <id>` to delete a specific intake entry, or `nourish-mcp clear-day <date> --yes` to delete all intake entries for a day.
|
|
122
|
+
|
|
123
|
+
## Not Medical Advice
|
|
124
|
+
|
|
125
|
+
Nutrition estimates are approximate and intended for personal tracking and agent workflow context. They are not diagnosis, treatment, or medical advice. Confirm important nutrition decisions with a qualified professional.
|
|
126
|
+
|
|
127
|
+
## Development And Tests
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm run typecheck
|
|
131
|
+
npm run build
|
|
132
|
+
npm run smoke:http
|
|
133
|
+
npm run test:cli-ux
|
|
134
|
+
npm run test:agent-readiness
|
|
135
|
+
npm test
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Fixture mode:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
NOURISH_FIXTURE_MODE=1 NOURISH_FIXTURE_DIR=fixtures npm run test:cli-ux
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Delx Wellness
|
|
145
|
+
|
|
146
|
+
Project page: <https://wellness.delx.ai/connectors/nourish>
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
Do not paste API keys, tokens, raw health exports, or private food logs into chats, tickets, prompts, or public issues.
|
|
4
|
+
|
|
5
|
+
Wellness Nourish stores local intake data at `~/.wellness-nourish/intake.jsonl` by default. Set `NOURISH_LOCAL_DIR` to move that storage path.
|
|
6
|
+
|
|
7
|
+
Use `nourish-mcp export` to review/export local intake JSONL. Use `nourish-mcp delete --entry <id>` to remove a local intake entry.
|
|
8
|
+
|
|
9
|
+
Report security issues privately to the repository owner. Do not publish private food logs, local storage files, tokens, or exploit details publicly before coordination.
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { lookupOpenFoodFactsBarcode } from "../providers/open-food-facts.js";
|
|
2
|
+
import { searchUsdaFoods } from "../providers/usda.js";
|
|
3
|
+
import { buildConnectionStatus } from "../services/connection-status.js";
|
|
4
|
+
import { getGoals, updateGoals } from "../services/goals-store.js";
|
|
5
|
+
import { buildHydrationSummary, logWater } from "../services/hydration-store.js";
|
|
6
|
+
import { addIntakeEntry, clearIntakeDay, deleteIntakeEntry, exportIntakeCsvData, exportIntakeData, listIntakeEntries, updateIntakeEntry, } from "../services/intake-store.js";
|
|
7
|
+
import { estimateMeal } from "../services/meal-estimator.js";
|
|
8
|
+
import { buildDailySummary, buildWeeklySummary } from "../services/summary.js";
|
|
9
|
+
const COMMANDS = new Set([
|
|
10
|
+
"status",
|
|
11
|
+
"doctor",
|
|
12
|
+
"setup",
|
|
13
|
+
"search",
|
|
14
|
+
"barcode",
|
|
15
|
+
"log",
|
|
16
|
+
"list",
|
|
17
|
+
"edit",
|
|
18
|
+
"today",
|
|
19
|
+
"weekly",
|
|
20
|
+
"export",
|
|
21
|
+
"delete",
|
|
22
|
+
"clear-day",
|
|
23
|
+
"goals",
|
|
24
|
+
"water",
|
|
25
|
+
]);
|
|
26
|
+
const MEAL_TYPES = ["breakfast", "lunch", "dinner", "snack", "other"];
|
|
27
|
+
export function isCliCommand(args) {
|
|
28
|
+
const command = args[0];
|
|
29
|
+
return command !== undefined && COMMANDS.has(command);
|
|
30
|
+
}
|
|
31
|
+
export function isUnknownCliCommand(args) {
|
|
32
|
+
const command = args[0];
|
|
33
|
+
return command !== undefined && !command.startsWith("-") && !COMMANDS.has(command);
|
|
34
|
+
}
|
|
35
|
+
export async function runCliCommand(args) {
|
|
36
|
+
const [command, ...rest] = args;
|
|
37
|
+
try {
|
|
38
|
+
switch (command) {
|
|
39
|
+
case "status":
|
|
40
|
+
return printStatus();
|
|
41
|
+
case "doctor":
|
|
42
|
+
return doctorCommand();
|
|
43
|
+
case "setup":
|
|
44
|
+
return setupCommand(rest);
|
|
45
|
+
case "search":
|
|
46
|
+
return await searchCommand(rest);
|
|
47
|
+
case "barcode":
|
|
48
|
+
return await barcodeCommand(rest);
|
|
49
|
+
case "log":
|
|
50
|
+
return await logCommand(rest);
|
|
51
|
+
case "list":
|
|
52
|
+
return await listCommand(rest);
|
|
53
|
+
case "edit":
|
|
54
|
+
return await editCommand(rest);
|
|
55
|
+
case "today":
|
|
56
|
+
return await todayCommand(rest);
|
|
57
|
+
case "weekly":
|
|
58
|
+
return await weeklyCommand(rest);
|
|
59
|
+
case "export":
|
|
60
|
+
return await exportCommand(rest);
|
|
61
|
+
case "delete":
|
|
62
|
+
return await deleteCommand(rest);
|
|
63
|
+
case "clear-day":
|
|
64
|
+
return await clearDayCommand(rest);
|
|
65
|
+
case "goals":
|
|
66
|
+
return await goalsCommand(rest);
|
|
67
|
+
case "water":
|
|
68
|
+
return await waterCommand(rest);
|
|
69
|
+
default:
|
|
70
|
+
console.error("Unknown command");
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function printStatus() {
|
|
80
|
+
console.log("Nourish MCP");
|
|
81
|
+
console.log(JSON.stringify(buildConnectionStatus(), null, 2));
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
function doctorCommand() {
|
|
85
|
+
const status = buildConnectionStatus();
|
|
86
|
+
console.log(JSON.stringify({
|
|
87
|
+
ok: true,
|
|
88
|
+
checks: [
|
|
89
|
+
{
|
|
90
|
+
name: "storage",
|
|
91
|
+
ok: true,
|
|
92
|
+
detail: status.local_dir,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "mcp",
|
|
96
|
+
ok: true,
|
|
97
|
+
detail: "stdio ready; Streamable HTTP available with --http",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "usda",
|
|
101
|
+
ok: true,
|
|
102
|
+
detail: status.usda_mode,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "open_food_facts",
|
|
106
|
+
ok: status.open_food_facts_enabled,
|
|
107
|
+
detail: status.open_food_facts_enabled ? "enabled" : "disabled",
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
status,
|
|
111
|
+
}, null, 2));
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
function setupCommand(args) {
|
|
115
|
+
const parsed = parseArgs(args);
|
|
116
|
+
const client = optionString(parsed, "client") ?? "generic";
|
|
117
|
+
const config = {
|
|
118
|
+
mcpServers: {
|
|
119
|
+
nourish: {
|
|
120
|
+
command: "npx",
|
|
121
|
+
args: ["-y", "wellness-nourish"],
|
|
122
|
+
env: {
|
|
123
|
+
FDC_API_KEY: "${FDC_API_KEY}",
|
|
124
|
+
NOURISH_OFF_ENABLED: "1",
|
|
125
|
+
NOURISH_LOCAL_DIR: "~/.wellness-nourish",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
console.log(JSON.stringify({
|
|
131
|
+
client,
|
|
132
|
+
config,
|
|
133
|
+
next_steps: [
|
|
134
|
+
"Run nourish-mcp doctor.",
|
|
135
|
+
"In agents, call nourish_connection_status before provider-backed tools.",
|
|
136
|
+
"Use preview before write for food logs.",
|
|
137
|
+
],
|
|
138
|
+
}, null, 2));
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
async function searchCommand(args) {
|
|
142
|
+
const query = args.join(" ").trim();
|
|
143
|
+
if (query.length === 0) {
|
|
144
|
+
console.error("Usage: nourish-mcp search <query>");
|
|
145
|
+
return 1;
|
|
146
|
+
}
|
|
147
|
+
const result = await searchUsdaFoods(query, 10);
|
|
148
|
+
for (const food of result.foods) {
|
|
149
|
+
const calories = food.nutrients_per_100g.calories_kcal ?? "unknown";
|
|
150
|
+
console.log(`${food.name}\t${food.source}\t${calories} kcal/100g`);
|
|
151
|
+
}
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
154
|
+
async function barcodeCommand(args) {
|
|
155
|
+
const barcode = args[0];
|
|
156
|
+
if (barcode === undefined || barcode.trim().length === 0) {
|
|
157
|
+
console.error("Usage: nourish-mcp barcode <barcode>");
|
|
158
|
+
return 1;
|
|
159
|
+
}
|
|
160
|
+
const result = await lookupOpenFoodFactsBarcode(barcode);
|
|
161
|
+
console.log(JSON.stringify(result.food, null, 2));
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
async function logCommand(args) {
|
|
165
|
+
const parsed = parseArgs(args);
|
|
166
|
+
const text = parsed.positionals.join(" ").trim();
|
|
167
|
+
if (text.length === 0) {
|
|
168
|
+
console.error("Usage: nourish-mcp log [--preview] [--meal breakfast] [--timestamp ISO] <text...>");
|
|
169
|
+
return 1;
|
|
170
|
+
}
|
|
171
|
+
const mealType = parseMealType(optionString(parsed, "meal") ?? "other");
|
|
172
|
+
const estimate = await estimateMeal({
|
|
173
|
+
text,
|
|
174
|
+
meal_type: mealType,
|
|
175
|
+
locale: "en-US",
|
|
176
|
+
});
|
|
177
|
+
const entryInput = {
|
|
178
|
+
meal_type: mealType,
|
|
179
|
+
food_ref: {
|
|
180
|
+
source: "estimate",
|
|
181
|
+
source_id: stableEstimateId(text),
|
|
182
|
+
name: text,
|
|
183
|
+
},
|
|
184
|
+
quantity: 1,
|
|
185
|
+
unit: "meal",
|
|
186
|
+
nutrients: estimate.total_nutrients,
|
|
187
|
+
confidence: estimate.confidence,
|
|
188
|
+
source_trace: "estimate",
|
|
189
|
+
tags: [],
|
|
190
|
+
wellness_context_refs: [],
|
|
191
|
+
};
|
|
192
|
+
const timestamp = optionString(parsed, "timestamp") ?? dateToNoonTimestamp(optionString(parsed, "date"));
|
|
193
|
+
const notes = optionString(parsed, "notes");
|
|
194
|
+
const gramsEstimate = sumGrams(estimate.items);
|
|
195
|
+
if (timestamp !== undefined) {
|
|
196
|
+
entryInput.timestamp = timestamp;
|
|
197
|
+
}
|
|
198
|
+
if (notes !== undefined) {
|
|
199
|
+
entryInput.notes = notes;
|
|
200
|
+
}
|
|
201
|
+
if (gramsEstimate !== undefined) {
|
|
202
|
+
entryInput.grams_estimate = gramsEstimate;
|
|
203
|
+
}
|
|
204
|
+
if (hasFlag(parsed, "preview")) {
|
|
205
|
+
console.log(JSON.stringify({
|
|
206
|
+
would_write: false,
|
|
207
|
+
estimate,
|
|
208
|
+
entry_preview: entryInput,
|
|
209
|
+
}, null, 2));
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
const entry = await addIntakeEntry(entryInput);
|
|
213
|
+
console.log(JSON.stringify(entry, null, 2));
|
|
214
|
+
return 0;
|
|
215
|
+
}
|
|
216
|
+
async function listCommand(args) {
|
|
217
|
+
const parsed = parseArgs(args);
|
|
218
|
+
const date = optionString(parsed, "date") ?? parsed.positionals[0];
|
|
219
|
+
const entries = await listIntakeEntries(date === undefined ? {} : { date });
|
|
220
|
+
console.log(JSON.stringify({ entries }, null, 2));
|
|
221
|
+
return 0;
|
|
222
|
+
}
|
|
223
|
+
async function editCommand(args) {
|
|
224
|
+
const parsed = parseArgs(args);
|
|
225
|
+
const id = optionString(parsed, "entry") ?? parsed.positionals[0];
|
|
226
|
+
if (id === undefined) {
|
|
227
|
+
console.error("Usage: nourish-mcp edit --entry <id> [--meal snack] [--quantity 2] [--notes text]");
|
|
228
|
+
return 1;
|
|
229
|
+
}
|
|
230
|
+
const patch = {};
|
|
231
|
+
const meal = optionString(parsed, "meal");
|
|
232
|
+
const quantity = optionString(parsed, "quantity");
|
|
233
|
+
const unit = optionString(parsed, "unit");
|
|
234
|
+
const timestamp = optionString(parsed, "timestamp");
|
|
235
|
+
const notes = optionString(parsed, "notes");
|
|
236
|
+
if (meal !== undefined) {
|
|
237
|
+
patch.meal_type = parseMealType(meal);
|
|
238
|
+
}
|
|
239
|
+
if (quantity !== undefined) {
|
|
240
|
+
patch.quantity = parsePositiveNumber(quantity, "quantity");
|
|
241
|
+
}
|
|
242
|
+
if (unit !== undefined) {
|
|
243
|
+
patch.unit = unit;
|
|
244
|
+
}
|
|
245
|
+
if (timestamp !== undefined) {
|
|
246
|
+
patch.timestamp = timestamp;
|
|
247
|
+
}
|
|
248
|
+
if (notes !== undefined) {
|
|
249
|
+
patch.notes = notes;
|
|
250
|
+
}
|
|
251
|
+
console.log(JSON.stringify(await updateIntakeEntry(id, patch), null, 2));
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
async function todayCommand(args) {
|
|
255
|
+
const parsed = parseArgs(args);
|
|
256
|
+
const summary = await buildDailySummary(optionString(parsed, "date"));
|
|
257
|
+
printSummary(summary, optionString(parsed, "format"));
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
async function weeklyCommand(args) {
|
|
261
|
+
const parsed = parseArgs(args);
|
|
262
|
+
const summary = await buildWeeklySummary(optionString(parsed, "start-date"));
|
|
263
|
+
printWeeklySummary(summary, optionString(parsed, "format"));
|
|
264
|
+
return 0;
|
|
265
|
+
}
|
|
266
|
+
async function exportCommand(args) {
|
|
267
|
+
const parsed = parseArgs(args);
|
|
268
|
+
const format = optionString(parsed, "format") ?? "jsonl";
|
|
269
|
+
if (format === "csv") {
|
|
270
|
+
process.stdout.write(await exportIntakeCsvData());
|
|
271
|
+
return 0;
|
|
272
|
+
}
|
|
273
|
+
if (format !== "jsonl") {
|
|
274
|
+
throw new Error("export --format must be jsonl or csv.");
|
|
275
|
+
}
|
|
276
|
+
process.stdout.write(await exportIntakeData());
|
|
277
|
+
return 0;
|
|
278
|
+
}
|
|
279
|
+
async function deleteCommand(args) {
|
|
280
|
+
const id = parseDeleteId(args);
|
|
281
|
+
if (id === undefined) {
|
|
282
|
+
console.error("Usage: nourish-mcp delete --entry <id>");
|
|
283
|
+
return 1;
|
|
284
|
+
}
|
|
285
|
+
const deleted = await deleteIntakeEntry(id);
|
|
286
|
+
console.log(JSON.stringify({ deleted, id }, null, 2));
|
|
287
|
+
return 0;
|
|
288
|
+
}
|
|
289
|
+
async function clearDayCommand(args) {
|
|
290
|
+
const parsed = parseArgs(args);
|
|
291
|
+
const date = optionString(parsed, "date") ?? parsed.positionals[0];
|
|
292
|
+
if (date === undefined || !hasFlag(parsed, "yes")) {
|
|
293
|
+
console.error("Usage: nourish-mcp clear-day <YYYY-MM-DD> --yes");
|
|
294
|
+
return 1;
|
|
295
|
+
}
|
|
296
|
+
console.log(JSON.stringify(await clearIntakeDay(date), null, 2));
|
|
297
|
+
return 0;
|
|
298
|
+
}
|
|
299
|
+
async function goalsCommand(args) {
|
|
300
|
+
const parsed = parseArgs(args);
|
|
301
|
+
const daily = {};
|
|
302
|
+
const calories = optionString(parsed, "set-calories");
|
|
303
|
+
const protein = optionString(parsed, "set-protein");
|
|
304
|
+
const carbs = optionString(parsed, "set-carbs");
|
|
305
|
+
const fat = optionString(parsed, "set-fat");
|
|
306
|
+
const water = optionString(parsed, "set-water");
|
|
307
|
+
if (calories !== undefined) {
|
|
308
|
+
daily.calories_kcal = parsePositiveNumber(calories, "set-calories");
|
|
309
|
+
}
|
|
310
|
+
if (protein !== undefined) {
|
|
311
|
+
daily.protein_g = parsePositiveNumber(protein, "set-protein");
|
|
312
|
+
}
|
|
313
|
+
if (carbs !== undefined) {
|
|
314
|
+
daily.carbohydrates_g = parsePositiveNumber(carbs, "set-carbs");
|
|
315
|
+
}
|
|
316
|
+
if (fat !== undefined) {
|
|
317
|
+
daily.fat_g = parsePositiveNumber(fat, "set-fat");
|
|
318
|
+
}
|
|
319
|
+
if (Object.keys(daily).length === 0 && water === undefined) {
|
|
320
|
+
console.log(JSON.stringify(await getGoals(), null, 2));
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
const input = {};
|
|
324
|
+
if (Object.keys(daily).length > 0) {
|
|
325
|
+
input.daily = daily;
|
|
326
|
+
}
|
|
327
|
+
if (water !== undefined) {
|
|
328
|
+
input.hydration_ml = parsePositiveNumber(water, "set-water");
|
|
329
|
+
}
|
|
330
|
+
console.log(JSON.stringify(await updateGoals(input), null, 2));
|
|
331
|
+
return 0;
|
|
332
|
+
}
|
|
333
|
+
async function waterCommand(args) {
|
|
334
|
+
const parsed = parseArgs(args);
|
|
335
|
+
const action = parsed.positionals[0];
|
|
336
|
+
const date = optionString(parsed, "date");
|
|
337
|
+
if (action === "today") {
|
|
338
|
+
console.log(JSON.stringify(await buildHydrationSummary(date), null, 2));
|
|
339
|
+
return 0;
|
|
340
|
+
}
|
|
341
|
+
const amount = action === undefined ? undefined : Number.parseFloat(action);
|
|
342
|
+
if (amount === undefined || !Number.isFinite(amount) || amount <= 0) {
|
|
343
|
+
console.error("Usage: nourish-mcp water <amount_ml> [--date YYYY-MM-DD]");
|
|
344
|
+
return 1;
|
|
345
|
+
}
|
|
346
|
+
const waterInput = {
|
|
347
|
+
amount_ml: amount,
|
|
348
|
+
source: "manual",
|
|
349
|
+
};
|
|
350
|
+
const timestamp = optionString(parsed, "timestamp") ?? dateToNoonTimestamp(date);
|
|
351
|
+
const notes = optionString(parsed, "notes");
|
|
352
|
+
if (timestamp !== undefined) {
|
|
353
|
+
waterInput.timestamp = timestamp;
|
|
354
|
+
}
|
|
355
|
+
if (notes !== undefined) {
|
|
356
|
+
waterInput.notes = notes;
|
|
357
|
+
}
|
|
358
|
+
console.log(JSON.stringify(await logWater(waterInput), null, 2));
|
|
359
|
+
return 0;
|
|
360
|
+
}
|
|
361
|
+
function parseDeleteId(args) {
|
|
362
|
+
if (args[0] === "--entry") {
|
|
363
|
+
return args[1];
|
|
364
|
+
}
|
|
365
|
+
return args[0];
|
|
366
|
+
}
|
|
367
|
+
function printSummary(summary, format) {
|
|
368
|
+
if (format === "markdown") {
|
|
369
|
+
console.log(dailySummaryMarkdown(summary));
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
373
|
+
}
|
|
374
|
+
function printWeeklySummary(summary, format) {
|
|
375
|
+
if (format === "markdown") {
|
|
376
|
+
console.log(weeklySummaryMarkdown(summary));
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
380
|
+
}
|
|
381
|
+
function dailySummaryMarkdown(summary) {
|
|
382
|
+
return [
|
|
383
|
+
"# Nourish Daily Summary",
|
|
384
|
+
"",
|
|
385
|
+
`- date: ${summary.date}`,
|
|
386
|
+
`- entries: ${summary.entry_count}`,
|
|
387
|
+
`- calories_kcal: ${summary.total_nutrients.calories_kcal ?? 0}`,
|
|
388
|
+
`- protein_g: ${summary.total_nutrients.protein_g ?? 0}`,
|
|
389
|
+
`- hydration_ml: ${summary.hydration.total_ml}`,
|
|
390
|
+
`- confidence: ${summary.confidence}`,
|
|
391
|
+
"",
|
|
392
|
+
"| meal | calories_kcal | protein_g |",
|
|
393
|
+
"| --- | --- | --- |",
|
|
394
|
+
...MEAL_TYPES.map((mealType) => `| ${mealType} | ${summary.by_meal[mealType].calories_kcal ?? 0} | ${summary.by_meal[mealType].protein_g ?? 0} |`),
|
|
395
|
+
].join("\n");
|
|
396
|
+
}
|
|
397
|
+
function weeklySummaryMarkdown(summary) {
|
|
398
|
+
return [
|
|
399
|
+
"# Nourish Weekly Summary",
|
|
400
|
+
"",
|
|
401
|
+
`- start_date: ${summary.start_date}`,
|
|
402
|
+
`- end_date: ${summary.end_date}`,
|
|
403
|
+
`- entries: ${summary.entry_count}`,
|
|
404
|
+
`- calories_kcal: ${summary.total_nutrients.calories_kcal ?? 0}`,
|
|
405
|
+
"",
|
|
406
|
+
"| date | entries | calories_kcal | hydration_ml |",
|
|
407
|
+
"| --- | --- | --- | --- |",
|
|
408
|
+
...summary.days.map((day) => `| ${day.date} | ${day.entry_count} | ${day.total_nutrients.calories_kcal ?? 0} | ${day.hydration.total_ml} |`),
|
|
409
|
+
].join("\n");
|
|
410
|
+
}
|
|
411
|
+
function parseArgs(args) {
|
|
412
|
+
const options = {};
|
|
413
|
+
const positionals = [];
|
|
414
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
415
|
+
const arg = args[index];
|
|
416
|
+
if (arg === undefined) {
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
if (!arg.startsWith("--")) {
|
|
420
|
+
positionals.push(arg);
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
const key = arg.slice(2);
|
|
424
|
+
const next = args[index + 1];
|
|
425
|
+
if (next !== undefined && !next.startsWith("--")) {
|
|
426
|
+
options[key] = next;
|
|
427
|
+
index += 1;
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
options[key] = true;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return { options, positionals };
|
|
434
|
+
}
|
|
435
|
+
function optionString(parsed, key) {
|
|
436
|
+
const value = parsed.options[key];
|
|
437
|
+
return typeof value === "string" ? value : undefined;
|
|
438
|
+
}
|
|
439
|
+
function hasFlag(parsed, key) {
|
|
440
|
+
return parsed.options[key] === true;
|
|
441
|
+
}
|
|
442
|
+
function parseMealType(value) {
|
|
443
|
+
if (MEAL_TYPES.includes(value)) {
|
|
444
|
+
return value;
|
|
445
|
+
}
|
|
446
|
+
throw new Error(`Invalid meal type: ${value}`);
|
|
447
|
+
}
|
|
448
|
+
function parsePositiveNumber(value, label) {
|
|
449
|
+
const parsed = Number.parseFloat(value);
|
|
450
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
451
|
+
throw new Error(`${label} must be a positive number.`);
|
|
452
|
+
}
|
|
453
|
+
return parsed;
|
|
454
|
+
}
|
|
455
|
+
function dateToNoonTimestamp(date) {
|
|
456
|
+
return date === undefined ? undefined : `${date}T12:00:00.000Z`;
|
|
457
|
+
}
|
|
458
|
+
function sumGrams(items) {
|
|
459
|
+
if (items.length === 0) {
|
|
460
|
+
return undefined;
|
|
461
|
+
}
|
|
462
|
+
return items.reduce((total, item) => total + item.grams, 0);
|
|
463
|
+
}
|
|
464
|
+
function stableEstimateId(text) {
|
|
465
|
+
return `estimate:${Buffer.from(text).toString("base64url").slice(0, 48)}`;
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|