The server defines 8 tools with clear names and mostly good descriptions. All tools start with action verbs (fetch, list), which is strong. However, the schema quality is uneven: several tools have incomplete parameter descriptions, missing type constraints (enums), and output schemas are not explicitly documented. Error handling is present but generic. The server uses Zod for validation, which is positive, but the definitions themselves could be more precise for LLM consumption. Average tool score: 62/100.
Output schemas are not documented. Users cannot see what fields tools return, forcing LLMs to guess at response structure and inhibiting downstream tool chaining.
Parameter descriptions in fetchTransfers are vague and lack constraints. 'Filter by transfer category' does not specify what valid categories are. 'Sort order for results' does not explain options (asc/desc). Parameters like 'maxCount' and 'pageKey' lack type hints and range guidance.
No enum constraints on categorical parameters. 'interval' in fetchTokenPriceHistoryBySymbol accepts free-form strings (e.g. '1d', '1h') with no validation or list of valid options. LLMs will hallucinate invalid intervals.
fetchTokenPriceHistoryBySymbol
Recommendations
Document output schemas for all tools. Include field names, types, and descriptions. Example: fetchTokenPriceBySymbol should document { 'tokens': [{ 'symbol': string, 'price': number, 'currency': string }], 'timestamp': string }. This enables LLMs to extract the right fields and chain tools.
Replace example values with formal constraints. Instead of 'e.g. "0x1234..."', use 'Ethereum address (0x-prefixed hex, 40 characters)' in the description and add a regex pattern to the schema. This prevents LLM hallucination of invalid inputs.
Add enum constraints to categorical parameters. Define interval options as enum: ['1h', '4h', '1d', '1w', '1m']. Add category enum to fetchTransfers. Use zod.enum() to enforce at the schema level.
Expand fetchTransfers parameter descriptions. Clarify: what are valid transfer categories? What sort orders are supported (asc/desc)? What is the format and purpose of pageKey? Add type and range constraints to maxCount.
Add recovery guidance to error responses. When a network is unsupported, return 'Network "solana-mainnet" is not supported for this tool. Call listSupportedNetworks() to see available options.' When a token symbol is invalid, suggest 'Token "XYZ" not found. Try a major symbol like BTC, ETH, or call an endpoint with autocomplete.'
Document pagination and result limits in all tool descriptions. Add explicit statements: 'Returns up to 100 results. Use before/after cursors for pagination.' Cap result sets at reasonable defaults (20-50 items) and offer pagination parameters.
Score history
Overall score trend
↑ 26 points across a rubric change (v1 → v2)
67/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
C
67
2026-07-28+
v2
2026-03-09
F
41
-
v1
fetchTransfers
read onlyauthsource verified68/100
Get token and ETH transfers filtered by address, block range, or contract
Parameter descriptions include example values (e.g. 'e.g. "0x1234567890123456789012345678901234567890"'). LLMs frequently reuse examples literally rather than substituting real values, causing failures.
fetchTokenPriceHistoryByTimeFrame has a 'useNaturalLanguageProcessing' boolean flag but the description does not explain what happens when false, or when the tool processes natural language automatically vs. requiring this flag. Dependency is unclear.
No documented pagination limits or result caps. Tools like fetchAddressTransactionHistory accept 'limit' (default 25, max 100) but description does not state the maximum. fetchTokensOwnedByMultichainAddresses and fetchTransfers lack any guidance on result size, risking context window exhaustion.
Error handling is generic and does not guide recovery. The formatError() function returns raw API messages (e.g. 'Error 404: not found') without actionable guidance. LLMs receive no hint about whether to retry, call a different tool, or ask the user.
Clarify the relationship between timeFrame and useNaturalLanguageProcessing. If useNaturalLanguageProcessing=false, does the tool expect ISO 8601 dates? If true, what natural language formats are supported ('last week', 'past 7 days', 'ytd')? Document examples for each mode.
Add a 'required' constraint to array parameters where applicable. In fetchTokensOwnedByMultichainAddresses, clarify whether at least one address/network pair is required, or if both arrays can be empty.
Provide alternative tools or lookup suggestions in errors. If a wallet address is not found, return 'Address not found. Ensure it is a valid Ethereum address. If you have a username or ENS name, try a lookup tool first.' (if such a tool exists).