DEV Community

Paul Spread
Paul Spread

Posted on Originally published at agentbadge.xyz

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

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

Top comments (0)