Skip to main content
Glama
KrivchenkoEgor

mcp-recipe-shopping-list

Recipe Shopping List — MCP 服务器

MCP 服务器(Model Context Protocol),能够:

  1. 从 food.ru 读取食谱 — 通过链接获取食材、步骤、营养成分

  2. 在 magnit.ru 搜索商品 — 结合具体门店

  3. 生成购物清单 — 根据食谱找到带价格的商品并计算总计

  4. 显示门店信息 — 通过门店代码

结果:您提供食谱链接 — 即可获得现成的购物清单, 包含来自 Магнит 的价格和商品直链。

🎓 教学项目: 该项目用于教授零售连锁店的品类经理如何创建 MCP 服务器。这是一个完整的实践案例:从构思和技术规格书到可运行的、由 AI 助手使用的 MCP 服务器。学员在 AI 代理的帮助下构建一个可用的应用——解析 food.ru 上的食谱、在 magnit.ru 上搜索商品、生成带价格的购物清单——并在一次课程时间内获得积极成果。

🌐 网页版: 除了 MCP 接口外,还有一个本地网页界面——它不需要 MCP 客户端,在浏览器中即可运行。一条命令启动:

./start.sh   # запустить и открыть страницу в браузере (http://127.0.0.1:8000)
./stop.sh    # остановить сервер

在网页版中,您可以粘贴食谱链接,获得购物清单表格, 并将其保存为 Excel。详情见 网页界面 一节。


安装

快速方式:install.py 安装器

脚本 install.py(仅使用 Python 标准库——无需额外安装任何东西)会自行完成一切:创建虚拟环境、安装依赖和 Playwright 浏览器、创建 .env、将服务器注册到所选的 MCP 客户端,并检查一切是否正常。

需要 Python 3.11+(推荐使用 uv——安装器会同时找到 uv 和普通 Python)。

python install.py      # или: python3 install.py

所有标志均为可选:

标志

作用

--yes

对所有问题使用默认值回答

--shop-code КОД

Магнит 的门店代码(默认 543440)

--shop-type dostavka|supermarket|hypermarket

门店类型(默认 dostavka)

--clients opencode,claude

将服务器注册到哪些 MCP 客户端(逗号分隔)

--no-browser

不下载 Chromium 浏览器

--force

重新创建 .venv 并覆盖 .env

--check

仅检查环境——不做任何更改

--project ПУТЬ

项目文件夹(默认为安装器所在文件夹)

示例:

python install.py --check              # проверка окружения без изменений
python install.py --yes                # установка «на все по умолчанию»
python install.py --shop-code 992301 --clients opencode,claude

手动方式

需要 Python 3.11+(推荐使用 uv)。

# 1. Виртуальное окружение и зависимости
uv venv --python 3.11 .venv
uv pip install --python .venv/bin/python -r requirements.txt

# 2. Браузер для Playwright (оба сайта — SPA, без браузера никак)
.venv/bin/python -m playwright install chromium

# 3. Секреты
cp .env.example .env   # при необходимости поправь код магазина по умолчанию

Related MCP server: Recipe Commerce Intelligence MCP

启动

.venv/bin/python src/server.py

服务器通过 stdio 的 MCP 协议工作——由 AI 助手(Claude Desktop、LM Studio 等)调用,它自身在终端中“保持沉默”。

网页界面

网页版是针对不想连接 MCP 客户端的用户的本地网页:粘贴食谱链接——即可获得购物清单表格和保存为 Excel 的按钮。

启动(服务器会自己在浏览器中打开页面):

./start.sh     # запустить и открыть браузер
./stop.sh      # остановить сервер

如果服务器已在运行,再次执行 ./start.sh 只会打开页面。手动方式(如果脚本不适合):

.venv/bin/python src/web/server.py

在浏览器中打开:http://127.0.0.1:8000

页面的功能:

  • 粘贴 food.ru 的食谱链接并点击按钮——服务器会生成购物清单(请求网站需要 30–90 秒,期间显示加载指示器);

  • 显示表格:食材、数量、Магнит 中的商品、价格、需购买数量、合计、商品链接;

  • 通过「保存为 Excel」按钮将清单保存为 Excel 文件。

Excel 文件保存在项目根目录的 exports/ 文件夹中(文件名格式为 shopping_list_<рецепт>_<дата>.xlsx)。

连接 OpenCode

