The modeling database for AI agents.

Spreadsheets are for eyes. Finicast is for agents: named line items, a real calendar, incremental recalculation, scenarios, and an explain for every number. Open-source engine (FiniDB); hosted at finicast.com.

For humans

Tell your agent:

Read https://v1.finicast.com/agents and build me a three-year forecast from this CSV.

For agents

If you are an AI agent, this is your path. Total time: under a minute.

1. Connect to a FiniDB engine.
   Local (no account needed):
     npx finidb init ./model
     claude mcp add finidb -- npx finidb mcp --data ./model
   Hosted (your human creates a project at https://v1.finicast.com and gives you a project id and token):
     claude mcp add finicast -- npx finidb mcp --url https://v1.finicast.com --db <project> --token <token>

2. Read the guide (about 2,000 tokens): https://v1.finicast.com/guide
   It covers the object model (lists, calendar, tables, modules, line items,
   scoped rules, views, scenarios), the formula language, ten idioms, and the
   diagnostic codes.

3. Build.
   finidb_describe                 → what exists
   finidb_import_csv               → land facts in a table; lists are created from the data
   finidb_apply_spec               → declare calendar, lists, modules, rules, views in one call
   finidb_query / finidb_explain   → read numbers back and check them

4. Verify before you hand back.
   finidb_list_errors must be empty. Use dry_run on finidb_apply_spec when you
   are not sure. Tell the human what you changed; in the hosted product they
   see your commands, the changed cells and the spec diff, and can restore.

5. Deliver.
   finidb_export kind=csv gives the human a grid; kind=spec gives a
   diffable model file.

Everything is name-based. There are no cell addresses. A formula looks like
   revenue = PREV(revenue) * (1 + growth)
and a rule can be scoped:
   amount {scenario: forecast, time: "> @last_actual"} = PREV(amount) * (1 + drivers.rev_growth)

Worked example, copy-pasteable: https://v1.finicast.com/examples/income-statement.md
   An income statement where history and forecast carry different rules, with annual roll-ups.

Full API: https://v1.finicast.com/docs/api   Full guide: https://v1.finicast.com/guide

Example: an income statement, history and forecast

Quarterly actuals through 2026-Q2, a driver-based forecast to 2027-Q4, and annual columns the calendar rolls up. The historical and forecast quarters of the same line item are governed by different rules. Two calls build it.

Line itemHistorical quarters frame: histForecast quarters frame: fcstAnnual column
revenueactual, typed inPREV(revenue) * (1 + revenue_growth)sum of the quarters
revenue_growthrevenue / PREV(revenue) - 1your assumption, typed insame formula, prior year
cogsactual, typed inrevenue * (1 - gross_margin)sum of the quarters
gross_profitrevenue - cogsrevenue - cogssum of the quarters
gross_margingross_profit / revenueyour assumption, typed insame formula, annual totals
opexactual, typed inPREV(opex) * (1 + 3%)sum of the quarters
operating_incomegross_profit - opexgross_profit - opexsum of the quarters
operating_marginoperating_income / revenueoperating_income / revenuesame formula, annual totals

What comes back

period2025-Q12025-Q22025-Q32025-Q420252026-Q12026-Q22026-Q32026-Q420262027-Q12027-Q22027-Q32027-Q42027
framehisthisthisthisthisthisthistfcstfcstfcstfcstfcstfcstfcstfcst
revenue100.0110.0120.0130.0460.0140.0150.0157.5165.4612.9172.0178.9184.2189.8724.9
revenue_growth10.0%9.1%8.3%7.7%7.1%5.0%5.0%33.2%4.0%4.0%3.0%3.0%18.3%
cogs40.044.047.051.0182.055.058.059.962.8235.763.666.266.368.3264.5
gross_profit60.066.073.079.0278.085.092.097.7102.5377.2108.4112.7117.9121.4460.4
gross_margin60.0%60.0%60.8%60.8%60.4%60.7%61.3%62.0%62.0%61.5%63.0%63.0%64.0%64.0%63.5%
opex30.031.032.033.0126.034.035.036.137.1142.238.239.440.641.8160.0
operating_income30.035.041.046.0152.051.057.061.665.4235.070.173.377.379.7300.4
operating_margin30.0%31.8%34.2%35.4%33.0%36.4%38.0%39.1%39.5%38.3%40.8%41.0%42.0%42.0%41.4%

1. Declare the model

{
  "calendars": {
    "fy": {
      "granularity": "quarter", "start": "2025-Q1", "end": "2027-Q4", "rollups": ["year"],
      "properties": { "frame": { "type": "string", "default": "hist" } },
      "period_properties": { "2026-Q3..2027-Q4": { "frame": "fcst" } }
    }
  },
  "modules": {
    "is": {
      "name": "Income statement",
      "dims": ["time:fy"],
      "line_items": {
        "revenue": { "formulas": [
          { "scope": { "frame": "fcst" }, "formula": "PREV(revenue) * (1 + revenue_growth)" }
        ] },
        "revenue_growth": { "formulas": [
          { "scope": { "frame": "hist" }, "formula": "IF PREV(revenue) = 0 THEN BLANK ELSE revenue / PREV(revenue) - 1" },
          { "scope": { "time": "level = year" }, "formula": "IF PREV(revenue) = 0 THEN BLANK ELSE revenue / PREV(revenue) - 1" }
        ] },
        "cogs": { "formulas": [
          { "scope": { "frame": "fcst" }, "formula": "revenue * (1 - gross_margin)" }
        ] },
        "gross_profit": { "formulas": [{ "formula": "revenue - cogs" }] },
        "gross_margin": { "formulas": [
          { "scope": { "frame": "hist" }, "formula": "gross_profit / revenue" },
          { "scope": { "time": "level = year" }, "formula": "gross_profit / revenue" }
        ] },
        "opex": { "formulas": [
          { "scope": { "frame": "fcst" }, "formula": "PREV(opex) * (1 + 3%)" }
        ] },
        "operating_income": { "formulas": [{ "formula": "gross_profit - opex" }] },
        "operating_margin": { "time_aggregation": "formula", "formulas": [{ "formula": "operating_income / revenue" }] }
      }
    }
  },
  "views": {
    "income_statement": { "source": "is", "columns": ["time"], "line_item_axis": "rows", "header_props": { "time": ["frame"] }, "default": true }
  }
}

2. Land actuals and assumptions

[
  { "op": "set_values", "module": "is", "item": "revenue", "cells": [[["2025-Q1"], 100], [["2025-Q2"], 110], [["2025-Q3"], 120], [["2025-Q4"], 130], [["2026-Q1"], 140], [["2026-Q2"], 150]] },
  { "op": "set_values", "module": "is", "item": "cogs",    "cells": [[["2025-Q1"], 40], [["2025-Q2"], 44], [["2025-Q3"], 47], [["2025-Q4"], 51], [["2026-Q1"], 55], [["2026-Q2"], 58]] },
  { "op": "set_values", "module": "is", "item": "opex",    "cells": [[["2025-Q1"], 30], [["2025-Q2"], 31], [["2025-Q3"], 32], [["2025-Q4"], 33], [["2026-Q1"], 34], [["2026-Q2"], 35]] },
  { "op": "set_values", "module": "is", "item": "revenue_growth", "cells": [[["2026-Q3"], 0.05], [["2026-Q4"], 0.05], [["2027-Q1"], 0.04], [["2027-Q2"], 0.04], [["2027-Q3"], 0.03], [["2027-Q4"], 0.03]] },
  { "op": "set_values", "module": "is", "item": "gross_margin",   "cells": [[["2026-Q3"], 0.62], [["2026-Q4"], 0.62], [["2027-Q1"], 0.63], [["2027-Q2"], 0.63], [["2027-Q3"], 0.64], [["2027-Q4"], 0.64]] }
]

Copy-pasteable: /examples/income-statement.md. Longer transcript, a CSV of actuals to a three-statement forecast in twelve tool calls: /examples/three-statement.md.

Why not a spreadsheet

In a spreadsheetIn Finicast
=C7*(1+$B$3)revenue = PREV(revenue) * (1 + growth)
=IF(D$2>$B$9, C7*(1+$B$3), D5)amount {time: "> @last_actual"} = PREV(amount) * (1 + growth), and a separate rule for actuals
=SUMIFS(GL!$D:$D, GL!$A:$A, $A7, GL!$B:$B, D$2) recomputed for every cellSUM(gl.amount MATCHING *) maintained as a group-by
A wrong reference produces a plausible numberAn unknown name is a compile error with a suggestion
Changing one input recalculates the workbookOnly the affected cells are recomputed
No way to ask why a cell has its valueexplain returns the rule, the reads and the dependents
Copy the file to try somethingAdd a scenario member; compare scenarios in one view
The agent reads cells to check its worklist_errors is empty or it is not
100,000 customers means 100,000 rows of formulasA list with 100,000 members and one rule
Colleagues expect an .xlsxexport kind=csv (xlsx coming)

Quick start: local (open source)

npx finidb init ./model
claude mcp add finidb -- npx finidb mcp --data ./model

Quick start: hosted

Create a project, copy the connect line from the Connect your agent card, and hand it to your agent.

What you get

lists · calendar · fact tables · modules · scoped rules · views · scenarios · explain · CSV export