Multi-chain wallet API for AI agents. Non-custodial HD wallets, on-chain balances, send, and cross-chain swaps via Wagyu.
Purple Flea Public Wallet is an HTTP-based MCP server with 16 tools. Overall definition quality is below average. Critical issues: (1) Tool names do NOT follow verb_noun convention, most are HTTP route paths (GET /v1/wallet/chains/gas/:chain) rather than action-oriented names like get_gas_price_by_chain. (2) Descriptions are present but many are extremely short (e.g., 'Health check endpoint with database and agent registration status' = 71 chars for /health, 'Ultra-lightweight uptime check returning pong' = 45 chars for /ping). (3) Input schemas ARE present and typed (string, number), but parameter descriptions are often generic or missing depth ('Chain name (ethereum, base, arbitrum, bsc)' for /chains/gas/:chain is acceptable but minimal). (4) Output schemas are NOT documented, the code returns JSON objects but the response structures are not formally specified in tool definitions. (5) Error handling is present at the HTTP level (global error handler in server.ts catches errors and returns JSON responses), but tool-level error guidance is minimal, no recovery hints like 'If X fails, try Y' are embedded in tool descriptions. (6) The 'GET /health' and 'GET /ping' tools are redundant utility endpoints that should not be exposed as primary tools. (7) Path-based parameter extraction (e.g., ':chain' in /v1/wallet/chains/gas/:chain) is not ideal for tool schemas, the parameter should be explicit in the input schema. (8) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present, though risk levels ARE marked (READ_ONLY, WRITE, DESTRUCTIVE). (9) Several tools (token-info variants, alert-check) could be better composed, listing all tokens then filtering by symbol is less efficient than a direct lookup. (10) The /v1/public-stats endpoint returns basic counts but no pagination or filtering, acceptable for a small endpoint but the pattern is not generalizable.
Delete a price alert by ID
Health check endpoint with database and agent registration status
Ultra-lightweight uptime check returning 'pong'
List all price alerts for the authenticated agent
Check all active alerts against live prices and return triggered alerts
Get leaderboard of top agents by swap volume and referral earnings
Get public statistics (no auth required) - registered agents and total swaps
Get list of all supported tokens with basic metadata
Tool names do NOT follow verb_noun convention. Most are HTTP route paths (GET /v1/wallet/chains) rather than action verbs (get_supported_chains, list_chains). LLMs rely on names to infer intent before reading descriptions. Route-based naming delays comprehension and makes tool disambiguation harder.
Output schemas are NOT documented in tool definitions. The code returns JSON (e.g., /health returns {status, service, version, uptime_seconds, database, registered_agents, timestamp}; /chains returns array of chain objects), but these response structures are not formally specified in the MCP tool definitions. LLMs cannot plan downstream calls or extract fields without knowing the response schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | - | v1 |
Get detailed information about a supported token including contract addresses
Get supported chains for wallet operations and swaps
Get current gas prices across EVM chains
Get gas price for a specific chain
Get well-known ERC-20 token list on Base and Ethereum
Get live USDC yield rates across DeFi protocols via DeFi Llama
Create a price alert for a cryptocurrency
Create agent account + API key
Affected: 'Ultra-lightweight uptime check returning pong' (45 chars for /ping), 'Health check endpoint with database and agent registration status' (71 chars for /health). These are too terse to guide LLM selection when similar tools exist.
Path parameters (e.g., ':chain' in GET /v1/wallet/chains/gas/:chain, ':id' in DELETE /v1/alerts/:id) are not cleanly mapped to input schema. The parameter 'chain' is described inline but the schema does not show that it is required (path parameters are always required). This creates ambiguity when the LLM reasons about optionality.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. While risk levels are documented in metadata (READ_ONLY, WRITE, DESTRUCTIVE), the tools themselves do not carry these annotations. This prevents agents from understanding which tools are safe to retry without side effects (idempotent) and which cause permanent state changes.
Utility/health-check tools (/health, /ping) are exposed as primary agent tools. These should be internal endpoints for monitoring, not invoked by agents. They add noise to the tool list and mislead LLMs into treating server status checks as domain actions.
Error handling at the HTTP level provides generic messages ('internal_error', 'invalid_json', 'not_found') but does NOT embed recovery guidance in tool descriptions. E.g., if GET /v1/token-info/:symbol returns 404, the tool description should hint 'Call GET /v1/token-info first to discover available symbols.' Currently, LLMs face dead-ends without recovery paths.