MCP server for corporate valuation calculations including WACC, EVA, terminal value, and deal strategy generation
Server has 4 tools with complete input schemas and descriptions. All tools follow verb_noun naming (calculate_*, generate_*). Descriptions are domain-specific and explain the financial purpose (e.g., 'prevent the growth trap', 'prevent timing mismatch'). However, descriptions are terse (60-120 chars vs. baseline 194 chars), lack WHEN/WHY guidance for LLM selection, and output schemas are not documented. Parameters have types and descriptions but lack constraints (enums, ranges, formats). No error handling guidance beyond a single validation check in calculate_terminal_value. Tools are read-only and well-scoped, but lack recovery hints and actionable error messages.
Calculate EVA (Economic Value Added) strictly using Beginning Invested Capital to prevent timing mismatch in valuation bridges.
Calculate Terminal Value using the Value Driver Formula to prevent the growth trap.
Calculate WACC strictly using Interest-Bearing Debt for capital structure. Used to establish a defensible discount rate for corporate valuation.
Generate a negotiation strategy based on the spread between FCF (Cash Flow) and RIM (Asset Base).
Output schemas not documented. LLMs cannot plan downstream calls or extract fields without knowing return structure. All 4 tools return dicts but no schema is declared.
Descriptions lack WHEN/WHY context. 'Calculate WACC strictly using Interest-Bearing Debt' explains WHAT but not WHEN to call it vs. alternatives or what prerequisites exist. Baseline is 194 chars; these are 60-120 chars.
Numeric parameters lack constraints. risk_free_rate, beta, tax_rate, growth_rate have no min/max bounds or format hints. LLMs can pass absurd values (negative rates, beta > 10, tax_rate > 100%).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
Error handling minimal. Only calculate_terminal_value returns an error dict; others assume valid input. No recovery guidance (e.g., 'If ROIC ≤ growth_rate, adjust assumptions and retry'). Errors are not categorized as retryable/user-fixable/fatal.
generate_deal_strategy returns a plain string, not structured output. LLMs cannot extract strategy type, confidence, or rationale for downstream reasoning. Should return {strategy: 'OFFENSE'|'DEFENSE', rationale: str, recommendation: str}.