在 ~/.config/opencode/opencode.jsonc(全局)或项目根目录的 opencode.json 中添加 mcp 部分——格式与 Claude Desktop 不同(键为 mcp,command 为数组,变量为 environment):

{
  "mcp": {
    "recipe-shopping-list": {
      "type": "local",
      "command": [
        "/ПОЛНЫЙ/ПУТЬ/К/MCP_rec/.venv/bin/python",
        "/ПОЛНЫЙ/ПУТЬ/К/MCP_rec/src/server.py"
      ],
      "environment": {
        "MAGNIT_SHOP_CODE": "543440",
        "MAGNIT_SHOP_TYPE": "dostavka",
        "LOG_LEVEL": "INFO"
      },
      "enabled": true
    }
  }
}

重启 OpenCode 后,服务器将出现在 MCP 列表中(应用内使用 /mcp 命令)。在通过 OpenCode.app 安装的版本中,从终端运行(opencode mcp list)不可用——CLI 是 Electron 封装。

连接 Claude Desktop

在 claude_desktop_config.json 中添加(路径必须是绝对路径):

{
  "mcpServers": {
    "recipe-shopping-list": {
      "command": "/ПОЛНЫЙ/ПУТЬ/К/MCP_rec/.venv/bin/python",
      "args": ["/ПОЛНЫЙ/ПУТЬ/К/MCP_rec/src/server.py"],
      "env": {
        "MAGNIT_SHOP_CODE": "543440",
        "MAGNIT_SHOP_TYPE": "dostavka",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

工具

工具

作用

parse_foodru_recipe(recipe_url)

来自 food.ru 的食谱:食材、步骤、营养成分

search_magnit_product(query, shop_code, shop_type, filters)

在 magnit.ru 上搜索商品

get_shopping_list(recipe_url, shop_code, shop_type)

带价格和总计的购物清单

get_shop_info(shop_code)

门店信息

示例

«这是食谱:https://food.ru/recipes/269806-sous-iz-iogurta-s-ukropom-i-chesnokom-1766588076»

代理将调用 get_shopping_list 并返回:

Греческий йогурт — 100г → Йогурт греческий Teos 2% 140г — 89,90 ₽ [ссылка]
Чеснок — 2 зубчик =10г → Чеснок свежий 100г — 45,00 ₽ [ссылка]
...
Итого: 356,70 ₽ · 6 товаров

测试

快速逻辑测试(不访问网站——解析器用 mock 代替):

.venv/bin/python -m pytest tests/ -v

实时集成测试——通过 Playwright 真实打开 food.ru 和 magnit.ru,就像工作服务器一样(约 1 分钟,请求之间带停顿):

.venv/bin/python -m pytest -m integration -v

实时测试规则:网站不可访问(网络问题)——测试跳过;网站有响应但结构不符——测试失败(页面结构已更改,该更新选择器并记录经验到 LESSONS.md 了)。

结构

src/
├── server.py                  # Точка входа MCP-сервера
├── tools/                     # MCP-инструменты (бизнес-логика)
├── integrations/              # Парсеры сайтов (Playwright)
├── models/                    # Pydantic-модели
├── utils/                     # Кэш, ограничитель запросов, валидаторы
└── config/                    # Настройки (.env) и селекторы

重要须知

  • 这两个网站(food.ru、magnit.ru)都是 SPA:数据通过 JavaScript 加载。因此解析器使用 Playwright(无头浏览器)工作,而不是简单的 HTTP。

  • 对网站的请求之间会有 2–5 秒的停顿,结果会被缓存(食谱缓存 24 小时,商品缓存 15 分钟)。

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    MCP server for the Pepesto API — give your agent the ability to turn any recipe (a URL, plain text, or a photo) into a matched basket of real supermarket products with live prices, across 26 European supermarkets. The MCP covers the recipe → matched cart half of the grocery shopping workflow (parse / search / map ingredients to SKUs / check catalogs).
    7
    51 npm
    7
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Extracts branded ingredients and kitchen tools from recipes, matches them to affiliate products, and generates shoppable ingredient lists to turn recipes into affiliate revenue.
    3
    47 npm
    1
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    Enables cross-store price comparison and recipe-driven cart automation for Israeli grocery stores Shufersal and Tiv Taam, with an extensible architecture for additional stores.
    14
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables automated weekly meal planning and grocery price comparison across Swedish supermarkets through a Claude/GPT interface.
    3
    MIT