Fair Value MCP Server
The server offers 16 calculate_* tools for financial valuation, risk analysis, and standards compliance aligned to IVS 2025 and IFRS/IAS.
calculate_actuarial_pv: IFRS 17/IAS 19/IAS 37 actuarial present value.calculate_company_summary: company profile with live market metrics.calculate_convertible_bond: convertible/exchangeable bond valuation with credit risk.calculate_credit_loss: IFRS 9 ECL, PD/LGD, provision matrices, CVA/DVA.calculate_dcf: DCF, NPV/IRR, annuities, perpetuities, terminal values, lease PV.calculate_discount_rate: WACC, CAPM, build-up, country/ESG risk, portfolio beta, IBR.calculate_expected_value: expected value for scenarios, Monte Carlo, decision trees, football fields.calculate_fair_value_adjustment: IFRS 13 adjustments (DLOM, DLOC, control premium, hierarchy).calculate_fixed_income: bond pricing, yield, duration, convexity, term structure, zero curve.calculate_loss_making_company: margin-ramp DCF, Merton equity, VC method, distressed waterfall, SPAC.calculate_market_multiple: peer multiples (EV/Revenue, EV/EBITDA, P/E, P/B, etc.).calculate_option: option/warrant pricing (Black-Scholes, binomial, FX, barrier, Asian, digital, share-based).calculate_report_review: audit valuation reports against IVS/IFRS or draft report structures.calculate_residual: IFRS measurement (goodwill, impairment, inventory, PP&E, biological assets, residual income, MPEEM).calculate_sector_metrics: SaaS, marketplace, lending, crypto metrics (LTV/CAC, ARR, NRR, take rate, NVT, Metcalfe).calculate_structured_product: CBBCs, warrants, ELN/ELI, autocallables, accumulators, CLNs, TRS, CFDs. All tools return a shared envelope with status, value, statistics, assumptions, citations, and error handling.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fair Value MCP Serverrun a DCF valuation for 9988.HK"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Fair Value
Professional financial valuation system for OpenCode with IFRS/IVS compliance.
mcp-name: io.github.simonmak-ascent/fair-value
Overview
A single valuation core — exposed as an MCP server, a REST API, and a
Python library — whose 14 native calculate_* tools / 135 methods cover
corporate, startup, and intangible valuation aligned to IVS 2025 and
IFRS/IAS:
DCF / NAV / CCA / residual income, market multiples, cost of capital (WACC, Fama-French 5-Factor, build-up)
Options, fixed income (term-structure curves), convertible bonds, structured products
IFRS 9 / HKFRS 9 credit risk (ECL, PD/LGD, CVA/DVA), actuarial PV (IFRS 17, IAS 19, IAS 37)
Fair-value adjustments (IFRS 13), expected value, and loss-making-company methods
Every result is a deterministic-first envelope carrying the centre value,
solution_type, statistics (σ / percentiles, and seeded samples for the few
stochastic methods), and citations resolving to verbatim IVS/IFRS clauses.
120 / 135 methods carry standards citations and the taxonomy has 0 orphan
clauses, enforced by a conformance gate in CI.
Related MCP server: agentladle-mcp-reoi
Quick start (≤ 5 minutes)
Fastest path — no install:
Hosted MCP (Streamable HTTP):
https://fair-value.ascent-partners.com/mcpHosted REST:
https://fair-value.ascent-partners.com/v1/healthFrontage & docs:
https://fair-value.ascent-partners.com/Run locally, no install:
uvx --from "fair-value[mcp]" fair-value-mcp
Then call any of the 14 calculate_* tools (add -help / help=true for the
generated transparency record). Client config: MCP Server.
Architecture
flowchart LR
CLIENT["AI agent / OpenCode"] -->|"stdio (uvx) or Streamable HTTP"| MCP["fair-value-mcp<br/>14 calculate_* tools · 135 methods"]
HOST["Hosted · fair-value.ascent-partners.com<br/>docs/landing at / · MCP at /mcp · REST at /v1"] --> CLIENT
MCP --> REG["method-spec registry<br/>(valuation://methods)"]
REG --> STD["standards taxonomy + corpus<br/>IVS 2025 · IFRS/IAS · (valuation://standards)"]
REG --> CORE["valuation engine<br/>DCF · NAV · CCA · WACC (FF5) · derivatives<br/>credit risk · actuarial"]
CORE --> DATA["inputs from apdb-etl (cited)"]
CORE --> ENV["result envelope<br/>value + statistics + citations"]Installation
pip install -r requirements.txt # dev workflow
# or, as a package:
pip install . # base library
pip install ".[mcp]" # + MCP server dependencies (fastmcp)The console command fair-value-mcp runs the MCP server (stdio; add --http for Streamable HTTP).
MCP Server
# run locally without installing (stdio)
uvx --from "fair-value[mcp]" fair-value-mcp
# or install and run
pip install "fair-value[mcp]"
fair-value-mcp # stdio
fair-value-mcp --http # Streamable HTTPThe server exposes 14 native calculate_* tools spanning DCF, cost of capital,
market multiples, residual/asset valuation, options, expected value, credit
risk, actuarial PV, sector metrics, fair-value adjustments, convertible bonds,
structured products, loss-making companies, and fixed income —
all derived from one method-spec registry. Add -help to any
tool (or help=true) for its generated documentation with formula reference,
inputs, and governing clauses.
Adoption target: ≥ 100 PyPI downloads and ≥ 1 directory listing within 90 days of the first release (tracked via the PyPI stats API and the directory listing).
REST API
The same core is exposed at /v1 (served next to MCP by mcp_server.asgi:app):
curl -s localhost:8000/v1/health
curl -s -X POST localhost:8000/v1/calculate/calculate_dcf \
-H 'content-type: application/json' \
-d '{"method":"dcf","cash_flows":[100,110],"discount_rate":0.1}'Endpoints: /v1/health, /v1/tools, /v1/methods, /v1/standards,
/v1/openapi.json, /v1/docs (Swagger UI), /v1/help/{tool},
POST /v1/calculate/{tool}. See REST API.
Web frontage (Next.js)
The hosted domain serves a Next.js frontage — landing, complete docs, methods
catalogue (one page per method), standards browser, and an API playground —
alongside the MCP/REST function in one Vercel project. It is data-driven: the
catalogue is generated from the registry at build time
(scripts/gen_web_data.py → data/catalog.json).
pnpm install
pnpm dev # http://localhost:3000 (expects /v1 from the API for the playground)
pnpm build # prebuild regenerates data/catalog.json
pnpm typecheck && pnpm lintRouting: / and /docs/* are Next.js; /mcp and /v1/* are rewritten to the
Python function (api/index.py). The frontage is localized — en at /,
zh at /zh, hk at /hk — via per-locale root layouts with hreflang.
Quick Start (Python)
from valuation_engine import run_valuation
result = run_valuation('9988.HK', 'dcf') # DCF valuation (shared envelope)Standards & citations
The standards alignment is data, not code: standards/taxonomy.json maps
each method to its IVS and IFRS/IAS clauses, standards/source/*.md holds the
verbatim clause text (with standards/provenance.json recording edition and
source), and standards/coverage-baseline.json is the coverage ratchet. The
engine attaches solution_type and citations to every envelope, and
scripts/check_conformance.py fails CI if a published method loses its citation
or the taxonomy/corpus drifts. See Standards reference.
Module structure
flowchart LR
SEED["method_spec_seed.py<br/>method tables · 135 methods"] --> SPEC["method_spec.py<br/>parameter vocabulary"]
SPEC --> SURF["tool_surface.py<br/>15 calculate_* tools"]
SPEC --> STD["standards.py<br/>taxonomy · citations"]
SURF --> SRV["server.py (FastMCP)"]
SRV --> STDIO["stdio · uvx fair-value-mcp"]
SRV --> HTTP["Streamable HTTP · fair-value-mcp --http"]
ASGI["asgi.py (+ rest.py, openapi.py)"] --> HOST["Hosted · / + /v1"]
SRV --> DOCS["docs.py<br/>-help transparency records"]
STD -.->|resources| RES["valuation://methods · valuation://standards"]
SRV -.-> DOCSsrc/
├── constants.py # standards references
├── valuation/ # DCF, NAV, CCA, asset standards (relief-from-royalty, MPEEM, residual)
├── cost_of_capital/ # WACC, FF5, KMV
├── credit_risk/ # ECL, PD/LGD, CVA/DVA
├── derivatives/ # options, swaps, convertible bonds, structured products, fixed income
└── output/ # shared result envelope (value + statistics + citations)
mcp_server/
├── method_spec.py + method_spec_seed.py # single source of truth for tools/methods
├── standards.py # taxonomy loader, citations, coverage
├── tool_surface.py · engine.py · handlers.py · server.py
├── docs.py · rest.py · openapi.py · asgi.py
└── catalog.py · prompts.py # valuation:// resources + guided prompts
standards/ # taxonomy.json · source/*.md · provenance · baseline
scripts/ # check_conformance.py · gen_docs.pyRequest lifecycle
sequenceDiagram
autonumber
participant C as MCP / REST / Python caller
participant E as validation + dispatch
participant R as method-spec registry
participant S as standards taxonomy
participant M as computation modules (src/)
participant O as output envelope
C->>E: calculate_*(...) / POST /v1/calculate/*
E->>R: resolve method + validate parameters (no defaults)
R-->>E: method spec
E->>M: dispatch to valuation / cost_of_capital / credit_risk / derivatives
E->>S: attach solution_type + citations
M-->>E: value + steps + assumptions
E->>O: ok() / error() envelope (value · statistics · citations)
O-->>C: status · method · value · statistics · assumptions · citations · disclaimerRequirements
Python 3.10+
pandas, numpy, scipy, python-dateutil
fastmcp (MCP extra), openpyxl, pdfplumber, python-docx
QuantLib, pandas_datareader, pytesseract/easyocr (all optional, with native fallbacks)
Documentation
Docs site:
mkdocs build(seemkdocs.yml); method reference auto-generated byscripts/gen_docs.pySKILL.md— capability spec;valuation://methods/valuation://standards— machine-readable catalogues
Standards compliance
IVS 2025 — International Valuation Standards (103, 105, 210, 220, 230, 300, 400, 410, 500)
IFRS 13 Fair Value Measurement; IFRS 9 Financial Instruments; IFRS 16 Leases; IFRS 17 Insurance Contracts
IAS 36 Impairment of Assets; IAS 19 Employee Benefits; IAS 37 Provisions, Contingent Liabilities and Contingent Assets
License
Released under the MIT License.
Available Tools
14 toolscalculate_actuarial_pvActuarial present valueARead-onlyIdempotentInspect
Actuarial present value engine. Discount expected cash flows with mortality, survival, and risk adjustment for insurance and benefit obligations, generalising IFRS 17 (fulfilment cash flows), IAS 19 (employee benefits), IFRS 2 (share-based payments), and IAS 37 (provisions). Use this for regulated IFRS/HKFRS obligations only; it does NOT do generic project or scenario probability weighting (use calculate_expected_value). Methods: ifrs17_gmm: cash_flows, discount_rate, risk_adjustment; ifrs17_paa: premiums, claims_cash, acquisition_cash_flows, coverage_periods; ifrs17_vfa: cash_flows, discount_rate, underlying_items_return, risk_adjustment; ias19_puc: projected_benefits, discount_rate, attribution_years; ias37_provision: outcomes, probabilities, discount_rate, periods. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| periods | No | Number of periods n (>=1). | |
| outcomes | No | Outcome values aligned with probabilities. | |
| premiums | No | Premiums in reporting currency. | |
| cash_flows | No | Projected cash flows in reporting currency, indexed t=1..n. | |
| claims_cash | No | Expected claims in reporting currency. | |
| discount_rate | No | Discount rate as a decimal (0.10 = 10%); pre-tax when method=viu_pre_tax. | |
| probabilities | No | Cumulative success probability per period in [0,1], aligned with cash_flows. | |
| risk_adjustment | No | Explicit risk adjustment for non-financial risk. | |
| coverage_periods | No | Coverage periods for the PAA (>=1). | |
| attribution_years | No | Years of service for attribution (>=1). | |
| projected_benefits | No | Projected benefits per service year. | |
| acquisition_cash_flows | No | Acquisition cash flows in reporting currency. | |
| underlying_items_return | No | Return on underlying items (decimal). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, but the description adds behavioral context beyond them: it specifies error semantics (unknown method, missing input, or extra field returns an INVALID_ARGUMENT error envelope instead of raising), the no-defaults rule, and the IFRS/HKFRS scope restriction. This is meaningful disclosure not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage/exclusion, then method input lists, and closes with error behavior. Every sentence carries required information (frameworks, alternative tool, per-method inputs, error contract) with no filler, which is appropriate density for a 5-method, 14-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers scope, method selection, required inputs per method, and error behavior, leaving nothing an agent needs in order to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3; however, the description adds the critical method-to-input mapping that the schema's method.enum explicitly defers to (e.g., ifrs17_gmm needs cash_flows, discount_rate, risk_adjustment; ias19_puc needs projected_benefits, discount_rate, attribution_years). Without this mapping the 14 flat parameters would be unusable, so the description materially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Actuarial present value engine', 'Discount expected cash flows with mortality, survival, and risk adjustment') and names the regulatory frameworks (IFRS 17, IAS 19, IFRS 2, IAS 37). It explicitly distinguishes itself from the sibling calculate_expected_value by excluding generic probability weighting, so an agent can tell the two apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('for regulated IFRS/HKFRS obligations only'), when not to use ('does NOT do generic project or scenario probability weighting'), and names the alternative tool (calculate_expected_value). It also defines the invocation rule ('Supply exactly one method with its declared inputs (no defaults)') that governs correct use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_convertible_bondConvertible and exchangeable bond valuationARead-onlyIdempotentInspect
Convertible-bond engine. Value callable and puttable convertible or exchangeable bonds with credit risk using a Tsiveriotis-Fernandes lattice (equity discounted at the risk-free rate, debt at a credit spread), with conversion, issuer call, holder put, coupon schedule, and a straight-bond floor. Use this for convertible and exchangeable bonds; for a plain bond or rate curve use calculate_fixed_income, and for a standalone option or warrant use calculate_option. The lattice_tsf, lattice_intensity, finite_difference, lsmc and quantlib methods are alternative numerical schemes for the same valuation and take identical inputs (Tsiveriotis-Fernandes is the reference, lsmc is Monte Carlo, quantlib needs the optional engine); choose one. Methods: lattice_tsf/lattice_intensity/finite_difference/lsmc/quantlib: spot, face, coupon_rate, maturity, conversion_ratio, volatility, risk_free, credit_spread, call_schedule, put_schedule, rights_priority. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| face | No | Bond face value. | |
| spot | No | Spot price of the underlying (or FX rate for garman_kohlhagen). | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| maturity | No | Time to expiry in years (0.5 = six months); > 0. | |
| risk_free | No | Continuously-compounded risk-free rate (decimal). | |
| volatility | No | Annualized volatility (decimal, 0.30 = 30%); > 0. | |
| coupon_rate | No | Annual coupon rate (decimal). | |
| put_schedule | No | Investor put schedule [{date_years, price}]; pass [] when there is none. | |
| call_schedule | No | Issuer call schedule [{date_years, price}]; pass [] when there is none. | |
| credit_spread | No | Credit spread over the risk-free rate (decimal). | |
| rights_priority | No | Which right prevails when call and put coincide. | |
| conversion_ratio | No | Shares received per bond on conversion. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description goes further by disclosing the error contract (unknown method, missing input, or extra field yields an INVALID_ARGUMENT envelope rather than raising), the no-defaults rule, and that quantlib needs an optional engine while lsmc is Monte Carlo. It stops short of describing convergence/accuracy trade-offs or runtime cost, which would matter for method choice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the engine and technique before the routing guidance and method list, and every sentence carries information. It is somewhat repetitive, enumerating the five method names in two separate sentences plus the schema enum, which costs a little density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with a 100% covered schema and an output schema, the description supplies everything else an agent needs: the valuation domain, the sibling routing, the method/input contract, and the error behavior. Return values need not be explained given the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real invocation semantics beyond the schema: exactly one method's declared inputs must be supplied with no defaults, extra fields are rejected, and the method list is enumerated with its input set. This clarifies a schema that otherwise marks every parameter nullable with default null.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (value callable/puttable convertible or exchangeable bonds) and the exact numerical technique (Tsiveriotis-Fernandes lattice with credit spread), which immediately distinguishes it from the fixed-income and option siblings. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: use this for convertible/exchangeable bonds, use calculate_fixed_income for plain bonds or rate curves, and calculate_option for standalone options/warrants. It also explains that the five methods are interchangeable schemes for the same valuation and that the agent must choose one, which is genuine selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_credit_lossCredit loss and impairmentARead-onlyIdempotentInspect
Credit-risk engine (IFRS 9 / HKFRS 9). Compute 12-month, lifetime, and staged expected credit loss, PD/LGD/EAD, provision matrices, hazard rates, and CVA/DVA. Use this for impairment, fair-value credit adjustment, and loan-loss provisioning; for the credit component of a specific convertible bond use calculate_convertible_bond, and for liquidity, control or marketability discounts rather than credit loss use calculate_fair_value_adjustment. Methods: ecl_12m: ead, pd, lgd; ecl_lifetime: ead, pd_lifetime, lgd; ecl_staged: ead, pd_12m, pd_lifetime, lgd, stage; provision_matrix: receivables_ageing, loss_rates; pd_from_spread: credit_spread, recovery, tenor_years; cumulative_pd: annual_pd, years; hazard: hazard_rate, tenor_years; cva_dva: exposure_profile, pd, lgd, discount_rate. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| pd | No | Probability of default over the horizon, in [0,1]. | |
| ead | No | Exposure at default in currency units. | |
| lgd | No | Loss given default in [0,1] (1 - recovery rate). | |
| stage | No | IFRS 9 stage (1, 2 or 3). | |
| years | No | Number of projection years n; equal len(cash_flows) when both are supplied. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| pd_12m | No | 12-month PD in [0,1]. | |
| recovery | No | Recovery rate in [0,1]. | |
| annual_pd | No | Annual PD in [0,1]. | |
| loss_rates | No | Loss rate per ageing bucket. | |
| hazard_rate | No | Default hazard rate as a decimal. | |
| pd_lifetime | No | Lifetime PD in [0,1]. | |
| tenor_years | No | Tenor in years (>0). | |
| credit_spread | No | Credit spread over the risk-free rate (decimal). | |
| discount_rate | No | Discount rate as a decimal (0.10 = 10%); pre-tax when method=viu_pre_tax. | |
| exposure_profile | No | Expected exposure per period. | |
| receivables_ageing | No | Ageing buckets [{bucket, amount}]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: it discloses the error contract (unknown method, missing input, or extra field returns an INVALID_ARGUMENT envelope rather than raising) and the no-defaults, exactly-one-method constraint. It stops short of describing result shape or precision, but the output schema covers return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and domain are front-loaded, followed by routing, then the compact method-to-input contract, then the error contract. The method list is dense but every clause is load-bearing for a tool with 8 mutually exclusive methods; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity multi-method calculator, the description covers purpose, sibling routing, the full method/input matrix, and failure semantics, while the output schema handles return values. An agent has everything needed to select a method and assemble a valid call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the method enum's schema description explicitly defers to the tool description for required inputs. The description supplies exactly that per-method mapping (ecl_12m: ead/pd/lgd; provision_matrix: receivables_ageing/loss_rates; cva_dva: exposure_profile/pd/lgd/discount_rate, etc.), which the schema alone cannot convey given 17 optional parameters and one discriminator.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (compute expected credit loss) and anchors it in a named domain (IFRS 9 / HKFRS 9), listing the concrete outputs (12-month/lifetime/staged ECL, PD/LGD/EAD, provision matrices, hazard rates, CVA/DVA). It explicitly distinguishes itself from calculate_convertible_bond and calculate_fair_value_adjustment, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use cases (impairment, fair-value credit adjustment, loan-loss provisioning) and two named when-not cases with the correct alternative for each (convertible bond credit component, liquidity/control/marketability discounts). This is exactly the routing information the sibling set requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_dcfDiscounted cash flow valuationARead-onlyIdempotentInspect
Discounted cash flow valuation engine. Choose a method and supply its exact inputs to value a business from projected free cash flows, dividends, residual income, or economic profit. Covers FCFF/FCFE DCF, NPV/IRR, terminal values, and multi-stage growth. Use this for going-concern cash-flow businesses; for asset-anchored or financial firms use calculate_residual, for peer-based pricing use calculate_market_multiple, and for pre-profit companies use calculate_loss_making_company. Methods: dcf/npv: cash_flows, discount_rate; annuity: payment, discount_rate, periods; growing_annuity: payment, discount_rate, growth_rate, periods; perpetuity: payment, discount_rate; terminal_gordon: final_cash_flow, discount_rate, perpetual_growth; terminal_multiple: final_cash_flow, exit_multiple; viu_pre_tax: cash_flows, pre_tax_discount_rate; rnpv: cash_flows, discount_rate, probabilities; lease_pv: lease_payments, incremental_borrowing_rate. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| payment | No | Level periodic payment in reporting currency. | |
| periods | No | Number of periods n (>=1). | |
| cash_flows | No | Projected cash flows in reporting currency, indexed t=1..n. | |
| growth_rate | No | Periodic growth rate as a decimal (0.03 = 3%). | |
| discount_rate | No | Discount rate as a decimal (0.10 = 10%); pre-tax when method=viu_pre_tax. | |
| exit_multiple | No | Exit multiple on the final flow, e.g. 8.0 for 8x. | |
| probabilities | No | Cumulative success probability per period in [0,1], aligned with cash_flows. | |
| lease_payments | No | Contractual lease payments in reporting currency, t=1..n. | |
| final_cash_flow | No | Final-period cash flow for the terminal value. | |
| perpetual_growth | No | Gordon growth rate (decimal); strictly below discount_rate. | |
| pre_tax_discount_rate | No | Pre-tax discount rate (decimal), required by viu_pre_tax (IAS 36). | |
| incremental_borrowing_rate | No | Lessee incremental borrowing rate (decimal), IFRS 16. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds behavior beyond that: exactly one method per call, no defaults, and the failure mode (an INVALID_ARGUMENT error envelope rather than a raised exception). It does not need to discuss auth or rate limits for a pure in-process computation, so this is close to complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the routing rule follows before the method list. The enumeration of methods and their inputs is long, but each entry is load-bearing because the schema does not encode per-method requirements. Slightly dense, yet nothing is redundant with the structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. With the safety profile in annotations, per-method input requirements, sibling routing, and error semantics all stated, an agent has everything required to select a method and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, which normally caps the baseline at 3, but here the schema marks 12 of 13 parameters as optional-with-null, so it cannot convey which inputs a given method actually requires. The description supplies that mapping explicitly per method (e.g. "terminal_multiple: final_cash_flow, exit_multiple; viu_pre_tax: cash_flows, pre_tax_discount_rate"), which is information no single-parameter schema description can express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Discounted cash flow valuation engine") and enumerates the exact technique families covered (FCFF/FCFE DCF, NPV/IRR, terminal values, multi-stage growth). It also names the sibling tools it is not (calculate_residual, calculate_market_multiple, calculate_loss_making_company), so an agent can discriminate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: "Use this for going-concern cash-flow businesses; for asset-anchored or financial firms use calculate_residual, for peer-based pricing use calculate_market_multiple, and for pre-profit companies use calculate_loss_making_company." This is a when-to-use plus three named alternatives with the condition selecting each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_discount_rateCost of capital and discount ratesARead-onlyIdempotentInspect
Cost-of-capital engine. Compute WACC, cost of equity (CAPM), cost of debt, unlevered/relevered beta, and country or size premiums from an explicit capital structure and market inputs. Use this to derive the discount rate an income-approach valuation needs; it returns a rate, not a valuation, so feed the result to calculate_dcf, or to calculate_residual for IFRS-basis measurement. Methods: wacc: equity_weight, debt_weight, cost_equity, cost_debt, tax_rate; capm: risk_free, beta, market_return; startup_capm: risk_free, beta, market_risk_premium, size_premium, illiquidity_premium; build_up: risk_free, equity_risk_premium, size_premium, industry_premium, specific_premium; currency_adjusted: base_rate, currency_risk_premium, country_risk_premium; country_risk: sovereign_yield, us_risk_free; esg: base_rate, esg_risk_premium, esg_opportunity_discount; portfolio_beta: weights, betas; ibr: risk_free, credit_spread, tenor_years. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| beta | No | Equity beta (market = 1.0). | |
| betas | No | Asset/segment betas aligned with weights. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| weights | No | Weights that must sum to 1. | |
| tax_rate | No | Marginal corporate tax rate as a decimal. | |
| base_rate | No | Base rate before currency/country/ESG adjustment (decimal). | |
| cost_debt | No | Pre-tax cost of debt as a decimal. | |
| risk_free | No | Continuously-compounded risk-free rate (decimal). | |
| cost_equity | No | Cost of equity as a decimal (0.12 = 12%). | |
| debt_weight | No | Market-value weight of debt (decimal); with equity_weight must sum to 1. | |
| tenor_years | No | Tenor in years (>0). | |
| size_premium | No | Small-size premium (decimal). | |
| us_risk_free | No | US Treasury risk-free yield (decimal). | |
| credit_spread | No | Credit spread over the risk-free rate (decimal). | |
| equity_weight | No | Market-value weight of equity (decimal); with debt_weight must sum to 1. | |
| market_return | No | Expected market return (decimal). | |
| sovereign_yield | No | Sovereign bond yield (decimal). | |
| esg_risk_premium | No | ESG risk premium added to the base rate (decimal). | |
| industry_premium | No | Industry risk premium (decimal). | |
| specific_premium | No | Company-specific risk premium (decimal). | |
| equity_risk_premium | No | Equity risk premium (decimal). | |
| illiquidity_premium | No | Illiquidity premium (decimal). | |
| market_risk_premium | No | Market risk premium (decimal). | |
| country_risk_premium | No | Country risk premium (decimal). | |
| currency_risk_premium | No | Currency risk premium (decimal). | |
| esg_opportunity_discount | No | ESG opportunity discount subtracted from the base rate (decimal). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real behavioral context beyond them: exactly one method with its declared inputs, no defaults applied, and an error-envelope contract (INVALID_ARGUMENT) instead of raising on unknown method, missing input, or extra field. It omits any note on auth, limits, or output shape, but has an output schema covering returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and routing before the dense method table; every sentence carries information. The per-method enumeration is long but necessary given nine modes, though it reads as a run-on and could be structured for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-parameter, nine-method calculation tool, the description covers purpose, routing, method-to-input mapping, and failure semantics. A return-value explanation is unnecessary because an output schema exists. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description goes well beyond it by mapping each of the nine method values to the exact inputs it requires (e.g. wacc: equity_weight, debt_weight, cost_equity, cost_debt, tax_rate; ibr: risk_free, credit_spread, tenor_years). This conditional dependency between method and parameters is not expressible in the flat schema and is the key guidance for correctly invoking the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Cost-of-capital engine. Compute WACC, cost of equity (CAPM), cost of debt, unlevered/relevered beta, and country or size premiums'), which is precisely scoped and clearly distinguished from the valuation siblings. The explicit statement that it 'returns a rate, not a valuation' separates it from calculate_dcf/calculate_residual without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the use case ('derive the discount rate an income-approach valuation needs'), the boundary ('returns a rate, not a valuation'), and names the concrete downstream routing targets (calculate_dcf, calculate_residual for IFRS-basis measurement). An agent knows both when to call it and where its output goes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_expected_valueExpected value and probability weightingARead-onlyIdempotentInspect
Expected-value engine. Compute expected values over discrete, continuous, simulated, or tree-structured uncertainty, plus football-field ranges. Use this for generic probability weighting of scenarios, Monte-Carlo and decision trees; it does NOT perform IFRS/HKFRS measurement of provisions, insurance or employee-benefit obligations (use calculate_actuarial_pv), and it does not price path-dependent payoffs (use calculate_structured_product). Methods: discrete: outcomes, probabilities; continuous: distribution, mean, std, lower, upper; scenario: scenarios; monte_carlo: iterations, distributions, base_params, seed; decision_tree: tree; football_field: estimates. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| std | No | Distribution standard deviation (>0). | |
| mean | No | Distribution mean. | |
| seed | No | Deterministic RNG seed (required by simulation methods for reproducibility). | |
| tree | No | Decision tree with chance/decision nodes. | |
| lower | No | Lower integration bound. | |
| upper | No | Upper integration bound. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| outcomes | No | Outcome values aligned with probabilities. | |
| estimates | No | Estimates [{method, central, low, high}] for a football field. | |
| scenarios | No | Scenarios [{probability, value}] with probabilities summing to 1. | |
| iterations | No | Monte-Carlo iterations (>=1000). | |
| base_params | No | Base parameter values for simulation. | |
| distribution | No | Continuous distribution to integrate over. | |
| distributions | No | Input distributions [{parameter, type, mean, std}]. | |
| probabilities | No | Cumulative success probability per period in [0,1], aligned with cash_flows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description goes further by disclosing the validation contract: exactly one method, no defaults, and an INVALID_ARGUMENT error envelope rather than an exception. That failure-mode disclosure is real value beyond the annotations. One caveat: 'no defaults' is in mild tension with the schema, which lists default null for every optional field, so a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then exclusions, then the per-method input contract, then the error contract — a sensible priority order with no filler sentences. The middle method-inventory sentence is dense and list-heavy, but every element is load-bearing rather than decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter tool with an enum discriminator and an output schema, the description supplies the method-to-input contract, the mutual-exclusion rule, the sibling routing, and the error behavior. Return values are covered by the output schema, so nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline would be 3, but the description adds the crucial conditional mapping the flat schema cannot express: which inputs each method value requires (discrete: outcomes+probabilities; continuous: distribution/mean/std/lower/upper; monte_carlo: iterations/distributions/base_params/seed, etc.). This resolves the cross-parameter dependency the enum alone leaves ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb and resource ('expected-value engine', 'Compute expected values') and immediately scopes the breadth of methods it covers. It distinguishes itself from sibling tools by name, explicitly ruling out calculate_actuarial_pv and calculate_structured_product, so an agent can route between them without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('generic probability weighting of scenarios, Monte-Carlo and decision trees') and two explicit when-not cases with the correct alternative tool named for each. Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_fair_value_adjustmentFair value adjustments (IFRS 13)ARead-onlyIdempotentInspect
Fair-value-adjustment engine (IFRS 13). Compute exit-price adjustments including credit, liquidity, control and marketability discounts, blockage, and the fair-value hierarchy level. Use this to move from an indicated value to the fair value recognised in the accounts; for liquidity/marketability inputs of a listed instrument prefer calculate_market_multiple, and for expected credit loss use calculate_credit_loss. Methods: dlom: base_value, restricted_period, volatility, risk_free; dloc: base_value, transaction_cost_pct; control_premium: base_value, control_premium_pct; minority_discount: base_value, minority_discount_pct; highest_best_use: base_value, alternative_use_values; hierarchy_level: inputs. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | No | Inputs [{value, level}] used to determine the hierarchy level. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| risk_free | No | Continuously-compounded risk-free rate (decimal). | |
| base_value | No | Base valuation before the adjustment. | |
| volatility | No | Annualized volatility (decimal, 0.30 = 30%); > 0. | |
| restricted_period | No | Restricted/marketability period in years (>=0). | |
| control_premium_pct | No | Control premium as a fraction of value. | |
| transaction_cost_pct | No | Transaction cost as a fraction of value. | |
| minority_discount_pct | No | Minority discount as a fraction of value. | |
| alternative_use_values | No | Financially feasible alternative-use values. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds real behavioral context beyond that: exactly one method must be supplied with its declared inputs, there are no defaults, and invalid input returns an error envelope (code INVALID_ARGUMENT) rather than raising. It doesn't need to describe output because an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose, alternatives and error contract are front-loaded, and every sentence carries information. The method/input listing is dense but necessary since the schema defers it here; it is slightly run-on but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-method, 10-parameter calculation tool this is complete: method-to-input mapping, alternatives, and error behavior are all covered, and return values are handled by the output schema. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so field meanings are already documented, but the description adds cross-parameter semantics the schema cannot express: the exact input set required per method value, the exactly-one-method constraint, and that no defaults apply. That mapping meaningfully exceeds the per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('fair-value-adjustment engine', 'compute exit-price adjustments') and enumerates the adjustment types (credit, liquidity, control, marketability, blockage, hierarchy). It explicitly distinguishes itself from siblings calculate_market_multiple and calculate_credit_loss, so an agent can route correctly without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('move from an indicated value to the fair value recognised in the accounts') and names the alternatives with the condition that selects them (liquidity/marketability inputs of a listed instrument -> calculate_market_multiple; expected credit loss -> calculate_credit_loss). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_fixed_incomeFixed income and term structure analyticsARead-onlyIdempotentInspect
Fixed-income engine. Price plain coupon bonds, solve for yield to maturity, measure interest-rate sensitivity via Macaulay and modified duration and convexity, and build a HIBOR/HKD-style term structure: bootstrap a zero curve from par rates, infer forward rates, and discount cash flows on the curve. Use this for vanilla bonds, rate risk and discount curves; for convertibles use calculate_convertible_bond and for structured payoffs use calculate_structured_product. Methods: bond_price/duration/convexity: face, coupon_rate, years, ytm, frequency; bond_yield: face, coupon_rate, years, price, frequency; matrix_pricing: target_tenor, benchmark_tenors, benchmark_yields; discount_factor: rate, years, frequency; zero_curve: par_rates, tenors, frequency; forward_rate: zero_rates, tenors, t1, t2; pv_curve: cash_flows, times, zero_rates, tenors. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| t1 | No | Forward period start in years (>=0). | |
| t2 | No | Forward period end in years (> t1). | |
| ytm | No | Yield to maturity (decimal, annualised). | |
| face | No | Bond face value. | |
| rate | No | A single interest/zero rate (decimal). | |
| price | No | Dirty price of the instrument in reporting currency. | |
| times | No | Cash-flow times in years, aligned with cash_flows. | |
| years | No | Number of projection years n; equal len(cash_flows) when both are supplied. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| tenors | No | Tenors in years, aligned with par_rates or zero_rates. | |
| frequency | No | Coupon payments per year (1=annual, 2=semi-annual). | |
| par_rates | No | Par (coupon) rates per tenor, aligned with tenors (decimal). | |
| cash_flows | No | Projected cash flows in reporting currency, indexed t=1..n. | |
| zero_rates | No | Zero (spot) rates per tenor, decimal, annual compounding. | |
| coupon_rate | No | Annual coupon rate (decimal). | |
| target_tenor | No | Target tenor in years for matrix pricing (interpolated). | |
| benchmark_tenors | No | Benchmark tenors in years, sorted, aligned with benchmark_yields. | |
| benchmark_yields | No | Benchmark yields (decimal) at each benchmark tenor. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral contract beyond that: the exactly-one-method dispatch rule, 'no defaults' enforcement, and the error-envelope behavior (INVALID_ARGUMENT returned rather than raised) for unknown methods, missing inputs, or extra fields. It doesn't discuss numerical edge cases (e.g., non-convergence in yield solving) or output shape, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose first, then sibling routing, then the per-method input contract, then the error contract. The method-input enumeration is long but every element earns its place given the 9-way method enum. Slightly cramped as one unbroken paragraph, which costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be described, and the description covers the remaining agent-critical surface: which method to pick, what inputs each method requires, same-call constraints, and error semantics. For an 18-parameter, single-method-dispatch tool, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value the schema cannot: an explicit method-to-input mapping (bond_yield takes price instead of ytm; matrix_pricing takes target/benchmark tenors; pv_curve takes cash_flows plus times plus zero_rates). This tells the agent which of the 18 optional parameters to populate for a given method, which the flat schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific domain engine with enumerated capabilities (bond pricing, YTM solving, duration/convexity, zero-curve bootstrap, forwards, curve discounting) and names the exact sibling alternatives for convertible and structured payoffs. An agent can distinguish it from calculate_convertible_bond and calculate_structured_product without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance: 'Use this for vanilla bonds, rate risk and discount curves; for convertibles use calculate_convertible_bond and for structured payoffs use calculate_structured_product.' Both the when-to-use and the when-not-to-use (with named alternatives) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_loss_making_companyLoss-making and pre-profit company valuationARead-onlyIdempotentInspect
Loss-making-company engine. Value currently unprofitable companies with margin-ramp DCF, revenue multiples, Merton structural equity, the VC method, distressed waterfalls, bank residual income, and SPAC deals; every method returns a central value plus a dispersion (sigma, percentiles, long-tail). Use this when earnings-based multiples break down; for standalone probability weighting of arbitrary scenarios use calculate_expected_value, and for a single going-concern DCF use calculate_dcf. Methods: margin_ramp_dcf: revenue, growth_rate, start_margin, target_margin, ramp_years, discount_rate, years, shares_outstanding, net_debt, range_method; revenue_multiple: revenue, ev_revenue_multiple, net_debt, shares_outstanding, range_method; merton_equity: firm_value, firm_volatility, debt, risk_free, maturity, range_method; vc_method: terminal_value, target_return, investment, shares_outstanding, range_method; distressed_waterfall: enterprise_value, claims, range_method; bank_residual_income: book_value, net_income, cost_equity, growth_rate, range_method; spac_deal: trust_cash, shares_outstanding, redemption_price, range_method. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| debt | No | Debt face value (default point) for the Merton equity model. | |
| years | No | Number of projection years n; equal len(cash_flows) when both are supplied. | |
| claims | No | Ordered claims [{name, amount, priority}] for a waterfall. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| revenue | No | Base-year revenue in reporting currency. | |
| maturity | No | Time to expiry in years (0.5 = six months); > 0. | |
| net_debt | No | Total debt minus cash and equivalents. | |
| risk_free | No | Continuously-compounded risk-free rate (decimal). | |
| book_value | No | Book value of equity in reporting currency. | |
| firm_value | No | Firm/asset value for the Merton equity model. | |
| investment | No | Amount invested (VC method). | |
| net_income | No | Net income in reporting currency. | |
| ramp_years | No | Years to move from start_margin to target_margin (>=1). | |
| trust_cash | No | SPAC trust cash available for redemption. | |
| cost_equity | No | Cost of equity as a decimal (0.12 = 12%). | |
| growth_rate | No | Periodic growth rate as a decimal (0.03 = 3%). | |
| range_method | No | Statistic returned as the headline value; the full dispersion is always included. | |
| start_margin | No | Opening operating margin (decimal, may be negative); margin_ramp. | |
| discount_rate | No | Discount rate as a decimal (0.10 = 10%); pre-tax when method=viu_pre_tax. | |
| target_margin | No | Normalized margin reached after ramp_years; margin_ramp. | |
| target_return | No | VC target return multiple. | |
| terminal_value | No | Exit/terminal value (VC method). | |
| firm_volatility | No | Asset volatility for the Merton equity model (decimal). | |
| enterprise_value | No | Enterprise value distributed across claims. | |
| redemption_price | No | SPAC redemption price per share. | |
| shares_outstanding | No | Shares outstanding. | |
| ev_revenue_multiple | No | EV/Revenue multiple. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the safety profile is covered; the description still adds real value by disclosing that every method returns a central value plus dispersion (sigma, percentiles, long-tail), that no defaults are applied, and that bad input yields an INVALID_ARGUMENT error envelope rather than raising. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage/exclusions, then the method-to-input catalog. The method listing is long but each term carries load for a 27-parameter tool; only the repeated 'range_method' tail across every method is slightly wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 27 params, one required discriminator, full schema coverage, and an existing output schema, the description supplies everything an agent needs: purpose, routing versus siblings, the per-method input contract, no-defaults rule, and error behavior. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, which alone would cap the baseline at 3, but the description goes well beyond the per-field schema text by mapping each of the seven method enum values to the exact inputs it requires (e.g. merton_equity: firm_value, firm_volatility, debt, risk_free, maturity) and stating that exactly one method's declared inputs must be supplied. That mapping is genuinely unavailable from the flat schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (value currently unprofitable companies) and enumerates the exact method families the engine covers. It explicitly distinguishes itself from siblings by naming calculate_expected_value (probability weighting of arbitrary scenarios) and calculate_dcf (single going-concern DCF), so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use this when earnings-based multiples break down') plus two named alternatives with the precise condition that selects each. Coverage of when-to-use and when-to-use-something-else is essentially complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_market_multipleMarket multiples and comparable pricingARead-onlyIdempotentInspect
Market-multiple engine. Apply peer multiples (P/E, P/B, EV/EBITDA, EV/Sales, PEG and more) or derive implied multiples to price a company on a comparable basis. Use this for market-approach pricing where peers exist; it does peer multiples only — for intrinsic cash-flow value use calculate_dcf, and for residual-income or IFRS-basis measurement use calculate_residual. Methods: ev_revenue: revenue, ev_revenue_multiple; ev_ebitda: ebitda, ev_ebitda_multiple; ev_arr: arr, ev_arr_multiple; ev_gmv: gmv, ev_gmv_multiple; pe: eps, pe_multiple; pb: book_value_per_share, pb_multiple; ps: sales_per_share, ps_multiple; cap_rate: net_operating_income, cap_rate; regression: intercept, growth_rate, growth_coefficient, market_maturity, maturity_coefficient; royalty_cap: revenue, royalty_rate, discount_rate; ddm: dividend_per_share, cost_equity, growth_rate. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| arr | No | Annual recurring revenue in reporting currency. | |
| eps | No | Earnings per share. | |
| gmv | No | Gross merchandise value in reporting currency. | |
| ebitda | No | EBITDA in reporting currency. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| revenue | No | Base-year revenue in reporting currency. | |
| cap_rate | No | Capitalisation rate as a decimal (0.06 = 6%). | |
| intercept | No | Regression intercept (base multiple). | |
| cost_equity | No | Cost of equity as a decimal (0.12 = 12%). | |
| growth_rate | No | Periodic growth rate as a decimal (0.03 = 3%). | |
| pb_multiple | No | Price/Book multiple. | |
| pe_multiple | No | Price/Earnings multiple. | |
| ps_multiple | No | Price/Sales multiple. | |
| royalty_rate | No | Royalty rate as a decimal (0.05 = 5% of revenue). | |
| discount_rate | No | Discount rate as a decimal (0.10 = 10%); pre-tax when method=viu_pre_tax. | |
| ev_arr_multiple | No | EV/ARR multiple. | |
| ev_gmv_multiple | No | EV/GMV multiple. | |
| market_maturity | No | Market maturity indicator. | |
| sales_per_share | No | Sales per share. | |
| dividend_per_share | No | Dividend per share in reporting currency. | |
| ev_ebitda_multiple | No | EV/EBITDA multiple. | |
| growth_coefficient | No | Regression slope on growth. | |
| ev_revenue_multiple | No | EV/Revenue multiple. | |
| book_value_per_share | No | Book value per share. | |
| maturity_coefficient | No | Regression slope on market maturity. | |
| net_operating_income | No | Stabilised net operating income in reporting currency. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds real behavioral detail the annotations cannot: exactly one method must be supplied with its declared inputs, no defaults are applied, and invalid input returns an error envelope (INVALID_ARGUMENT) rather than raising. It does not discuss output shape or numeric precision, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and sibling routing are front-loaded, then the method-to-input table follows. The enumeration is long but each entry is load-bearing, since the schema alone does not encode the mapping; there is little fat to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. The description covers method selection, required inputs per method, the exactly-one-method constraint, and error behavior, which is everything an agent needs to invoke a 26-parameter, 11-branch tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the 26 individual fields, but the schema cannot express which subset each method requires. The description supplies that complete cross-parameter mapping for all 11 methods plus the one-method-at-a-time rule, which is genuine value beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Market-multiple engine') and states the exact scope: apply peer multiples or derive implied multiples for comparable-basis pricing. It explicitly distinguishes itself from calculate_dcf and calculate_residual, so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use condition ('market-approach pricing where peers exist') and names two alternatives with the conditions that select them (intrinsic cash-flow value -> calculate_dcf; residual-income/IFRS -> calculate_residual). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_optionOption and warrant pricingARead-onlyIdempotentInspect
Option-pricing engine. Price European and American options and warrants (Black-Scholes, Black-76, CRR binomial, Garman-Kohlhagen FX, digital, range, share-based) and their greeks. Use this for a single contingent claim or warrant on one underlying; it does NOT price listed structured payoffs such as CBBCs, inline/derivative warrants or autocallables (use calculate_structured_product). Methods: black_scholes: spot, strike, maturity, risk_free, volatility, option_type; black76: forward, strike, maturity, risk_free, volatility, option_type; binomial_american: spot, strike, maturity, risk_free, volatility, option_type, steps; garman_kohlhagen: spot, strike, maturity, domestic_rate, foreign_rate, volatility, option_type; barrier_first_passage: spot, strike, maturity, risk_free, volatility, option_type, barrier, barrier_type; asian_average: spot, strike, maturity, risk_free, volatility, option_type, average_type; digital: spot, strike, maturity, risk_free, volatility, cash_payout; range: spot, lower_strike, upper_strike, maturity, risk_free, volatility, payout; share_based: share_price, exercise_price, expected_life, volatility, risk_free, dividend_yield. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| spot | No | Spot price of the underlying (or FX rate for garman_kohlhagen). | |
| steps | No | Lattice steps for binomial_american (>=50). | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| payout | No | Fixed payout when the range condition is met. | |
| strike | No | Strike or exercise price in the same currency as spot. | |
| barrier | No | Knock level for barrier_first_passage. | |
| forward | No | Forward/futures price of the underlying. | |
| maturity | No | Time to expiry in years (0.5 = six months); > 0. | |
| risk_free | No | Continuously-compounded risk-free rate (decimal). | |
| volatility | No | Annualized volatility (decimal, 0.30 = 30%); > 0. | |
| cash_payout | No | Fixed cash amount paid when the digital condition is met. | |
| option_type | No | Option right. | |
| share_price | No | Grant-date share price (IFRS 2). | |
| average_type | No | Averaging convention. | |
| barrier_type | No | Barrier direction. | |
| foreign_rate | No | Foreign continuously-compounded rate (decimal). | |
| lower_strike | No | Lower strike of the range. | |
| upper_strike | No | Upper strike of the range. | |
| domestic_rate | No | Domestic continuously-compounded rate (decimal). | |
| expected_life | No | Expected life of the award in years (IFRS 2). | |
| dividend_yield | No | Continuous dividend yield (decimal). | |
| exercise_price | No | Exercise price of the award (IFRS 2). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so safety is covered. The description adds genuinely useful behavior beyond the schema: the 'exactly one method with its declared inputs (no defaults)' rule and the error envelope contract (INVALID_ARGUMENT instead of raising). It does not describe whether greeks are always returned, but the output schema covers the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prohibition clause is front-loaded well, but the per-method input lists read as a compressor run-on and are somewhat redundant with the method enum plus parameter descriptions. The content is justified by the combinatorial method/input matrix, but the dense single block is heavy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 9-way method enum over 22 parameters with only one required field, the method-to-input mapping is the key missing piece and it is provided. An output schema exists so return values need not be explained, and the error contract closes the remaining gap. Nothing an agent needs to form a valid call is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents each parameter's meaning and constraints (maturity > 0, volatility > 0, IFRS 2 labels). The description goes further by mapping which inputs each method value requires, which is semantic information the field-level schema does not express. It does not add unit/format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (price) and a well-defined resource (European/American options and warrants) with the exact formula families named. It explicitly distinguishes itself from the sibling calculate_structured_product, which an agent could otherwise confuse given the overlapping 'contingent payoff' domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the exclusion set (CBBCs, inline/derivative warrants, autocallables) and routes the agent to the correct sibling calculate_structured_product. The 'single contingent claim or warrant on one underlying' framing gives the positive selection criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_residualIFRS measurement, residual income and non-financial fair valueARead-onlyIdempotentInspect
IFRS/HKFRS measurement engine. Compute goodwill and purchase-price allocation, impairment (IAS 36), inventory net realisable value, held-for-sale, debt waterfalls, cap tables, sum-of-the-parts and SPAC redemption; residual income and justified price-to-book; and non-financial asset fair value: investment property (IAS 40 / HKAS 40), PP&E revaluation via depreciated replacement cost (IAS 16) and biological assets at fair value less costs to sell (IAS 41). Use this for accounting-basis measurement of assets and equity; for going-concern cash flow use calculate_dcf and for peer multiples use calculate_market_multiple. Methods: goodwill: purchase_price, fair_value_net_identifiable_assets; ppa: purchase_price, tangible_assets_fv, identified_intangibles_fv; impairment_fvlcd: carrying_value, fair_value_less_costs_to_dispose; impairment_viu: carrying_value, value_in_use; inventory_nrv: carrying_value, net_realisable_value; held_for_sale: carrying_value, fair_value_less_costs_to_sell; debt_waterfall/cap_table: enterprise_value, claims; sotp: segments, net_debt, holding_discount; spac_redemption: trust_cash, shares_outstanding, redemption_price; investment_property: noi, cap_rate; ppe_revaluation: replacement_cost, accumulated_depreciation; biological_asset: expected_price, quantity, costs_to_sell; residual_income: book_value, net_income, cost_equity; justified_pb: roe, cost_equity, growth_rate; relief_from_royalty: revenue, royalty_rate, discount_rate, periods; mpeem: cash_flows, contributory_charges, discount_rate; with_without: with_cash_flows, without_cash_flows, discount_rate; recoverable_amount: fair_value_less_costs_to_dispose, value_in_use; liability_fulfilment: fulfilment_costs, mark_up, discount_rate; inventory_residual: selling_price, costs_to_complete, profit_allowance; development_residual: gross_development_value, development_costs, developer_profit. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| noi | No | Net operating income of the property (IAS 40). | |
| roe | No | Return on equity (decimal). | |
| claims | No | Ordered claims [{name, amount, priority}] for a waterfall. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| mark_up | No | Reasonable mark-up on fulfilment costs (decimal, IVS 220 Bottom-Up). | |
| periods | No | Number of periods n (>=1). | |
| revenue | No | Base-year revenue in reporting currency. | |
| cap_rate | No | Capitalisation rate as a decimal (0.06 = 6%). | |
| net_debt | No | Total debt minus cash and equivalents. | |
| quantity | No | Number of units (biological assets). | |
| segments | No | Segments [{name, value}] for a sum-of-the-parts. | |
| book_value | No | Book value of equity in reporting currency. | |
| cash_flows | No | Projected cash flows in reporting currency, indexed t=1..n. | |
| net_income | No | Net income in reporting currency. | |
| trust_cash | No | SPAC trust cash available for redemption. | |
| cost_equity | No | Cost of equity as a decimal (0.12 = 12%). | |
| growth_rate | No | Periodic growth rate as a decimal (0.03 = 3%). | |
| royalty_rate | No | Royalty rate as a decimal (0.05 = 5% of revenue). | |
| value_in_use | No | Value in use in reporting currency. | |
| costs_to_sell | No | Incremental costs to sell / dispose (IAS 41). | |
| discount_rate | No | Discount rate as a decimal (0.10 = 10%); pre-tax when method=viu_pre_tax. | |
| selling_price | No | Estimated selling price of the finished inventory (IVS 230 top-down). | |
| carrying_value | No | Carrying amount before the test. | |
| expected_price | No | Expected market price per biological-asset unit (IAS 41). | |
| purchase_price | No | Consideration transferred in reporting currency. | |
| with_cash_flows | No | After-tax cash flows with the asset in use (IVS 210 with-and-without). | |
| developer_profit | No | Required developer's profit/risk allowance (IVS 410). | |
| enterprise_value | No | Enterprise value distributed across claims. | |
| fulfilment_costs | No | Costs required to fulfil the performance obligation per period (IVS 220 Bottom-Up). | |
| holding_discount | No | Holding-company discount as a decimal. | |
| profit_allowance | No | Estimated profit allowance on the completion/disposal effort. | |
| redemption_price | No | SPAC redemption price per share. | |
| replacement_cost | No | Depreciated-replacement-cost gross value of PP&E (IAS 16). | |
| costs_to_complete | No | Remaining costs to complete work-in-process inventory (IVS 230). | |
| development_costs | No | All known/anticipated costs to complete the development. | |
| shares_outstanding | No | Shares outstanding. | |
| tangible_assets_fv | No | Fair value of tangible assets. | |
| without_cash_flows | No | After-tax cash flows absent the asset (IVS 210 with-and-without), aligned with with_cash_flows. | |
| contributory_charges | No | Contributory-asset charges (economic rent) per period, aligned with cash_flows (IVS 210 MPEEM). | |
| net_realisable_value | No | Estimated NRV in reporting currency. | |
| gross_development_value | No | Anticipated value of the completed development (IVS 410 residual method). | |
| accumulated_depreciation | No | Accumulated depreciation to deduct (IAS 16). | |
| identified_intangibles_fv | No | Fair value of separately identified intangibles. | |
| fair_value_less_costs_to_sell | No | FV less costs to sell in reporting currency. | |
| fair_value_less_costs_to_dispose | No | FVLCD in reporting currency. | |
| fair_value_net_identifiable_assets | No | Fair value of net identifiable assets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: no defaults are applied, and an unknown method, missing input, or extra field returns an error envelope with code INVALID_ARGUMENT rather than raising. It does not discuss magnitude/precision of results, but with annotations plus an output schema that gap is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly: purpose, then routing guidance, then the method-to-inputs table. The length is justified by 22 methods and 46 parameters, and every clause carries information, but the single run-on sentence with semicolon-delimited clauses is hard to scan and could be structured as a list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity dispatcher with an output schema already present, the description supplies the two things an agent actually needs: the method enum's input contract and the strict-failure behavior. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-field meanings are already documented and the baseline would be 3. The description exceeds that by mapping each of the 22 enum methods to its exact required input set (e.g. 'impairment_viu: carrying_value, value_in_use'), which is cross-parameter semantics the schema cannot express — essential given 46 optional-looking fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('IFRS/HKFRS measurement engine') and enumerates the exact measurement domains covered (goodwill/PPA, IAS 36 impairment, IAS 40 investment property, IAS 16 revaluation, IAS 41 biological assets, residual income, etc.). It explicitly names sibling tools it is not (calculate_dcf for going-concern cash flow, calculate_market_multiple for peer multiples), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this for accounting-basis measurement of assets and equity; for going-concern cash flow use calculate_dcf and for peer multiples use calculate_market_multiple' gives an explicit when-to-use plus named alternatives and the condition that selects each. It also states the invocation contract ('supply exactly one method with its declared inputs'), removing ambiguity about how to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_sector_metricsSector-specific operating metricsARead-onlyIdempotentInspect
Sector-metric engine. Compute the metrics that anchor valuation in specific industries: SaaS (ARR, NRR, magic number, Rule of 40), marketplaces (take rate, GMV multiple), lending (LTV/CAC), and crypto (NVT, Metcalfe). It returns operating metrics, not a valuation; use them as inputs to calculate_market_multiple or calculate_dcf. Methods: ltv: arpu, gross_margin, churn_rate; cac: sales_marketing_expense, new_customers; arr: subscription_values; nrr: starting_revenue, ending_revenue, expansion_revenue; magic_number: net_new_arr, sales_marketing_expense_prior; rule_of_40: growth_rate, profit_margin; take_rate: revenue, gmv; gmv_multiple: gmv, ev_gmv_multiple; retention: retained_customers, starting_customers; trl: market_size, market_share, margin, exit_multiple, trl_discount; break_even: fixed_costs, asp, variable_cost; gross_margin: asp, variable_cost; token: transaction_volume, price_per_tx, velocity, supply; nvt: market_cap, transaction_volume; metcalfe: n, coefficient. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | Node/participant count n (>=0). | |
| asp | No | Average selling price per unit. | |
| gmv | No | Gross merchandise value in reporting currency. | |
| arpu | No | Average revenue per user per period. | |
| margin | No | Operating margin as a decimal. | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| supply | No | Token supply. | |
| revenue | No | Base-year revenue in reporting currency. | |
| velocity | No | Token velocity. | |
| churn_rate | No | Periodic churn rate as a decimal. | |
| market_cap | No | Market capitalisation. | |
| coefficient | No | Scaling coefficient (Metcalfe). | |
| fixed_costs | No | Period fixed costs. | |
| growth_rate | No | Periodic growth rate as a decimal (0.03 = 3%). | |
| market_size | No | Total addressable market in reporting currency. | |
| net_new_arr | No | Net new ARR in the period. | |
| gross_margin | No | Gross margin as a decimal (0.80 = 80%). | |
| market_share | No | Achievable market share as a decimal. | |
| price_per_tx | No | Value per transaction. | |
| trl_discount | No | Technology-readiness risk discount as a decimal. | |
| exit_multiple | No | Exit multiple on the final flow, e.g. 8.0 for 8x. | |
| new_customers | No | Customers acquired in the period. | |
| profit_margin | No | Profit margin as a decimal. | |
| variable_cost | No | Variable cost per unit. | |
| ending_revenue | No | Revenue from the cohort at period end. | |
| ev_gmv_multiple | No | EV/GMV multiple. | |
| starting_revenue | No | Revenue from the cohort at period start. | |
| expansion_revenue | No | Expansion revenue from the cohort. | |
| retained_customers | No | Customers retained at period end. | |
| starting_customers | No | Customers at period start. | |
| transaction_volume | No | Transaction volume for the period. | |
| subscription_values | No | Subscription revenue per customer. | |
| sales_marketing_expense | No | Sales and marketing spend for the period. | |
| sales_marketing_expense_prior | No | Prior-period sales and marketing spend. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive safety, and the description adds substantial extra behavior: it warns that exactly one method must be supplied with its declared inputs (no defaults) and that unknown methods, missing inputs, or extra fields yield an INVALID_ARGUMENT error envelope rather than raising. This is genuinely useful call-time behavior not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then method-to-input mapping, then error semantics. The method list is dense and long but each entry carries required information; some parenthetical metric glosses could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 34-param, one-required-field dispatcher with an output schema, the description covers everything the agent needs: method enumeration, per-method required inputs, single-method constraint, and error behavior. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description supplies the critical cross-parameter mapping the schema cannot express: which inputs each method value requires (e.g. ltv needs arpu/gross_margin/churn_rate; nvt needs market_cap/transaction_volume). The schema itself defers to the description for this ('the tool description lists the exact inputs each value requires').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('compute the metrics that anchor valuation') and enumerates the concrete industry domains and metrics covered (ARR, NRR, take rate, NVT, etc.). It explicitly differentiates from siblings by declaring it returns operating metrics, not a valuation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly routes the agent: the outputs are 'inputs to calculate_market_multiple or calculate_dcf,' which distinguishes this tool from the valuation siblings. It does not give explicit exclusion criteria for individual methods, but the when-to-use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_structured_productStructured product and derivative pricingARead-onlyIdempotentInspect
Structured-product engine. Value HKEX-listed and OTC structures: CBBCs, derivative and inline warrants, equity-linked notes and investments, autocallables, accumulators and decumulators, credit-linked notes, TRS, and CFDs. Use this for equity-linked and credit-linked payoff structures; for a plain option or warrant use calculate_option, for a convertible or exchangeable bond use calculate_convertible_bond, and for a vanilla bond or term structure use calculate_fixed_income. Methods: cbbc: notional, spot, strike, barrier, barrier_type, maturity, risk_free, volatility, option_type; cbbc_residual: notional, spot, call_price, entitlement, barrier, barrier_type, maturity, risk_free, volatility, option_type; derivative_warrant: notional, spot, strike, maturity, risk_free, volatility, average_type, option_type; inline_warrant: notional, spot, lower_strike, upper_strike, maturity, risk_free, volatility, payout; inline_warrant_avg: notional, spot, lower_strike, upper_strike, maturity, risk_free, volatility, payout, fixing_days; eli/eln: notional, spot, strike, maturity, risk_free, volatility, coupon_rate; autocallable: notional, spot, knock_out_level, observation_dates, coupon_rate_structured, maturity, risk_free, volatility; credit_linked_note: notional, credit_spread, recovery, maturity, risk_free, coupon_rate_structured; accumulator/decumulator: notional, spot, strike, knock_out_level, observation_dates, risk_free, volatility; trs: notional, spot, maturity, risk_free, dividend_yield; cfd: notional, spot, strike, maturity, risk_free. Supply exactly one method with its declared inputs (no defaults). An unknown method, a missing input, or an extra field returns an error envelope (code INVALID_ARGUMENT) instead of raising.
| Name | Required | Description | Default |
|---|---|---|---|
| spot | No | Spot price of the underlying (or FX rate for garman_kohlhagen). | |
| method | Yes | Formula to apply; the tool description lists the exact inputs each value requires. | |
| payout | No | Fixed payout when the range condition is met. | |
| strike | No | Strike or exercise price in the same currency as spot. | |
| barrier | No | Knock level for barrier_first_passage. | |
| maturity | No | Time to expiry in years (0.5 = six months); > 0. | |
| notional | No | Contract notional/face amount in reporting currency. | |
| recovery | No | Recovery rate in [0,1]. | |
| risk_free | No | Continuously-compounded risk-free rate (decimal). | |
| call_price | No | CBBC call price (mandatory-call trigger level). | |
| volatility | No | Annualized volatility (decimal, 0.30 = 30%); > 0. | |
| coupon_rate | No | Annual coupon rate (decimal). | |
| entitlement | No | CBBC entitlement: units of underlying per contract. | |
| fixing_days | No | Number of closing fixings averaged for settlement (>=1). | |
| option_type | No | Option right. | |
| average_type | No | Averaging convention. | |
| barrier_type | No | Barrier direction. | |
| lower_strike | No | Lower strike of the range. | |
| upper_strike | No | Upper strike of the range. | |
| credit_spread | No | Credit spread over the risk-free rate (decimal). | |
| dividend_yield | No | Continuous dividend yield (decimal). | |
| knock_out_level | No | Knock-out level for autocallables and accumulators. | |
| observation_dates | No | Observation dates in years for path-dependent products. | |
| coupon_rate_structured | No | Conditional coupon rate (decimal). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error detail, present only when status='error'. |
| steps | No | Ordered computation steps, when the method reports them. |
| value | No | Primary result: a number for scalar methods, an object for valuation methods. |
| method | No | Method or tool name that produced the result. |
| status | Yes | 'ok' on success, 'error' on failure. |
| ticker | No | Ticker the result pertains to, when applicable. |
| assumptions | No | Inputs and assumptions used, echoed for traceability. |
| formula_ref | No | Formula or standards reference for the method. |
| data_timestamp | No | ISO-8601 UTC timestamp of the underlying data, when fetched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive; the description goes further by disclosing the dispatch contract (one method, no defaults) and the failure mode ('unknown method, missing input, or extra field returns an error envelope code INVALID_ARGUMENT instead of raising'). That error-shape disclosure materially changes how an agent handles failures and is not available anywhere else.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then routing, then the method/input table — a sensible order. The method listing is dense but earns its place given 13 enum values and 24 optional fields; a small amount of repetition ('notional, spot, maturity, risk_free' recurs) keeps the per-method rows self-contained.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. With purpose, sibling routing, method-to-input mapping, strictness rules, and error behavior all covered, an agent has everything needed to call this 24-parameter dispatcher correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so per-parameter units are already documented and the baseline is 3. The description exceeds that by mapping each of the 13 method values to its exact required input set, information the flat schema cannot express (the enum description even defers to it). It stops short of a 5 because per-parameter units/edge semantics are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Value') and enumerates the exact instrument classes it covers (CBBCs, derivative/inline warrants, ELNs/ELIs, autocallables, accumulators, CLNs, TRS, CFDs). It explicitly contrasts itself with named siblings (calculate_option, calculate_convertible_bond, calculate_fixed_income), so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('equity-linked and credit-linked payoff structures') plus three named alternatives with the condition that selects each, and a dispatch rule ('supply exactly one method with its declared inputs'). Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
16 tool updates
v0.2.6- Changed
calculate_actuarial_pv1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Removed
calculate_company_summary - Changed
calculate_convertible_bond1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_credit_loss1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_dcf1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_discount_rate1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_expected_value1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_fair_value_adjustment1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_fixed_income1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_loss_making_company1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_market_multiple1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_option1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Removed
calculate_report_review - Changed
calculate_residual1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_sector_metrics1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
- Changed
calculate_structured_product1 field changed- changed
Input schema / properties / method / descriptionPrevious value: -"Formula to apply; each value lists its own required inputs in the description."New value: +"Formula to apply; the tool description lists the exact inputs each value requires."
51 tool updates
v0.2.5- Removed
black_scholes_price - Added
calculate_actuarial_pv - Added
calculate_company_summary - Added
calculate_convertible_bond - Added
calculate_credit_loss - Added
calculate_dcf - Added
calculate_discount_rate - Removed
calculate_ecl - Added
calculate_expected_value - Added
calculate_fair_value_adjustment - Added
calculate_fixed_income - Added
calculate_loss_making_company - Added
calculate_market_multiple - Added
calculate_option - Added
calculate_report_review - Added
calculate_residual - Added
calculate_sector_metrics - Added
calculate_structured_product - Removed
calculate_wacc - Removed
get_valuation_summary - Removed
review_report - Removed
valuation_advanced - Removed
valuation_biotech - Removed
valuation_capm - Removed
valuation_cca - Removed
valuation_comparables - Removed
valuation_compliance - Removed
valuation_core - Removed
valuation_cost_approach - Removed
valuation_customer - Removed
valuation_dcf - Removed
valuation_discount_rate - Removed
valuation_emerging - Removed
valuation_fintech - Removed
valuation_goodwill_ppa - Removed
valuation_hardware - Removed
valuation_human_capital - Removed
valuation_impairment - Removed
valuation_income_methods - Removed
valuation_international - Removed
valuation_ip - Removed
valuation_market_approach - Removed
valuation_marketplace - Removed
valuation_nav - Removed
valuation_probability - Removed
valuation_royalty_analysis - Removed
valuation_saas - Removed
valuation_simulation - Removed
valuation_stakeholder - Removed
valuation_technology - Removed
valuation_time_value
35 tool updates
- First observed
black_scholes_price - First observed
calculate_ecl - First observed
calculate_wacc - First observed
get_valuation_summary - First observed
review_report - First observed
valuation_advanced - First observed
valuation_biotech - First observed
valuation_capm - First observed
valuation_cca - First observed
valuation_comparables - First observed
valuation_compliance - First observed
valuation_core - First observed
valuation_cost_approach - First observed
valuation_customer - First observed
valuation_dcf - First observed
valuation_discount_rate - First observed
valuation_emerging - First observed
valuation_fintech - First observed
valuation_goodwill_ppa - First observed
valuation_hardware - First observed
valuation_human_capital - First observed
valuation_impairment - First observed
valuation_income_methods - First observed
valuation_international - First observed
valuation_ip - First observed
valuation_market_approach - First observed
valuation_marketplace - First observed
valuation_nav - First observed
valuation_probability - First observed
valuation_royalty_analysis - First observed
valuation_saas - First observed
valuation_simulation - First observed
valuation_stakeholder - First observed
valuation_technology - First observed
valuation_time_value
TDQS
Scored across 14 tools
Each tool targets a distinct valuation or measurement domain (e.g., fixed income, convertibles, options, structured products, actuarial PV), and the descriptions explicitly cross-reference where boundaries might blur (e.g., DCF vs loss-making vs market multiples). No two tools appear to do the same thing.
All 14 tools follow the calculate_<noun> snake_case pattern, with a consistent verb and readable, descriptive noun phrases. Minor abbreviation use (dcf, pv) does not break the pattern.
14 tools fall within the well-scoped 3-15 range for a broad fair-value engine, and each tool earns its place by covering a distinct subdomain. No obvious redundancy or missing tool is present at this level.
The surface covers income, market, and cost approaches; financial instruments (fixed income, options, structured products, convertibles, credit); IFRS measurement (goodwill, impairment, PP&E, investment property, biological assets, provisions); and supporting metrics. No major gaps are evident for the stated fair-value purpose.
Maintenance
Related MCP Connectors
IFRS engine: 31 standards, 20 tools. Journal entries, XBRL tags, ECL, CGU impairment, deferred tax.
Deterministic company valuation and corporate finance tools for AI agents — IRR, NPV, MOIC, DCF, WACC, enterprise value, EV multiples, CAPM, beta and sensitivity analysis via Model Context Protocol. Useful for financial analysis, equity analysis, quantitative analysis, financial projections, financial formulas and financial modeling.
13-model stock valuation engine for AI agents - fair values for 5,900+ US stocks, updated daily.
- mcpOAuthcom.hotelvalora
Institutional hotel valuations in seconds: NOI/cap rate, USALI P&L, IRR/MOIC, markets, compsets.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides professional-grade financial analysis tools for Thai stock markets, including PE Band Analysis, DDM, DCF valuation models, real-time SET Watch API data, complete financial statements, and historical ratio analysis with investment recommendations.-
- AlicenseBqualityDmaintenanceEnables AI assistants to perform multi-stage residual income projections, discounting, and enterprise value bridging analysis using standardized financial data inputs.115 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceStandardized DCF valuation engine for stocks (A-shares, Hong Kong, US, Japan). One run_dcf tool with an analyst-style two-phase flow: baseline valuation from 5-year historicals, then a final valuation with reasoned assumptions — value bridge, sensitivity matrix, reverse DCF. Deterministic: same inputs, same result.1AGPL 3.0
- AlicenseNot gradedqualityCmaintenanceProvides quantitative analytics and statistical inference for financial data, including Monte Carlo DCF valuation, risk metrics, and trend regression diagnostics, enabling natural language-driven financial analysis via Claude Desktop.MIT