食谱管理服务器

Tandoor Recipes MCP Server是一个提供全面食谱管理、购物清单、膳食计划和库存跟踪功能的模型上下文协议服务器。

  • by ChristopherJMiller
  • Rust
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 ChristopherJMiller/tandoor-mcp

使用说明

Tandoor食谱MCP服务器

一种模型上下文协议(MCP)服务器 Tandoor食谱 它提供全面的食谱管理、购物清单、膳食计划和库存跟踪功能。

特性

  • 配方管理:搜索、创建和管理食谱
  • 购物单:添加商品、标记为已购买以及管理购物工作流
  • 膳食计划:计划膳食和管理膳食时间表
  • 库存跟踪:监控食品储藏室物品并获取食谱建议
  • 关键词和标签:使用关键字和类别组织食谱
  • 烹饪日志:跟踪烹饪历史和评分

快速开始

  1. 克隆存储库:
git clone https://github.com/your-repo/mcp-tandoor
cd mcp-tandoor
  1. 配置环境变量:
export TANDOOR_BASE_URL="http://localhost:8080"
export TANDOOR_USERNAME="admin"
export TANDOOR_PASSWORD="your-password"
  1. 运行服务器:

建议使用防锈漆:

cargo run

油箱门配置

⚠️ 重要:Tandoor使用多对映者权限系统,该系统需要对API访问进行特定设置才能正常工作。如果没有适当的空间和组配置,即使使用有效的身份验证,也会出现权限错误。

方法1:Web界面设置(推荐)

  1. 访问Tandoor管理界面:

    • 首选 http://your-tandoor-url/admin/
    • 使用超级用户凭据登录
  2. 创建/验证组:

    • 引导到 验证和授权 → 群组
    • 确保这些组存在: admin, user, guest
    • 如果缺少,请创建它们(名称必须完全匹配)
  3. 创建空间:

    • 引导到 烹饪书 → 空间
    • 点击 添加空间
    • 填写:
      • 名字:您的组织/空间名称(例如“制作”、“家庭”)
      • 最大食谱:0(无限制)
      • 最大用户:0(无限制)
      • 最大文件存储mb:0(无限制)
      • 允许共享:已检查
    • 点击 保存
  4. 创建用户空间关联:

    • 引导到 烹饪书 → 用户空间
    • 点击 添加用户空间
    • 选择:
      • 用户:您的管理员用户
      • 太空:您刚才创建的空间
      • 活跃的:必须检查
    • 点击 保存
    • 保存后,单击创建的用户空间条目
    • 在 群组,选择 admin 并添加它
    • 点击 保存

方法2:命令行设置

如果您更喜欢命令行或没有web管理员权限:

# Enter your Tandoor container
docker exec -it your-tandoor-container /opt/recipes/venv/bin/python manage.py shell

# Run this Python code:
from cookbook.models import Space, UserSpace
from django.contrib.auth.models import User, Group

# Get your admin user (replace 'admin' with your username)
admin_user = User.objects.get(username='admin')

# Create a space
space, created = Space.objects.get_or_create(
    name='Production',  # Choose your space name
    defaults={
        'created_by': admin_user,
        'max_recipes': 0,
        'max_users': 0,
        'max_file_storage_mb': 0,
        'allow_sharing': True
    }
)

# Associate user with space
user_space, created = UserSpace.objects.get_or_create(
    user=admin_user,
    space=space,
    defaults={'active': True}
)

# Ensure it's active if it already existed
if not created and not user_space.active:
    user_space.active = True
    user_space.save()

# Add user to admin group in this space
admin_group = Group.objects.get(name='admin')
user_space.groups.add(admin_group)

验证

测试您的设置是否正常工作:

# Get an API token
curl -X POST http://your-tandoor-url/api-token-auth/ \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"your-password"}'

# Test API access
curl -X GET http://your-tandoor-url/api/keyword/ \
  -H "Authorization: Bearer <YOUR_TOKEN>"

您应该得到一个包含关键字的JSON响应

配置

环境变量

变量 描述 默认值
TANDOOR_BASE_URL Tandoor实例的完整URL http://localhost:8080
TANDOOR_USERNAME Tandoor身份验证的用户名 admin
TANDOOR_PASSWORD Tandoor身份验证密码 admin
BIND_ADDR MCP服务器的地址和端口 127.0.0.1:3001

运行时配置

# Example with custom configuration
TANDOOR_BASE_URL="https://recipes.mycompany.com" \
TANDOOR_USERNAME="api-user" \
TANDOOR_PASSWORD="secure-password" \
BIND_ADDR="0.0.0.0:8000" \
cargo run

可用工具

MCP服务器提供以下工具:

配方管理

  • search_recipes -通过灵活的查询搜索食谱
  • get_recipe_details -获取按比例配料的全面配方信息
  • create_recipe -创建新配方
  • import_recipe_from_url -从外部URL导入配方

