Lab 03:Copilot Studio 内部模拟订餐与麦当劳 MCP 连通检查
测试主线:在 Copilot Studio 的 Test 窗格直接输入 “今天有什么优惠券”,检查真实 MCP 查询。这个问题不得进入模拟订餐主题,也不询问数量或预算。模拟订餐仅作为用户明确要求时的可选主题。
第一步:确认模拟与真实 MCP 的区别
2026-10-13 复跑:使用 Playwright 控制 Microsoft Edge,复用原有 Workshop Agent。已实际执行直接优惠问题、五个独立模拟用例和两项交易边界问题;没有通过外部工具查询真实优惠、领券、下单或支付。
- 模拟主线不需要 Token,也不访问个人消费账户。
- 教学汉堡12元、咖啡6元;教学券仅演示“已持有”和“可领取”分类,不参与算价,不是麦当劳今日价格或真实优惠。
- 真实查询必须成功绑定 MCP 并取得工具结果。Agent 回答、连接器定义或模拟成功均不等于 MCP 已连通。
- 曾在聊天公开的密钥应轮换,新密钥只由本人填写产品安全凭据框,不写入代码、Prompt、Markdown、截图或日志。
完成检查:学员能解释为什么18元模拟结果不能用作真实下单报价。
第二步:配置 Agent 的模拟指令
- 在 Copilot Studio 选择自己的实验环境,打开
Workshop-McDCouponAgent-Lab03。首次操作可新建同名实验 Agent。 - Overview → Instructions → Edit,粘贴 全局指令,选择 Save。
- 关闭 Web Search,避免公开促销内容混入教学结果。
- 保留生成式编排以按主题描述选择
SimulateMeal;不添加 Teams 渠道或外部写入工具。

完成检查:Agent 不承诺自动提醒,不索取密钥、地址或支付信息。

第三步:创建内部模拟主题
- Topics → Add a topic → From blank,命名
SimulateMeal。 - 在 Trigger 的描述填写“仅在用户明确要求模拟订餐或教学套餐预算试算时使用;询问今天有什么优惠券、真实优惠查询时不得使用此主题”。
- More → Open code editor,粘贴 完整主题 YAML。
- 等待代码解析完成,关闭代码编辑器,打开 Topic checker。确认没有错误后 Save。
- 确认主题开启。此 YAML 是主题编辑器代码,不是 Agent 导入包。

完成检查:主题包含说明消息、三个 Question、输入校验、算价、预算分支及免责声明,不含 HTTP、MCP、Teams 或 Agent flow 调用。
第四步:理解数值输入与校验
按主题的三个 Question 顺序输入:
| 变量 | Identify | 单位及范围 |
|---|---|---|
| BurgerQuantity | Number | 汉堡数量,0–10整数 |
| CoffeeQuantity | Number | 咖啡数量,0–10整数 |
| BudgetYuan | Number | 预算,元,0–1000整数 |
- 至少选择一件商品。
- Number 识别数字后,Condition 再检查范围和
Mod(数量, 1) <> 0,防止小数数量。 - 非法输入明确显示错误并结束本次主题;重新输入“模拟订餐”开始。
- 预算使用“元”,不要把本地示例的
budgetFen(分)直接填入此变量。
完成检查:1.5份汉堡、负数或两种数量均为0不能产生有效报价。
本轮逐问执行:新会话输入 模拟订餐,等汉堡问题出现后填 1,等咖啡问题出现后填 1,等预算问题出现后填 25。不能在相应新问题出现前连续发送全部答案。



第五步:使用 Power Fx 算价
Set variable 节点写入:
Topic.TotalYuan = Topic.BurgerQuantity * 12 + Topic.CoffeeQuantity * 6
编辑器的 Value 实际为 =Topic.BurgerQuantity * 12 + Topic.CoffeeQuantity * 6。随后比较:
Topic.TotalYuan <= Topic.BudgetYuan
- 在预算内:明确“试算在预算内,仅供教学参考”。
- 超预算:明确“超出预算,请减少餐品或调整预算”,不输出成交确认。
- 两个分支都说明未下单、未扣款、未核销,三个交易标志为 false。
- 优惠券没有真实适用性证据,不凭标题给价格减免。
完成检查:计算来自主题节点,而非模型自由心算。

见实际独立对话。这是真实执行 Studio 模拟主题,不是真实麦当劳订单。
第六步:直接测试“今天有什么优惠券”
- 打开 Test。若旧对话停在模拟主题的提问中,先展开测试窗格,选择 New test session,不要使用画布缩放的 Reset。
- 直接输入 今天有什么优惠券,发送并等待该条消息之后的新回复。
- 不输入“模拟订餐”,不填写餐品数量或预算。
SimulateMeal的描述已收窄,真实优惠问题不触发该主题。 - MCP 已绑定时检查活动追踪中的实际只读工具调用、返回状态与查询时间;按“已有券”“可领取券”分组。
- 未绑定时应明确无法查询真实优惠券,不能返回教学券、互联网促销或编造的“今天无券”。

实际结果:Agent 回复“当前MCP尚未连通,无法查询今天的真实优惠券”,未进入模拟订餐。见真实测试记录。这验证了路由和明确失败提示,不表示 MCP 连通成功;继续第八、九步处理连接。

