recipal-mcp-unofficial

recipal-mcp-unofficial

An MCP server for ReciPal's nutrition-label API that lets AI assistants read and edit recipes, ingredients, and subrecipes, including bulk operations like cloning and swapping ingredients, with safety guards for destructive actions.

Category
访问服务器

README

recipal-mcp-unofficial

An MCP server for the ReciPal nutrition-label API. It lets an AI assistant read and edit your recipes, ingredients, and subrecipes directly — including bulk operations that would take hours in the web UI.

Unofficial. Not affiliated with, endorsed by, or supported by ReciPal. Built by users of the product against its public API.

Interim project — this repository will be archived. ReciPal is building an official MCP server. When theirs ships, this one will be updated to point at it and then archived read-only. Don't build anything load-bearing on it. See SUNSET.md.

You need an active paid ReciPal subscription. API access is a paid feature; the key comes from your account settings under API access. Without one, this server cannot do anything.

What it's for

ReciPal's web UI is fine for editing one recipe. It is painful when you need to do the same thing to forty of them — fix a serving size across a whole catalog, rename ingredients that came in with (copy) suffixes, or build a family of product variants that differ by one ingredient. This server exposes the API so an assistant can do that work in a loop, with a dry run first.

The tool that earns its keep is bulk_clone_and_swap: take one fully-configured recipe as a template, clone it N times, and swap a single ingredient in each clone. Label settings, tags, and serving sizes carry forward, so the clones come out consistent.

Scope and distribution

Deliberately narrow, and it will stay that way:

  • Source you clone and build. There is no one-click plugin bundle, no npx package, and no listing in any MCP directory or marketplace. That is a commitment made to ReciPal, not an oversight or a to-do item.
  • Not published to npm. The package.json is marked private on purpose.
  • Named recipal-mcp-unofficial at ReciPal's request, so it cannot be mistaken for their official server.

Pull requests that add packaged distribution, marketplace submissions, or a friendlier consumer install path will be declined. See CONTRIBUTING.md for what is welcome.

Install

Requires Node.js 18 or newer.

git clone https://github.com/BlackBlack/recipal-mcp-unofficial.git
cd recipal-mcp-unofficial
npm install
npm run build

Then register it with your MCP client. For Claude Code:

claude mcp add --transport stdio recipal-mcp-unofficial \
  --env RECIPAL_API_KEY=your_key_here \
  -- node /absolute/path/to/recipal-mcp-unofficial/build/index.js

For Claude Desktop, add to claude_desktop_config.json:

{
  "mcpServers": {
    "recipal-mcp-unofficial": {
      "command": "node",
      "args": ["/absolute/path/to/recipal-mcp-unofficial/build/index.js"],
      "env": { "RECIPAL_API_KEY": "your_key_here" }
    }
  }
}

Restart the client, then ask it to list your recipes. You should see 19 tools available. Full walkthrough in docs/SETUP.md.

⚠️ Read this before pointing it at a catalog you care about

The confirm: true and dry_run guards are supplied by the model, not by you. They stop a vaguely-worded prompt from causing damage. They do not stop a determined or confused agent — an assistant that decides to delete a recipe will pass confirm: true in the same call. ReciPal has no undo.

Because of that, the genuinely destructive tools are off by default. Turning them on is a deliberate act by the person running the server, not something a conversation can do:

Environment variable Enables Why it's gated
RECIPAL_MCP_ALLOW_DELETE=1 delete_recipe, delete_recipe_ingredient Permanent data loss, no undo
RECIPAL_MCP_ENABLE_RAW=1 recipal_request Can call any endpoint with any method

Everything else — all reads, and the ordinary create/update tools — works out of the box. The bulk tools are always available but default to dry_run: true, and refuse to execute unless the caller passes both dry_run: false and confirm: true.

Recommended practice regardless: work against a throwaway recipe first. Several endpoints behave differently from what the docs suggest (see Known limitations).

Configuration

