跳到正文
DEV Community· Paul Spread·· 5 小時前AI 評分53

SaSame 的 GEC 市集邀請作者從零提交出價,完整記錄實測流程與錯誤

A Marketplace Invited Us to Bid From Scratch. Here Is the Full Trace, Including the Bugs

AI 導讀

Paul Spread 以約 600 行腳本和零資金錢包,在 SaSame GEC 市集正式環境成功提交 5,000,000 microUSDC 出價。

正文

Paul Spread

SaSame's GEC marketplace put a demand on its public board: prove that an independent external agent can walk their live production path — keyless discovery, wallet authentication, MCP session — and place a real bid.

We took the challenge with a throwaway wallet holding zero funds, one ~600-line script and no SDK. On 2026-10-23 the full loop completed: a read-only dry run through gec_open_demands (10 open demands), then a live gec_bid_submit — bid 5ae9fd03…fc3 accepted, state SUBMITTED, 5,000,000 microUSDC.

The architecture

Two MCP surfaces split the trust boundary: keyless Public MCP (gec_open_demands, start_here) and wallet-bound User MCP (18 tools incl. gec_bid_submit) behind OAuth 2.1 + EIP-191.

The elegant part: every open demand carries provider_action.machine_entry — endpoints, chain id, cookie policy and a numbered step list. We implemented our client from the projection alone.

The walk (real timings)

# Step Result
1 Keyless projection GET /api/gec/open-demands 200, 918ms
2 OAuth authorize (PKCE S256, CIMD client_id) 302 → Account Control
3 Wallet challenge 201, 320ms
4 EIP-191 personal_sign (local) —
5 Signature verify 200, 307ms
6 Participant consent → callback 303+302
7 Token exchange (form-encoded) 200, ~305ms
8 MCP initialize 200, mcp-session-id
9 tools/list 200, 894ms
10 gec_open_demands (public-mcp) 200, 310ms — 10 demands
11 gec_bid_submit 200, 900ms — SUBMITTED

Friction — spec vs. production

  1. Challenge wants wallet_address, not address
  2. Sign challenge.message; verify wants all fields echoed + signature
  3. /token is form-urlencoded — JSON gets a bare 500
  4. mcp-session-id header on every call after initialize
  5. notifications/initialized first, else misleading "Tool not found"
  6. gec_open_demands lives on public-mcp, not User MCP
  7. MCP answers SSE, not JSON — unwrap data:
  8. redirect:manual — cookies must not leak across origins

What impressed us

  • machine_entry self-describing onboarding
  • Per-demand bid_constraints — machine-checkable before writing
  • Idempotent gec_bid_submit (idempotency_key + duplicate flag + request_sha256)
  • structuredContent alongside content[]
  • Honest disclosure: "a Demand or budget cap is not proof of reserved funds or payment"

What it cost

$0. Off-chain HTTP + one local EIP-191 signature. Burner wallet: 0 ETH / 0 USDC on Base (RPC-verified).

Full redacted transcripts + friction report: https://agentbadge.xyz/blog/gec-interop-field-report

來源:DEV Community · dev.to