内容
# Mealforge
[](https://github.com/LooseWireDev/mealforge/actions/workflows/release.yml)
[](LICENSE)
**AI计划的餐食,在真正的应用程序中。** 与任何支持MCP的AI聊天(LibreChat,Claude等)进行对话式计划——模型将完成的计划推送到这里,它变成了食谱卡,逐步烹饪模式和您在商店中可以勾选的购物清单。计划是您需要的任何内容:一个星期的晚餐,几个早餐或一个大星期日烹饪——每个餐食都标记为早餐,午餐,晚餐或小吃。
餐食计划应用程序将您限制在他们的食谱目录中。mealforge **没有目录**:每个食谱都是在对话中生成的,根据您的家庭,限制和当前的需求量身定制。该应用程序是您和模型共同决定的结构化,可购置和可烹饪的家园。

| 购物清单,按商店分类 | 食谱和烹饪模式 |
|:---:|:---:|
|  |  |
## 工作原理
```
┌────────────┐ MCP(可流式HTTP) ┌─────────────────────────────┐
│ 您的AI │ ───────────────────────▶ │ mealforge │
│ 聊天 │ push_meal_plan │ • 活跃/即将/ │
│ (LibreChat,│ activate_meal_plan │ 已完成的餐食计划 │
│ Claude, │ search_recipes │ • 食谱+烹饪模式 │
│ 等。) │ list_favorites … │ • 购物清单(派生) │
└────────────┘ │ • 收藏+历史记录 │
└─────────────────────────────┘
```
1. **在聊天中计划。** “这个星期有很多慢炖锅,三文鱼一次,用冰箱里的猪肩肉” - 或者“只有三个长周末的早餐。”迭代直到正确。
2. **模型推送最终计划**(`push_meal_plan`):1+餐食类型为早餐/午餐/晚餐/小吃,通过结构化食谱构建 - 包括具有数量,单位和商店分类的配料,以及降价烹饪步骤。
3. **一个计划是活跃的。** 新计划排队为*即将*;当您准备好了时,推广一个计划,当您已经烹饪完毕时,完成它。已完成的计划成为可浏览的历史记录,命名计划可以被收藏,以便稍后再次烹饪。
4. **mealforge自动派生购物清单** 从活跃的计划:汇总食谱中的配料(“2杯”+“1杯”→“3杯”),按商店分类,购物时可勾选。
5. **收藏您喜欢的。** 模型可以回忆收藏的食谱*和*收藏的计划(“再次运行墨西哥星期一”)并避免重复最近的餐食。
这是计划到位的瞬间,端到端 - 空应用程序,MCP推送,食谱,烹饪模式,购物清单:
<p align="center"><img src="docs/demo.gif" width="390" alt="演示:一个空的星期填充了代理推送计划,然后是食谱,烹饪模式和购物清单"></p>
## 快速入门(自行托管)
您只需要Docker。镜像发布到GHCR,适用于**amd64和arm64**(Raspberry Pi 4/5和其他ARM板)。
```bash
mkdir mealforge && cd mealforge
curl -O https://raw.githubusercontent.com/loosewiredev/mealforge/main/docker-compose.yml
docker compose up -d
```
Web应用程序和MCP端点现在位于端口`8090`:
- Web UI:`http://<host>:8090`
- MCP端点:`http://<host>:8090/mcp`
数据存储在`./data/`下的单个SQLite文件中 - 备份该文件夹,您就备份了所有内容。
> **安全注意:** mealforge没有内置身份验证。它设计用于私人网络中的家庭 - 将其放在您的Tailscale/VPN上,或使用身份验证的反向代理后面。不要将其公开暴露在互联网上。
### 配置
一个变量很重要:设置`APP_URL`(在docker-compose文件或旁边的`.env`文件中)为您家庭使用的URL,例如`APP_URL=https://mealforge.your-tailnet.ts.net` - MCP工具返回它,以便模型可以链接到应用程序。有关完整列表,请参见[`.env.example`](.env.example)。
### 验证您的安装
```bash
bash <(curl -fsSL https://raw.githubusercontent.com/loosewiredev/mealforge/main/scripts/verify-mcp.sh) http://<host>:8090
```
此操作对MCP端点进行端到端测试:初始化,列出工具,推送测试计划,读取它并将其标记为完成,以便它永远不会成为您的活跃计划。历史记录中完成的“验证脚本测试计划”条目可以忽略。
### 更新
```bash
docker compose pull && docker compose up -d
```
`latest` 跟踪主分支。 使用semver或`sha-*`标签在[GHCR package](https://github.com/LooseWireDev/mealforge/pkgs/container/mealforge)中固定特定版本。 要从源代码构建而不是拉取,请参阅[`docker-compose.yml`](docker-compose.yml)中的注释。
## 连接您的AI
任何通过可流式HTTP的MCP工作的客户端都可以 - 将其指向`http://<host>:8090/mcp`。无需身份验证标头(参见上面的安全说明)。
### LibreChat
`librechat.yaml`:
```yaml
mcpServers:
mealforge:
type: streamable-http
url: http://<host>:8090/mcp
timeout: 60000
```
如果mealforge在私有IP上运行,也请将其排除在LibreChat的SSRF防护之外:
```yaml
mcpSettings:
allowedAddresses:
- "<host>:8090"
```
然后重启LibreChat容器并为您的代理/端点启用`mealforge`工具。
### Claude 代码
```bash
claude mcp add --transport http mealforge http://<host>:8090/mcp
```
### Claude 桌面版
设置 → 连接器 → **添加自定义连接器** → 粘贴 `http://<host>:8090/mcp`。(URL必须是从Claude Desktop运行的机器可访问的 - 在tailnet上,使用tailnet URL。)
## 教您的代理进行餐食计划(推荐)
仓库中附带了一个现成的代理技能:[`skills/meal-planning/SKILL.md`](skills/meal-planning/SKILL.md)。它教会代理整个工作流程:首先收集历史记录,在对话中草拟计划,仅在明确命令时通过可靠的两步流程发布计划(每个食谱的`create_recipe`,然后一个`push_meal_plan`带有recipeIds),根据命令管理活跃/即将/已完成的生命周期,保持配料数据购物清单清洁,并从验证错误中恢复。强烈推荐 - 尤其适用于较小的模型。
- **Claude 代码 / 代理技能**:将`skills/meal-planning/`目录复制到您的技能文件夹中(例如`~/.claude/skills/`)。
- **LibreChat**:将`SKILL.md`的内容粘贴到您的餐食计划代理的说明中(或将其作为代理技能/文件附加)。
- **其他**:它纯粹是markdown - 以客户端接受指令的任何方式将其交给您的代理。
## MCP 工具
| 工具 | 用途 |
|---|---|
| `create_recipe` | 保存一个食谱(平面有效载荷)并获取一个`recipeId` - 在`push_meal_plan`之前可靠的第一步。 |
| `push_meal_plan` | 推送一个最终的1+餐食计划(新食谱和/或`recipeId`重用)。如果没有,则变为活跃;否则变为即将。传递`planId`以修订计划;已勾选的购物物品如果未更改,则保持勾选状态。 |
| `list_meal_plans` | 具有状态,名称和餐食标题的计划 - 按状态或收藏夹过滤。用于避免重复和召回收藏夹计划。 |
| `get_meal_plan` | 通过`planId`获取一个计划。 |
| `get_active_meal_plan` | 家庭当前正在烹饪的计划(如果有)。 |
| `activate_meal_plan` | 将即将到来的(或已完成的)计划提升为活跃 - 如果另一个计划活跃,则失败。 |
| `complete_meal_plan` | 将计划(默认为活跃的计划)标记为已烹饪完成。 |
| `list_favorites` | 家庭在UI中收藏的食谱。 |
| `search_recipes` | 按标题,标签或配料搜索过去的食谱。 |
| `get_recipe` | 通过ID获取完整的食谱(配料+步骤+餐食类型)。 |
工具输入故意宽容(字符串数字,像`"1/2"`这样的分数数量,双重包装的数组都被强制转换),验证错误会命名确切的字段并包含有效的示例 - 因此模型可以自我纠正而不是失败。
## 开发
欢迎贡献 - 有关设置,检查和约定的详细信息,请参见[CONTRIBUTING.md](CONTRIBUTING.md)。
要求:Node 22和pnpm(`corepack enable`为您获取pnpm)。它是一个Nx monorepo:`apps/api`(Hono + tRPC + Drizzle + SQLite,提供MCP端点和构建的Web应用程序),`apps/web`(React + Vite + TanStack Router + Tailwind)。
```bash
pnpm install
pnpm nx run-many -t test,build # 单元测试 + 构建
pnpm --filter @mealforge/api dev # API在:3000
pnpm --filter @mealforge/web dev # 网站在:5173(代理/trpc到:3000)
pnpm exec playwright test # 生产构建的e2e(先构建)
```
## 许可证
[MIT](LICENSE)