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.

The default mode 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.

Set include_deals: true when the person explicitly asks to include or add deals, or answers 1 to an offer already sent. An explicit request is approval: compute the floor from the supplied reads and render the deal-adjusted series once. When no inclusion was requested, omit include_deals; this returns the supplied baseline without a deal read. An ordinary forecast may use a separate well_list_projects offer metadata read before any monetary deal read. This mode reads at most 100 live deals from the workspace. It counts each won deal at its full amount in its closed_at month, and each open deal (active or paused) at its chance, its own or else its live stage's, in its end_date month, when that month is inside the projection window, converting with Well's stored FX rate as of this call. Draft, lost, archived, undated, past-due, out-of-window, incomplete and unconvertible deals return named exclusions; an excluded deal with a malformed source amount includes its original display string. An open deal with no chance returns the exclusion no stage weight. More than 100 live deals refuses the whole deal variant. The returned entries draw the deal-adjusted series; floor_entries preserve the series you passed.

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 convention_counts: { negative: <the sum's count_negative>, positive: <the sum's count_positive> }, 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

The result carries settled_change: the first settled reading, the anchor and the direction between them (up, down or flat), computed from the exact cents. Say how the settled cash moved from its direction alone. It is null when there is no movement to state.

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

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

NameRequiredDescriptionDefault
burnYes
as_ofYes
anchorYes
entriesYes
partialYes
successYes
currencyYes
cash_checkNo
cash_scopeYes
burn_policyYes
computed_byYes
deal_summaryNo
floor_entriesNo
months_forwardYes
settled_changeNo
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. Changed19 schema fields changed
    • removedInput schema / properties / actuals / items / properties / amount / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / actuals / items / properties / amount / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • changedInput schema / properties / as_of / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • removedOutput schema / properties / burn_policy / properties / excluded / properties / internal_transfers / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / burn_policy / properties / excluded / properties / internal_transfers / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / burn_policy / properties / unplaceable_count / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / burn_policy / properties / unplaceable_count / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / entries / items / properties / actuals / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / entries / items / properties / actuals / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / entries / items / properties / projection / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / entries / items / properties / projection / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / floor_entries / items / properties / actuals / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / floor_entries / items / properties / actuals / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / floor_entries / items / properties / projection / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / floor_entries / items / properties / projection / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / resolved_workspace / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / resolved_workspace / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / unexplained_gap / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / unexplained_gap / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  2. Changed1 schema field changed
    • addedOutput schema / properties / deal_summary / properties / excluded / items / properties / source_amount
      Added value: +{
      +  "description": "The original source display string when the deal amount is malformed.",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / deal_summary / properties / counted / items / properties / rate_display
      Added value: +{
      +  "description": "The rate as its source publishes it, with no padding zeros: the figure to show.",
      +  "type": "string"
      +}
  4. Changed6 schema fields changed
    • addedInput schema / properties / include_deals
      Added value: +{
      +  "const": true,
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / computed_by / const
      Removed value: -"caller"
    • addedOutput schema / properties / computed_by / enum
      Added value: +[
      +  "caller",
      +  "caller_and_well"
      +]
    • addedOutput schema / properties / deal_summary
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "counted": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "amount": {
      +            "type": "string"
      +          },
      +          "close_month": {
      +            "type": "string"
      +          },
      +          "currency": {
      +            "type": "string"
      +          },
      +          "forecast_amount": {
      +            "type": "number"
      +          },
      +          "fx_rate": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "weight_percent": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "close_month",
      +          "amount",
      +          "currency",
      +          "fx_rate",
      +          "weight_percent",
      +          "forecast_amount"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "counted_count": {
      +      "type": "number"
      +    },
      +    "counted_total": {
      +      "type": "number"
      +    },
      +    "excluded": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "name": {
      +            "type": "string"
      +          },
      +          "reason": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "reason"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "excluded_count": {
      +      "type": "number"
      +    },
      +    "fx_as_of": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "fx_as_of",
      +    "counted",
      +    "excluded",
      +    "counted_count",
      +    "excluded_count",
      +    "counted_total"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / floor_entries
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "actuals": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "month": {
      +        "type": "string"
      +      },
      +      "projection": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "month",
      +      "actuals",
      +      "projection"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / settled_change
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "direction": {
      +          "enum": [
      +            "up",
      +            "down",
      +            "flat"
      +          ],
      +          "type": "string"
      +        },
      +        "from": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "amount": {
      +              "type": "number"
      +            },
      +            "month": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "month",
      +            "amount"
      +          ],
      +          "type": "object"
      +        },
      +        "to": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "amount": {
      +              "type": "number"
      +            },
      +            "month": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "month",
      +            "amount"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "from",
      +        "to",
      +        "direction"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  5. 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."
  6. 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"
      +    }
      +  ]
      +}
  7. 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"
      +    }
      +  ]
      +}
  8. 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"
      +}
  9. 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"
      +}
  10. Added

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the read-only annotations, it discloses that the default mode measures nothing, explains worst-case vs recurring-inflow formulas, describes the deal-inclusion mode and its 100-deal limit, lists refusal conditions, and states what the card draws. This is unusually rich behavioral context for a rendering tool.

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 front-loaded with the key constraint that the caller must compute the forecast and is organized with bold section headers. It is very long and enumerates many refusals, so it is not maximally concise, but much of the length is justified by the tool's 10 required nested parameters and strict validation rules.

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?

Given the tool's complexity, nested schema, annotations, and output schema, the description is complete enough for an agent to invoke it correctly. It covers required inputs, optional modes, refusal behavior, card rendering behavior, and how returned fields like `settled_change` and `cash_check` should be used.

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 25%, but the description compensates heavily by explaining `actuals` null-vs-zero semantics, anchor bases, positive burn magnitude, projection formulas, `cash_scope`, `burn_policy` field mappings, the wider `partial` floor, and strict `recurring_inflow` constraints. It adds substantial meaning beyond the bare schema.

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: placing a caller-computed cash forecast onto a forecast card. It explicitly distinguishes this from calling to 'get' a forecast and names related tools like `well_measure_recurring_inflows` and `well_render_cash_flow_bridge`, so an agent can tell what this tool is and is not.

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?

It gives explicit when-to-use guidance: call only after computing both the month-end series and burn yourself, and never call it to obtain a forecast. It also specifies when to include `include_deals`, when to pass `recurring_inflow`, when to omit `cash_bridge`, and when `workspace_id` is needed.

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