公司动态
AI Agent通过MCP协议实现瑞幸咖啡自动点单:技术实践与挑战
1. 一次真实的AI点单实验动机与背景最近AI Agent智能体这个概念火得不行各种大模型都在强调自己的“智能体”能力仿佛不搞点Agent出来就跟不上时代了。但说实话看多了发布会和演示视频我总有个疑问这些Agent在实际生活场景里到底能不能真的“用”起来它们是真能帮我们省事还是只是技术Demo里的花架子正好我注意到瑞幸咖啡的官方MCPModel Context Protocol服务开放了。MCP是Anthropic提出的一种协议简单理解就是让大模型能够安全、标准化地调用外部工具和数据。瑞幸作为一家高频消费品牌把点单能力通过MCP开放出来这本身就是一个非常有意思的信号——它意味着AI Agent可以直接“动手”为我们完成一次真实的商品购买。这太有吸引力了。与其空谈Agent的潜力不如亲手让它跑一次完整的商业闭环从理解我的意图到浏览菜单、选择商品、确认订单、完成支付。这中间任何一个环节掉链子都足以说明当前技术的真实水位。于是我决定做一次“小白鼠”亲自扮演用户让一个配置了瑞幸官方MCP的AI Agent帮我下一单咖啡。这篇文章就是这次实验的完整记录、技术拆解和深度复盘。我会详细还原整个过程分析其中的技术亮点与槽点并分享我对AI Agent落地消费场景的一些真实思考。2. 实验环境搭建Agent、MCP与瑞幸服务的三角连接要让AI Agent完成点单首先得搭建一个能让它“动手”的环境。这不像我们平时用ChatGPT聊天它需要具备“感知-思考-行动”的能力。我的实验架构核心是三个部分一个具备推理和规划能力的AI大脑Agent框架、一双能操作瑞幸系统的手MCP Server、以及瑞幸本身的服务接口。2.1 Agent框架的选择与考量市面上能用的Agent框架不少比如LangChain、AutoGen、CrewAI等。我最终选择了一个相对轻量、对MCP原生支持较好的框架。这里不具体点名因为核心逻辑是相通的。选择时我主要考虑几点对MCP协议的支持度框架是否能方便地加载和调用MCP Server这是连接瑞幸服务的前提。规划与推理能力Agent不能只会一步一步执行死命令。它需要理解“我想喝杯咖啡”这样的模糊指令并自主拆解成“登录-查询菜单-选择商品-确认订单-支付”这一系列步骤。可控性与透明度实验过程中我需要能清晰地看到Agent的“思考过程”即Chain of Thought以及它每一步调用了什么工具、返回了什么结果方便排查问题。基于这几点我搭建了一个基础的Agent其核心是一个大语言模型LLM我赋予了它一个明确的系统指令System Prompt你是一个咖啡点单助手目标是帮助用户完成瑞幸咖啡的下单。你可以通过可用的工具来获取信息并执行操作。在行动前请逐步思考你的计划。2.2 瑞幸MCP Server的配置与连接这是本次实验最关键的环节。瑞幸的MCP Server本质上是一个标准的HTTP服务它根据MCP协议定义了工具Tools和资源Resources。我需要将这个Server配置到我的Agent框架中。配置过程通常涉及指定Server的URL或本地运行一个Server实例。以本地运行为例我可能需要通过命令行启动一个服务# 示例命令非真实命令 python -m luckin_coffee_mcp_server --port 8080然后在Agent的配置文件中声明这个MCP Server# 示例配置 mcp_servers: luckin: command: npx -y luckin/coffee-mcp-server # 或者使用直接的HTTP连接 # url: http://localhost:8080成功连接后Agent就能“看到”瑞幸MCP暴露出的工具了。通过检查工具列表我确认了可用的功能通常包括search_products根据关键词搜索商品。get_product_detail获取某个商品的详细信息价格、规格、库存等。get_nearest_stores获取附近的门店信息。add_to_cart将商品加入购物车。get_cart查看当前购物车。place_order提交订单。get_order_status查询订单状态。注意实际的工具名称和参数可能有所不同但功能模块大抵如此。这里的一个关键点是MCP协议规范了交互方式使得不同的Agent框架都能以统一的方式调用这些工具这是其价值所在。2.3 用户身份的模拟Token与授权任何商业操作都离不开身份认证。瑞幸MCP服务调用其内部API必然需要用户登录态。在实验前我需要先通过瑞幸官方App或小程序以常规方式登录我的账号。然后关键的一步来了如何将我的登录状态“赋予”Agent这通常通过access_token或类似的授权令牌实现。在配置MCP Server时我需要提供一个有效的用户Token。这个Token可能通过OAuth2.0等授权流程获得也可能在启动Server时通过环境变量或配置文件传入。# 示例通过环境变量传递Token LUCKIN_ACCESS_TOKENyour_token_here python -m luckin_coffee_mcp_server这个过程涉及敏感的身份信息因此安全是重中之重。在实验环境中我使用了测试账号并且确保Token不会泄露。这也引出了一个未来落地的核心问题普通用户如何安全、便捷地将自己的服务授权给AI Agent使用现有的“扫码授权”或“OAuth授权”模式可能需要更流畅的集成。环境搭建完毕Agent拥有了大脑LLM、双手MCP工具和身份Token一场真实的点单实验即将开始。3. 点单全流程实录Agent的思考与行动我坐在电脑前给我的AI Agent发出了第一条指令“帮我用瑞幸点一杯生椰拿铁要冰的不另外加糖送到我默认地址。”接下来我就像观看一场电影一样观察着Agent的自主操作。以下是它思考与行动步骤的完整记录我同步加入了技术层面的解读。3.1 第一步意图解析与计划制定Agent并没有立刻去调用“点单”工具。它首先输出了它的“思考”“思考用户想要一杯特定口味冰、不另外加糖的生椰拿铁并配送到默认地址。这是一个标准的商品购买流程。我需要先确认商品是否存在及详情然后确认配送地址最后完成下单。计划如下1. 搜索‘生椰拿铁’商品。2. 从结果中筛选出符合‘冰’、‘不另外加糖’规格的商品。3. 获取我的默认配送地址可能需要调用用户信息工具或直接使用下单工具中的地址参数。4. 将选中的商品加入购物车。5. 提交订单。”技术解读这一步完全由LLM驱动。它基于我的系统指令“你是点单助手”和用户请求进行任务分解Task Decomposition。它识别出了几个关键实体商品名生椰拿铁、属性冰、不另外加糖、动作点单、配送。这个规划能力是Agent区别于简单自动化脚本的核心。3.2 第二步商品搜索与规格确认Agent开始行动。它首先调用了search_products工具参数为query: “生椰拿铁”。工具调用记录工具:search_products参数:{“query”: “生椰拿铁”}返回结果: 一个商品列表包含“生椰拿铁热/冰”、“丝绒生椰拿铁”、“厚乳生椰拿铁”等多个SKU每个SKU都带有基础信息如产品ID、名称、基础价格。Agent收到结果后并没有直接选择第一个。它继续“思考”“思考搜索返回了多个相关商品。用户指定了‘冰的’所以我需要找到冰饮选项。同时用户要求‘不另外加糖’这可能是商品的一个可选规格。我需要获取具体商品的详细信息来确认。”接着它从列表中选取了看起来最基础的“生椰拿铁冰”对应的产品ID调用了get_product_detail工具。工具调用记录工具:get_product_detail参数:{“product_id”: “xxx123”}(假设的ID)返回结果: 商品的完整详情包括当前价格、可选规格温度冰/热甜度标准糖/半糖/不另外加糖等、可选加料奶油、浓缩等、库存状态、商品图片等。技术解读与槽点这一步体现了Agent的“感知”能力。它知道搜索结果是粗略的需要进一步探查细节。MCP Server返回的结构化数据JSON格式让Agent能轻松解析。然而这里出现了一个小瑕疵返回的商品详情中“不另外加糖”是一个甜度选项而“冰”是一个温度选项。Agent需要理解这是两个独立的维度并能在后续的“加入购物车”操作中正确组合。如果MCP工具的参数设计不够直观Agent可能会混淆。3.3 第三步地址获取与购物车操作在确认商品详情后Agent的思考日志显示“思考商品详情确认存在‘冰’和‘不另外加糖’的规格选项。接下来需要确认配送地址。根据工具列表没有直接的‘get_default_address’工具。可能地址信息会在调用place_order时作为参数传入或者需要从用户资料中推断。我尝试先查看购物车并准备添加商品。”它先调用了get_cart查看当前购物车为空然后调用add_to_cart。工具调用记录工具:add_to_cart参数:{“product_id”: “xxx123”, “specifications”: {“temperature”: “ice”, “sweetness”: “no_extra_sugar”}, “quantity”: 1}返回结果: 成功。返回更新后的购物车信息包含刚添加的商品条目及小计。技术解读这里涉及到工具参数的映射。Agent需要将自然语言描述的“冰的不另外加糖”准确地映射到MCP工具定义的参数键值对上如temperature: “ice”,sweetness: “no_extra_sugar”。这依赖于LLM对工具描述的理解能力。成功加入购物车意味着商品规格匹配正确。3.4 第四步订单提交与支付模拟购物车有了商品来到最后一步。Agent继续思考“思考商品已加入购物车。现在需要提交订单。提交订单需要配送地址和支付方式。由于用户说‘默认地址’且我没有独立的地址查询工具我假设在place_order工具中可以传递一个如use_default_address: true的参数或者该工具能自动获取当前登录用户的默认地址。我将尝试调用下单工具。”工具调用记录工具:place_order参数:{“cart_id”: “cart_abc”, “delivery_remark”: “”}(参数仅为示例实际可能更复杂)返回结果:订单创建成功返回订单号ORDER20240517123456预计送达时间订单金额支付状态为“待支付”。高潮与转折是的Agent成功创建了订单但是状态是“待支付”。在真实的瑞幸流程中创建订单后会跳转到支付页面微信支付/支付宝。然而当前的MCP工具集里可能没有集成完整的支付工具。返回结果中可能包含一个payment_url支付链接但让Agent自动完成支付涉及更高的安全和合规门槛。我的处理实验至此核心目标——“让Agent自主完成从意图到生成订单”——已经达成。支付环节我手动在手机上打开了瑞幸App在“待支付订单”里看到了刚刚由Agent创建的订单并手动完成了支付。几分钟后我如愿喝到了这杯“AI代劳”的生椰拿铁。4. 深度复盘MCPAgent方案的闪光点与现实挑战一杯咖啡下肚是时候冷静复盘这次实验了。整个过程既有令人兴奋的“未来已来”的瞬间也暴露了诸多必须跨越的鸿沟。4.1 优势与价值为什么这件事有意义标准化接口降低集成成本MCP协议的核心价值在于标准化。对于瑞幸这样的服务商他们只需要按照MCP规范开发一套Server理论上就能被所有支持MCP的AI Agent无论是Anthropic的Claude、OpenAI的GPTs还是其他任何框架直接调用。这比为每个AI平台单独开发插件或API要高效得多。对于开发者来说也只需要学习一次MCP就能连接众多服务。Agent的自主规划能力得到验证实验证明在工具定义清晰的前提下现代的LLM完全有能力将一个模糊的用户指令“点杯生椰拿铁”分解为一系列正确的工具调用序列。它展现了初步的“思考-行动-观察”循环ReAct模式这是实现复杂任务自动化的基础。开启真正的服务闭环与只能提供信息的问答Bot不同MCP赋能下的Agent能真正“做事”。从信息查询到最终触发一个真实的商业交易这个闭环的跑通为AI融入日常生活场景点餐、打车、订票、智能家居控制提供了可行的技术路径。提升复杂任务体验想象一下未来你可以对Agent说“帮我对比一下公司附近三家瑞幸的‘丝绒拿铁’价格和预计送达时间选最快的那家下一单”。这种涉及多步骤查询、比较和决策的任务Agent处理起来可能比人类手动操作更高效。4.2 痛点与挑战距离“好用”还有多远工具描述的精确性与Agent理解的偏差这是最大的实操痛点。MCP Server提供的工具描述Name, Description, Parameters Schema必须极度精确和无歧义。例如如果“甜度”参数的描述枚举值包含“无糖”和“不另外加糖”而LLM根据常识认为两者等价选择了“无糖”但后端系统可能严格区分导致下单失败。这需要服务提供方以“机器可精确理解”为目标来设计工具对产品能力要求很高。复杂参数与状态管理的挑战点单过程中商品规格温度、甜度、加料是一个嵌套或组合参数。Agent需要正确构造这个JSON对象。更复杂的是一些选择可能有依赖关系例如选了某种加料才能选某种甜度。目前的Agent在处理复杂的状态和参数依赖时容易出错需要更强大的推理和验证机制。支付与安全的高墙支付是金融级安全操作。让Agent直接调用支付接口涉及用户密码、短信验证码、生物识别等目前几乎不可行。主流的折中方案是Agent创建订单后生成一个待支付订单或支付链接引导用户到受信任的客户端如手机App进行最终确认和支付。这打断了“全自动”的体验但却是安全和合规的必要妥协。错误处理与鲁棒性不足实验中一切顺利但现实中充满意外。门店突然打烊、商品售罄、配送地址超出范围、网络超时……当工具调用返回一个错误时当前的Agent往往缺乏有效的恢复策略。它可能需要人类介入或者只能报错退出。构建能够优雅处理异常、尝试备选方案的Agent是工程上的巨大挑战。用户授权与隐私的平衡如何让用户放心地把瑞幸、美团、滴滴等服务的操作权限授予一个AI Agent需要一个统一、安全、用户可控的授权管理平台。用户必须能清晰地知道Agent在什么时间、用什么身份、执行了什么操作并能随时撤销授权。这不仅是技术问题更是产品和信任问题。5. 给开发者与产品经理的实操建议基于这次踩坑实践对于想尝试或正在开发类似MCP服务或AI Agent应用的朋友我有几点非常具体的建议设计工具时要像设计API一样严谨你的MCP工具描述就是给AI看的API文档。参数名、枚举值、描述语必须清晰、一致、无二义性。最好能提供详尽的示例Examples。可以考虑为复杂参数设计更结构化的Schema甚至提供一个小型的“模拟测试”环境让Agent开发者能提前验证调用逻辑。为你的MCP Server实现完善的错误码和提示信息当调用失败时返回的错误信息不应该只是“400 Bad Request”。应该像对待人类开发者一样提供结构化的错误码如INVENTORY_SHORTAGE、STORE_CLOSED和友好的提示信息“您选择的商品在当前门店已售罄是否查看其他门店”。这能极大帮助Agent或背后的LLM理解问题所在并有可能进行自我修正。分阶段实现“自动化”不要一开始就追求全自动支付。可以从“只读”或“创建草稿”类工具开始。例如先开放“搜索商品”、“查询门店”、“估算运费”等工具让Agent扮演一个超级比价和查询助手。待模式成熟、信任建立后再逐步开放“创建待支付订单”等写操作。支付环节长期来看可能会依赖设备本地认证如手机TEE环境或特定的安全代理模式。在Agent侧加强验证与确认机制对于重要的操作如下单、修改地址即使Agent自主规划出来了也可以在最终执行前设计一个“用户确认”环节。例如让Agent生成一个订单摘要商品、规格、价格、地址以清晰的形式呈现给用户说“我将为您提交如下订单请确认”。这既是安全垫也是提升用户体验的关键。积极拥抱并参与MCP生态MCP还是一个新兴协议但由Anthropic推动势头很猛。尽早按照其规范暴露你的服务相当于提前占位AI Agent生态。同时多与Agent框架的开发者社区交流了解他们在调用时遇到的共性问题反哺你自身工具的设计。这次用Agent通过瑞幸MCP下单的实验像一次对未来的小小窥探。它既不完美也远非无缝但确实让我触摸到了“软件3.0”的脉搏——一个由自然语言驱动、AI自主调用工具来完成复杂任务的时代。技术上的坑还需要一锹一锹去填但方向已经清晰。作为开发者和用户我们正在亲身参与这场变革。下次或许我可以试试让Agent帮我规划一份一周的咖啡套餐并自动在每天上午十点下单——那将是另一个关于记忆、规划和定时执行的有趣故事了。