食谱工具
用于从PDF或JPG文件提取食谱的MCP服务器。提供提示和工具,以便 一个LLM客户端(克劳德桌面,光标等)在结构化的交互式扫描食谱 可以转换HTML文件。
工作方式
这 FastMCP-服务器在 server.py 集中注册所有终端:
- 提示
generate_recipe-- 具有 Prompt 支持的 MCP 客户端配方工作流程 - 工具
get_recipe_prompt-- 只支持工具的客户端的配方工作流程 - 工具
select_image_regions_tool-- 使用OCR选择图像片段的网页GUI(自动打开浏览器) - 工具
get_working_directory_tool-- 显示工作目录 - 工具
build_recipe_html_tool-- 从结构化食谱数据生成HTML,并更新索引(生成index.html自动从模板(如果不存在) - 工具
get_server_version-- 返回服务器的当前版本号
项目结构
recipe-tools/
├── pyproject.toml
├── README.md
├── CLAUDE.md
├── .flake8
├── src/
│ └── recipe_processor/
│ ├── __init__.py
│ ├── server.py # Zentraler MCP-Server (FastMCP)
│ ├── assets/
│ │ ├── Template.html # HTML-Template fuer einzelne Rezepte
│ │ └── index_template.html # HTML-Template fuer die Rezeptuebersicht
│ ├── core/
│ │ ├── __init__.py
│ │ ├── utils.py # Gemeinsame Utils (Pfade, Verzeichnisse)
│ │ └── recipes_index.py # Rezept-Index-Verwaltung (HTML-Manipulation)
│ └── tools/
│ ├── __init__.py
│ ├── prompt.py # RECIPE_PROMPT Konstante
│ ├── html_builder.py # HTML-Erzeugung aus Rezeptdaten
│ └── image_selector/
│ ├── __init__.py
│ ├── tools.py # Tool-Funktionen (select, list, get_dir)
│ ├── web_gui.py # Browser-GUI (FastAPI + HTML Canvas)
│ ├── gui.py # Tkinter-GUI (inaktiv, Backup)
│ ├── export.py # Region-Export + OCR
│ ├── pdf_utils.py # PDF-Bildextraktion (PyMuPDF)
│ └── utils.py # transform_coords (image_selector-spezifisch)
└── tests/
├── __init__.py
├── test_prompt.py
├── test_server.py
├── test_html_builder.py
├── test_image_selector_tools.py
├── test_web_gui.py
└── test_recipes_index.py安装
安装uv(一次性)
# Option 1: winget
winget install astral-sh.uv
# Option 2: pip
pip install uv然后重新启动终端 uv im路径是。
设置环境变量(唯一,使uv venv/ 而非 .venv/ 使用)
[System.Environment]::SetEnvironmentVariable("UV_PROJECT_ENVIRONMENT", "venv", "User")然后重新启动终端。
设置项目
uv sync --extra dev
git config core.hooksPath .githooksUV 设置 venv/ 安装所有依赖关系并锁定精确的依赖关系 版本在 uv.lock第二个命令激活预推钩(运行) 克隆之后)。
前提条件
立方体OCR 必须安装并在 PATH 中。
配置 MCP 服务器
Claude Desktop 配置示例 (claude_desktop_config.json):
{
"mcpServers": {
"recipe-server": {
"command": "path/to/venv/Scripts/recipe-server",
"env": {
"IMAGE_SELECTOR_WORKING_DIR": "C:/Rezepte",
"IMAGE_SUBDIRECTORY": "Eingang"
}
}
}
}服务器手动启动
uv run recipe-server或者作为模块:
uv run python -m recipe_processor.server测试和涂层
uv run pytest
uv run flake8 src/ tests/
uv run black src/ tests/Der预推钩(.githooks/pre-push自动执行这三个步骤 在每个人面前 git push 从:black格式化代码,flake8检查错误, pytest 执行测试。如果黑色进行了更改,将推 取消 - 格式化仍然需要提交。
CI/CD
Die GitHub操作工作流(.github/workflows/)也使用 uv:
- 持续集成 (
ci.yml):每次推动和PR - Linting,格式化,测试时运行 - 发布 (
release.yml) 在 push 上创建main自动创建新
发布人 python-semantic-release如果有传统的委托 (feat:, fix:等等)。发布后,将 uv.lock 自动 更新并与 [skip ci] 坚信的。
uv.lock 它是存储库的一部分,并确保可重复安装。之后 一 git pull 足够 uv sync --extra dev更新环境。
独立模式(无 MCP 服务器)
图像选择器(Web GUI)
uv run python -m recipe_processor.tools.image_selector.tools --standalone自动打开浏览器GUI。加载 .env文件自动(通过 python-dotenv). 没有论据,图片就会出现 IMAGE_SUBDIRECTORY 装载。 可选,可以直接传输图像路径:
uv run python -m recipe_processor.tools.image_selector.tools --standalone pfad/zum/bild.jpgHTML生成器
uv run python -m recipe_processor.tools.html_builder rezept.json从包含食谱数据的 JSON 文件生成 HTML 文件。JSON 文件 包含与 build_recipe_html功能(recipe_name, ingredients, instructions等等)。加载 .env文件自动。
环境变量 (.env)
| 变量 | 描述 | Default |
|---|---|---|
IMAGE_SELECTOR_WORKING_DIR 工作目录 | os.getcwd() | |
IMAGE_SUBDIRECTORY 图片子目录(相对于Working Dir) | "" (Working Yourself) |
模板
在目录中 src/recipe_processor/assets/ 有两个HTML模板:
- 模板.html -- 单个食谱 HTML 文件的模板。生成时替换占位符:
| 占位符 | 内容 |
|---|---|
`, ` 食谱名称 | |
| `` | 简要描述 |
| `` 相对图像路径。 | |
| ` |
, , , 时间(Text) | , , , 时间标准(ISO 8601) | |港口| | | 所使用的厨房设备 (逗号分隔) | | 成分清单作为 | | 准备步骤如 | | Tips and Tips | | | 后值 | | ` 源语言 |
- 索引模板.html -- 食谱模板 (
index.html).删除占位符 `被类别部分取代。自动使用,如果原始目录中没有index.html` 存在 。
成分说明
在成分列表中,可以用图案覆盖 --- Text --- 被标记。它们将自动进入 Text 转换。
相同数量的成分(“je”语法)
形状的成分 je 1 TL Kreuzkuemmel und Chilipulver 自动进入 单个条目分为相同数量:
je 1 TL Kreuzkümmel und Chilipulver → 1 TL Kreuzkümmel
1 TL Chilipulver
je 1 TL Salz, Pfeffer und Paprika → 1 TL Salz
1 TL Pfeffer
1 TL Paprika已知单位: g, kg, mg, l, ml, cl, dl, EL, TL, Stk, Pck, Pkg, Pr, Prise, Msp, Bd, Bund.
国家(cookware)
可选字段 cookware 接受设备列表并给予它们 在 HTML 的“蛋糕设备”部分中以逗号分隔。如果该字段缺少或是空的, 部分将完全隐藏。
可选字段和有条件的 HTML 块
字段 prep_time, cook_time, wait_time, cookware, tips, nutrition 和 source 是可选的。如果字段为空,则相应的HTML块将被删除。 完全省略(输出中没有空头)。
依赖关系
| 包装 | 目的 |
|---|---|
| fastmcp | MCP服务器框架 |
| Pillow | 图像处理 |
| PyMuPDF | PDF 图像提取 |
| pytesseract | OCR 文本识别 |
| beautifulsoup4 | HTML解析(Rezept索引) |
| lxml | HTML解析器后端为BeautifulSoup提供支持 |
| python-dotenv | .env 文件加载(独立模式) |
| fastapi | Web框架浏览器GUI |
| uvicorn | ASGI服务器燃料浏览器GUI |
