MCP server for USDC payments on Base - enable any Claude Code agent to send and receive payments
pay-mcp has clear, actionable tool names (pay_balance, pay_send, pay_request, pay_history) that follow verb_noun conventions. All four tools have descriptions (103-128 chars, within 10-1024 range) and explicit input schemas with typed properties. However, parameter descriptions are sparse and sometimes generic. Output schemas are not documented anywhere, responses are text blobs without structure. Error handling exists (success/error fields in send result) but lacks recovery guidance. The server follows a simple MCP pattern but misses several production-grade touches: no input validation examples, no pagination docs despite history accepting a limit param, and no security considerations around wallet addresses or transaction amounts. STDIO transport is a hard constraint that caps protocol readiness.
Check USDC balance on Base. Returns the balance for your wallet or a specified address.
Get recent USDC transaction history on Base. Shows both sent and received transfers.
Generate a payment request. Creates a payment link that others can use to send you USDC.
Send USDC payment on Base. Transfers USDC to the specified address.
Output schemas are undocumented. All tools return text blobs without structured field definitions. LLMs cannot plan downstream tool calls or extract data reliably.
pay_send lacks confirmation/dry-run pattern for irreversible transactions. An agent could accidentally send USDC without user approval. No idempotency guarantees stated.
No permission gates or scope declarations. Tools do not indicate what authority is required (e.g., must user approve sends? Is balance-checking restricted?). No audit trail guidance.
pay_history limit parameter lacks pagination structure. No cursor, offset, or total_count returned. Large transaction histories could blow context window.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Parameter descriptions are generic. 'Optional memo/note for this payment' and 'Amount to check balance for' lack format guidance. No constraints on amount (decimal places, limits) or address (0x prefix requirement).
Error responses in pay_send return plain text messages ('Error: ...') without categorization. LLM cannot distinguish retryable errors (network timeout) from fatal errors (invalid address) from user-fixable errors (insufficient balance).
Wallet address parameters (to, address) accept any string. No validation, format hints, or examples. LLMs may pass invalid 0x addresses, normal email addresses, or nonsense values without feedback.