menus-mcp 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- menus_mcp-1.0.0/PKG-INFO +151 -0
- menus_mcp-1.0.0/README.md +138 -0
- menus_mcp-1.0.0/menus_mcp/__init__.py +137 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/africa.md +54 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/americas.md +100 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/asia_china.md +320 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/asia_east.md +110 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/asia_se.md +109 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/asia_south.md +50 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/europe_south.md +181 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/middle_east.md +76 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/oceania.md +40 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/by_region/world_fusion.md +71 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/kb_cuisine_index.json +2064 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/kb_dish_index.json +5546 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/kb_hierarchy.json +1272 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/kb_keyword_index.json +872 -0
- menus_mcp-1.0.0/menus_mcp/knowledge_base/kb_price_index.json +404 -0
- menus_mcp-1.0.0/menus_mcp/recommender.py +372 -0
- menus_mcp-1.0.0/menus_mcp.egg-info/PKG-INFO +151 -0
- menus_mcp-1.0.0/menus_mcp.egg-info/SOURCES.txt +25 -0
- menus_mcp-1.0.0/menus_mcp.egg-info/dependency_links.txt +1 -0
- menus_mcp-1.0.0/menus_mcp.egg-info/entry_points.txt +2 -0
- menus_mcp-1.0.0/menus_mcp.egg-info/requires.txt +1 -0
- menus_mcp-1.0.0/menus_mcp.egg-info/top_level.txt +1 -0
- menus_mcp-1.0.0/pyproject.toml +34 -0
- menus_mcp-1.0.0/setup.cfg +4 -0
menus_mcp-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: menus-mcp
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: 全球美食推荐 MCP server:基于 396 道菜的知识库做加权随机推荐
|
|
5
|
+
Author: spyyps
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/spyyps/recommend-dish
|
|
8
|
+
Project-URL: Repository, https://github.com/spyyps/recommend-dish
|
|
9
|
+
Keywords: mcp,food,recommendation,menu,美食,推荐
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: mcp>=1.0
|
|
13
|
+
|
|
14
|
+
# menus-mcp:全球美食推荐 MCP Server
|
|
15
|
+
|
|
16
|
+
基于 396 道菜、40 个菜系的全球美食知识库做加权随机推荐。任何支持 Model Context Protocol(MCP)的 AI agent 均可使用,包括:
|
|
17
|
+
|
|
18
|
+
- [Claude Desktop](https://claude.ai/download)
|
|
19
|
+
- [Cline](https://github.com/cline/cline)
|
|
20
|
+
- [Cursor](https://cursor.sh)
|
|
21
|
+
- [Continue](https://continue.dev)
|
|
22
|
+
- 其他 MCP 兼容客户端
|
|
23
|
+
|
|
24
|
+
## 快速安装
|
|
25
|
+
|
|
26
|
+
### 方式 1:uvx(推荐,无需安装)
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"mcpServers": {
|
|
31
|
+
"menus": {
|
|
32
|
+
"command": "uvx",
|
|
33
|
+
"args": ["menus-mcp"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`uvx` 会自动从 PyPI 下载并运行,首次启动稍有延迟(数据加载约 1s),后续缓存到本地。
|
|
40
|
+
|
|
41
|
+
### 方式 2:pip install
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install menus-mcp
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
然后在 MCP 客户端配置中:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"mcpServers": {
|
|
52
|
+
"menus": {
|
|
53
|
+
"command": "menus-mcp"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 方式 3:本地源码运行
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
git clone https://github.com/spyyps/recommend-dish
|
|
63
|
+
cd recommend-dish
|
|
64
|
+
pip install -r mcp-server/requirements.txt
|
|
65
|
+
# 运行入口
|
|
66
|
+
python3 mcp-server/server.py
|
|
67
|
+
# 或在 mcp-server/ 目录下:
|
|
68
|
+
cd mcp-server && python3 -m menus_mcp
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
然后客户端配置:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"mcpServers": {
|
|
76
|
+
"menus": {
|
|
77
|
+
"command": "python3",
|
|
78
|
+
"args": ["/path/to/recommend-dish/mcp-server/server.py"]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 开放的工具
|
|
85
|
+
|
|
86
|
+
### `recommend_dishes`
|
|
87
|
+
|
|
88
|
+
主推荐工具。参数(皆为可选):
|
|
89
|
+
|
|
90
|
+
| 参数 | 类型 | 默认 | 说明 |
|
|
91
|
+
|------|------|------|------|
|
|
92
|
+
| `count` | int | 3 | 推荐数量 |
|
|
93
|
+
| `keywords` | str | "" | 逗号分隔的关键词(OR语义),见下方白名单 |
|
|
94
|
+
| `price_tier` | str | "" | 经济(≤20)/实惠(21-50)/中档(51-100)/高档(101-200)/奢华(>200) |
|
|
95
|
+
| `max_price` | int | 0 | 价格上限(CNY) |
|
|
96
|
+
| `cuisine` | str | "" | 菜系名(如「川菜」「日本料理」) |
|
|
97
|
+
| `geo` | str | "" | 地理大类(如「亚洲」「欧洲」) |
|
|
98
|
+
| `exclude_ids` | str | "" | 逗号分隔的菜品 ID,用于换一批去重 |
|
|
99
|
+
| `seed` | int | 0 | 随机种子(0=系统时间) |
|
|
100
|
+
|
|
101
|
+
**支持的关键词白名单:**
|
|
102
|
+
- 口味:麻辣、辣、甜、酸、咸、鲜
|
|
103
|
+
- 食材:海鲜、牛肉、羊肉、猪肉、鸡肉、素食
|
|
104
|
+
- 类型:面食、米饭类、汤、甜品、烧烤、火锅、咖喱、汉堡披萨、饮品
|
|
105
|
+
|
|
106
|
+
**否定注意**:用户说「不要太辣」时不要传入 `辣`——传空即可。关键词做硬过滤,传入就会强制匹配。
|
|
107
|
+
|
|
108
|
+
**返回示例(JSON):**
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"dishes": [
|
|
112
|
+
{"id": "cn_ch_001", "name": "麻婆豆腐", "name_en": "Mapo Tofu", "price": 38, "cuisine": "川菜", "region": "中华料理", "description": "嫩豆腐配牛肉末,以花椒和豆瓣酱炒制,麻辣鲜香"}
|
|
113
|
+
],
|
|
114
|
+
"exhausted": false,
|
|
115
|
+
"filters": {"count": 3, "keywords": ["辣"], "price_tier": "", "relaxed": false, ...},
|
|
116
|
+
"candidate_pool_size": 54,
|
|
117
|
+
"returned": 3
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`exhausted=true` 表示候选池不足,应触发兜底链(放宽约束、网络搜索、LLM 常识)。
|
|
122
|
+
|
|
123
|
+
### `list_keywords`
|
|
124
|
+
|
|
125
|
+
返回支持的关键词白名单。无参数。
|
|
126
|
+
|
|
127
|
+
## 兜底推荐
|
|
128
|
+
|
|
129
|
+
MCP server 仅负责第一层(本地知识库 + 加权随机)。当 `exhausted=true` 时,**应自行**按以下链兜底:
|
|
130
|
+
|
|
131
|
+
1. **降级过滤**:去掉价格约束,重试
|
|
132
|
+
2. **Web 搜索**:查 `"{用户原话} 推荐 菜品"`
|
|
133
|
+
3. **LLM 常识**:基于通用知识推荐,标注「非知识库菜品」
|
|
134
|
+
|
|
135
|
+
## 算法说明
|
|
136
|
+
|
|
137
|
+
- 关键词硬过滤:用户传关键词时菜品必须至少匹配一个(OR)
|
|
138
|
+
- 反偏置:`权重 × 1/√(该菜系菜品数)`,防止大菜系压制小菜系
|
|
139
|
+
- 多样性:同一菜系最多 ceil(count/3) 道
|
|
140
|
+
- 价格松弛:候选不足时自动去价格档重试一次
|
|
141
|
+
|
|
142
|
+
## 发布
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
cd mcp-server
|
|
146
|
+
pip install build
|
|
147
|
+
python3 -m build
|
|
148
|
+
twine upload dist/*
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
详见 [PyPI 发布指南](https://packaging.python.org/en/latest/tutorials/packaging-projects/)。
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# menus-mcp:全球美食推荐 MCP Server
|
|
2
|
+
|
|
3
|
+
基于 396 道菜、40 个菜系的全球美食知识库做加权随机推荐。任何支持 Model Context Protocol(MCP)的 AI agent 均可使用,包括:
|
|
4
|
+
|
|
5
|
+
- [Claude Desktop](https://claude.ai/download)
|
|
6
|
+
- [Cline](https://github.com/cline/cline)
|
|
7
|
+
- [Cursor](https://cursor.sh)
|
|
8
|
+
- [Continue](https://continue.dev)
|
|
9
|
+
- 其他 MCP 兼容客户端
|
|
10
|
+
|
|
11
|
+
## 快速安装
|
|
12
|
+
|
|
13
|
+
### 方式 1:uvx(推荐,无需安装)
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"mcpServers": {
|
|
18
|
+
"menus": {
|
|
19
|
+
"command": "uvx",
|
|
20
|
+
"args": ["menus-mcp"]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`uvx` 会自动从 PyPI 下载并运行,首次启动稍有延迟(数据加载约 1s),后续缓存到本地。
|
|
27
|
+
|
|
28
|
+
### 方式 2:pip install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pip install menus-mcp
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
然后在 MCP 客户端配置中:
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"mcpServers": {
|
|
39
|
+
"menus": {
|
|
40
|
+
"command": "menus-mcp"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 方式 3:本地源码运行
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
git clone https://github.com/spyyps/recommend-dish
|
|
50
|
+
cd recommend-dish
|
|
51
|
+
pip install -r mcp-server/requirements.txt
|
|
52
|
+
# 运行入口
|
|
53
|
+
python3 mcp-server/server.py
|
|
54
|
+
# 或在 mcp-server/ 目录下:
|
|
55
|
+
cd mcp-server && python3 -m menus_mcp
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
然后客户端配置:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"mcpServers": {
|
|
63
|
+
"menus": {
|
|
64
|
+
"command": "python3",
|
|
65
|
+
"args": ["/path/to/recommend-dish/mcp-server/server.py"]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 开放的工具
|
|
72
|
+
|
|
73
|
+
### `recommend_dishes`
|
|
74
|
+
|
|
75
|
+
主推荐工具。参数(皆为可选):
|
|
76
|
+
|
|
77
|
+
| 参数 | 类型 | 默认 | 说明 |
|
|
78
|
+
|------|------|------|------|
|
|
79
|
+
| `count` | int | 3 | 推荐数量 |
|
|
80
|
+
| `keywords` | str | "" | 逗号分隔的关键词(OR语义),见下方白名单 |
|
|
81
|
+
| `price_tier` | str | "" | 经济(≤20)/实惠(21-50)/中档(51-100)/高档(101-200)/奢华(>200) |
|
|
82
|
+
| `max_price` | int | 0 | 价格上限(CNY) |
|
|
83
|
+
| `cuisine` | str | "" | 菜系名(如「川菜」「日本料理」) |
|
|
84
|
+
| `geo` | str | "" | 地理大类(如「亚洲」「欧洲」) |
|
|
85
|
+
| `exclude_ids` | str | "" | 逗号分隔的菜品 ID,用于换一批去重 |
|
|
86
|
+
| `seed` | int | 0 | 随机种子(0=系统时间) |
|
|
87
|
+
|
|
88
|
+
**支持的关键词白名单:**
|
|
89
|
+
- 口味:麻辣、辣、甜、酸、咸、鲜
|
|
90
|
+
- 食材:海鲜、牛肉、羊肉、猪肉、鸡肉、素食
|
|
91
|
+
- 类型:面食、米饭类、汤、甜品、烧烤、火锅、咖喱、汉堡披萨、饮品
|
|
92
|
+
|
|
93
|
+
**否定注意**:用户说「不要太辣」时不要传入 `辣`——传空即可。关键词做硬过滤,传入就会强制匹配。
|
|
94
|
+
|
|
95
|
+
**返回示例(JSON):**
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"dishes": [
|
|
99
|
+
{"id": "cn_ch_001", "name": "麻婆豆腐", "name_en": "Mapo Tofu", "price": 38, "cuisine": "川菜", "region": "中华料理", "description": "嫩豆腐配牛肉末,以花椒和豆瓣酱炒制,麻辣鲜香"}
|
|
100
|
+
],
|
|
101
|
+
"exhausted": false,
|
|
102
|
+
"filters": {"count": 3, "keywords": ["辣"], "price_tier": "", "relaxed": false, ...},
|
|
103
|
+
"candidate_pool_size": 54,
|
|
104
|
+
"returned": 3
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`exhausted=true` 表示候选池不足,应触发兜底链(放宽约束、网络搜索、LLM 常识)。
|
|
109
|
+
|
|
110
|
+
### `list_keywords`
|
|
111
|
+
|
|
112
|
+
返回支持的关键词白名单。无参数。
|
|
113
|
+
|
|
114
|
+
## 兜底推荐
|
|
115
|
+
|
|
116
|
+
MCP server 仅负责第一层(本地知识库 + 加权随机)。当 `exhausted=true` 时,**应自行**按以下链兜底:
|
|
117
|
+
|
|
118
|
+
1. **降级过滤**:去掉价格约束,重试
|
|
119
|
+
2. **Web 搜索**:查 `"{用户原话} 推荐 菜品"`
|
|
120
|
+
3. **LLM 常识**:基于通用知识推荐,标注「非知识库菜品」
|
|
121
|
+
|
|
122
|
+
## 算法说明
|
|
123
|
+
|
|
124
|
+
- 关键词硬过滤:用户传关键词时菜品必须至少匹配一个(OR)
|
|
125
|
+
- 反偏置:`权重 × 1/√(该菜系菜品数)`,防止大菜系压制小菜系
|
|
126
|
+
- 多样性:同一菜系最多 ceil(count/3) 道
|
|
127
|
+
- 价格松弛:候选不足时自动去价格档重试一次
|
|
128
|
+
|
|
129
|
+
## 发布
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
cd mcp-server
|
|
133
|
+
pip install build
|
|
134
|
+
python3 -m build
|
|
135
|
+
twine upload dist/*
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
详见 [PyPI 发布指南](https://packaging.python.org/en/latest/tutorials/packaging-projects/)。
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""menus-mcp: 全球美食推荐 MCP server。
|
|
2
|
+
|
|
3
|
+
通过 stdio 暴露 recommend_dishes / list_keywords 两个工具。
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import importlib.util
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
import random
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
PKG_DIR = Path(__file__).resolve().parent
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _load_recommender():
|
|
18
|
+
"""从 package 内的 recommender.py 加载,支持 pip install 和源码运行两种场景。"""
|
|
19
|
+
rec_path = PKG_DIR / "recommender.py"
|
|
20
|
+
if not rec_path.exists():
|
|
21
|
+
raise RuntimeError(f"找不到 recommender.py: {rec_path}")
|
|
22
|
+
spec = importlib.util.spec_from_file_location("_menus_recommender", rec_path)
|
|
23
|
+
mod = importlib.util.module_from_spec(spec)
|
|
24
|
+
assert spec.loader is not None
|
|
25
|
+
spec.loader.exec_module(mod)
|
|
26
|
+
return mod
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _resolve_kb_dir() -> Path:
|
|
30
|
+
"""优先环境变量 MENUS_KB_DIR,否则用 package 内的 knowledge_base/。"""
|
|
31
|
+
env = os.environ.get("MENUS_KB_DIR", "")
|
|
32
|
+
if env:
|
|
33
|
+
p = Path(env).expanduser().resolve()
|
|
34
|
+
if p.exists():
|
|
35
|
+
return p
|
|
36
|
+
candidate = PKG_DIR / "knowledge_base"
|
|
37
|
+
if candidate.exists():
|
|
38
|
+
return candidate
|
|
39
|
+
raise RuntimeError(
|
|
40
|
+
f"找不到 knowledge_base 目录(尝试过 MENUS_KB_DIR 与 {candidate})"
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def main() -> None:
|
|
45
|
+
try:
|
|
46
|
+
from mcp.server.fastmcp import FastMCP
|
|
47
|
+
except ImportError:
|
|
48
|
+
print("错误:缺少 mcp 依赖。请 `pip install mcp` 或 `pip install menus-mcp`", file=sys.stderr)
|
|
49
|
+
sys.exit(1)
|
|
50
|
+
|
|
51
|
+
recommender = _load_recommender()
|
|
52
|
+
kb_dir = _resolve_kb_dir()
|
|
53
|
+
kb_cache = {"loaded": None}
|
|
54
|
+
|
|
55
|
+
def get_kb():
|
|
56
|
+
if kb_cache["loaded"] is None:
|
|
57
|
+
kb_cache["loaded"] = recommender.load_kb(kb_dir)
|
|
58
|
+
return kb_cache["loaded"]
|
|
59
|
+
|
|
60
|
+
mcp = FastMCP("menus-recommender")
|
|
61
|
+
|
|
62
|
+
@mcp.tool()
|
|
63
|
+
def recommend_dishes(
|
|
64
|
+
count: int = 3,
|
|
65
|
+
keywords: str = "",
|
|
66
|
+
price_tier: str = "",
|
|
67
|
+
max_price: int = 0,
|
|
68
|
+
cuisine: str = "",
|
|
69
|
+
region: str = "",
|
|
70
|
+
geo: str = "",
|
|
71
|
+
exclude_ids: str = "",
|
|
72
|
+
seed: int = 0,
|
|
73
|
+
) -> str:
|
|
74
|
+
"""基于全球美食知识库做加权随机推荐。
|
|
75
|
+
|
|
76
|
+
当用户表达就餐意向(推荐晚餐、不知道吃什么、想吃点辣的等)时调用。
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
count: 推荐数量,默认 3。
|
|
80
|
+
keywords: 逗号分隔的关键词(OR 语义)。白名单:
|
|
81
|
+
口味 麻辣/辣/甜/酸/咸/鲜
|
|
82
|
+
食材 海鲜/牛肉/羊肉/猪肉/鸡肉/素食
|
|
83
|
+
类型 面食/米饭类/汤/甜品/烧烤/火锅/咖喱/汉堡披萨/饮品
|
|
84
|
+
否定意图(如「不要太辣」)不要传入。
|
|
85
|
+
price_tier: 经济(≤20)/实惠(21-50)/中档(51-100)/高档(101-200)/奢华(>200)
|
|
86
|
+
max_price: 价格上限(CNY)
|
|
87
|
+
cuisine: 菜系名(如「川菜」「日本料理」)或 cuisine_id
|
|
88
|
+
region: 地区名(如「中华料理」)或 region_id
|
|
89
|
+
geo: 地理大类(如「亚洲」「欧洲」)
|
|
90
|
+
exclude_ids: 逗号分隔的菜品 ID,用于「换一批」时去重
|
|
91
|
+
seed: 随机种子,0 表示用系统时间
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
JSON 字符串:{dishes, exhausted, filters, candidate_pool_size, returned}
|
|
95
|
+
exhausted=true 时应触发兜底链(重试放宽、网络搜索、LLM 常识)。
|
|
96
|
+
"""
|
|
97
|
+
kw_list = [k.strip() for k in keywords.split(",") if k.strip()]
|
|
98
|
+
exclude_set = {k.strip() for k in exclude_ids.split(",") if k.strip()}
|
|
99
|
+
rng = random.Random(seed if seed else None)
|
|
100
|
+
|
|
101
|
+
result = recommender.recommend(
|
|
102
|
+
get_kb(),
|
|
103
|
+
count=max(1, count),
|
|
104
|
+
keywords=kw_list,
|
|
105
|
+
price_tier=price_tier,
|
|
106
|
+
max_price=max_price,
|
|
107
|
+
cuisine=cuisine,
|
|
108
|
+
region=region,
|
|
109
|
+
geo=geo,
|
|
110
|
+
exclude_ids=exclude_set,
|
|
111
|
+
relax=True,
|
|
112
|
+
rng=rng,
|
|
113
|
+
)
|
|
114
|
+
return json.dumps(result, ensure_ascii=False)
|
|
115
|
+
|
|
116
|
+
@mcp.tool()
|
|
117
|
+
def list_keywords() -> str:
|
|
118
|
+
"""列出推荐器支持的全部关键词与价格档。"""
|
|
119
|
+
return json.dumps(
|
|
120
|
+
{
|
|
121
|
+
"taste": ["麻辣", "辣", "甜", "酸", "咸", "鲜"],
|
|
122
|
+
"ingredient": ["海鲜", "牛肉", "羊肉", "猪肉", "鸡肉", "素食"],
|
|
123
|
+
"type": [
|
|
124
|
+
"面食", "米饭类", "汤", "甜品", "烧烤",
|
|
125
|
+
"火锅", "咖喱", "汉堡披萨", "饮品",
|
|
126
|
+
],
|
|
127
|
+
"price_tiers": ["经济", "实惠", "中档", "高档", "奢华"],
|
|
128
|
+
"note": "不在白名单内的关键词会被忽略,可能导致候选池为空。",
|
|
129
|
+
},
|
|
130
|
+
ensure_ascii=False,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
mcp.run()
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
if __name__ == "__main__":
|
|
137
|
+
main()
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 非洲料理
|
|
2
|
+
|
|
3
|
+
- **地理区域**: 非洲
|
|
4
|
+
- **区域ID**: `africa`
|
|
5
|
+
|
|
6
|
+
## 北非料理 `af_north`
|
|
7
|
+
> 阿拉伯柏柏尔饮食文化,塔吉锅和库斯库斯为代表
|
|
8
|
+
|
|
9
|
+
### 摩洛哥菜 `af_morocco`
|
|
10
|
+
- - `af_001` **塔吉锅炖羊肉** (Lamb Tagine) — ¥68
|
|
11
|
+
- - 羊肉杏干杏仁在锥形陶锅中慢炖,香料浓郁
|
|
12
|
+
- - `af_002` **库斯库斯** (Couscous) — ¥42
|
|
13
|
+
- - 蒸制小米饭搭配蔬菜羊肉和浓汤
|
|
14
|
+
- - `af_003` **摩洛哥薄荷茶** (Moroccan Mint Tea) — ¥18
|
|
15
|
+
- - 绿茶加新鲜薄荷和大量糖冲泡
|
|
16
|
+
- - `af_004` **哈里拉汤** (Harira) — ¥28
|
|
17
|
+
- - 番茄扁豆鹰嘴豆羊肉汤,斋月必备
|
|
18
|
+
|
|
19
|
+
### 埃及菜 `af_egypt`
|
|
20
|
+
- - `af_101` **鹰嘴豆泥埃及版** (Ful Medames) — ¥22
|
|
21
|
+
- - 蚕豆煮烂配橄榄油和香料,埃及国菜
|
|
22
|
+
- - `af_102` **烤鸽子** (Grilled Pigeon) — ¥38
|
|
23
|
+
- - 鸽子填满香草米烤制
|
|
24
|
+
- - `af_103` **库莎丽** (Koshari) — ¥18
|
|
25
|
+
- - 米饭通心粉扁豆混合配番茄酱和炸洋葱
|
|
26
|
+
|
|
27
|
+
## 撒哈拉以南非洲 `af_sub`
|
|
28
|
+
> 饮食文化多元,以木薯玉米芭蕉为主食,花生酱炖菜常见
|
|
29
|
+
|
|
30
|
+
### 西非料理 `af_west`
|
|
31
|
+
- - `af_201` **乔洛夫饭** (Jollof Rice) — ¥35
|
|
32
|
+
- - 番茄红椒炖煮米饭配鸡肉或鱼,西非庆典之王
|
|
33
|
+
- - `af_202` **花生炖汤** (Maafe) — ¥38
|
|
34
|
+
- - 花生酱炖牛肉或鸡肉配米饭
|
|
35
|
+
- - `af_203` **炸大蕉** (Plantain Chips) — ¥15
|
|
36
|
+
- - 成熟大蕉切片油炸,外脆内甜
|
|
37
|
+
- - `af_204` **福福配浓汤** (Fufu with Soup) — ¥28
|
|
38
|
+
- - 木薯泥揉成团配花生或棕榈浓汤食用
|
|
39
|
+
|
|
40
|
+
### 东非料理 `af_east`
|
|
41
|
+
- - `af_301` **英吉拉饼配炖菜** (Injera with Wot) — ¥35
|
|
42
|
+
- - 发酵酸面饼铺辣味炖菜,用手撕食,埃塞俄比亚国菜
|
|
43
|
+
- - `af_302` **肯尼亚豆饭** (Githeri) — ¥22
|
|
44
|
+
- - 玉米粒与豆类同煮,肯尼亚日常主食
|
|
45
|
+
- - `af_303` **乌咖喱** (Ugali) — ¥15
|
|
46
|
+
- - 玉米粉煮成稠团配炖菜食用,东非主食
|
|
47
|
+
|
|
48
|
+
### 南非料理 `af_south`
|
|
49
|
+
- - `af_401` **波波提耶** (Bobotie) — ¥38
|
|
50
|
+
- - 碎肉烤蛋派配咖喱香料,南非国菜
|
|
51
|
+
- - `af_402` **比尔通肉干** (Biltong) — ¥28
|
|
52
|
+
- - 风干腌制牛肉条,南非经典零食
|
|
53
|
+
- - `af_403` **布拉伊烤串** (Braai) — ¥52
|
|
54
|
+
- - 南非式烧烤盛宴,以羊肉串和布尔香肠为主
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 美洲料理
|
|
2
|
+
|
|
3
|
+
- **地理区域**: 美洲
|
|
4
|
+
- **区域ID**: `americas`
|
|
5
|
+
|
|
6
|
+
## 美式料理 `am_usa`
|
|
7
|
+
> 移民融合的多样化饮食文化,汉堡烧烤和灵魂食物为代表
|
|
8
|
+
|
|
9
|
+
### BBQ烤肉 `us_bbq`
|
|
10
|
+
- - `us_001` **堪萨斯城肋排** (Kansas City Ribs) — ¥88
|
|
11
|
+
- - 猪肋排低温慢熏涂甜辣酱,美国南部骄傲
|
|
12
|
+
- - `us_002` **德州烟熏牛胸肉** (Texas Brisket) — ¥98
|
|
13
|
+
- - 牛胸肉果木低温慢熏12小时
|
|
14
|
+
- - `us_003` **手撕猪肉** (Pulled Pork) — ¥58
|
|
15
|
+
- - 猪肩肉慢烤至酥烂撕碎拌烧烤酱
|
|
16
|
+
- - `us_004` **烤半鸡** (Smoked Half Chicken) — ¥52
|
|
17
|
+
- - 整鸡对半开腌制后慢烟熏烤
|
|
18
|
+
|
|
19
|
+
### 汉堡·热狗 `us_burger`
|
|
20
|
+
- - `us_101` **经典芝士汉堡** (Classic Cheeseburger) — ¥42
|
|
21
|
+
- - 牛肉饼融芝士加生菜番茄洋葱和特制酱
|
|
22
|
+
- - `us_102` **烟熏培根汉堡** (Bacon Burger) — ¥48
|
|
23
|
+
- - 双层牛肉饼配香脆培根
|
|
24
|
+
- - `us_103` **纽约热狗** (New York Hot Dog) — ¥22
|
|
25
|
+
- - 牛肉香肠夹面包配酸菜芥末和洋葱酱
|
|
26
|
+
- - `us_104` **和牛汉堡** (Wagyu Burger) — ¥85
|
|
27
|
+
- - 澳洲和牛肉饼芝士生菜番茄秘制酱汁
|
|
28
|
+
|
|
29
|
+
### 南方灵魂食物 `us_south`
|
|
30
|
+
- - `us_201` **南方炸鸡** (Southern Fried Chicken) — ¥38
|
|
31
|
+
- - 腌渍鸡块裹调味面粉炸至金黄酥脆
|
|
32
|
+
- - `us_202` **玉米面包** (Cornbread) — ¥18
|
|
33
|
+
- - 玉米面粉烤制的甜咸面包
|
|
34
|
+
- - `us_203` **秋葵浓汤** (Gumbo) — ¥48
|
|
35
|
+
- - 秋葵和多种海鲜肉类炖煮的浓汤配米饭
|
|
36
|
+
- - `us_204` **新英格兰蛤蜊浓汤** (Clam Chowder) — ¥38
|
|
37
|
+
- - 奶油为底的蛤蜊马铃薯浓汤
|
|
38
|
+
- - `us_205` **水牛城辣鸡翅** (Buffalo Wings) — ¥38
|
|
39
|
+
- - 炸鸡翅裹辣椒酱配蓝纹奶酪酱和西芹
|
|
40
|
+
|
|
41
|
+
### 美式甜点 `us_dessert`
|
|
42
|
+
- - `us_301` **纽约芝士蛋糕** (New York Cheesecake) — ¥38
|
|
43
|
+
- - 浓郁绵密的奶油芝士蛋糕
|
|
44
|
+
- - `us_302` **苹果派** (Apple Pie) — ¥32
|
|
45
|
+
- - 肉桂苹果馅酥皮烤制配香草冰淇淋
|
|
46
|
+
- - `us_303` **布朗尼** (Brownie) — ¥22
|
|
47
|
+
- - 香浓巧克力蛋糕块外脆内软
|
|
48
|
+
|
|
49
|
+
## 墨西哥菜 `am_mx`
|
|
50
|
+
> 被联合国教科文列为非物质文化遗产的饮食文化,玉米是灵魂食材
|
|
51
|
+
|
|
52
|
+
- - `mx_001` **塔可** (Taco) — ¥28
|
|
53
|
+
- - 玉米饼夹各种馅料配莎莎酱,墨西哥街头之王
|
|
54
|
+
- - `mx_002` **墨西哥卷饼** (Burrito) — ¥38
|
|
55
|
+
- - 大面饼包裹米饭豆子肉和奶酪
|
|
56
|
+
- - `mx_003` **鳄梨酱配玉米片** (Guacamole with Chips) — ¥28
|
|
57
|
+
- - 新鲜鳄梨调制的酱料配烤玉米片
|
|
58
|
+
- - `mx_004` **芝士薄饼** (Quesadilla) — ¥28
|
|
59
|
+
- - 玉米饼夹融化的芝士烤制
|
|
60
|
+
- - `mx_005` **墨西哥辣肉酱** (Chili con Carne) — ¥38
|
|
61
|
+
- - 牛肉豆子和辣椒炖煮的墨西哥经典
|
|
62
|
+
- - `mx_006` **巧克力辣椒酱炖火鸡** (Mole Poblano) — ¥48
|
|
63
|
+
- - 巧克力辣椒等多种香料熬制的深色酱配火鸡
|
|
64
|
+
|
|
65
|
+
## 拉丁美洲料理 `am_latam`
|
|
66
|
+
> 涵盖巴西秘鲁阿根廷等,地域风格差异大但同样热情
|
|
67
|
+
|
|
68
|
+
### 阿根廷·乌拉圭 `la_ar`
|
|
69
|
+
- - `la_001` **阿根廷烤牛排** (Asado) — ¥108
|
|
70
|
+
- - 厚切牛肉在炭火上慢烤,只以盐调味
|
|
71
|
+
- - `la_002` **巧昆百里香酱** (Chimichurri) — ¥12
|
|
72
|
+
- - 欧芹大蒜橄榄油醋调的烤肉酱
|
|
73
|
+
- - `la_003` **阿根廷肉馅饺** (Empanada) — ¥18
|
|
74
|
+
- - 酥皮包肉馅烤制的便携小食
|
|
75
|
+
|
|
76
|
+
### 巴西菜 `la_br`
|
|
77
|
+
- - `la_101` **巴西烤肉** (Churrasco) — ¥128
|
|
78
|
+
- - 多种部位牛肉串在大铁签上炭火烤制
|
|
79
|
+
- - `la_102` **黑豆炖肉饭** (Feijoada) — ¥58
|
|
80
|
+
- - 黑豆炖猪杂配米饭橙子片,巴西国菜
|
|
81
|
+
- - `la_103` **芝士面包球** (Pão de Queijo) — ¥18
|
|
82
|
+
- - 木薯粉和奶酪制作的烘烤小球
|
|
83
|
+
- - `la_104` **巴西甘蔗酒** (Caipirinha) — ¥28
|
|
84
|
+
- - 甘蔗酒配青柠和糖,巴西国饮
|
|
85
|
+
|
|
86
|
+
### 秘鲁·智利 `la_pe`
|
|
87
|
+
- - `la_201` **酸橘汁腌鱼** (Ceviche) — ¥68
|
|
88
|
+
- - 鱼生用青柠汁腌制配洋葱辣椒,秘鲁国菜
|
|
89
|
+
- - `la_202` **秘鲁炒牛柳** (Lomo Saltado) — ¥48
|
|
90
|
+
- - 牛柳条和番茄洋葱中餐风格爆炒配米饭
|
|
91
|
+
- - `la_203` **紫玉米饮** (Chicha Morada) — ¥18
|
|
92
|
+
- - 紫玉米菠萝肉桂煮制的清爽饮品
|
|
93
|
+
|
|
94
|
+
### 加勒比料理 `la_car`
|
|
95
|
+
- - `la_301` **古巴三明治** (Cubano) — ¥32
|
|
96
|
+
- - 火腿烤猪肉芝士酸黄瓜压烤三明治
|
|
97
|
+
- - `la_302` **牙买加烟熏烤鸡** (Jerk Chicken) — ¥42
|
|
98
|
+
- - 苏格兰帽椒和多香果腌制的炭火烤鸡
|
|
99
|
+
- - `la_303` **朗姆烤菠萝** (Rum Grilled Pineapple) — ¥22
|
|
100
|
+
- - 菠萝切片朗姆酒烤制配冰淇淋
|