Install
openclaw skills install ap2-checkoutAP2 Agent-to-Agent mock checkout (SuperShoe). HP/HNP with card or x402 via mcporter and local mock MCP. No real payments.
openclaw skills install ap2-checkoutDrive the AP2 unified demo purchase flow via mcporter against local mock MCP servers (merchant, buyer, credentials provider, MPP). All settlement is simulated.
From your AP2 clone (installs skill, patches OpenClaw, starts mock backend):
cd "$AP2_HOME"
npx -y file:code/samples/python/scenarios/a2a/unified/clawhub/npm/ap2-agent-checkout install
Then restart the OpenClaw gateway. Manual steps below are only needed if you skip the installer.
AP2_HOME to the repository root (the folder that contains code/):export AP2_HOME="/path/to/AP2"
cd "$AP2_HOME/code/samples/python/scenarios/a2a/unified"
chmod +x openclaw/start_ap2_backend.sh openclaw/stop_ap2_backend.sh
./openclaw/start_ap2_backend.sh
mcporter.json (after ClawHub install, use the skill directory):# After clawhub install (adjust if your skills dir differs):
export MCPORTER_CONFIG="$HOME/.openclaw/workspace/skills/ap2-checkout/mcporter.json"
Enable skills in ~/.openclaw/openclaw.json: mcporter and ap2-checkout → enabled: true. Restart the gateway.
Verify (optional): run scripts/check-backend.sh from this skill folder with AP2_HOME set.
See references/setup.md for ports and troubleshooting.
Use a stable session_id per chat (Feishu channel + peer id, or any unique string). Pass it to every ap2-buyer.* tool.
mcporter list ap2-buyer --schema
mcporter list ap2-merchant --schema
| User intent | presence_mode | payment_method |
|---|---|---|
| Drop / monitor / buy when price drops | hnp | card or x402 if user says crypto |
| Buy now / in stock today | hp | card or x402 if user says so |
mcporter call ap2-buyer.set_ap2_session_config_tool \
session_id=CHAT_ID presence_mode=hnp payment_method=card merchant=shoe
mcporter call ap2-buyer.get_ap2_session_config_tool session_id=CHAT_ID
Follow merchant_instruction from get_ap2_session_config.
Before signing mandates, show a clear summary (item, price cap, payment rail). Wait for explicit yes / approve / 确认.
mcporter call ap2-buyer.register_trusted_surface_approval \
session_id=CHAT_ID price_cap=200 payment_method=card \
item_id=supershoe_limited_edition_gold_sneaker_womens_9_0
Plain-text budget or "pay by card" alone is not approval.
hnp + card or x402.item_id as <slug>_0 (lowercase, non-alphanumeric → _). Do not call search_inventory for shoes.mcporter call ap2-merchant.check_product item_id=... constraint_price_cap=200register_trusted_surface_approval.mandate_request must be a JSON string inside --args:mcporter call ap2-buyer.assemble_and_sign_mandates --args '{
"session_id": "CHAT_ID",
"mandate_request": "{\"item_id\":\"...\",\"price_cap\":200,\"qty\":1}"
}'
mcporter call ap2-buyer.check_constraints session_id=CHAT_ID price=299 available=falsecurl -X POST "http://127.0.0.1:8091/trigger-price-drop?item_id=ITEM_ID&price=199&stock=10"
meets_constraints is true: assemble_cart → create_checkout → payment/checkout presentations → issue_payment_credential (presence_mode=hnp) → complete_checkout → verify_checkout_receipt_tool. Emit purchase_complete JSON and stop.hp + card or x402.search_inventory or check_product → assemble_cart.create_hp_open_mandates (no checkout_jwt yet).create_checkout with open_checkout_mandate_id and payment_method.register_trusted_surface_approval.assemble_and_sign_immediate_mandates with checkout_jwt, checkout_jwt_hash, amount_cents, etc.issue_payment_credential (presence_mode=hp) → complete_checkout → purchase_complete.Never call create_hp_open_mandates twice per purchase. Never re-run assemble_cart / create_checkout after user confirmed.
set_ap2_session_config_tool with new payment_method → clear_open_mandate_session_tool → re-approve → sign again.
cd "$AP2_HOME/code/samples/python/scenarios/a2a/unified" && ./openclaw/stop_ap2_backend.sh