Buyer-side MCP gateway for x402 and MPP (pay.sh) — let any agent pay any metered API on Base or Solana without seeing a 402 or a wallet.
Three tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. pay.discover and pay.wallet_status have empty input schemas (no parameters), which is acceptable for read-only discovery tools. pay.fetch has a reasonable schema with url (required), method (enum), and body (object), but lacks descriptions for all parameters. Tool descriptions are present but generic (10-60 chars), below the 50-200 char baseline for LLM-optimized descriptions. No output schemas documented. Error handling is not visible in the tool definitions. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications (READ_ONLY vs WRITE). Parameter descriptions are entirely missing, LLMs cannot infer what 'body' means or what format it expects.
Discover x402-priced APIs from the registry and federation
Fetch a URL with automatic x402 or MPP payment handling
Get the current wallet status, spending limits, and allowlist
All parameters lack descriptions. 'body' parameter in pay.fetch has no description explaining what object structure is expected, what fields are required, or how it maps to the HTTP request body.
Tool descriptions are too short (10-60 chars) to guide LLM selection. 'Discover x402-priced APIs from the registry and federation' (60 chars) lacks context on WHEN to call it, WHAT it returns, or HOW to use results downstream.
No output schemas documented. Smoke test shows pay.wallet_status returns {address, spent_today_usdc, daily_limit_usdc, remaining_usdc, per_call_limit_usdc, allowlist}, but this structure is not declared in the tool definition. LLMs cannot plan downstream calls without knowing response shape.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | <=2025-11-25 | v2 |
No tool annotations despite clear risk classifications. pay.fetch is marked WRITE (destructive) but has no destructiveHint annotation. pay.discover and pay.wallet_status are READ_ONLY but lack readOnlyHint. Annotations enable agents to reason about safety and retry logic.
Error handling not visible in tool definitions. Smoke test shows allowlist rejection returns {error: '...'}, but no error schema or recovery guidance is documented. LLMs cannot self-correct without actionable error messages.