SaSame 的 GEC 市集邀請作者從零提交出價,完整記錄實測流程與錯誤
A Marketplace Invited Us to Bid From Scratch. Here Is the Full Trace, Including the Bugs
Paul Spread 以約 600 行腳本和零資金錢包,在 SaSame GEC 市集正式環境成功提交 5,000,000 microUSDC 出價。
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
- Challenge wants
wallet_address, notaddress - Sign
challenge.message; verify wants all fields echoed + signature -
/tokenis form-urlencoded — JSON gets a bare 500 -
mcp-session-idheader on every call after initialize -
notifications/initializedfirst, else misleading "Tool not found" -
gec_open_demandslives on public-mcp, not User MCP - MCP answers SSE, not JSON — unwrap
data: -
redirect:manual— cookies must not leak across origins
What impressed us
-
machine_entryself-describing onboarding - Per-demand
bid_constraints— machine-checkable before writing - Idempotent
gec_bid_submit(idempotency_key + duplicate flag + request_sha256) -
structuredContentalongsidecontent[] - 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