Skip to main content
Glama

Render a caller-computed cash forecast

well_render_cash_forecast
Read-only

Put a cash forecast YOU computed onto the forecast card.

This tool measures nothing. It takes the settled month-end series, the anchor, the burn and the projection you computed, and returns them for rendering. Call it only after you have computed both halves yourself: the month-end totals under your cash scope, and the burn under your stated policy. Never call it to "get" a forecast.

Without recurring_inflow the projection is WORST CASE: no revenue arrives, and cash declines by the burn each month until it reaches zero, where it stops. Take the anchor and the burn each to the cent, then each point is max(0, anchor − k × burn) for the k-th month after the anchor.

With recurring_inflow, the projection counts the recurring inflow well_measure_recurring_inflows measured, and nothing else: each point is max(0, anchor − k × (burn − inflow)), each figure to the cent. An inflow larger than the burn makes the series grow. Pass the forecast_inflows entry of the cash's currency as it is; never add a one-off payment, an unpaid invoice or a deal to it. The tool re-derives the series from the amount you state and cannot check where that amount came from. The amount is a floor that holds month by month: only monthly payers that may not have stopped and paid in every month are in it, and quarterly, yearly, month-skipping, ended and no-cadence payers are not.

The tool re-derives every point from the figures you state here, in cents.

The card draws the series, the anchor clause and the caveat: the worst-case one, or the recurring-inflow one when recurring_inflow is sent. The cash scope, the burn policy and partial are REQUIRED and reach no pixel. All of it comes back in this tool's text result, which is what you write the prose from.

REQUIRED:

  • currency, and as_of: the full ISO time of the balances read the series came from

  • actuals: one { month, amount } per month, oldest first, ending on the last month that has ended at as_of (UTC). A month no account covered is null, never 0, and it stays in the list.

  • anchor: { month, amount, basis }. closed_month_end is the latest settled month-end in actuals. current_position is today's cash when no month has a settled total. It sits on the grid at the last actual month.

  • burn: the POSITIVE monthly magnitude, its currency, trailing_months, and the window it averaged (from inclusive and to exclusive, each YYYY-MM-01). The window ends with the last actual month.

  • months_forward (at most 12), and projection: one { month, amount } per projected month. When the anchor sits before the last actual month, the months between are projected too, so months_forward must reach past them.

  • cash_scope: the counted account types, whether unknown ownership was counted, anchor_missing_accounts (counted accounts with no reading at a closed-month anchor; 0 under current_position), and the four exclusion groups

  • burn_policy: the elected convention and its counts, the exclusions (internal_transfers is the sum's excluded_multi_leg, unreadable_rows its malformed rows), and unplaceable_count (the sum's excluded_no_owned_leg)

  • partial: the forecast's own floor, which is WIDER than a cash total's is_floor. It is checked against cash_scope and must be true exactly when an account was left out with no readable balance, no rate, OR no reading at the anchor month — that last one is the forecast's alone, and a caller that forwards its cash total's is_floor unchanged is refused on it. It never means a cut-short read: a cut-short balances read or sum stops the run before this call.

OPTIONAL:

  • recurring_inflow: { amount, currency, measured_through }, the forecast_inflows entry of well_measure_recurring_inflows in the cash's currency, as it is. Leave it out when that measure returned no entry in the cash's currency.

REFUSED rather than rendered, each because your own figures disagree:

  • a projection point that is not max(0, anchor − k × burn) within a cent, or max(0, anchor − k × (burn − inflow)) when recurring_inflow is sent

  • a recurring_inflow in another currency than the cash, or measured through a month other than the last actual month

  • a recurring_inflow above the burn on an anchor at or below zero: the balance is recovering, which a series clamped at zero cannot draw. Report the overdraft and the inflow instead

  • a projection that does not start the month after the anchor, skips a month, continues after a zero, or has the wrong length

  • a projection ending on a month that has already ended. The refusal names which of the three causes fired: the cash ran out (report that), the horizon was too narrow for the gap (widen it), or the gap exceeds every legal horizon (the feed is too far behind to project across)

  • a cash currency that differs from the burn's

  • a negative burn, a burn elected "magnitude", signed elected from no negative rows, or one of unplaceable_count and internal_transfers null without the other

  • a closed_month_end anchor that is not the latest settled actual, or whose amount differs from it

  • a current_position anchor beside a settled actual, off the last actual month, or with an account missing at it

  • actual months out of order, repeated, skipped, or ending on any month but the last one that has ended at as_of

  • a burn window that disagrees with trailing_months, or ends on a different month than the actuals

  • a partial that disagrees with the floor your own cash_scope implies

  • an as_of in the future

