kfc-cn-mcp
Integrates with KFC China's H5 ordering APIs to search stores, browse menus, manage a cart, preview orders, and submit real unpaid pickup orders for KFC China.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kfc-cn-mcpFind KFC stores near Huaihai Road in Shanghai and show me the burger menu."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kfc-cn-mcp
肯德基中国(order.kfc.com.cn)点餐 MCP 服务器,为 Hermes Agent 适配,同时兼容任何支持 stdio 的 MCP 客户端(Claude Desktop、Cursor、Cherry Studio 等)。
它把肯德基中国 H5 点餐的真实接口封装成一组工具:找门店 → 看菜单 → 加购物车 → 结算预览 → 提交订单。不依赖浏览器自动化,直接走官方 H5 的 JSON 接口(含 KBS 签名与字段加密),因此速度快、资源占用低,价格与库存都是真实的。
本项目参考了 markswendsen-code/mcp-kfc 的工具形态(search_menu / add_to_cart / view_cart / checkout …),但美国 KFC 的实现是 Playwright 点击网页 + 估算价格;中国版是重写的 HTTP 客户端,能真正在肯德基中国下单。
1. 能力与边界
已实现
工具 | 作用 |
| 按关键词 + 城市国标码,或经纬度找门店,返回 |
| 选定门店并加载该店实时菜单(走 |
| 查看分类/某个分类下的餐品( |
| 按中文名/描述搜索餐品 |
| 商品详情 + 套餐可选内容( |
| 加购;套餐可不传 |
| 修改某行数量(0 = 删除) |
| 删除某行 |
| 清空购物车 |
| 查看购物车与合计 |
| 服务端结算预校验,返回金额、门店、是否需登录、 |
| 真实下单(生成未支付订单);必须 |
| 查询订单状态(实验性,可能需要登录态) |
| 查看当前门店/购物车/会话状态,便于排障 |
明确不做
不处理支付:
place_order成功后订单处于“未支付”,用餐人需在 15 分钟内到肯德基 App / H5「我的订单」完成微信/支付宝支付;超时自动取消。本 MCP 不接触支付密码、验证码、银行卡。不保存账号密码:默认免登录点餐(H5 的「免登录点餐」能力)。会员价、优惠券、大神卡、积分等需要登录的权益暂未接入。
不绕过风控:若肯德基触发人机验证(geetest),工具会返回提示,需要用餐人在 App/H5 内完成。
不做预约时段:默认“尽快取餐”。H5 的「预约」选时间尚未封装(接口已具备,后续可加)。
Related MCP server: mcp-telepizza
2. 环境要求
Node.js ≥ 18.17(建议 20/22/24)
能直连
order.kfc.com.cn、store.kfc.com.cn(如公司网络有代理,请给 Hermes 进程配置HTTPS_PROXY)Hermes Agent(标准安装已含 MCP 支持)
3. 安装与构建
git clone <this-repo> kfc-cn-mcp
cd kfc-cn-mcp
npm install
npm run build构建产物是 dist/index.js,Hermes 直接用 node 启动它,不需要常驻服务。
自检(会真实访问肯德基接口,只读 + 加购/清空购物车,不会下单):
npm run smoke成功时最后一行是 SMOKE OK。
4. 接入 Hermes
4.1 写入 ~/.hermes/config.yaml
把下面的片段合并进 mcp_servers(Windows 示例,路径改成你的实际路径):
mcp_servers:
kfc_cn:
command: "node"
args:
- "C:/Users/你的用户名/kfc-cn-mcp/dist/index.js"
env:
KFC_STATE_DIR: "C:/Users/你的用户名/.kfc-cn-mcp"
# 默认城市:上海 310100;北京 110100;深圳 440300;广州 440100
KFC_CITY_CODE: "310100"
# 默认坐标(用于“附近门店”推荐,可改成你的常用位置)
KFC_LATITUDE: "31.2304"
KFC_LONGITUDE: "121.4737"
timeout: 60
connect_timeout: 20
tools:
include:
- find_stores
- select_store
- get_menu
- search_menu
- get_item
- cart_add
- cart_set_quantity
- cart_remove
- cart_clear
- cart_view
- preview_order
- place_order
- order_status
- session_status
prompts: false
resources: false完整可复制版本见 hermes/config.snippet.yaml。
4.2 或者用 hermes mcp add
hermes mcp add kfc_cn --command node --args "C:\path\to\kfc-cn-mcp\dist\index.js"然后编辑 ~/.hermes/config.yaml 补上 env 和 tools.include(hermes mcp add 不一定支持一次写入全部字段)。
4.3 验证
hermes mcp test kfc_cn应能看到 14 个工具。然后在 Hermes 会话里:
/reload-mcp问一句:「用 kfc_cn 的工具查一下上海淮海路附近的肯德基」。
Hermes 注册后的工具名形如:
mcp_kfc_cn_find_stores
mcp_kfc_cn_select_store
mcp_kfc_cn_search_menu
mcp_kfc_cn_cart_add
mcp_kfc_cn_preview_order
mcp_kfc_cn_place_order
...4.4 收紧权限(推荐)
如果只想让 Hermes 查菜单、不想让它下单,把 place_order 从 tools.include 里删掉即可;购物车工具可以保留。
Hermes 支持 tools.exclude,也可以反过来只排除危险工具:
tools:
exclude: [place_order]4.5 装配套 Skill(可选)
hermes/skills/kfc-cn-ordering/SKILL.md 是一份 Hermes Skill,教模型按正确顺序调用工具、什么时候必须停下来让用户确认。复制到 Hermes 技能目录:
# Windows
Copy-Item -Recurse hermes\skills\kfc-cn-ordering "$env:USERPROFILE\.hermes\skills\"
# macOS / Linux
mkdir -p ~/.hermes/skills
cp -r hermes/skills/kfc-cn-ordering ~/.hermes/skills/之后在 Hermes 里输入 /kfc-cn-ordering 或直接说“帮我点肯德基”,它会按 Skill 的流程执行。
5. 使用示例
你:帮我看看上海淮海路附近有哪些肯德基。
AI:(find_stores keyword=淮海路 cityCode=310100)
附近有「淮海路餐厅 SH1146」「淮海路新金钟餐厅 SH2103」…
你:选淮海路餐厅,看看有什么汉堡。
AI:(select_store storeCode=SH1146 → get_menu category=汉堡卷)
培根鸡腿肉霸堡 ¥24.90、泰夯Q虾鸡腿肉霸堡 ¥24.90…
你:来一个培根鸡腿肉霸堡,再加一个特大号鸡腿桶。
AI:(cart_add → cart_view)
购物车:培根鸡腿肉霸堡 ×1、S特大号鸡腿桶 ×1,合计 ¥64.80
你:可以,手机号 138****8000,堂食。
AI:(preview_order → place_order confirm=true phone=… previewToken=…)
订单已提交:订单号 1793…,合计 ¥64.80。
请在 15 分钟内到肯德基 App「我的订单」完成支付。套餐选择
get_item 会返回:
{
"comboRounds": [
{
"roundId": "1",
"name": "小食",
"minCount": 2,
"maxCount": 2,
"items": [{ "linkId": "100129945", "name": "特大号鸡腿1个", "maxCount": 2 }]
}
]
}加购时可以显式指定:
{
"items": [
{
"linkId": "100129947",
"quantity": 1,
"selections": { "1": [{ "linkId": "100129945", "quantity": 2 }] }
}
]
}不传 selections 时,会按每轮 minCount 自动选第一个可选项(与 H5 默认行为一致)。
6. 环境变量
变量 | 默认值 | 说明 |
|
| 会话 cookie、sessionId、菜单缓存、购物车状态目录 |
|
| 默认城市国标码( |
|
| 默认坐标(上海人民广场),用于附近门店与切换门店时的距离计算 |
|
| 单次接口超时 |
城市国标码示例:北京 110100、上海 310100、广州 440100、深圳 440300、杭州 330100、成都 510100、南京 320100、武汉 420100。
7. 状态与并发
状态保存在
KFC_STATE_DIR/session.json(cookie + sessionId + 购物车)与menu.json(菜单缓存,30 分钟有效)。每个 Hermes 会话会拉起一个 MCP 进程;同一时间只应有一个进程操作同一个
KFC_STATE_DIR,否则购物车会互相覆盖。多开时给每个进程设置不同的KFC_STATE_DIR。session.json里有肯德基会话 cookie,属于敏感文件;不要提交到 Git(项目已.gitignore)。
8. 故障排查
现象 | 原因/处理 |
| 网络或代理问题。给 Hermes 配 |
| 接口/版本变化,或门店不支持自取。先 |
| 已自动重建会话并重试;若仍失败,重新 |
| 菜单缓存过期, |
| 肯德基风控,需在 App/H5 人工完成,MCP 无法绕过。 |
| 检查 |
工具列表里没有 | 被 |
下单成功但没看到支付入口 | 打开肯德基 App →「我的」→「订单」,或 |
9. 实现说明(给维护者)
详细接口笔记见 docs/API-NOTES.md。核心点:
H5 入口:
https://order.kfc.com.cn/preorder-taro/menu预订单接口:
https://order.kfc.com.cn/preorder-portal门店接口:
https://order.kfc.com.cn/store-portal每个请求带
kbck/kbcts/kbsv三个头;kbsv = md5(client_key \t client_sec \t 时间戳 \t 路径 \t\t 完整 JSON body)。encodeList里的字段(手机号、经纬度、门店坐标等)用 DES-CBC(key=iv=D963r1wp,PKCS7,Base64)加密。cart/update的quantity是增量而不是绝对值(已实测);删除用cart/clearItem。这些常量来自公开 H5 bundle,官方改版后可能需要重新提取;代码里集中在
src/crypto.ts,便于更新。
10. 合规与免责
仅供个人学习与自用。请遵守肯德基用户协议、门店规则与当地法律。
请勿用于代下单、黄牛、批量刷单、爬取价格或其他商业用途。
下单会产生真实订单(未支付也会占用门店产能),请确保用餐人确认后再调用
place_order。项目与肯德基(Yum China)无关联;接口可能随时变更,维护者不对下单失败、价格变动、订单取消等负责。
参考项目:markswendsen-code/mcp-kfc(MIT)。
11. License
MIT
Available Tools
14 toolscart_addAdd to cartA
Add dishes to the cart (套餐可传 selections;不传则按套餐最少份数自动选择). 加购;数量累加,套餐会自动选默认规格。
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation/safety profile (readOnlyHint=false, destructiveHint=false), and the description adds two non-obvious behaviors: quantities are additive rather than overwritten, and combos auto-select their minimum/default spec when selections is omitted. It does not say what happens on failure (invalid linkId, out-of-stock, max quantity) or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action, with no filler. The bilingual phrasing is a bit dense but each clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with annotations covering safety, the description covers the combo-selection edge case but omits error/validation behavior and any notion of the result. With no output schema, the agent gets no hint of what a successful add returns (cart state, line item, etc.).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 0%, so the description carries the burden, and it does explain the selections parameter's fallback rule (auto-select minimum portions when omitted) — meaningful beyond the schema. However, the items array shape and the quantity accumulation semantics are only hinted at, and the quantity default/max are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Add dishes to the cart") and names the combo-meal (套餐) case, which distinguishes it from cart_view/cart_remove/cart_clear. It does not explicitly contrast with the closest sibling, cart_set_quantity, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"数量累加" (quantities accumulate) implicitly signals when to use this over cart_set_quantity, which overwrites, but the agent must infer that contrast rather than being told. No explicit when-to-use/when-not-to-use or prerequisite guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cart_clearClear cartB
Remove every dish from the cart. 清空购物车。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the mutability and scope profile is largely covered. The description contributes the useful detail that the removal is wholesale (every dish), but says nothing about idempotency, whether an empty cart is an error, or what state is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with the scope stated first. The Chinese sentence is a pure duplicate translation and adds no information a monolingual agent can use, which is the only waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter mutation with annotations and no output schema this is close to sufficient, but the description never says what the call returns or what the cart looks like afterwards, which matters for a bulk clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema has nothing to explain and there is no semantic gap for the description to fill. Baseline 4 applies for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Remove every dish from the cart" gives a specific verb (remove) and resource (cart) with a clear bulk scope (every), which distinguishes it in practice from cart_remove. It stops short of naming cart_remove or cart_set_quantity explicitly as the alternatives for partial removal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to prefer this over cart_remove or cart_remove-per-item, and no statement of prerequisites, confirmation, or side effects. The agent must infer usage entirely from the name and the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cart_removeRemove cart lineA
Remove one line from the cart by lineKey or linkId. 删除购物车中的一行。
| Name | Required | Description | Default |
|---|---|---|---|
| lineKey | Yes | cart_view 返回的 lineKey(也可以用 linkId) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-read-only, open-world, non-destructive operation. The description adds scope information—removing exactly one line, identified by lineKey or linkId—but does not explain reversibility, behavior when the line is missing, or side effects beyond the cart line itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no waste; the core action and targeting method are front-loaded. The bilingual repetition does not obscure the primary instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter cart mutation with full schema coverage and annotations, the description is largely complete enough to invoke correctly. Minor gaps remain around what happens if the lineKey is invalid or whether removal is reversible, but they are not critical for basic selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single lineKey parameter is already documented in the schema, including the linkId alternative. The description restates the same targeting information without adding syntax, validation, or error details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: remove one cart line, and identifies how the line is targeted (lineKey or linkId). It distinguishes itself implicitly from cart_clear by saying "one line," though it does not explicitly name sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool's usage is implied by the operation: use it to remove a line from the cart. However, the description does not explicitly say when to use it instead of cart_clear or cart_set_quantity, nor does it state any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cart_set_quantitySet cart quantityA
Set the quantity of one cart line (0 removes it). 修改购物车某一行的数量,0 表示删除;lineKey 来自 cart_view。
| Name | Required | Description | Default |
|---|---|---|---|
| lineKey | Yes | cart_view 返回的 lineKey(也可以用 linkId) | |
| quantity | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the bar is lower. The description adds genuinely non-obvious behavior: quantity 0 deletes the line, an effect not visible from the schema's minimum: 0, and it points at the source of the key (cart_view). It omits any note on permissions, rate limits, or what state the cart is left in afterwards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and the destructive edge case. The Chinese clause restates the English for a bilingual audience; that is defensible but slightly redundant for a single-language reader.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and annotations covering the safety profile, the description tells the agent the action, the removal side effect, and where lineKey comes from. Missing only post-call expectations (e.g., whether a refreshed cart is returned or cart_view must be re-called).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: lineKey is documented in the schema while quantity has only min/max bounds. The description compensates for quantity by defining the 0 = remove semantics, which is meaningful, but it adds nothing about the upper bound (99) or about stale/invalid lineKeys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Set the quantity of one cart line') and parenthetically clarifies the zero-quantity edge case, which distinguishes it from cart_add/cart_clear. It doesn't explicitly name the siblings it supersedes (cart_remove, cart_clear), so an agent must infer the boundary from the parenthetical.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one real workflow prerequisite — 'lineKey 来自 cart_view' — which tells the agent where to obtain the required key. However, there is no statement of when to prefer this over cart_add, cart_remove, or cart_clear, so the choice among mutating siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cart_viewView cartBRead-only
Show cart lines, quantities and total. 查看购物车。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully adds what the response contains (lines, quantities, total), but says nothing about empty-cart behavior, currency, or whether calling it recalculates totals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely short and front-loaded, with the return contents stated immediately. The trailing Chinese phrase 查看购物车 is a pure duplicate of the English rather than added information, a minor waste of the limited budget.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool this is nearly sufficient, and the description does supply return-field information even though no output schema exists. It could go further on empty-cart behavior and its relationship to preview_order, but nothing essential for calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate. Not specifying whether the cart is scoped to the current session is a small residual gap, but no parameter exists to control it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Show cart lines, quantities and total" states a specific verb (show), the resource (cart), and what is returned, which distinguishes it from the mutating cart_add/cart_remove/cart_clear siblings. It stops short of explicitly contrasting with preview_order, which also surfaces totals, so an agent must infer the difference from the names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to call this versus preview_order or order_status, nor mentions any prerequisites such as first calling select_store or cart_add. The read-only nature of viewing a cart is only implied by the word "Show".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_storesFind KFC China storesARead-only
Find KFC China restaurants by 门店关键词 + 城市国标码 (gbCityCode, e.g. 310100 = Shanghai) or by latitude/longitude. Returns storeCode you pass to select_store. 查询肯德基门店,返回 storeCode。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 返回数量上限 | |
| keyword | No | 门店/地址关键词,如“淮海路”“人民广场” | |
| cityCode | No | 城市国标码 gbCityCode,例如上海 310100、北京 110100、深圳 440300 | |
| latitude | No | 纬度,配合 longitude 使用 | |
| longitude | No | 经度,配合 latitude 使用 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real value by disclosing the key output contract (storeCode) and the downstream dependency on select_store. It does not describe result shape beyond storeCode or how limit interacts with the two search modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The English portion is front-loaded with the two lookup modes and the return value in two tight sentences. The trailing Chinese restatement ('查询肯德基门店,返回 storeCode') duplicates information already given, a minor redundancy rather than a structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers the essential return value (storeCode) and its consumer (select_store). The remaining gap is that all five parameters are optional, and the description never explains what an empty call returns or how limit defaults behave.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (limit, keyword, cityCode, latitude, longitude) is already documented inline. The description's 'gbCityCode, e.g. 310100 = Shanghai' and 'latitude/longitude' pairing largely restate the schema, so this lands at the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (find KFC China restaurants) and enumerates the two supported lookup modes: keyword + gbCityCode, or latitude/longitude. It also distinguishes itself from the sibling it feeds into by noting the returned storeCode is what you pass to select_store.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for use: supply keyword + city code, or coordinates, and then hand the resulting storeCode to select_store — this spells out a concrete workflow. It stops short of stating when not to use it or what happens if no parameters are supplied, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_itemGet item detailBRead-only
Get dish detail plus combo rounds (套餐可选内容) and option groups. 查商品详情;套餐会返回 comboRounds(roundId、可选商品、最少/最多份数)。
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | 商品名(模糊匹配),与 linkId 二选一 | |
| linkId | No | 商品 linkId,例如 100129947 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description does add genuinely useful return-shape context that no output schema provides — comboRounds with roundId, selectable items, and min/max portions — but it says nothing about the fuzzy-name path (e.g. what happens when the name matches multiple dishes, or when a linkId is not found).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the core action and followed by the conditional combo detail. The bilingual duplication is functional rather than wasteful, and no sentence is filler. Slightly dense with parenthetical details but well within bounds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter read-only tool with full schema coverage and no output schema, the description covers the payload shape adequately. What is missing is behavior around fuzzy matching and ambiguity resolution and any pointer to the search tool that would normally precede this call, which matters in a menu-browsing flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema, including the '模糊匹配' behavior for name and the mutual-exclusivity note '与 linkId 二选一'. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get dish detail') and goes beyond the name by naming what extra payload comes back (combo rounds and option groups). An agent can tell this is a detail-fetch rather than a search, but the description never names the sibling it is distinct from (e.g. search_menu), so the differentiation is inferred from the tool name rather than earned in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use statement, and none of the sibling tools (search_menu, get_menu) are referenced. The only implicit signal is that combo/option-group information requires this tool, which an agent could glean but is never stated as a routing rule. It also doesn't mention that either name or linkId must be given, even though the schema makes both optional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
order_statusOrder statusBRead-only
Check an order status by orderId (experimental; KFC may require the logged-in account). 查询订单状态,实验性接口。
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | place_order 返回的订单号 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Read-only and open-world behavior is already covered by annotations, but the description adds genuinely new context: the endpoint is experimental and may require the logged-in account (KFC). It does not say what the status response contains, what statuses are possible, or what happens when the order is not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and kept to one sentence plus a caveat. The bilingual repetition adds length without new information, which slightly dilutes efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A one-parameter read-only tool needs little, and annotations cover safety. However, with no output schema the description could reasonably indicate what a status result looks like, and the 'logged-in account' caveat is vague about whose account (merchant vs. customer).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single orderId parameter is already documented in the schema as the order number returned by place_order. The description only restates 'by orderId', adding no syntax or format detail (e.g., length constraints) beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: check an order status by orderId. An agent can distinguish it from place_order and preview_order by name and description, though the description never contrasts it with session_status or explicitly says it applies to already-placed orders.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (query a placed order using the orderId returned by place_order) but never stated as when-to-use vs. alternatives. The experimental caveat and account requirement are preconditions rather than routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_orderPlace orderA
Submit the previewed order to KFC China. Requires confirm=true, the previewToken from preview_order and the diner phone. Creates a real unpaid order; payment must be completed by the diner in the KFC app/H5. 真实下单(会生成未支付订单),必须显式 confirm=true。
| Name | Required | Description | Default |
|---|---|---|---|
| phone | Yes | 取餐联系电话,11 位中国大陆手机号 | |
| remark | No | 备注,例如“不要辣”“少冰” | |
| confirm | Yes | 必须显式传 true,表示用餐人已确认门店/餐品/金额 | |
| packType | No | dinein=堂食(默认),takeaway=外带 | dinein |
| previewToken | Yes | preview_order 返回的 previewToken | |
| expectedTotalCents | No | 可选:用户确认的总金额(分),与预览不一致时拒绝下单 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: annotations only say non-read-only and open-world, while the description discloses that this creates a real unpaid order, that payment must be completed by the diner in the KFC app/H5, and that confirm=true must be explicitly supplied as an intent gate. The Chinese clause reinforces that a real unpaid order is generated — exactly the side-effect context an agent needs before an irreversible-ish action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the prerequisites in a compact multi-sentence block with no filler. The trailing Chinese sentence largely restates the confirm/real-order point, which is a mild redundancy given the target audience is an agent, but it costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the high-stakes aspects (required token, explicit confirmation, real unpaid order, payment handoff to the app) for a 6-param mutation tool. The one gap is the return shape — there is no output schema and the description never says what comes back (e.g. order id or status), which an agent needs to chain into order_status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter mentioned in the description (confirm, previewToken, phone) is already documented in the schema with equal or greater detail. The description adds nothing about remark, packType, or expectedTotalCents beyond what the schema states, so it sits at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Submit the previewed order to KFC China') and anchors scope to the preview step, which cleanly separates it from preview_order and order_status in the sibling list. An agent can identify this as the commit step of the ordering workflow without consulting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions: confirm=true, the previewToken from preview_order, and the diner phone, which implies the required preview_order-first workflow. It does not explicitly say when not to call it (e.g. pending cart changes) or point at alternatives such as cart_view for adjustments, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_orderPreview orderARead-only
Server-side price/stock validation before ordering (locks the current price) and returns a previewToken for place_order. 结算预校验,返回金额、门店、是否需登录和 previewToken(10 分钟内有效)。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does add useful behavior beyond the annotations: a 10-minute token TTL and the fact that the current price is locked. But "locks the current price" describes a server-side state change, which is at odds with readOnlyHint=true (no environment modification). The side effect is disclosed, but in a way that conflicts with the declared safety profile rather than clarifying it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the place_order handoff are front-loaded in the first clause, and the token TTL is attached where it matters. The Chinese sentence largely restates the first sentence before adding the return-field list, which is mild but real redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input schema to explain and no output schema available, the description compensates by naming the returned fields and the token validity window, which is the right shape for this tool. The one gap is that a price-lock side effect is never reconciled with the read-only annotation, leaving the agent unsure whether calling this mutates state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. The description correctly implies the tool derives its inputs from existing session/cart context instead of arguments, which is the only semantic question a zero-arg tool raises.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (pre-validate price and stock before ordering) and explicitly positions itself relative to a sibling by naming place_order as the consumer of the returned previewToken. It also enumerates what comes back (amount, store, whether login is required, token), so the agent knows exactly what this call yields without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"before ordering" plus "returns a previewToken for place_order" gives a clear use condition and the downstream call it feeds. It does not name exclusions or say when to skip the preview (for example, when the cart is empty), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_storeSelect storeA
Bind the ordering session to one KFC China store by storeCode and load its live menu. 选定门店并加载菜单;之后所有购物车/下单都针对该门店。
| Name | Required | Description | Default |
|---|---|---|---|
| storeCode | Yes | 门店编码,来自 find_stores 的 storeCode,例如 SH2103 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, openWorldHint=true, destructiveHint=false. The description adds real state context: this binds session scope and loads a live menu, and that the binding governs every later cart/order call — behavior the annotations cannot convey. It does not say what happens if a store is re-selected or whether the prior binding is replaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the binding action, then the downstream consequence. The bilingual restatement is a faithful translation rather than padding, but it does lengthen the definition without adding new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers what is loaded (the live menu) and the lasting effect on session state, which is what an agent needs before calling. Missing only edge-case behavior such as re-selection or invalid storeCode handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter at 100% schema description coverage, the schema already explains storeCode and its provenance from find_stores. The description restates the binding role of storeCode but adds no format or validation detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: bind the ordering session to one KFC China store by storeCode and load its live menu. That is clearly distinct from find_stores (which locates stores) and get_menu (which presumably reads a menu without binding session state).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the sequencing contract — all subsequent cart and order operations target this store — implying this must precede cart_add/place_order. It does not explicitly name find_stores as the prerequisite, though the schema fills that in.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_statusSession statusARead-only
Show current store, cart, preview and session age for troubleshooting. 查看当前会话/门店/购物车状态。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description only needs to add context. It does add value by enumerating what is surfaced (current store, cart, preview, session age), but says nothing about response shape, freshness, or whether session age has units/format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the returned fields; no filler. The bilingual duplication adds length, but it plausibly serves a locale purpose rather than being redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only diagnostic with no output schema, the description needs to convey what comes back, and it does list the four data points. Only a note on units/semantics of 'session age' and the response form is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no semantics to explain and the baseline applies. The description correctly doesn't invent parameter behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Show' plus the exact resources returned (store, cart, preview, session age) and a stated purpose (troubleshooting). This distinguishes it reasonably from cart_view and order_status, though it doesn't name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For troubleshooting' implies a diagnostic use case, which is helpful, but the description never states when to prefer this over cart_view or order_status, nor any prerequisites. Usage is implied rather than specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v1.0.0- First observed
cart_add - First observed
cart_clear - First observed
cart_remove - First observed
cart_set_quantity - First observed
cart_view - First observed
find_stores - First observed
get_item - First observed
get_menu - First observed
order_status - First observed
place_order - First observed
preview_order - First observed
search_menu - First observed
select_store - First observed
session_status
TDQS
Scored across 14 tools
Each tool targets a distinct step or resource in the ordering flow: store discovery (find_stores), session binding (select_store), menu browsing (get_menu/search_menu/get_item), cart mutation (add/set_quantity/remove/clear/view), and checkout (preview_order/place_order). The menu trio is related but clearly differentiated as list vs. fuzzy search vs. detail lookup, and the cart verb set is unambiguous.
Two conventions coexist: verb_noun tools (find_stores, select_store, get_menu, search_menu, get_item, preview_order, place_order) and noun_verb/noun_noun tools (order_status, session_status, cart_add, cart_set_quantity, cart_remove, cart_clear, cart_view). The cart_ prefix group is internally readable, but the mixed verb/noun ordering across the set prevents a higher score.
14 tools is well within the healthy range and every tool maps to a necessary stage of a food-ordering lifecycle. The five cart tools (add, set_quantity, remove, clear, view) each earn their place rather than being redundant wrappers.
The surface covers the full flow from store lookup through real order submission plus order status and session troubleshooting. Minor gaps exist: no order history/list, no order cancellation, and payment is intentionally delegated to the KFC app, which agents must work around.
Maintenance
Related MCP Connectors
Order food from Cordering white-label restaurants: browse menus, confirm, then place an order.
Pickup orders at Japanese restaurants for AI agents: find stores, read menus, place orders. No auth.
Real-time data APIs for 50+ commerce, grocery, social and maps platforms over one OAuth MCP server
Build custom POS apps with your AI agent. Final's MCP server gives developers what they need to ship a custom point of sale: scaffold a checkout flow, adapt vetted screen blueprints for counter POS, self-checkout kiosks, restaurant ordering and payment terminals, ground every call in Final's version-locked POS APIs, validate, boot a live preview and deploy to real hardware with integrated card payments. The same server also manages the store behind it: products, stock, orders, customers and sales reports. Remote Streamable HTTP with OAuth 2.1.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables users to interact with KFC's online ordering system via Playwright browser automation. It supports searching the menu, managing an order cart, finding nearby locations, and initiating checkout for pickup or delivery.712 npmMIT
- AlicenseNot gradedqualityDmaintenanceUnofficial read-only MCP server for Telepizza.es that enables querying menu, prices, offers, stores, loyalty points, and order history using your own account. It cannot make purchases.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables ordering from McDonald's through an interactive UI: selecting stores, browsing menus, managing a cart, applying coupons, placing orders, paying, and tracking orders.0MIT
- AlicenseNot gradedqualityBmaintenanceEnables Egyptian-Arabic restaurant ordering over Streamable HTTP, exposing 11 tools for Arabic menu search, cart edits, VAT-quoted totals, confirmed order placement, order status/history, and weekday-based reordering with cross-session memory of orders and preferences.MIT