anova-oven-mcp
Anova Precision Oven 库 + MCP 服务器
该项目包含两个刻意分离的层:
anova_oven:一个异步 Python 库,用于 Anova 认证、设备发现、温度读取、烹饪控制、阶段和 APO 2.0 WebRTC 摄像头帧。anova_oven_mcp:基于该库的精简 MCP 2.x 适配器。
这种分离让未来可复用于 Raspberry Pi 服务或扩展,同时使 MCP 不成为核心依赖。
功能
捕获一帧 JPEG 摄像头帧,或作为异步迭代器持续消费帧。
读取四个物理烹饪传感器:干式顶部、干式底部、湿球和食物探针。当前生效的干式控制值单独返回。
启动和停止烹饪。定时阶段支持 1 秒至烤箱最大时长的 359,940 秒(99 小时 59 分钟);若省略时长,则将持续运行直至停止。
支持探针终止的烹饪,也支持顺序执行、定时、预热延迟或手动推进的阶段。
替换进行中烹饪的阶段列表。
返回 UTC 时刻的时、分、秒。
从 macOS Keychain、权限为 0600 的私有文件或注入的环境机密中加载凭据。
Related MCP server: Mealie MCP Server
重要状态与安全说明
烹饪命令会真实地触发设备动作。启动或更改烹饪的 MCP 工具必须带有 acknowledge_physical_action=true,并会校验烤箱文档中规定的温度、定时器、探针、加热元件、蒸汽、风扇和支架限制。
摄像头通路是私有移动应用协议,不属于 Anova 文档化的 Personal Access Token 命令范围。它当前要求:
Anova Precision Oven 2.0
存在进行中的烹饪
兼容或更新的固件
有效的 Anova 订阅
实时视频的命令或响应形式可能随未来的 Anova 应用/后端版本而变化。签名后的播放 URL 只保存在内部,库或 MCP 服务器绝不会返回这些 URL。
已完成的实测传感器、烹饪、摄像头和测试后安全检查,请参见 VALIDATION.md。
安装
需要 Python 3.11 或更高版本,推荐使用 Python 3.12。
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[server]"仅使用库而不需要 MCP 或视频:
python -m pip install -e .可选的扩展有 camera、mcp、server 和 test。基础安装可保持核心库轻量;若缺少可选运行时环境,anova-oven-mcp 命令会提示安装 mcp 或 server 附加模块。
凭据
默认凭据的搜索顺序是:
ANOVA_FIREBASE_REFRESH_TOKEN由
ANOVA_FIREBASE_REFRESH_TOKEN_FILE指定的文件macOS Keychain 的通用密码条目,其中:
service:
com.codex.anova-camera.firebase-refresh-tokenaccount:
anova-oven-mcp
固定的 Keychain 账户名可避免同一 service 下较旧的凭据被意外选中。Keychain 的读取和令牌轮换均直接使用 Apple 的 Security 框架,因此机密不会出现在进程参数中。
不要将刷新令牌写入源代码、MCP 配置、shell 历史或日志。对于 Raspberry Pi 的部署,推荐使用主机密钥管理器,或 root 拥有且权限为 0600 的凭据文件:
chmod 600 /run/credentials/anova-refresh-token
export ANOVA_FIREBASE_REFRESH_TOKEN_FILE=/run/credentials/anova-refresh-token若已配对多台烤箱,请在进程环境中设置 ANOVA_OVEN_ID。MCP 的 device-list 工具只会返回脱敏后的 ID;完整 ID 需在模型可见的上下文之外配置。
MCP 服务器
本地默认使用 stdio,因此不会打开监听端口:
.venv/bin/anova-oven-mcp通用的桌面 MCP 配置如下:
{
"mcpServers": {
"anova-oven": {
"command": "/absolute/path/to/anova-oven-mcp/.venv/bin/anova-oven-mcp"
}
}
}可用工具:
工具 | 用途 |
| 列出已配对的烤箱,仅显示脱敏 ID |
| 读取全部四个物理传感器温度以及干式控制值 |
| 返回一帧 |
| 启动单阶段定时、探针或无限期烹饪 |
| 启动多阶段烹饪 |
| 替换进行中烹饪的阶段列表 |
| 切换到已配置的阶段 UUID |
| 停止烹饪并关闭实时视频 |
| 返回 UTC 时、分、秒 |
Claude Code 和 Claude Desktop
与 Claude(程序)配套的配置器可以将这个本地 stdio 服务器注册到 Claude Code、Claude Desktop 或两者。它不会把 Anova 凭据复制进任一客户端。
先预览将要做的更改:
python scripts/configure_claude.py --dry-run配置两个客户端(Claude Code 默认使用用户作用域):
python scripts/configure_claude.py --target both其他可用选项:
# One client only
python scripts/configure_claude.py --target code
python scripts/configure_claude.py --target desktop
# Update an existing same-named Claude Code entry
python scripts/configure_claude.py --target code --replace
# Remove the entry from both clients
python scripts/configure_claude.py --removeClaude Desktop 配置会以原子方式合并,保留其他服务器并创建带时间戳、权限为 0600 的备份。随后请退出并重新打开 Claude Desktop。如需在本地检出之外分发此项目,Anthropic 当前最推荐的格式是可安装的 MCP Bundle(.mcpb)。
未来若用于 Pi 服务,同一个适配器也可改用 Streamable HTTP:
anova-oven-mcp --transport streamable-http这会绑定到 127.0.0.1:8766。非回环绑定需要 --allow-lan;在引入带认证的反向代理或 MCP 授权层之前,请勿暴露该服务。
库使用示例
import asyncio
from anova_oven import CookPlan, CookingStage, PrecisionOvenClient
async def main() -> None:
async with PrecisionOvenClient() as oven:
temperatures = await oven.get_temperatures()
print(temperatures.as_dict())
plan = CookPlan(
title="Two-stage example",
stages=(
CookingStage(
title="Warm",
target_celsius=60,
duration_seconds=600,
),
CookingStage(
title="Finish",
target_celsius=180,
duration_seconds=300,
),
),
)
# This physically starts the oven:
receipt = await oven.start_cook(plan)
print(receipt.stage_ids)
try:
frame = await oven.capture_frame(timeout=60)
with open("oven-frame.jpg", "wb") as output:
output.write(frame.jpeg_bytes)
finally:
await oven.stop_cook()
asyncio.run(main())对于连续多帧,可将 oven.frames() 用作异步迭代器。MCP 有意只提供单帧图像,因为无限持续流式工具调用在主机间移植性较差。
验证
python -m pip install -e ".[server,test]"
ruff check .
mypy src
pytest
python -m pip check只读账户检查如下:
python scripts/live_read_only.py受保护的摄像头自动测件会启动一个最低温度的三分钟烹饪,等待独立状态事件确认烹饪启动后,捕获一帧,再“尽责进行媒体清理”之前发出物理停止命令:
python scripts/live_camera_smoke.py --acknowledge-empty-oven-and-start-cook该测试已在 APO 2.0 上成功完成。所捕获的验证帧已放入项目 oven-camera-smoke.jpg。
协议来源
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables interaction with 3D printer management systems through an MCP server, supporting STL file manipulation, slicing, and control of printers like OctoPrint, Klipper, Duet, and more.103225GPL 2.0
- AlicenseNot gradedqualityBmaintenanceEnables interaction with Mealie for managing recipes, meal plans, shopping lists, foods, units, tags, categories, and more through MCP.MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for interacting with Fireboard BBQ temperature monitoring. Enables querying devices, live probe temperatures, Drive fan controller status, and historical cook sessions.MIT
- FlicenseNot gradedqualityBmaintenanceEnables control of external Home Assistant devices via an MCP control layer and frontend system page.
Related MCP Connectors
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
MCP server wrapping the Tesla Fleet API and TeslaMate API
Tailscale device, route, DNS, key, user, and ACL management over MCP and CLI.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ampdot-io/anova-oven-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server