This tool renders its own chart card. Do not re-plot the series with a charting tool.

OPTIONAL, and send it whenever you computed a cash-flow bridge over the same cash:

  • cash_bridge — { unexplained, closing }, the two terms you sent well_render_cash_flow_bridge, in this card's currency. The server applies the bridge's own tolerance and returns cash_check. "provisional": the bridge does not reconcile, the gap is in unexplained_gap, and the card marks the figure Provisional; say so in prose too: the figure stands on cash with an unexplained gap of that amount. "reconciled": say nothing about it. Leave cash_bridge off when you computed no bridge: the result is cash_check: "not_checked" and the card marks the figure Not checked.

When the token authorizes one workspace, call this directly — no workspace call is needed first. When it authorizes several, this read will not guess which one you mean: pass workspace_id on the call.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
burnYes
as_ofYes
anchorYes
actualsYes
partialYes
currencyYes
cash_scopeYes
projectionYes
burn_policyYes
cash_bridgeNoThe cash-flow bridge over the same cash, when you computed one. The server decides whether it reconciles and returns the figure's `cash_check`. Leave it off when you computed no bridge: the figure is then `not_checked`.
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several: this read reports one workspace's own figures and will not choose which.
months_forwardYes
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.
recurring_inflowNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
burnYes
as_ofYes
anchorYes
entriesYes
partialYes
successYes
currencyYes
cash_checkNo
cash_scopeYes
burn_policyYes
computed_byYes
months_forwardYes
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
unexplained_gapNo
recurring_inflowNo
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
  2. Changed2 schema fields changed
    • addedInput schema / properties / recurring_inflow
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "amount": {
      +      "exclusiveMinimum": 0,
      +      "type": "number"
      +    },
      +    "currency": {
      +      "enum": [
      +        "USD",
      +        "EUR",
      +        "GBP",
      +        "JPY",
      +        "CHF",
      +        "CAD",
      +        "AUD",
      +        "NZD",
      +        "SEK",
      +        "NOK",
      +        "DKK",
      +        "PLN",
      +        "CZK",
      +        "HUF",
      +        "RON",
      +        "BGN",
      +        "HRK",
      +        "ISK",
      +        "ALL",
      +        "BAM",
      +        "BYN",
      +        "MDL",
      +        "MKD",
      +        "RSD",
      +        "FOK",
      +        "GGP",
      +        "GIP",
      +        "IMP",
      +        "JEP",
      +        "CNY",
      +        "CNH",
      +        "KRW",
      +        "SGD",
      +        "HKD",
      +        "TWD",
      +        "THB",
      +        "MYR",
      +        "IDR",
      +        "PHP",
      +        "VND",
      +        "INR",
      +        "PKR",
      +        "LKR",
      +        "BDT",
      +        "BND",
      +        "BTN",
      +        "KHR",
      +        "LAK",
      +        "MMK",
      +        "MNT",
      +        "MOP",
      +        "MVR",
      +        "NPR",
      +        "KID",
      +        "AED",
      +        "SAR",
      +        "QAR",
      +        "KWD",
      +        "BHD",
      +        "OMR",
      +        "JOD",
      +        "ILS",
      +        "EGP",
      +        "ZAR",
      +        "NGN",
      +        "KES",
      +        "GHS",
      +        "MAD",
      +        "TND",
      +        "DZD",
      +        "CVE",
      +        "GMD",
      +        "GNF",
      +        "LRD",
      +        "MGA",
      +        "MRU",
      +        "SHP",
      +        "SLE",
      +        "SLL",
      +        "SSP",
      +        "STN",
      +        "YER",
      +        "MXN",
      +        "BRL",
      +        "ARS",
      +        "CLP",
      +        "COP",
      +        "PEN",
      +        "UYU",
      +        "VES",
      +        "GTQ",
      +        "HNL",
      +        "NIO",
      +        "CRC",
      +        "PAB",
      +        "DOP",
      +        "JMD",
      +        "TTD",
      +        "BBD",
      +        "XCD",
      +        "ANG",
      +        "AWG",
      +        "BMD",
      +        "BOB",
      +        "BSD",
      +        "BZD",
      +        "CUP",
      +        "GYD",
      +        "HTG",
      +        "KYD",
      +        "PYG",
      +        "SRD",
      +        "XCG",
      +        "FKP",
      +        "FJD",
      +        "PGK",
      +        "SBD",
      +        "TOP",
      +        "TVD",
      +        "VUV",
      +        "WST",
      +        "RUB",
      +        "TRY",
      +        "UAH",
      +        "KZT",
      +        "UZS",
      +        "AZN",
      +        "GEL",
      +        "AMD",
      +        "KGS",
      +        "TJS",
      +        "TMT",
      +        "AFN",
      +        "IRR",
      +        "IQD",
      +        "SYP",
      +        "LBP",
      +        "LYD",
      +        "SDG",
      +        "ETB",
      +        "UGX",
      +        "TZS",
      +        "MWK",
      +        "ZMW",
      +        "BWP",
      +        "SZL",
      +        "LSL",
      +        "NAD",
      +        "MUR",
      +        "SCR",
      +        "KMF",
      +        "DJF",
      +        "ERN",
      +        "SOS",
      +        "AOA",
      +        "MZN",
      +        "ZWL",
      +        "ZWG",
      +        "BIF",
      +        "RWF",
      +        "CDF",
      +        "XAF",
      +        "XOF",
      +        "XPF"
      +      ],
      +      "type": "string"
      +    },
      +    "measured_through": {
      +      "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "amount",
      +    "currency",
      +    "measured_through"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / recurring_inflow
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount": {
      +          "type": "number"
      +        },
      +        "currency": {
      +          "type": "string"
      +        },
      +        "measured_through": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "amount",
      +        "currency",
      +        "measured_through"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  3. Changed4 schema fields changed
    • addedInput schema / properties / cash_bridge
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The cash-flow bridge over the same cash, when you computed one. The server decides whether it reconciles and returns the figure's `cash_check`. Leave it off when you computed no bridge: the figure is then `not_checked`.",
      +  "properties": {
      +    "closing": {
      +      "description": "The bridge's `closing.amount`, exactly as you sent it to `well_render_cash_flow_bridge`, in this card's currency.",
      +      "type": "number"
      +    },
      +    "unexplained": {
      +      "description": "The bridge's SIGNED `unexplained` gap, exactly as you sent it to `well_render_cash_flow_bridge`, in this card's currency.",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "unexplained",
      +    "closing"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / workspace_scope
      Added value: +{
      +  "description": "Restrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.",
      +  "enum": [
      +    "family"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / cash_check
      Added value: +{
      +  "enum": [
      +    "reconciled",
      +    "provisional",
      +    "not_checked"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / unexplained_gap
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / newly_connected
      Added value: +{
      +  "description": "Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "name": {
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "service_id"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Changed4 schema fields changed
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_note
      Added value: +{
      +  "description": "Present only when the server opened a fresh lane, stating that no choice recorded earlier was read.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_source
      Added value: +{
      +  "description": "Where the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.",
      +  "enum": [
      +    "host_meta",
      +    "argument",
      +    "minted"
      +  ],
      +  "type": "string"
      +}
  6. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources