MCP Server for Stock Valuation Calculations (PE Band, DDM, DCF) with comprehensive financial analysis tools including file system, math, utility, and web research capabilities
The server provides 14 tools with generally complete schemas and descriptions. Most tools have proper input schemas with typed parameters and reasonable descriptions (mostly 50-150 chars). However, several critical issues reduce quality: (1) Output schemas are NEVER documented, tools return results but the schema structure for responses is not declared anywhere, violating the pattern:tool requirement that LLMs understand return types. (2) Many descriptions lack actionable context about WHEN to use each tool vs alternatives (e.g., web_search vs web_fetch). (3) Tool composition has gaps, web_search and web_fetch are close cousins but lack clear guidance on when to use each. (4) No error classification or recovery guidance in any tool. (5) Some parameter descriptions are generic or lack format constraints (e.g., 'timezone' parameter just says 'IANA timezone' but doesn't explain what happens if invalid). (6) The file system tools (read_file, write_file, list_directory) are not domain-specific to stock valuation, they're generic utilities that dilute the server's purpose. Overall: solid baseline with complete schemas, but missing the LLM-optimization patterns needed for agent composition and error recovery.
Calculate compound interest with various compounding frequencies and generate amortization schedule
Calculate comprehensive statistics for a dataset including mean, median, mode, standard deviation, variance, quartiles, and outliers
Calculate the difference between two dates/times in multiple units
Convert between currencies using approximate exchange rates (note: rates are estimates, not real-time)
Convert date/time from one timezone to another
Check if a file or directory exists and get its metadata
Format a date/time in multiple different formats (ISO, readable, etc.)
Output schemas are completely undocumented. No tool declares what fields it returns, what types those fields have, or what the LLM should expect. This violates pattern:tool-description and pattern:tool which require documented return types. LLMs must guess at response structure, leading to failed chaining and extraction errors.
No error handling or recovery guidance in any tool. Descriptions do not specify what errors are possible, how to classify them (retryable vs user-fixable vs fatal), or what the LLM should do when they occur. Violates pattern:recovery-guide and pattern:error-classification.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Get current date/time with timezone support, including ISO format, Unix timestamp, and parsed components
Perform linear regression analysis on paired data points (x, y) to find trend line and correlation
List files and directories in a given path
Read file contents from the local file system. Supports text files, JSON, code files, etc.
Fetch and extract readable content from a web page. Automatically removes ads, navigation, and clutter to get clean, structured content.
Search the web using DuckDuckGo for current information, news, and research. Free search without API key requirements.
Write content to a file. Creates the file if it doesn't exist, overwrites if it does.
Generic file system and utility tools (read_file, write_file, list_directory, file_exists, get_current_time, convert_timezone, calculate_time_diff, format_datetime) are not domain-specific to stock valuation. They dilute the server's stated purpose (stock valuation for PE Band, DDM, DCF) and would be better provided by a general-purpose utilities server. No domain-specific tools like 'calculate_pe_band', 'calculate_dcf', or 'calculate_ddm' are present.
Tool descriptions lack clear WHEN-TO-USE context. For example, web_search and web_fetch are closely related but descriptions do not explain when to call search first vs fetching a URL directly. 'Search the web' vs 'Fetch and extract readable content' are both vague about composition. This violates pattern:tool-description which requires explicit guidance on when and why to select a tool.
Parameter descriptions lack format constraints and validation guidance. For example, 'timezone' parameter in get_current_time says 'IANA timezone' but does not specify what happens if an invalid timezone is passed, whether partial matches work, or acceptable fallbacks. Similarly, 'query' in web_search lacks guidance on length, special characters, or API rate limits. Violates pattern:constrained-input and review:param-validation-rules.
convert_currency description says 'rates are estimates, not real-time' but does not specify the source of rates, how stale they might be, or acceptable use cases. This is a critical limitation for stock valuation (which requires current financial data) but is buried in a disclaimer rather than prominently featured. Violates pattern:tool-description.
No indication that web_search uses DuckDuckGo in the tool description (the note is in a comment, not in the user-facing description). LLMs may assume Google or another engine, affecting result quality and legal/ToS compliance. Tool descriptions must be self-contained and not rely on implementation details visible only in source comments.
file_exists description is minimal ('Check if a file or directory exists and get its metadata') but does not specify what metadata is returned (size? modified time? permissions?). This forces LLMs to guess or make unnecessary calls to read_file or list_directory. Violates pattern:tool-description.
No idempotency guidance. Tools like write_file and web_search are potentially non-idempotent (write_file overwrites, web_search results may vary by time), but descriptions do not warn agents about this. If an agent retries due to transient error, side effects may occur. Violates pattern:idempotent-operation.
No pagination or result-limit enforcement for web_search. Description says maxResults defaults to 10 and caps at 50, but does not document what happens if results exceed limit (truncation? are they returned in any specific order?). For large result sets, LLMs need cursor/offset guidance. Violates pattern:paginated-result.