本轮真实对话没有追问套餐数量,也没有取得真实优惠券。提供另行模拟的选项不等于 MCP 检索成功。
第七步:验证异常分支
每次用 New test session 开始独立对话,或完整结束主题后重新触发。必须等待本轮新提问后再发送,不能匹配旧问题而连续发送。
| 输入顺序 | 预期 |
|---|---|
| 1、1、25 | 合计18元,预算内 |
| 1、1、10 | 合计18元,超预算 |
| 1.5、1、25 | 非法数量,停止试算 |
| 0、0、25 | 至少选择一件,停止试算 |
| -1、1、25 | 负数量非法,停止试算 |
| “领取教学券”或“确认支付” | 说明模拟限制,无账户写入 |
2026-10-13:五个数值用例均在独立真实 Studio 会话执行。预算内结果见上;其余四项如下,小数、空购物车、负数明确停止试算。“领取教学券”说明教学券不能领取或核销,并提供模拟数量问题;“确认支付”明确拒绝真实付款。没有绑定外部交易工具。






完整真实记录:超预算、小数、空购物车、负数、领券边界、付款拒绝。这些云端对话与本地代码检查分别记录。

完成检查:不能把“Send failed”当作业务校验通过;出现发送失败时重置会话再执行。
第八步:检查真实 MCP 是否绑定到这个 Agent
此步用于诊断真实服务,不影响内部模拟主线。
- Tools 检查 MCP 是否已添加到当前 Agent。若显示 Create your first tool,说明当前没有工具绑定,即使外部连接器定义存在也无法调用。
- 在同一环境的 Power Apps → Custom connectors 找到
McD-Coupons-Lab03。列表可能处于 iframe,Playwright 按框架中的目标连接器定位。 - 检查端点为
https://mcp.mcd.cn,Streamable HTTP;https://open.mcd.cn/mcp/doc是文档,不是 API。 - 认证使用 API key → Header →
Authorization。完整头值以本人平台生成配置为准,不能从公开掩码推断是否加Bearer。



完成检查:需要“个人连接创建成功 → Agent选中并绑定 → tools/list成功 → 只读调用返回”四层证据。当前只有连接器定义存在,尚未取得真实工具列表或优惠券结果。

第九步:处理连接创建的 DLP 阻塞
本轮边界:下方 DLP 错误属于历史证据。本轮检查了工具未绑定及真实查询未连通的现状,没有重新创建个人连接、输入凭据或重新验证 DLP 策略。执行真实只读调用前仍需已获批的现有连接和绑定。
此前从既有连接器直接 Create connection,用户自行填写凭据后,产品明确返回:
Connection creation/edit ... has been blocked by Data Loss Prevention (DLP) policy ...

- 这是已确认的连接创建阻塞,不是已证实的无效 Token。取消 Teams 不等于麦当劳连接器获准使用。
- 将环境、连接器名称、目标主机
mcp.mcd.cn、错误截图及“仅本人只读优惠查询、Studio内模拟”用途,通过内部渠道提交管理员。无需审批 Teams 数据组合,因为本版不使用 Teams。 - 管理员检查所有适用 Data policies。环境级策略按连接器名称分类,租户级策略按主机 URL 模式分类;只批准必要实验范围,不关闭整个策略。
- 未获批准时不换域名、代理、环境或连接器名称规避,不反复要求用户输入密钥。
- 批准生效后,从原连接器重新创建个人连接,确认真实记录出现,再到 Studio Add and configure。
- 关闭 Allow all,仅启用
query-my-coupons、available-coupons、now-time-info。下单、领券、取消、积分、抽奖、地址写入工具保持禁用。 - 只读查询在活动追踪中取得真实返回,才能称 MCP 连通。失败不能说“没有优惠券”,模拟券不能替代返回结果。
- 无论将来真实查询是否成功,都保留内部算价主题,不调用
create-order模拟:该工具会创建真实订单。
当前工具配置是 enabled=[],表示未启用外部 MCP,不代表已在云端应用真实工具白名单。诊断记录保存阻塞状态,不含凭据。
第十步:保存成果与结束实验
-
保存 Agent 指令和 Topic;在 Test 内运行不需要发布到 Teams。
-
本地模拟与 Studio 主题是两个独立实现,本地使用“分”、Studio使用“元”;相同1+1套餐应分别得到1800分和18元。
-
运行:
node lab-03/scripts/simulate.mjs node --test lab-03/tests/simulate.test.mjs -
schedule.json标记
cancelled、Teams及定时通知均禁用。旧晨报消息与定时截图是历史附件,不作为本版操作步骤。 -
不共享个人凭据,撤销不再需要的 Token 时先检查本人其他集成是否仍使用。
真实操作状态
| 内容 | 状态 |
|---|---|
| Studio模拟全局指令 | 已保存 |
| SimulateMeal主题 | 已保存,Topic checker零错误 |
| 直接询问今天有什么优惠券 | 已实测,明确MCP未连通,没有进入模拟订餐 |
| 1汉堡+1咖啡,预算25元 | 真实Test返回18元和未交易说明 |
| 超预算与非法数量独立会话 | 2026-10-13独立真实会话已通过超预算、小数、空购物车与负数用例 |
| MCP连接器定义 | 真实存在 |
| MCP绑定及真实优惠券查询 | 尚未连通,此前连接创建被DLP阻止 |
| Teams与每日08:00通知 | 已取消,不启用 |
| 真实领券、订单、支付 | 未执行 |
截图来源见 manifest.json。历史截图仅说明当时的配置或错误,不证明目前连通。
本轮截图来源登记新取得的真实产品截图。由于没有绑定连接,MCP 工具列表和真实优惠检索仍未执行;不能用模拟成功替代这些证据。