Skip to main content

概述

本指南将带你使用 Clawdot Gateway,从零构建一个完整的本地生活 Agent。通过遵循最佳实践和处理边界情况,你将能够创建一个健壮、用户友好的应用。 Gateway 以 MCP(Model Context Protocol)工具的形式对外开放能力——你连上外卖 MCP,就能看到 24 个工具,用一串工具调用从绑定授权、找店选品,一路串到预览、下单、签约。本指南所有示例都以 工具名 + JSON 参数 给出(除绑定工具外,每个业务工具的参数都带 consent_grant_id)。

架构设计

一个完整的本地生活 Agent 由以下模块组成:
外卖网关通过 Streamable HTTP 暴露 24 个 MCP 工具,覆盖从绑定授权到下单支付的完整本地生活能力。工具的连接方式、分组与下单顺序见 MCP 概览。

Step 1:获取 API Key 并连接 MCP

1

在控制台创建 Agent

访问 Clawdot 控制台,创建一个 Agent 并为它开通外卖能力。Agent 与 API Key 都在控制台管理。
2

复制 API Key

系统生成 API Key(clw_ 开头),仅显示一次,立即复制并保存到安全位置。服务端只存哈希,遗失需重新生成。
3

把 API Key 配进 MCP 客户端

网关以 Streamable HTTP(FastMCP)对外提供 MCP 服务,Endpoint 为 https://eleme-gateway.hicaspian.com/mcp/v1。把 API Key 配进你的 MCP 客户端连接头:
不要把 API Key 提交到 Git 仓库或硬编码进代码,用环境变量或密钥管理注入。
API Key 标识 Agent,在连接层通过 Authorization: Bearer clw_... 请求头传递,每个 MCP 请求都需要它。后续操作用户资源时,还需要下一步获取的用户授权(consent grant),它作为业务工具的参数 consent_grant_id 传入,不走请求头。详见 认证机制。

Step 2:获取用户授权

操作用户资源(搜店、下单、查地址等)需要双层认证:连接层的 API Key 标识 Agent,用户授权(consent grant) 标识已授权的外卖用户。用户走一次绑定流程后,你拿到 consent_grant_id(cg_ 前缀),后续业务工具调用都把它作为参数带上。 绑定支持两种模式:sms(向手机号下发验证码)与 h5(返回授权链接,用户在链接中登录授权)。绑定类工具 request_user_bind / verify_user_bind 是获取授权的入口,只需 Agent 身份(连接层 API Key),本身不传 consent_grant_id。下面以 sms 模式演示。

绑定流程

第一步,发起绑定,网关向用户手机下发验证码:
第二步,用户告知验证码后确认绑定,铸造 consent_grant_id:
拿到 consent_grant_id 后,妥善保存——它明文仅本次返回一次,落库仅存哈希。后续每个业务工具调用都把它作为参数带上。
也支持 H5 模式:request_user_bind(auth_type="h5") 返回 h5_url(有效期约 300 秒),把链接交给用户打开完成授权;随后 verify_user_bind(auth_type="h5", request_id=...) 轮询,pending 表示还没好,bound=true 时返回 consent_grant_id。也可在 request_user_bind 传 callback_url,授权完成后网关 POST 回调(event=user_bind)。完整字段见 发起绑定 与 确认绑定。
绑定成功返回的 expires_at 是授权过期时间(ISO 8601)。重授权即轮换:同一用户每次成功绑定都会铸造新的 consent_grant_id,旧的立即失效。授权可随时通过 revoke_user_bind 撤销,撤销后旧 consent_grant_id 即时失效。

Step 3:核心业务流程

实现从备好收货地址、搜店选品、算价、预览到下单的完整链路。整条链路是有状态的:每一步返回的 ID 必须原样回传给下一步,不可自造或跨链路混用。先备好收货地址、再按地址搜可送达的店,下游工具因此都拿得到配送坐标。
所有金额字段单位为分(整数),不是元。例如 payable_price: 1500 表示 ¥15.00。
免密支付签约是账户级的一次性前置(见下文「免密支付签约」),不属于每一单的链路、也不绑定某笔订单——不要把它当成下单链路里的一步。
下面每个业务工具调用都带 consent_grant_id 参数(来自 Step 2)。

Phase 1:准备收货地址

先定下”送到哪里”。地址流程 = 搜 POI 拿一次性 token → 登记拿 address_id。先搜地址:
saved_addresses[] 是已保存地址,可直接复用其 address_id;新地址则取一条 suggestions[].token,作为 select_address 的 suggestion_token 入参登记:
也可直接用已有地址的 address_id 调 select_address。这个 address_id 既用于下一步搜店,也用于后续算价 / 预览。详见 搜索地址 与 选择/登记地址;编辑门牌 / 标签用 update_address(address_id 不变)。

Phase 2:搜索商家

用上一步的 address_id 搜可送达的店铺。不传 keyword 即按该地址附近浏览模式(最多 20 家),带距离、评分、配送费、起送价等决策字段;传 keyword(店名 / 品类 / 商品名)则精确搜索(约 5 家)。浏览模式可传 offset 翻页:首次传 offset: 0,用返回的 next_offset 继续翻,直到 shops 为空。 每个结果都附带 shop_id 与 cart_id:cart_id 已封装该店铺与本次配送坐标,是后续 get_shop_menu / quote_cart / preview_order 的入口,原样回传即可,下游工具因此免传经纬度。完整字段见 搜索店铺。

Phase 3:查看菜单详情

