概述
本指南将带你使用 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 标识 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 后,妥善保存——它明文仅本次返回一次,落库仅存哈希。后续每个业务工具调用都把它作为参数带上。
绑定成功返回的
expires_at 是授权过期时间(ISO 8601)。重授权即轮换:同一用户每次成功绑定都会铸造新的 consent_grant_id,旧的立即失效。授权可随时通过 revoke_user_bind 撤销,撤销后旧 consent_grant_id 即时失效。Step 3:核心业务流程
实现从备好收货地址、搜店选品、算价、预览到下单的完整链路。整条链路是有状态的:每一步返回的 ID 必须原样回传给下一步,不可自造或跨链路混用。先备好收货地址、再按地址搜可送达的店,下游工具因此都拿得到配送坐标。免密支付签约是账户级的一次性前置(见下文「免密支付签约」),不属于每一单的链路、也不绑定某笔订单——不要把它当成下单链路里的一步。
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:查看菜单详情
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)时,提供替代方案(展示缓存结果或提示用户稍后重试)。完整链路一览
把上面各步骤的工具调用串起来,就是一次完整下单:address_id / shop_id / cart_id / preview_id / confirmation_token …)都由网关签发、原样回传,不要自行构造或跨链路混用。confirmation_token 是下单幂等键,绑定阶段铸造的 consent_grant_id 是后续每个业务工具调用都要带的用户授权参数。免密支付签约(get_sign_action)是账户级、一次性的前置,独立于这条下单链路(见 Step 4)。

