Skip to main content
Glama

Render a monthly pivot

well_render_monthly_pivot
Read-only

Put a table of amounts per company and per month onto the monthly-pivot card: one row per company with its logo and name, an optional category column, then one column per month. The running month is drawn apart, at the end, marked as in progress.

This tool measures nothing. Pass a pivot another tool measured, as it is: for subscriptions, the pivots entry of well_measure_subscriptions for the currency you drew the trend in. Never build or edit the rows yourself.

The server reads the running month from its own clock, in UTC, and draws the month_count complete months before it (12 by default). It resolves each row's company from company_id, so the card shows the company's logo and name. A row with a null company_id and a label_means_id is a bank label tied to no company: it is drawn from its name. A payee the company read cannot reach is drawn from the name and domain on its row, as the measure returned them. A row with a null category is drawn as uncategorised.

REFUSED rather than drawn:

  • more than 50 rows, or two rows for one company or one label

  • a row with both or neither of company_id and label_means_id, or a label row with no name

  • an amount keyed outside the drawn months, or keyed by anything but YYYY-MM, or a negative amount. A measure that ran just before the month changed is refused on its oldest month: run it again

  • a company_id this workspace cannot read and whose row carries no name (success: false names the ids)

  • a currency outside ISO-4217

A month with no amount draws an empty cell, which reads as "no payment", never as zero.

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
rowsYesOne row per company.
currencyYesISO-4217 code every amount is denominated in. Checked against the catalog, not its shape.
month_countNoThe complete months drawn before the running month. Defaults to 12.
show_totalsNoDraw a totals row under the companies.
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.
rows_truncatedNoTrue when more rows existed than the measure listed.
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.

Output Schema

NameRequiredDescriptionDefault
rowsYes
errorNo
monthsYes
successYes
currencyYes
computed_byYes
month_countYes
show_totalsYes
current_monthYes
rows_truncatedYes
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.
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
unknown_company_idsNo
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. Changed10 schema fields changed
    • 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 / rows / items / properties / category / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / category / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rows / items / properties / category_key / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / category_key / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rows / items / properties / company_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / company_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rows / items / properties / label_means_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rows / items / properties / label_means_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed10 schema fields changed
    • addedInput schema / properties / rows / items / properties / company_id / anyOf
      Added value: +[
      +  {
      +    "format": "uuid",
      +    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / rows / items / properties / company_id / description
      Previous value: -"The company the row is about. Its logo and name are resolved server-side."New value: +"The company the row is about. Its logo and name are resolved server-side. `null` on a label row."
    • removedInput schema / properties / rows / items / properties / company_id / format
      Removed value: -"uuid"
    • removedInput schema / properties / rows / items / properties / company_id / pattern
      Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    • removedInput schema / properties / rows / items / properties / company_id / type
      Removed value: -"string"
    • addedInput schema / properties / rows / items / properties / label_means_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "uuid",
      +      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The label-only payee the row is about, as the measure returned it, when `company_id` is `null`."
      +}
    • addedOutput schema / properties / rows / items / properties / company_id / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / rows / items / properties / company_id / type
      Removed value: -"string"
    • addedOutput schema / properties / rows / items / properties / label_means_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / rows / items / required
      Previous value: -[
      -  "company_id",
      -  "name",
      -  "category",
      -  "category_key",
      -  "amounts"
      -]New value: +[
      +  "company_id",
      +  "label_means_id",
      +  "name",
      +  "category",
      +  "category_key",
      +  "amounts"
      +]
  3. 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."
  4. Changed1 schema field changed
    • 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"
      +}
  5. 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"
      +}
  6. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint/openWorldHint/destructiveHint, so the description carries the burden and does far more: it discloses the UTC clock source, the running-month-in-progress treatment, empty-cell semantics ('reads as no payment, never as zero'), and a full list of refusal conditions including the stale-measure case on its oldest month. It even notes which failures return `success: false` with named ids.

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?

Front-loaded with the layout and the 'measures nothing' constraint before the detail, then a scannable refusal list. The prose is dense but every paragraph carries information an agent needs; the closing workspace paragraph is somewhat long relative to its point, which keeps this off a 5.

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 an 8-parameter rendering tool with an output schema and read-only annotations, nothing material is missing: input provenance, layout, clock behavior, refusal modes, and workspace scoping are all stated, and return values are correctly left to the output schema.

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 baseline is 3; the description goes beyond it by explaining cross-field rules the schema cannot express (a row needs exactly one of `company_id`/`label_means_id`, a label row needs `name`, amounts must be keyed inside the drawn months) and the semantics of `month_count` relative to the server clock. It says nothing about `show_totals`, `rows_truncated`, or `conversation_id`, which the schema already documents, so it stops just short of full coverage.

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?

States a specific verb and artifact (put a table of amounts per company and per month onto the monthly-pivot card) and describes the exact layout produced. It also explicitly separates itself from the measurement family: 'This tool measures nothing. Pass a pivot another tool measured' — an agent can distinguish it from well_measure_subscriptions or well_render_mrr without opening any schema.

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?

Gives an explicit routing rule to the sibling that produces the input (use the `pivots` entry of `well_measure_subscriptions` for the currency drawn), an explicit prohibition (never build or edit rows yourself), and the workspace precondition (call directly for a single-workspace token, pass `workspace_id` when several). When-to-use and when-not-to-use are both covered.

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