A comprehensive MCP server providing 250+ financial, economic, web, and database tools via REST, MCP, and A2A protocols. Supports tools from OpenBB, Yahoo Finance, FMP, FRED, SEC EDGAR, DuckDB, and more.
Static source inference · medium confidence · evidence: Streamable HTTP
Current-spec patterns detected
Summary
SAJHA provides 12 tools with basic definitions but significant quality gaps. All tools have names starting with data source prefixes (fmp_, openbb_, yahoo_, fred_, edgar_, duckdb_, tavily_, world_bank_, fbi_, coingecko_, alpha_vantage_, un_) rather than action verbs, which reduces semantic clarity. All tools have non-empty descriptions (10-60 chars), meeting the minimum threshold but falling below production baselines (avg 194 chars). Input schemas are visible and include parameter type definitions and descriptions, but lack constraints (no enums, ranges, or validation guidance). Output schemas are completely undocumented, critical for agent planning. Error handling patterns are not evident from the provided code. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools declaring READ_ONLY risk. Tool naming follows data source convention rather than action verb pattern, forcing LLMs to infer intent from descriptions alone. Parameter descriptions are minimal (e.g., 'Stock ticker symbol', 'Search query') and lack constraints, format hints, or multi-step guidance. No evidence of pagination, result limits, or batching support. Schema completeness is low: input schemas present but output schemas entirely absent.
Tools (12)
alpha_vantage_stock_dataread onlyauth42/100
Retrieve stock market data from Alpha Vantage
coingecko_crypto_dataread only42/100
Get cryptocurrency price and market data from CoinGecko
duckdb_queryread only47/100
Execute SQL queries on CSV, Parquet, or JSON files using DuckDB
edgar_company_factsread only40/100
Search SEC EDGAR for company financial facts and filings
fbi_crime_statisticsread only40/100
Access FBI crime statistics by region and category
Tool descriptions are too brief (10-60 chars, vs production baseline of 194 chars). Missing WHEN to use this tool vs similar ones, WHAT it returns, and any prerequisites. Example: 'Get real-time stock quotes for a ticker symbol' lacks context for agent planning. Should be: 'Retrieves real-time stock quote data (price, volume, change) for a given ticker. Use when you need current market data. Returns quotes with timestamp, open, high, low, close, volume.'
fmp_stock_quote
Recommendations
Rename tools from data-source pattern to action-verb pattern: fmp_stock_quote → get_stock_quote, openbb_equity_fundamental_ratios → get_equity_fundamentals, yahoo_stock_data → list_historical_stock_prices, fred_economic_data → get_economic_indicator, edgar_company_facts → search_sec_filings, duckdb_query → execute_sql_query, tavily_web_search → search_web, world_bank_indicators → get_development_indicator, fbi_crime_statistics → get_crime_statistics, coingecko_crypto_data → get_crypto_prices, alpha_vantage_stock_data → get_stock_data, un_sustainable_development → get_sdg_indicator. This improves semantic clarity and helps LLMs select tools based on intent, not source.
Expand tool descriptions from 10-60 chars to 100-250 chars. For each tool, add: (1) What data it provides, (2) When to use it vs similar tools, (3) What structure it returns. Example for fmp_stock_quote: 'Retrieves current stock price data (open, high, low, close, volume, change percent) for a given ticker symbol from Financial Modeling Prep. Use for real-time quotes. Returns structured price object with timestamp.'
Document output schemas in code (via Pydantic models or OpenAPI) or in a supplementary schema document. For each tool, explicitly define response fields, types, and examples. Example: fmp_stock_quote returns {price: float, change: float, change_percent: float, volume: int, timestamp: str}. This enables agents to plan downstream calls and extract required data.
Add constraints and format hints to parameter descriptions. Replace generic descriptions with validation guidance: 'ticker: Stock ticker symbol (1-5 uppercase letters, e.g., AAPL, MSFT, BRK.B)' instead of just 'Stock ticker symbol'. For enums, replace free-form strings with enum constraints (e.g., function in alpha_vantage_stock_data: enum [TIME_SERIES_DAILY, TIME_SERIES_WEEKLY, TIME_SERIES_MONTHLY]).
Score history
Overall score trend
↓ 6 points across a rubric change (v1 → v2)
36/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
36
2026-07-28+
v2
2026-03-09
F
42
-
v1
tavily_web_searchread onlyauth45/100
Search the web using Tavily AI search engine
un_sustainable_developmentread only42/100
Access UN Sustainable Development Goals (SDG) indicators and data
world_bank_indicatorsread only42/100
Retrieve World Bank development indicators by country and year
yahoo_stock_dataread only45/100
Fetch historical stock price data from Yahoo Finance
Output schemas completely undocumented. No visible field definitions, types, or structure for tool responses. LLMs cannot plan downstream calls or extract required data (e.g., does fmp_stock_quote return price, change, change_percent, or all?). Every tool must document its response structure in code or OpenAPI spec.
Parameter descriptions lack constraints, format hints, and validation guidance. Example: 'Stock ticker symbol' (no mention of format, case sensitivity, or examples). 'Start date in YYYY-MM-DD format' is better but lacks range (min/max year). All params should state: format, allowed values/ranges, examples of valid input, and dependencies. Use enums for constrained values (e.g., 'function' in alpha_vantage_stock_data).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools explicitly declaring Risk: READ_ONLY. Annotations should be embedded in tool registration to help agents distinguish safe tools from dangerous ones and manage retry logic. Implement via tool.inputSchema.readOnlyHint or equivalent MCP annotation mechanism.
No evidence of error handling patterns (recovery guides, error categorization, actionable error messages). If a tool call fails (API timeout, invalid input, rate limit), the LLM has no guidance on what to do next. Implement: user-fixable errors with constraint violations (e.g., 'Invalid ticker: must be 1-5 uppercase letters'), retryable errors with backoff hints, and fatal errors with alternative tool suggestions.
Parameter naming lacks type suffixes for ambiguous identifiers. Example: 'series_id' is clear; 'symbol' appears in fmp_stock_quote, openbb_equity_fundamental_ratios, and alpha_vantage_stock_data but could refer to stock ticker, commodity code, or index ticker without context. Use suffixed names like ticker_symbol, commodity_code, or index_symbol to remove ambiguity.
No pagination, result limits, or batching support documented for tools that may return large result sets (yahoo_stock_data, edgar_company_facts, duckdb_query). If duckdb_query returns 1000+ rows, context window is exhausted. Implement: limit parameter (default 20, max 100), offset/page_number, and next_cursor for large result sets. Document in tool description.
Implement tool annotations (readOnlyHint, idempotentHint) in tool registration. Since all 12 tools are READ_ONLY, add readOnlyHint: true to signal agents these tools are safe to retry and can be called in any order without side effects. This is critical for agent planning.
Add error handling guidance to tool descriptions and implementation. For each tool, document: (1) common failure modes (API timeout, rate limit, invalid input), (2) recommended recovery actions (retry with backoff, ask user for valid input, try alternative tool), (3) actionable error messages (include the invalid value and constraint violated).
Add pagination parameters (limit, offset/page_number) and result-limit defaults to tools returning large result sets: yahoo_stock_data, edgar_company_facts, duckdb_query, world_bank_indicators. Default to limit=20 or limit=50, max=100 or max=1000. Document the limits in tool descriptions to prevent context window exhaustion.
Disambiguate parameter names using type suffixes. In multi-tool contexts, use ticker_symbol instead of symbol, country_code instead of country, iso_code instead of code. This reduces LLM confusion when many tools are available.
Add dependency hints and multi-step guidance to tool descriptions. Example for edgar_company_facts: 'Search for company facts by CIK or company name. If you only have a company name, call search_companies() first to get the CIK.' This guides agents through multi-step workflows without wasted calls.
Create a tool discovery/taxonomy document explaining which tools to use for different financial data types (stock quotes vs fundamentals vs economic data vs crypto), when to combine them, and common workflows. This helps agents (and users) understand tool relationships and reduces wrong-tool selection.