sol-mcp provides 4 clearly named tools with strong action verbs (get_, batch_) and detailed descriptions. All tools have proper input schemas with type definitions and parameter descriptions. Tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) are consistently applied. However, output schemas are not formally documented, responses are returned as free-text strings rather than structured objects. Error handling returns text-based errors without guidance on recovery actions or error classification. The codebase shows good naming discipline and parameter validation, but lacks the structured output and sophisticated error recovery patterns expected of production tools. Descriptions range from 120-250 chars (baseline: 194), which is appropriate for LLM parsing.
Get risk scores for multiple Solana tokens (up to 10) in one call. Returns results sorted by risk score, lowest (safest) first.
Get both risk score AND momentum signal for a token in one call. Combined verdict: low risk + strong buy = best setup for entry.
Get a buy/sell momentum signal for a Solana token based on multi-window buy/sell ratio analysis. Returns STRONG_BUY / BUY / NEUTRAL / SELL / STRONG_SELL with confidence level.
Get a risk score (0–100) and risk label for a Solana token mint address. LOW (0-30) = safer, HIGH (56-75) = risky, EXTREME (76-100) = likely rug. Analyzes liquidity, whale concentration, holder count, and volume patterns.
Output schemas not formally documented. Tools return free-text strings constructed via string concatenation (e.g., `text = 'Token: ' + mint + '\n' + 'Risk Score: ' + score...`) rather than structured JSON objects with typed fields. LLMs cannot parse downstream requirements or validate field presence.
Error handling lacks recovery guidance and classification. Errors return plain text (e.g., 'Error: Risk API error: 404') with no indication of whether the error is retryable, user-fixable, or fatal. Missing the 'Try X next' pattern that helps agents self-correct.
batch_token_risk error handling does not provide per-item success/failure. Code shows `Promise.allSettled()` collecting results, but the response construction is truncated in the provided source. If one mint fails, LLMs cannot determine which ones succeeded and which ones need retry.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
No pagination or limit enforcement documented. batch_token_risk accepts up to 10 mints and returns results 'sorted by risk score', but there is no documentation of result limits, pagination cursors, or next_token handling. Single-call responses risk context bloat for larger result sets.