Skip to main content
Glama
harshith-vaddiparthy

financial-modeling-harness

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.

Synthetic SaaS forecast with scenario comparison and cash curves

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.json

The 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-harness

Check 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

skills/financial-modeling-harness/SKILL.md

Domain

domain/brief.md, rules, output contract

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 vendor/

Workflow

workflows/primary.md

Evaluation

tests/, evals/cases.jsonl, rubric

Operations

runbook, verification evidence

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.py

CI 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 tools
finance_doctorA
Read-only

Check local readiness; no model API or external finance account is needed

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines3/5

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_summaryB
Read-only

Read saved scenario summaries after verifying the run

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesFull model object in the documented input contract
scenarioNoall

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_sensitivityC
Read-only

Recalculate the full model for up to 20 driver values

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesFull model object in the documented input contract
driverYes
valuesYes
scenarioNobase

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_validateB
Read-only

Validate inputs, opening balance and provenance. Missing inputs remain errors

ParametersJSON Schema
NameRequiredDescriptionDefault
modelYesFull model object in the documented input contract

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_verifyC
Read-only

Verify artifact hashes, seven accounting identities and deterministic replay

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 6 tool updatesv1.0.0
    • First observedfinance_doctor
    • First observedfinance_get_summary
    • First observedfinance_run
    • First observedfinance_sensitivity
    • First observedfinance_validate
    • First observedfinance_verify

TDQS

B3.4/5.0

Scored across 6 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 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
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables financial modeling for SaaS and other assets via MCP tools, including simulation, scenario comparison, sensitivity analysis, semantic knowledge search, and persistent context memory.
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables 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.
    20
    25 npm
    Apache 2.0
  • F
    license
    A
    quality
    C
    maintenance
    Provides AI agents with deterministic, offline finance tools for commodity margin analysis, loan covenant compliance, invoice auditing, AP exception classification, and five-day close readiness.
    14
    2 npm
    -