菜单可能很大(100+ 项),可用 keyword 或 limit / offset 渐进披露,按 has_more 判断是否还有更多。下单必须使用 get_shop_menu 返回的 item_id / sku_id(以及规格 / 加料的 ingredient_option_ids)。完整字段见 店铺菜单;规格 / 属性 / 加料体系见 商品规格说明。

Phase 4:购物车算价

items 是一个数组(不是 JSON 字符串),每项的 item_id / sku_id 来自 get_shop_menu。can_checkout 指示是否满足起送等下单条件,payable_price 是预估应付(单位分)。完整字段见 购物车算价。

Phase 5:预览订单(下单前确认)

始终在创建订单前用 preview_order 校验并向用户确认最终价格,避免误操作。预览产出的 preview_id + confirmation_token 是真正下单所需的凭据。
preview_id + confirmation_token 须配对使用,由同一次预览产出,有效期约 10 分钟。 优惠券在预览阶段生效,当前订单可用券以返回的 available_coupons 为准(coupon_ids 三态:不传=自动选最优券;[]=不用券;["<coupon_id>"]=指定券)。要换券时,选中 available_coupons[].coupon_id,带 coupon_ids=[...] 重新调一次 preview_order 重算:
账户级券列表可用 list_coupons 查看,但当前订单实际可用以 preview_order 的 available_coupons 为准。完整字段与 coupon_ids 三态说明见 预览订单。

Phase 6:创建订单

用同一次预览的 preview_id + confirmation_token 正式下单:
本工具以 confirmation_token 为幂等键:同一令牌只能下一单,再次下单需重新预览取新令牌。返回 order_id、status 与(需支付时的)payment_action。可选传 callback_url,这笔单每次状态变化都会 POST 一条回调(体含 order_id、seq、status 等;支付结果那条为 event=order_payment 并带 ispay);不传则自行用 get_order_status 轮询。完整字段见 创建订单。

Step 4:免密支付签约(账户级,一次性)

免密签约让用户授权免密支付:签约一次,后续免密支付类订单即可自动扣款。它是账户级、一次性的前置设置,不绑定某一笔订单、也不是每单都要做——所以独立于上面的下单链路。建议在需要免密支付前先用 get_sign_status 查是否已签约,未签约再发起:
action_type=open_h5 时把用户引导到 action_url(H5 签约页)完成签约,完成后浏览器跳回 return_url;none 表示已签约。随后用 get_sign_status 轮询签约结果:
完整字段见 发起免密签约 与 查询签约状态;下单链路与支付时序见 下单流程。

Step 5:处理边界情况

健壮的 Agent 应该优雅地处理各种边界情况,提供友好的错误提示。Gateway 的错误统一返回 {"error": {"code", "message"}} 结构(每个 MCP 工具失败时都是这个形状)。

错误处理

按 error.code 分支给用户友好提示:

用户授权过期处理

任意业务工具返回 CONSENT_GRANT_INVALID / CONSENT_GRANT_EXPIRED 即表示需要重新授权(也可主动比对绑定时记录的 expires_at)。重新走一遍绑定流程即可——重授权即轮换,会得到新的 consent_grant_id,把它替换掉本地存储的旧值。

商家关闭处理

search_shops 浏览模式结果中的 available / unavailable_reason 可提前判断商家是否营业。若下单链路中途遇到商家关闭,提示用户选择其他商家,并回到 search_shops 重新选店。

订单查询重试

get_order_status 是只读查询,超时可安全重试:
建议对 get_order_status 这类只读工具做有上限的退避重试(如最多 3 次),下单类工具则不要盲目重试——靠 confirmation_token 幂等键避免重复下单。

最佳实践

复用已保存地址

search_addresses 返回 saved_addresses[],优先复用其 address_id,避免重复登记新地址。

渐进披露大菜单

菜单可能有 100+ 项。get_shop_menu 用 keyword 或 limit / offset 分页,按 has_more / next_offset 翻页直到取完。

日志和监控

记录关键工具调用(入参摘要、返回的 order_id / 错误码等),便于调试和监控。注意脱敏 consent_grant_id 等敏感字段。

速率限制处理

尊重速率限制(下单 10 次/分钟,其他 60 次/分钟,每 Agent)。超限时工具返回 RATE_LIMITED,用指数退避重试。

金额单位统一为分

所有金额字段都是分(整数)。展示给用户时除以 100,不要把分当元。payable_price: 1500 即 ¥15.00。

优雅降级

当上游不可用(ELEME_ERROR)时,提供替代方案(展示缓存结果或提示用户稍后重试)。

完整链路一览

把上面各步骤的工具调用串起来,就是一次完整下单:
先备好收货地址、再按地址搜可送达的店,下游工具因此都拿得到配送坐标。所有跨步骤的 ID(address_id / shop_id / cart_id / preview_id / confirmation_token …)都由网关签发、原样回传,不要自行构造或跨链路混用。confirmation_token 是下单幂等键,绑定阶段铸造的 consent_grant_id 是后续每个业务工具调用都要带的用户授权参数。免密支付签约(get_sign_action)是账户级、一次性的前置,独立于这条下单链路(见 Step 4)。

下一步

  • 查看 MCP 概览 了解 24 个工具的连接方式、分组与完整入参 / 出参
  • 阅读 下单流程 掌握完整的有状态下单链路与支付时序
  • 阅读 安全模型 学习数据保护最佳实践
  • 探索 支持的平台 集成到你的 Agent 应用