MCP Server for publicly available Indian Mutual Funds data via AMFI
This server defines 26 tools with comprehensive descriptions and mostly complete input schemas. Naming follows verb_noun convention consistently (get_, calculate_, clear_, set_, search_, is_valid_). However, several critical gaps reduce the score: (1) Output schemas are undocumented, no tool declares its return type structure, forcing LLMs to infer response shape; (2) Error handling is minimal, tools catch exceptions and return {"error": str(e)} without actionable recovery guidance; (3) Several parameter descriptions include example values (e.g., '119597') that LLMs may reuse literally; (4) No input validation documentation in descriptions (format constraints, ranges, enums); (5) No tool annotations (readOnlyHint, destructiveHint) despite clear READ_ONLY vs WRITE distinction in metadata. The server is competent but lacks the polish expected for A/B grades.
Calculate the current market value of a given number of balance units held in a mutual fund scheme, using the latest NAV.
Calculate the total current market value of a multi-scheme mutual fund portfolio. Fetches all quotes concurrently for better performance.
Calculate SIP investment returns for a mutual fund scheme. Shows current market value, absolute return, and annualised IRR.
Clear all cached mftool data (NAV cache and scheme codes cache). Useful when you want to force fresh data to be fetched from AMFI/BSE.
Get all mutual fund schemes available under a specific AMC (Asset Management Company).
Get the Average Assets Under Management (AAUM) for all AMCs for a given quarter. Returns both domestic and overseas AAUM for each fund house.
No output schemas documented. Tools catch exceptions and return generic {"error": str(e)} without documenting the success response structure. LLMs cannot infer what fields to expect (e.g., does calculate_returns return 'absolute_return' or 'abs_return'? does get_scheme_codes return a dict or list?). This forces LLMs to guess and wastes tokens on trial-and-error parsing.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Fetch the latest NAV quotes for multiple mutual fund schemes concurrently. Much faster than calling get_scheme_quote one-by-one for portfolios.
Get cache statistics for the mftool internal cache layers. Shows hit/miss counts and entry counts for NAV and scheme codes caches.
Get daily performance data for all open-ended DEBT mutual fund schemes. Includes Liquid, Overnight, Short Duration, Corporate Bond, Gilt funds, etc. Shows latest NAV (Regular & Direct plans) and 1Y/3Y/5Y returns.
Get daily performance data for all open-ended EQUITY mutual fund schemes. Includes Large Cap, Mid Cap, Small Cap, Flexi Cap, ELSS, Sectoral, etc. Shows latest NAV (Regular & Direct plans) and 1Y/3Y/5Y returns.
Get daily performance data for all open-ended HYBRID mutual fund schemes. Includes Balanced Advantage, Aggressive Hybrid, Conservative Hybrid, Arbitrage, etc. Shows latest NAV (Regular & Direct plans) and 1Y/3Y/5Y returns.
Get daily performance data for open-ended OTHER mutual fund schemes. Includes Index Funds and Fund of Funds (FoF) categories. Shows latest NAV (Regular & Direct plans) and 1Y/3Y/5Y returns.
Get a dictionary of ALL mutual fund scheme codes and names available on AMFI. Returns a large dataset with scheme_code -> scheme_name mappings. Use this to discover scheme codes for funds you want to query.
Get detailed metadata for a mutual fund scheme including fund house, type, category, and scheme start date. Uses AMFI scheme codes.
Get the full historical NAV data for a mutual fund scheme (all available dates). Uses AMFI scheme codes.
Get historical NAV data for a mutual fund scheme within a specific date range. Uses AMFI scheme codes. Dates must be in DD-MM-YYYY format.
Get historical NAV data for a mutual fund using its BSE/YFinance code. Use either period OR start_date + end_date. Validate codes with is_valid_new_scheme_code.
Get complete information for a mutual fund scheme using its BSE/YFinance code. Returns richer data than get_scheme_details (includes AUM, returns, ratings, etc.). Validate the code first with is_valid_new_scheme_code.
Get the latest NAV (Net Asset Value) quote for a mutual fund scheme.
Get daily performance data for open-ended SOLUTION-ORIENTED mutual fund schemes. Includes Retirement Fund and Children's Fund categories. Shows latest NAV (Regular & Direct plans) and 1Y/3Y/5Y returns.
Check whether a given code is a valid NEW BSE scheme code (used with get_scheme_history and get_scheme_info). Different from AMFI codes.
Check whether a given scheme code is a valid AMFI scheme code.
Search for mutual fund schemes by name using built-in relevance matching. Results ranked: exact > prefix > whole-word > partial match.
Search for mutual fund schemes within a specific AMC (fund house). Optionally filter further by a name keyword.
Search for mutual fund schemes by type/category keyword.
Enable or disable mftool's internal caching globally. Disabling cache forces fresh API calls every time (slower but always up-to-date).
Error handling does not guide recovery. All exceptions are caught as bare 'return {"error": str(e)}'. Example: get_scheme_quote catches and returns the raw exception message. An LLM has no idea if the error is retryable, user-fixable, or fatal. Pattern violation: 'Error responses must tell the LLM what to do next: "User not found. Try search_users() with a partial name."' Actual errors should be categorized and actionable.
Example values in parameter descriptions risk literal reuse by LLMs. Multiple tools include examples like '119597', '119062', 'hdfc', 'YYYY-MM-DD', 'DD-MM-YYYY' in description strings. LLMs frequently copy example values into actual requests, causing failures when the example is stale or user-specific. Examples should be moved to enum constraints or formal format declarations. Affected: get_scheme_quote, calculate_balance_units_value, get_available_schemes, get_scheme_history (date formats), get_average_aum (quarter format).
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear semantic distinction in metadata. The server metadata lists 'Risk: READ_ONLY' vs 'Risk: WRITE' but does not use MCP v2025+ tool annotations. This forces LLMs to infer mutability from descriptions alone. Cache management tools (clear_cache, set_cache_enabled) are destructive and should carry destructiveHint to prevent unsafe retry patterns.
Parameter descriptions lack formal constraints (ranges, enums, format patterns). Example: get_bulk_quotes accepts 'max_workers' (int) but description does not specify valid range. Suggest: 'max_workers: int, range 1 - 50, default 10 (increase for large portfolios; exceeding 50 may trigger rate limits).' get_scheme_history uses string period with valid values '1d', '5d', '1mo', etc., should be an enum constraint in the schema, not just listed in description text. LLMs cannot reliably parse free-form constraint text.
Date format ambiguity across tools. get_scheme_historical_nav_for_dates requires 'DD-MM-YYYY' while get_scheme_history accepts 'YYYY-MM-DD'. This inconsistency risks date swaps and parsing failures. Standardize to ISO 8601 (YYYY-MM-DD) across all tools, or use explicit enum-based period/preset selectors (e.g., 'last_30_days', 'last_quarter') to remove format guessing.
No input validation messaging in descriptions. Tools silently return {'error': str(e)} for invalid inputs, but descriptions never hint at what makes input invalid. Example: is_valid_scheme_code accepts a scheme_code string but does not describe what constitutes 'valid' (numeric only? length constraints?). Add validation rules to parameter descriptions: 'scheme_code: string, numeric AMFI code, 6 digits (e.g., 119597).'