This server exposes 20 financial data tools via the Yahoo Finance API. While all tools follow a consistent naming pattern (get_*) and have basic descriptions, the schema and parameter definition quality is mediocre. Most tools accept only a 'symbols' parameter (comma-separated string) with minimal validation, lack output schema documentation, and have descriptions that are functional but lack LLM-optimization guidance. Tools like get_balance_sheet and get_cash_flow include a 'frequency' parameter with a default, but parameter descriptions are brief (under 50 chars). No tools document their return structure, which violates the pattern:tool requirement. Error handling is minimal, the code wraps external API calls with generic try/catch and format_response(), offering no actionable recovery guidance. The server demonstrates basic competence but falls short of production-grade agent tool design.
Tools (22)
get_balance_sheetread onlysource verified
Get balance sheet data for stock symbols.
get_calendar_eventsread onlysource verified
Get upcoming calendar events (earnings dates, dividends) for stock symbols.
get_cash_flowread onlysource verified
Get cash flow statement for stock symbols.
get_company_officersread onlysource verified
Get company officers (executives, titles, compensation) for stock symbols.
get_company_profileread onlysource verified
Get company profile (sector, industry, description, address) for stock symbols.
get_earningsread onlysource verified
Get earnings data for stock symbols.
get_earnings_trendread onlysource verified
Get earnings trend estimates for stock symbols.
get_esg_scoresread onlysource verified
Get ESG (environmental, social, governance) scores for stock symbols.
Output schemas are completely undocumented. No tool describes what fields it returns, forcing LLMs to parse raw JSON and guess field meanings. The format_response() helper converts pandas DataFrames to dict records, but the agent has no prior knowledge of structure.
Parameter descriptions are minimal and lack validation guidance. 'symbols' parameter accepts comma-separated values but does not document valid stock symbol format, length limits, or example valid values. No description of what happens on invalid input.
Recommendations
Document output schemas for every tool. Example: 'Returns a JSON object with keys: symbol (str), marketCap (float), peRatio (float), dividend (float), ...' This allows LLMs to understand result structure before calling the tool.
Add enum constraints to 'frequency' parameters. Change from free-form string to enum: ['annual', 'quarterly']. This prevents invalid values and is machine-parseable.
Expand parameter descriptions to 100-150 characters. Current descriptions like 'Comma-separated list of stock symbols' do not explain valid formats (UPPERCASE?, length limits?, max count?). Add: 'Comma-separated list of valid stock symbols in UPPERCASE (e.g., AAPL,MSFT,GOOGL). Max 20 symbols per call. Invalid symbols are silently ignored.'
Implement structured error handling. Catch yahooquery exceptions separately: If SymbolNotFound → return 'Invalid symbol: INVALID. Valid US stock symbols are uppercase letters only. Search for the correct ticker before retrying.' If RateLimited → return 'Rate limited. Retry in 60 seconds.' If NetworkError → return 'Network error. This is retryable.'
Add pagination support to tools returning lists. Accept limit (default 20, max 100) and offset parameters. Return { results: [...], total_count: N, has_more: bool } structure so agents can fetch batches without overloading the context window.
Expand tool descriptions to distinguish overlapping tools. Example: 'get_financial_data: Key financial metrics (cash, debt, revenue) for comparison and analysis. Use this for balance sheet ratios. get_summary_detail: Current stock price, trading volume, and market cap. Use this for quick price checks or watchlist building.' This guides LLM selection.
Score history
Overall score trend
↓ 34 points across a rubric change (v1 → v2)
14/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
14
2026-07-28+
v2
2026-03-09
F
48
-
v1
get_financial_dataread onlysource verified
Get key financial data (price targets, margins, cash, debt, growth) for stock symbols.
get_fund_ownershipread onlysource verified
Get mutual fund / ETF ownership for stock symbols.
get_historical_pricesread onlysource verified
Get historical OHLCV price data for stock symbols.
get_income_statementread onlysource verified
Get income statement for stock symbols.
get_insider_holdersread onlysource verified
Get insider holders for stock symbols.
get_insider_transactionsread onlysource verified
Get insider transactions for stock symbols.
get_institution_ownershipread onlysource verified
Get institutional ownership for stock symbols.
get_major_holdersread onlysource verified
Get major holders breakdown for stock symbols.
get_price_dataread onlysource verified
Get current price and trading data for stock symbols.
get_recommendation_trendread onlysource verified
Get analyst recommendation trend (strong buy/buy/hold/sell counts) for stock symbols.
get_recommendationsread onlysource verified
Get analyst recommendations for stock symbols.
get_summary_detailread onlysource verified
Get summary details (day range, volume, dividend, 52-week range) for stock symbols.
get_technical_insightsread onlysource verified
Get technical analysis insights for stock symbols.
get_valuation_measuresread onlysource verified
Get valuation measures (market cap, P/E, EV, price/book) for stock symbols.
Error handling is generic and non-actionable. The format_response() function catches exceptions with 'Error formatting data - {str(e)}' but does not distinguish between invalid symbols, network failures, rate limits, or data unavailability. LLM cannot determine if it should retry, ask the user, or move on.
No pagination or result limiting. Tools that return lists (e.g., get_insider_transactions, get_recommendations) do not accept limit or offset parameters. Large result sets will be returned as full unstructured JSON, consuming token budget and degrading LLM reasoning.
Tool descriptions are functional but not LLM-optimized. Most descriptions (e.g., 'Get financial data for given stock symbols.') are 50-60 characters, well below the 194-char baseline for production tools. They lack context for when to use the tool vs. alternatives (e.g., difference between get_financial_data and get_summary_detail).
The 'frequency' parameter (in get_balance_sheet, get_cash_flow, get_income_statement) lacks an enum constraint. Description says '"annual" or "quarterly"' but is defined as a free-form string. LLM could pass 'monthly', 'semi-annual', or other invalid values without validation.
No tool composition support. Tools are isolated getters with no way to chain results. If an agent wants to compare valuation across multiple symbols or track changes over time, it must manually correlate responses across separate calls.
Add rate limiting and retry logic. Use exponential backoff when yahooquery returns 429/503 errors, with a max retry count of 3. Return a clear message if all retries fail: 'Yahoo Finance is temporarily unavailable. Try again in 5 minutes.'
Strip response metadata. The current convert_to_json_serializable() converts all pandas output to dict. Filter to user-relevant fields only. If a DataFrame has 50 columns, return the 5-10 most actionable (symbol, price, change%, volume) and document what was omitted.
Add a batch symbol lookup tool (e.g., validate_symbols) that checks which symbols are valid before querying. This lets agents fail-fast on typos rather than silently ignoring invalid inputs in larger queries.
Document rate limits and call quotas in tool descriptions. If Yahoo Finance allows 2000 calls/hour, state: 'Note: Rate limited to 2000 calls/hour. For bulk data collection, use CSV import instead.'