Variable Default Purpose
RECIPAL_API_KEY — Required. From ReciPal account settings → API access
RECIPAL_MCP_ALLOW_DELETE off Expose the two delete tools
RECIPAL_MCP_ENABLE_RAW off Expose recipal_request
RECIPAL_MCP_DEBUG off Log full request bodies to stderr. Bodies contain recipe data and your client probably logs stderr to disk, so leave off routinely
RECIPAL_MCP_MAX_RETRIES 3 Retries on HTTP 429
RECIPAL_API_BASE https://www.recipal.com/api/v1 Override the endpoint. Must be https and a recipal.com host
RECIPAL_MCP_ALLOW_CUSTOM_BASE off Permit a non-recipal.com base. Your API key is sent to whatever it points at, so this is deliberately awkward

See .env.example.

Tools

22 tools total, 19 exposed by default. Generated reference with every parameter: docs/TOOLS.md.

Group Tools
Read list_recipes, get_recipe, get_recipe_nutrition, list_recipe_ingredients, get_recipe_ingredient, list_ingredients, get_ingredient, get_recipe_label
Recipe writes create_recipe, create_recipe_shortcut, update_recipe, scale_recipe, create_subrecipe, delete_recipe†
Ingredient-line writes create_recipe_ingredient, update_recipe_ingredient, delete_recipe_ingredient†, update_ingredient
Labels request_label_render
Bulk bulk_create_subrecipes, bulk_clone_and_swap
Escape hatch recipal_request†

† disabled by default.

Write tools take an open fields object rather than a fixed parameter list. ReciPal's published docs truncate before the full recipe attribute list, so hardcoding field names would have meant guessing; instead fields is passed straight through, Rails-style form-encoded (recipe[name]=...). Undocumented attributes work without a code change. Set as_json: true if an endpoint prefers JSON.

Read a real recipe before writing to one. get_recipe on an existing recipe shows the exact attribute names your account uses.

Known limitations

These are real, verified against the live API, and worth knowing before you build on this:

  • create_recipe_shortcut does not work. It returns HTTP 422 for every ingredients-array format tried. ReciPal's docs truncate before the parameter list, so the correct shape is unknown. Use create_recipe + create_recipe_ingredient, or scale_recipe to clone a configured template. The tool is left in place so the shape can be discovered — if you work it out, please open a PR.
  • PUT /recipe_ingredients/{id} silently ignores ingredient_id. It returns HTTP 200 with the original ingredient still attached. Swapping one ingredient for another must be done as delete-then-create, which is what bulk_clone_and_swap does internally.
  • ReciPal double-wraps almost every response — {recipe: {recipe_ingredients: [{recipe_ingredient: {…}}]}}. Reading fields off the outer envelope yields undefined with no error. If you extend this server, use the existing unwrap() / extractRecords() helpers.
  • Parameter names for scale_recipe and create_subrecipe are not published. They work via pass-through fields, but run each once against a throwaway recipe and read the response before looping.
  • The docs list /recipes/{id}/scale as PUT; POST is what actually works. Don't "fix" this without testing.
  • No pagination helper. list_recipes caps at 100 per page; walk pages yourself.

Rate limits

ReciPal documents roughly 175,000 requests/week, 1,000/minute (HTTP 429 beyond that), and a maximum of 5 concurrent label renders. This server honours 429 with Retry-After and exponential backoff, warns on stderr when fewer than 100 requests remain, and runs every bulk loop strictly sequentially with a configurable delay. Do not parallelise label renders.

Development

npm run typecheck   # tsc --noEmit
npm run build       # -> build/index.js
npm test            # offline smoke tests, no API key or network needed
npm run gen:docs    # regenerate docs/TOOLS.md from the running server
npm run verify      # all of the above

docs/TOOLS.md is generated by booting the built server and asking it for its own tool list, so the reference cannot drift from the code. CI fails if it's stale. If you add or change a tool, run npm run build && npm run gen:docs and commit the result.

Contributions welcome within the scope above — start with CONTRIBUTING.md, then docs/TESTING.md for how to verify changes against a live account, and docs/DESIGN.md for how the pieces fit.

License

Apache-2.0.

"ReciPal" is a trademark of its owner and is used here only to describe what this software talks to.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选