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.

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. The tool re-derives every point from the anchor and burn you state here, in cents.

The card draws the series, the anchor clause and the worst-case caveat. 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.

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

  • a projection point that is not max(0, anchor − k × burn) within a cent

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

When the token authorizes one workspace, call this directly — no other tool 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
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.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
burnYes
as_ofYes
anchorYes
entriesYes
partialYes
successYes
currencyYes
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.
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. 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"
      +}
  2. Added

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral detail: it re-derives projection points, refuses rather than renders on disagreement, renders its own chart card, and instructs the caller not to re-plot. It also clarifies what the card does and does not display, going far beyond the annotations.

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?

The description is long, but it is densely packed with essential information and uses clear structural sections (REQUIRED, REFUSED). It is front-loaded with the core purpose and 'measures nothing' warning. Some redundancy exists around not using it to 'get' a forecast, but given the 12-parameter complexity, nearly every sentence earns its place.

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?

For a highly complex tool with 12 parameters, deep nesting, and only 17% schema description coverage, the description is exceptionally complete. It covers required inputs, validation rules, refusal causes, workspace handling, rendering behavior, and output expectations. Any gaps are covered by the existing output schema and parameter-level schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17%, but the description compensates thoroughly. It explains every parameter group: actuals null-vs-zero semantics, anchor basis distinction, burn window inclusivity, projection formula, cash_scope requirements, burn_policy mappings, and the refined meaning of partial. This far exceeds what the sparse schema descriptions provide.

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 opens with a specific verb+resource: 'Put a cash forecast YOU computed onto the forecast card.' It immediately distinguishes the tool from retrieval tools with 'This tool measures nothing' and 'Never call it to "get" a forecast.' This removes ambiguity and clearly separates it from the sibling rendering tools.

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?

The description explicitly states when to call it ('only after you have computed both halves yourself'), when not to call it ('Never call it to get a forecast'), and provides important invocation context such as workspace authorization and whether to pass workspace_id. This is direct, actionable guidance.

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