Financial market sentiment analysis using Twitter data
Server provides 4 tools with reasonable naming (verb-first: analyze_*, monitor_*, get_), but descriptions are inconsistent in depth. All tools have documented input schemas with types and parameter descriptions. However, output schemas are inferred from Pydantic models rather than explicitly declared in the tool registration, and descriptions lack strategic guidance about when to use each tool vs. alternatives. The server shows medium maturity: compliant with basic requirements but missing depth in LLM-optimization patterns. No error handling guidance visible, no tool annotations (readOnlyHint). Schema validation is present but not integrated into the response path.
Analyze sentiment for a specific stock symbol
Analyze trends across multiple stocks
Get available capabilities and tool descriptions
Real-time market sentiment monitoring
Tool descriptions lack strategic guidance. 'Analyze sentiment for a specific stock symbol' does not explain WHEN to use analyze_market_sentiment vs. monitor_market vs. analyze_market_trends. LLMs cannot disambiguate overlapping tools without explicit selection criteria.
Output schemas are inferred from Pydantic model definitions in code, not explicitly documented in tool registration or returned by get_capabilities. The get_capabilities endpoint returns input_schema and output_schema fields, but this discovery pattern is non-standard MCP. Clients expect tools to be registered via the server's CallTool handler with full schemas.
No error handling guidance in descriptions or implementation. What does the LLM do if Twitter API is rate-limited, unavailable, or returns no tweets? Error responses must include recovery hints (e.g., 'Try again in 15 minutes' or 'Fall back to analyze_market_trends for broader data'). Currently, 404/rate-limit errors return bare HTTP status codes.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
Tool annotations missing. No readOnlyHint on any tool (all are read-only, should declare this). No destructiveHint (correctly absent). No idempotentHint (analyze_* should declare idempotency, but monitor_market with cache may not be).
Parameter descriptions do not specify constraints. 'lookback_hours' defaults to 24 but has no min/max bounds (what if an LLM passes 0 or 8760?). 'min_tweets' defaults to 50 but no min bound specified (what if -10 is passed?).
get_capabilities is a meta-discovery tool but has no description. A bare 'Get available capabilities and tool descriptions' (under 20 chars after trimming) does not explain why an LLM would call it or when.
Result limiting and pagination absent. Tools return up to 10 tweets (hardcoded max_results=10 in search_recent_tweets), but if returned to LLM, no pagination offered.
Tool composition risk: analyze_market_sentiment, analyze_market_trends, and monitor_market have overlapping functionality. No clear guidance on which to prefer for a given use case (single stock vs. multiple vs. real-time monitoring). This forces LLM to guess or require clarification.