financial-modeling-harness
Connects a Hermes agent to the Financial Modeling Harness through a discoverable skill and stdio MCP tools, enabling financial model validation, scenario runs, verification, summaries, and sensitivity analysis via the finance_doctor, finance_validate, finance_run, finance_verify, finance_get_summary, and finance_sensitivity tools.
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., "@financial-modeling-harnessBuild a 36-month SaaS model, validate inputs, and run all scenarios."
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.
Financial Modeling Harness
A runnable financial modeling specialization of Vertical Harness, combining the startup-planning concepts in wshobson's startup-financial-modeling and the integrated-statement concepts in Claude Office Skills financial-modeling.
Hermes supplies the reasoning and conversation. This repository supplies a deterministic financial engine, validated inputs, scoped tools, domain rules, private run evidence and a reusable specialist skill. It runs locally without model API credentials and connects to Hermes through its native skills and stdio MCP support.

Original synthetic example, inspected on desktop and mobile. No company financials are included.
Start with a working model
Python 3.10+ is the only core dependency. No package installation or cloud account is required.
git clone https://github.com/harshith-vaddiparthy/Financial-Modeling-Harness.git
cd Financial-Modeling-Harness
python3 -m harness doctor
python3 -m harness run examples/saas.jsonThe command returns a run ID, report path and summaries. Open the returned report.html in your browser. The report works offline and shows all three cash curves, a scenario selector, annual results, monthly statements, active drivers and input provenance. On macOS, double-click Open Financial Model.command to generate, verify and open the synthetic demonstration.
python3 -m harness verify RUN_ID
python3 -m harness init --model corporate --output workspace/my-company.json
python3 -m harness validate workspace/my-company.json
python3 -m harness run workspace/my-company.json --scenario all
python3 -m harness sensitivity examples/saas.json \
--driver monthly_churn --values '[0.01, 0.02, 0.03]'init creates a synthetic starter and refuses to overwrite existing files. Replace its inputs and sources for a real company. Read the input contract before converting company data. Choose saas, corporate, marketplace, ecommerce or services; all five original examples are included.
Related MCP server: asset-finance-modeler
What the engine implements
Up to 60 monthly periods, with calendar-year summaries that sum flows and retain ending balances.
SaaS cohort retention, expansion, MRR/ARR, fully loaded CAC, simple LTV, payback, NRR and burn multiple.
Corporate revenue growth, marketplace GMV/take rate, ecommerce traffic/conversion/AOV, and services capacity/utilization.
Hiring by role, department and employment dates, salary growth, and loaded compensation.
Linked income statement, balance sheet and cash flow, with receivables, inventory, payables, PP&E and average-debt interest.
Explicit equity raises, simple priced-round dilution, debt issuance/repayment and dividends.
Conservative/base/optimistic scenarios and full-model sensitivity recalculation.
Strict missing-input and provenance validation. An unbalanced opening balance sheet fails the run.
Seven independently reviewed accounting identities each month. Negative cash remains visible and creates a funding-gap warning.
JSON, monthly/annual/cohort CSV, Markdown and a portable interactive HTML report. CSVs are spreadsheet-compatible snapshots; this version does not author an editable Excel workbook.
The core has no external finance accounts, bank connections, market-data API, automatic funding plug, or money-transfer tool. General tax, annual-contract deferred revenue, SAFEs, options, complex capital structures, multicurrency, and inventory purchasing schedules require domain extensions. The accounting rules define the simplifications.
Connect your Hermes agent
Read Hermes integration. The repository includes a discoverable skill and six MCP tools:
finance_doctor, finance_validate, finance_run, finance_verify, finance_get_summary, finance_sensitivity.
python3 scripts/install_skill.py --target hermes
hermes mcp add financial-modeling-harness \
--command /absolute/path/Financial-Modeling-Harness/scripts/mcp-server.sh
hermes mcp test financial-modeling-harnessCheck hermes mcp add --help for the flags supported by your Hermes version. The helper launcher changes into this checkout, so MCP works regardless of the agent's current directory. Set FINANCIAL_HARNESS_WORKSPACE to a private workspace path for that server. Registration adds this server only; it does not select a provider or change model credentials.
Use this request in a new Hermes session:
Use financial-modeling-harness to build a 36-month SaaS plan for my company. First identify the missing opening balances and forecast drivers. Separate actuals from assumptions. Run conservative, base and optimistic scenarios, verify the run, and show cash-breach timing, funding need, hiring costs, unit economics and the report path. Use the saved model for a churn sensitivity analysis.
For a quick demonstration, replace “my company” with “the repository's synthetic SaaS example.” Shell access also works through python3 -m harness; MCP is optional for standalone use.
Harness map
Layer | Implementation |
Specialist skill | |
Domain | |
Models | Reasoning stays in the caller's existing agent; calculations use harness/engine.py |
Tools and access | CLI, stdio MCP, validated model objects, bounded horizon, private workspace |
Context | Company inputs with per-input sources; upstream guidance pinned in |
Workflow | |
Evaluation | |
Operations |
This uses the same independent-repository pattern as 3D Printing Harness and Android TV Harness. The parent template links back to this specialization under its examples directory.
Evidence and integrity
Each workspace/runs/RUN_ID/ contains input.json, results.json, reports/CSVs and manifest.json. The manifest binds the input, engine source and output artifact hashes. verify checks file hashes, recalculates the financial model and reviews the statement identities. These are local integrity checks, not signatures or evidence of external approval. Workspace files are excluded from Git and created with restricted permissions. Abandoned incomplete directories have no completed manifest and cannot pass verification.
python3 -m unittest discover -s tests -v
python3 scripts/check_bundle.pyCI runs the same tests on Python 3.10, 3.12 and 3.13. Fresh integration results belong in operations/verification.md.
Source and license
Original harness code and examples: MIT. Upstream skills are retained unchanged at pinned commits, with their own MIT licenses and checksums. See THIRD_PARTY_NOTICES.md and vendor/sources.lock.json. Their suggested providers, tools, ratios and example numbers are reference material, not installed services, mandatory benchmarks or company actuals.
Available Tools
6 toolsfinance_doctorARead-only
Check local readiness; no model API or external finance account is needed
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond those fields: it requires no model API call and no external finance account, meaning no auth or network dependency. It stops short of describing what the readiness report contains.
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?
A single tight sentence with the operational constraint front-loaded after the action; no filler. It is arguably too terse for the ambiguity it leaves, but as conciseness it is efficient.
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 zero-parameter, read-only diagnostic with no output schema, the description should say what a result looks like (pass/fail report, which checks are run). It states the input-side guarantees but leaves the output entirely unexplained, so an agent cannot anticipate what it receives.
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?
The tool takes zero parameters, which is the baseline-4 case. Nothing in the schema needs compensating for, and additionalProperties=false confirms the empty contract matches the description's implication of a self-contained local check.
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 verb+resource is 'check local readiness', which names the act but leaves the object of the check ambiguous (dependencies? config? credentials?). It is distinguishable from siblings like finance_run and finance_validate in the sense that it is a diagnostic, but the description never states that explicitly.
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?
'No model API or external finance account is needed' implies the condition under which this tool is usable (offline/unconfigured environments), which is real usage signal. However, it never names an alternative or states when to prefer this over finance_validate or finance_verify, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finance_get_summaryBRead-only
Read saved scenario summaries after verifying the run
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds the sequencing precondition but says nothing about what happens if the run was not verified, whether summaries are cached/persisted, or permissions required.
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?
A single short clause with the verb and resource front-loaded and no redundant phrasing. It is arguably too terse given the undocumented parameter, but nothing in it is wasted.
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?
With one required param, no output schema, and 0% schema coverage, an agent still cannot tell what run_id should be or what a 'scenario summary' contains. The read-only tool needs little safety context, but key invocation and return information 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?
There is exactly one required parameter and schema description coverage is 0%, so the description carries the burden. 'the run' only loosely suggests run_id ties to a prior run/verify cycle; it never states the expected id format, where it comes from, or that it is required.
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 pairs the verb 'Read' with a specific resource, 'saved scenario summaries', and adds a scoping condition ('after verifying the run'), so it is not a tautology of the tool name. It does not name any sibling, but the resource itself separates it from finance_run/finance_validate/finance_verify.
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?
The phrase 'after verifying the run' gives an explicit precondition that implies finance_verify must precede this call, which is genuine when-to-use guidance. It stops short of stating exclusions or naming the alternative tools, so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finance_runA
Calculate linked monthly statements and named scenarios; save a private immutable run
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Full model object in the documented input contract | |
| scenario | No | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, openWorld=false. The description adds meaningful behavior beyond them: the tool persists a run that is 'private' and 'immutable', which tells the agent an artifact is created and not overwritten. It still omits idempotency, permissions, and cost/runtime characteristics.
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?
A single, front-loaded sentence split by a semicolon into compute and persist clauses. No filler, though the second clause is terse enough that it could be slightly clearer about what is saved.
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?
With no output schema, a nested required object parameter, and a 50%-covered schema, the description leaves gaps: it never explains what a run returns (run id? summary?) or where the 'documented input contract' lives. Adequate but incomplete for a compute-and-persist tool of this shape.
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 50%, so the description should compensate more than it does. It loosely maps 'named scenarios' to the scenario enum and 'linked monthly statements' to the model, but the required nested 'model' object is only deferred to an unspecified 'documented input contract' that is not provided here.
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 uses a specific verb ('Calculate') with concrete resources ('linked monthly statements', 'named scenarios') plus a stated side effect ('save a private immutable run'). An agent can tell this is the compute/execute step, distinct from finance_validate or finance_verify, though no sibling is named explicitly.
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?
Usage is only implied: 'run' and 'calculate' versus siblings named validate/verify/sensitivity/get_summary lets an agent infer this is the execution step, but no explicit when-to-use, ordering, or prerequisite (e.g., must validate first) is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finance_sensitivityCRead-only
Recalculate the full model for up to 20 driver values
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Full model object in the documented input contract | |
| driver | Yes | ||
| values | Yes | ||
| scenario | No | base |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds only the 'up to 20 driver values' bound, which the schema already enforces via maxItems, and says nothing about cost, determinism, or whether results are persisted or returned ephemerally.
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?
A single front-loaded sentence with no filler; the constraint is placed immediately after the action. It is efficient, though the brevity is partly under-specification rather than disciplined concision.
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?
With four parameters, a nested model object, no output schema, and annotations covering only safety, the description should say what a caller gets back and whether the recalculation mutates or merely evaluates. Neither the return shape nor the relationship to finance_run is addressed.
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 only 25%, and the description clarifies only 'driver'/'values' loosely while restating the maxItems=20 cap already in the schema. The required nested 'model' object and the 'scenario' enum (base/conservative/optimistic) are never mentioned, leaving half the contract unexplained.
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 ('Recalculate') and resource ('the full model') scoped to driver values, which conveys a sensitivity sweep across up to 20 inputs. It does not, however, distinguish itself from siblings like finance_run or finance_validate, which sound plausibly similar from the outside.
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?
No when-to-use guidance and no routing versus finance_run, finance_validate, or finance_verify. An agent cannot tell from the text whether this is a pre-run check, the primary execution path, or a post-run analysis step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finance_validateBRead-only
Validate inputs, opening balance and provenance. Missing inputs remain errors
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | Full model object in the documented input contract |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context — that it checks opening balance and provenance, and that it does not silently patch missing inputs ('Missing inputs remain errors') — but it says nothing about how failures are surfaced or whether validation halts a pipeline.
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?
Two short sentences, front-loaded with the action, with no filler. The second sentence is slightly oblique in phrasing ('Missing inputs remain errors') but still earns its place by conveying non-repair behavior.
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 one-parameter validation tool whose annotations cover safety and whose only param is fully documented in the schema, the description covers the essentials. The remaining gap is that, with no output schema, it never indicates what a successful or failed validation returns.
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?
There is a single parameter with 100% schema description coverage ('Full model object in the documented input contract'), so the schema carries the load. The description adds only marginal meaning by naming which aspects of that model are inspected (inputs, opening balance, provenance). Baseline 3 is appropriate.
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 ('Validate') and names the concrete things checked: inputs, opening balance, and provenance. It is clear on its own, but it gives no signal distinguishing it from the semantically adjacent sibling finance_verify (or finance_doctor), so an agent cannot route between them from the description alone.
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?
There is no guidance on when to call this rather than finance_verify, finance_doctor, or finance_run, and no stated prerequisites or calling order. 'Missing inputs remain errors' hints at a pre-run check but never frames the usage condition explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finance_verifyCRead-only
Verify artifact hashes, seven accounting identities and deterministic replay
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description usefully adds what the verification covers (hashes, seven accounting identities, replay), but says nothing about what a failure looks like, whether verification is exhaustive or short-circuits, or how long it may take.
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?
A single compact sentence with the core action and scope front-loaded and no filler. It is efficient, though arguably under-specified rather than ruthlessly concise.
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 verification tool the interpretation of results matters most, yet with no output schema and no annotation or description coverage of return values, an agent cannot tell what a passing or failing verification looks like. The undocumented run_id compounds the gap.
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 0% and the lone required run_id parameter is undocumented in both schema and description. The description never mentions run_id, its format, or where an agent should obtain one, so the description does not compensate for the coverage gap.
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 ("Verify") and enumerates the verified resources: artifact hashes, seven accounting identities, deterministic replay. This is far more concrete than a tautology. It does not, however, distinguish itself from the sibling finance_validate, which an agent will reasonably read as an alternative way to check the same output.
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?
No when-to-use guidance, no prerequisites, and no mention of when to prefer finance_validate or finance_doctor instead. With a near-identically named sibling, the absence of routing guidance is a real selection hazard.
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.
6 tool updates
v1.0.0- First observed
finance_doctor - First observed
finance_get_summary - First observed
finance_run - First observed
finance_sensitivity - First observed
finance_validate - First observed
finance_verify
TDQS
Scored across 6 tools
Each tool maps to a distinct stage of the modeling lifecycle (readiness, validation, run, verification, sensitivity sweep, summary read). The only mild overlaps are doctor vs. validate (both 'checks') and run vs. sensitivity (sensitivity recalculates the model), but the descriptions clearly separate environment readiness from input validation and single-run from driver sweeps.
All tools share a `finance_` namespace prefix and use short, readable verb-style suffixes (doctor, validate, run, verify, sensitivity). The only deviation is `finance_get_summary`, which switches to a verb_noun form while others use a bare verb or noun.
Six tools is well within the sweet spot and each one corresponds to a meaningful, non-redundant step in the workflow. There are no filler or trivially thin tools.
The surface covers the full lifecycle: readiness check, input validation, model execution, artifact verification, sensitivity analysis, and summary retrieval. Minor gaps exist around managing saved runs (listing or deleting prior immutable runs) and exporting results, but core workflows are covered.
Maintenance
Related MCP Connectors
Structured financial modeling for AI agents: build, version, audit models, export to Excel.
Deterministic finance tools for AI agents — IRR, NPV, MOIC, DCF, WACC and sensitivity.
Deterministic what-if & scenario simulation for AI agents: projections, sensitivity & break-even.
315 finance tools, 35 prompts: quant, SEC and EU filings, fact checks, rates, odds, DeFi, macro.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides startup verification tools including domain/package/org availability checks, unit economics, runway, market size, and cap table calculations with transparent formulas and warnings to prevent common agent errors.MIT
- AlicenseNot gradedqualityCmaintenanceEnables financial modeling for SaaS and other assets via MCP tools, including simulation, scenario comparison, sensitivity analysis, semantic knowledge search, and persistent context memory.MIT

ideaudit-toolsofficial
AlicenseBqualityCmaintenanceEnables local deterministic scoring for startup audits with twenty pure-function tools, allowing GO/KILL verdicts, composite scores, market, money, and signal calculations without accounts, network, or model calls.2025 npmApache 2.0- FlicenseAqualityCmaintenanceProvides AI agents with deterministic, offline finance tools for commodity margin analysis, loan covenant compliance, invoice auditing, AP exception classification, and five-day close readiness.142 npm-