购物单

  • add_to_shopping_list -通过智能整合将商品添加到购物清单中
  • get_shopping_list -获取按店铺分类的当前购物清单
  • check_shopping_items -将购物清单项目标记为已检查/已购买
  • clear_shopping_list -从购物清单中清除已检查的商品,并更新食品柜

食品和库存

  • search_foods -搜索名称匹配模糊的食品/配料
  • update_pantry -更新食品储藏室库存状态
  • suggest_from_inventory -根据当前库存获取食谱建议

膳食计划

  • get_meal_plans -获取约会范围内的用餐计划
  • create_meal_plan -制定新的用餐计划
  • delete_meal_plan -删除用餐计划
  • get_meal_types -获取可用的膳食类型

元数据

  • get_keywords -获取所有可用的食谱关键字/标签
  • get_units -获取可用的测量单位

烹饪历史

  • get_cook_log -获取烹饪历史记录
  • log_cooked_recipe -记录一份烹饪好的食谱

故障排除

“未提供身份验证凭据”

这表示OAuth2令牌格式错误。确保您正在使用:

  • Authorization: Bearer YOUR_TOKEN
  • 令牌来自 /api-token-auth/ 端点

“您没有执行此操作的权限”

这是Tandoor权限问题:

  1. 检查用户是否在组中:
user = User.objects.get(username='your-username')
print(f"Groups: {[g.name for g in user.groups.all()]}")
  1. 检查UserSpace是否处于活动状态:
user_spaces = UserSpace.objects.filter(user=user)
for us in user_spaces:
    print(f"Space: {us.space.name}, Active: {us.active}")
  1. 最常见的修复:
# Make sure UserSpace is active
user_space = UserSpace.objects.get(user=user)
user_space.active = True
user_space.save()

“请求被限制”

Tandoor有速率限制。请稍候,然后重试,或者检查您是否发出了太多的身份验证请求。MCP服务器实现了共享身份验证来防止这种情况。

连接被拒绝/网络错误

  • 验证 TANDOOR_BASE_URL 正确且可访问
  • 检查Tandoor是否正在运行: curl http://your-tandoor-url/
  • 验证防火墙/网络配置

Django作用域错误

ScopeError: A scope on dimension(s) space needs to be active for this query

这意味着空间范围未激活。按照上面的Tandoor配置部分修复权限。

发展

从源头构建

# Clone the repository
git clone https://github.com/your-repo/mcp-tandoor
cd mcp-tandoor

# Build in development mode
cargo build

# Run with debug logging
RUST_LOG=debug cargo run

运行测试

该项目包括一个全面的测试脚本,用于管理Docker服务和运行集成测试:

# Run full test suite (clean start, run tests, cleanup)
./scripts/test.sh test

# Keep services running after tests (for debugging)
./scripts/test.sh test --keep-running

# Run tests with verbose output
./scripts/test.sh test --verbose

# Manual service management
./scripts/test.sh up      # Start Tandoor services
./scripts/test.sh down    # Stop services
./scripts/test.sh reset   # Clean and restart services
./scripts/test.sh clean   # Clean volumes only
./scripts/test.sh logs    # View service logs

测试要求:

  • 已安装Docker和Docker Compose
  • 端口8080(Tandoor)和5432(PostgreSQL)可用
  • 为Docker卷提供足够的磁盘空间

关于利率限制的说明: Tandoor将身份验证限制为每天10个请求。测试脚本会自动获取并在所有测试中共享一个令牌,以避免达到此限制。

速率限制考虑因素

Tandoor对身份验证端点有极其严格的速率限制:

  • 每个IP地址每天10个身份验证请求
  • 速率限制在UTC午夜或Tandoor重新启动时重置
  • 超过限额退货 429 Too Many Requests

验证期间的处理速率限制

  1. 代币共享:使用全局令牌存储在所有工具调用之间共享身份验证
  2. 环境令牌:接受 TANDOOR_AUTH_TOKEN 完全绕过身份验证
  3. 优雅的后退:如果令牌过期,则回退到存储的凭据

最佳实践

# Get a token once and reuse it
TOKEN=$(curl -X POST http://localhost:8080/api-token-auth/ \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"your-password"}' | jq -r .token)

# Use the token for all subsequent requests
TANDOOR_AUTH_TOKEN="$TOKEN" cargo run

开发工作流程

# Start Tandoor and get a fresh token
./scripts/test.sh up
TOKEN=$(./scripts/get_token.sh admin testing1 http://localhost:8080)

# Use the token for development
TANDOOR_AUTH_TOKEN="$TOKEN" cargo run

# When done for the day
./scripts/test.sh down

如果你达到了利率上限

  1. 等到UTC午夜 (速率限制重置)
  2. 重新启动Tandoor 重置计数器:
    docker restart your-tandoor-container
    
  3. 使用现有令牌 如果你有一个保存