Skip to main content
Glama

Senaro Personal Finance

Cash Runway Calculator

calculate_runway
Read-onlyIdempotent

Calculation, not advice. Verify with a professional before acting. Deterministic cash-runway calculator. Given your liquid savings, monthly essential expenses, optional ongoing inflows (partner income, side income, severance paid as a monthly stream, unemployment benefits), and an optional expense-inflation rate, computes how many months the fund lasts before it hits zero, plus a month-by-month drawdown schedule.

Single scenario per call: to compare 'status quo' vs 'cutbacks' vs 'cutbacks + unemployment', call once per scenario with the matching expenses and inflows.

When inflows meet or exceed expenses (and expenses are not inflating), the fund does not draw down and a self-describing does-not-deplete outcome is returned instead of a month.

Yield on the fund is treated as 0% in v1 (conservative). All assumptions cite their source.

Pick this to project how many months current savings will last against expenses and inflows; pick calculate_emergency_fund when the question is the fund's target size, not how long it lasts.

HEAVY tool: use output='summary' (default) for the headline or output='inline' for the full schedule.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
outputNoValid values: 'summary' (default), 'inline'. 'summary' returns headline scalars (depletion month or does-not-deplete) and citations with the schedule stripped. 'inline' returns the full payload including the month-by-month schedule[] for chart rendering.
chart_titleNoReserved for the chart pipeline; validated but not yet used. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.
current_savingsYesLiquid fund available to draw down. Decimal from 0 to 1,000,000,000; 0 is valid (an already-empty fund). REQUIRED, no default.
monthly_inflowsNoOngoing monthly income that continues during the drawdown (partner income, side income, unemployment benefit, severance paid monthly), modeled as a flat monthly stream; a one-time severance lump and time-limited benefits are not modeled in v1. Decimal from 0 to 1,000,000,000. Optional; defaults to 0 when omitted.
use_essential_expensesNoExpense basis: true means essential-only spending (survival runway), false means total spending (current-pace runway). Labels the reported expense_basis. Optional; defaults to true when omitted.
annual_inflation_rate_pctNoAnnual expense-inflation rate as a percentage. When greater than 0, expenses grow each month by the monthly equivalent of this annual rate; when 0, expenses are constant. Decimal, at least 0 and less than 100. Optional; defaults to 0 when omitted.
monthly_essential_expensesYesMonthly outflow at the chosen expense basis. Decimal, greater than 0 and at most 1,000,000,000. REQUIRED, no default.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / properties / chart_title / maxLength
      Added value: +120
    • changedInput schema / properties / output / enum
      Previous value: -[
      -  "summary",
      -  "inline"
      -]New value: +[
      +  "summary",
      +  "inline",
      +  null
      +]
    • changedInput schema / properties / output / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
  2. Changed4 schema fields changed
    • removedInput schema / properties / output / default
      Removed value: -null
    • changedInput schema / properties / output / description
      Previous value: -"'summary' (default), 'inline', or 'capture'. 'summary' returns headline scalars (depletion month or does-not-deplete) and citations with the schedule stripped. 'inline' returns the full payload including the month-by-month schedule[] for chart rendering. 'capture' writes the full payload to ~/.senaro/captures/ and returns capture_ref; available on the local stdio transport only, since the hosted HTTP transport rejects 'capture' and names 'summary' and 'inline' as the valid alternatives."New value: +"Valid values: 'summary' (default), 'inline'. 'summary' returns headline scalars (depletion month or does-not-deplete) and citations with the schedule stripped. 'inline' returns the full payload including the month-by-month schedule[] for chart rendering."
    • addedInput schema / properties / output / enum
      Added value: +[
      +  "summary",
      +  "inline"
      +]
    • changedInput schema / properties / output / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
  3. Changed9 schema fields changed
    • addedInput schema / properties / annual_inflation_rate_pct
      Added value: +{
      +  "default": null,
      +  "description": "Annual expense-inflation rate as a percentage. When greater than 0, expenses grow each month by the monthly equivalent of this annual rate; when 0, expenses are constant. Decimal, at least 0 and less than 100. Optional; defaults to 0 when omitted.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / chart_title
      Added value: +{
      +  "default": null,
      +  "description": "Reserved for the chart pipeline; validated but not yet used. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / current_savings
      Added value: +{
      +  "description": "Liquid fund available to draw down. Decimal from 0 to 1,000,000,000; 0 is valid (an already-empty fund). REQUIRED, no default.",
      +  "type": "number"
      +}
    • addedInput schema / properties / monthly_essential_expenses
      Added value: +{
      +  "description": "Monthly outflow at the chosen expense basis. Decimal, greater than 0 and at most 1,000,000,000. REQUIRED, no default.",
      +  "type": "number"
      +}
    • addedInput schema / properties / monthly_inflows
      Added value: +{
      +  "default": null,
      +  "description": "Ongoing monthly income that continues during the drawdown (partner income, side income, unemployment benefit, severance paid monthly), modeled as a flat monthly stream; a one-time severance lump and time-limited benefits are not modeled in v1. Decimal from 0 to 1,000,000,000. Optional; defaults to 0 when omitted.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / output
      Added value: +{
      +  "default": null,
      +  "description": "'summary' (default), 'inline', or 'capture'. 'summary' returns headline scalars (depletion month or does-not-deplete) and citations with the schedule stripped. 'inline' returns the full payload including the month-by-month schedule[] for chart rendering. 'capture' writes the full payload to ~/.senaro/captures/ and returns capture_ref; available on the local stdio transport only, since the hosted HTTP transport rejects 'capture' and names 'summary' and 'inline' as the valid alternatives.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • removedInput schema / properties / toolArguments
      Removed value: -{
      -  "description": "JSON object with parameters:\n\nREQUIRED:\n  current_savings: decimal >= 0. Liquid fund available to draw down. 0 is valid (already-empty fund).\n  monthly_essential_expenses: decimal > 0. Monthly outflow at the chosen expense basis.\n\nOPTIONAL:\n  monthly_inflows: decimal >= 0 (default 0). Ongoing monthly income that continues during the\n    drawdown (partner income, side income, unemployment benefit, severance paid monthly). Modeled\n    as a flat monthly stream; a one-time severance lump and time-limited benefits are not modeled in v1.\n  annual_inflation_rate_pct: decimal [0, 100) (default 0). When > 0, expenses grow each month by the\n    monthly-equivalent of this annual rate. When 0, expenses are constant.\n  use_essential_expenses: bool (default true). true = essential-only basis (survival runway);\n    false = total-spend basis (current-pace runway). Labels the reported expense_basis.\n  chart_title: string (optional). Reserved for the chart pipeline. Must not contain em-dashes or en-dashes. Max 120 characters.\n\nENVELOPE:\n  output: 'summary' (default) | 'inline' | 'capture'\n  summary: headline scalars (depletion month / does-not-deplete) + citations; the schedule is stripped.\n  inline: full payload including the month-by-month schedule[] (for chart rendering).\n  capture: full payload written to ~/.senaro/captures/; capture_ref URI returned.\n    Available on the local stdio transport only; the hosted HTTP transport rejects 'capture'\n    with a structured error naming 'summary' and 'inline' as the valid alternatives."
      -}
    • addedInput schema / properties / use_essential_expenses
      Added value: +{
      +  "default": null,
      +  "description": "Expense basis: true means essential-only spending (survival runway), false means total spending (current-pace runway). Labels the reported expense_basis. Optional; defaults to true when omitted.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • changedInput schema / required
      Previous value: -[
      -  "toolArguments"
      -]New value: +[
      +  "current_savings",
      +  "monthly_essential_expenses"
      +]
  4. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description adds meaningful behavioral context: 'Calculation, not advice', 0% yield assumption in v1, the does-not-deplete edge case, and the HEAVY-tool output-mode behavior. These details go well beyond what the structured annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but every section earns its place: safety disclaimer, core computation, single-scenario rule, edge-case behavior, assumptions, sibling differentiation, and output-mode warning. Key guidance is front-loaded and the structure is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by specifying what summary returns ('headline scalars', 'depletion month or does-not-deplete', citations) and what inline returns ('month-by-month schedule[]'). It also covers assumptions, edge cases, and behavior limits sufficiently for an agent to select and invoke the tool correctly.

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?

Schema coverage is 100%, so the baseline is 3. The description adds interpretative meaning beyond the schema by framing current_savings as 'liquid savings', explaining that inflows include partner income, side income, severance-as-monthly-stream, and unemployment benefits, and clarifying the expense-inflation behavior in context. This is useful but somewhat redundant with already-rich schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: a 'deterministic cash-runway calculator' that computes how many months a fund lasts before hitting zero. It also differentiates itself from calculate_emergency_fund by clarifying the question being answered is duration, not target fund size.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: 'Pick this to project how many months current savings will last' versus 'pick calculate_emergency_fund when the question is the fund's target size.' It also instructs users to call once per scenario for comparisons and to use output='summary' or 'inline' appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources