使用说明
Tandoor食谱MCP服务器
一种模型上下文协议(MCP)服务器 Tandoor食谱 它提供全面的食谱管理、购物清单、膳食计划和库存跟踪功能。
特性
- 配方管理:搜索、创建和管理食谱
- 购物单:添加商品、标记为已购买以及管理购物工作流
- 膳食计划:计划膳食和管理膳食时间表
- 库存跟踪:监控食品储藏室物品并获取食谱建议
- 关键词和标签:使用关键字和类别组织食谱
- 烹饪日志:跟踪烹饪历史和评分
快速开始
- 克隆存储库:
git clone https://github.com/your-repo/mcp-tandoor
cd mcp-tandoor
- 配置环境变量:
export TANDOOR_BASE_URL="http://localhost:8080"
export TANDOOR_USERNAME="admin"
export TANDOOR_PASSWORD="your-password"
- 运行服务器:
建议使用防锈漆:
cargo run
油箱门配置
⚠️ 重要:Tandoor使用多对映者权限系统,该系统需要对API访问进行特定设置才能正常工作。如果没有适当的空间和组配置,即使使用有效的身份验证,也会出现权限错误。
方法1:Web界面设置(推荐)
-
访问Tandoor管理界面:
- 首选
http://your-tandoor-url/admin/ - 使用超级用户凭据登录
- 首选
-
创建/验证组:
- 引导到 验证和授权 → 群组
- 确保这些组存在:
admin,user,guest - 如果缺少,请创建它们(名称必须完全匹配)
-
创建空间:
- 引导到 烹饪书 → 空间
- 点击 添加空间
- 填写:
- 名字:您的组织/空间名称(例如“制作”、“家庭”)
- 最大食谱:0(无限制)
- 最大用户:0(无限制)
- 最大文件存储mb:0(无限制)
- 允许共享:已检查
- 点击 保存
-
创建用户空间关联:
- 引导到 烹饪书 → 用户空间
- 点击 添加用户空间
- 选择:
- 用户:您的管理员用户
- 太空:您刚才创建的空间
- 活跃的:必须检查
- 点击 保存
- 保存后,单击创建的用户空间条目
- 在 群组,选择
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权限问题:
- 检查用户是否在组中:
user = User.objects.get(username='your-username')
print(f"Groups: {[g.name for g in user.groups.all()]}")
- 检查UserSpace是否处于活动状态:
user_spaces = UserSpace.objects.filter(user=user)
for us in user_spaces:
print(f"Space: {us.space.name}, Active: {us.active}")
- 最常见的修复:
# 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
验证期间的处理速率限制
- 代币共享:使用全局令牌存储在所有工具调用之间共享身份验证
- 环境令牌:接受
TANDOOR_AUTH_TOKEN完全绕过身份验证 - 优雅的后退:如果令牌过期,则回退到存储的凭据
最佳实践
# 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
如果你达到了利率上限
- 等到UTC午夜 (速率限制重置)
- 重新启动Tandoor 重置计数器:
docker restart your-tandoor-container - 使用现有令牌 如果你有一个保存