MCP server + CLI: find free-mint NFT collections and the wallets farming them, ranked by on-chain secondary PnL. Any EVM chain with a Seaport deployment; Robinhood Chain by default.
Four tools with complete input schemas and descriptions. Naming follows verb_noun pattern (scan_*, list_*, job_*). Descriptions are substantive (100-200 chars), explaining WHAT and WHEN. Parameters are well-typed with Zod validation and mostly documented. However, output schemas are inferred from code (marketToJson, walletsToJson, jobSummary) rather than explicitly declared in tool registration. Error handling is minimal, no recovery guidance or actionable error messages visible. No tool annotations (readOnlyHint, destructiveHint). Missing pagination guidance for large result sets.
Poll the status of a background scan job (running, done, error, cancelled) with progress updates
List all supported EVM chains with their configuration (RPC endpoints, block time, Seaport deployment)
Rank free-mint NFT collections by secondary market PnL (profit/loss) on Seaport over a time window
Rank wallets by estimated PnL from minting free collections and selling on Seaport, with multi-collection overlap analysis
Output schemas not explicitly documented in tool registration. Schemas inferred from internal functions (marketToJson, walletsToJson, jobSummary) but not exposed to LLM. LLM cannot predict response structure before calling.
No error handling guidance. Tools may fail (RPC timeout, invalid chain, job not found) but no recovery hints provided. LLM receives raw errors with no actionable next steps.
No tool annotations. All tools are READ_ONLY but lack readOnlyHint annotation. Agents cannot determine safety/idempotency from tool metadata.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2025-06-18+ | v2 |
Large result sets (scan_collections returns top 20 by default, scan_wallets returns top 20) lack pagination guidance. No mention of limit/offset or cursor-based pagination in descriptions.
Parameter 'async' is ambiguous. Description says 'auto-decide from estimated cost' but does not explain what 'cost' means (getLogs calls?). LLM cannot predict when async will trigger.