Skip to main content
Glama

List uncategorized transactions in a window

well_list_uncategorized_window
Read-only

List the transactions in a date window that carry no category, so a figure that depends on categorization can say exactly what is missing before it is computed.

from is inclusive and to is EXCLUSIVE — for whole months, pass the first day of the month after the last one you want.

These rows are measured on when the movement happened (executed_at), not on its accounting date. That is deliberate and it matters: the two disagree about which MONTH a transaction belongs to for a large share of real data, and many rows carry no accounting date at all. A caller listing rows on one basis while summing a figure on the other ends up with rows it counts but cannot offer to fix. Pair this with a sum measured on the same basis.

Returns each row's identity, amount, counterparty and the classifier's pending suggestion where one exists. It lists rows with NO category; a categorized row that has not yet posted to the ledger is a booking question and is not returned here.

delivery says how WhatsApp shows the rows, and only WhatsApp reads it: list (the default) sends the numbered list in the thread, page sends one link to the categorize page in its place. The calling skill picks it from the row count. A page read returns at most 50 rows. Every read's result adds page, the list included, because a link to a list opens the same categorize page: the ref the page's message quotes, and line_ids, the id of each line of the page in line order (line 1 is the first id), for the first 50 rows at most. page.more_rows: true means rows exist past the page's last line.

exclude_transaction_ids drops rows the user already parked in this conversation (skipped, or sent to the web picker). Pass the ids a categorization hand-back names, so the next batch moves on instead of serving them again. The rows stay uncategorized; only this read leaves them out.

meta.truncated: true means the page filled and more rows exist. meta.returned is what came back. totals covers the whole window, not the page: count, the amounts per currency split by sign into sum_negative / count_negative and sum_positive / count_positive exactly as well_sum_transactions splits them, and unreadable_count. Both sums are positive magnitudes. Which side is money out is a property of the FEED, not of this read: elect it from the window's well_sum_transactions counts before you call either side spend or income. On a feed that stores magnitudes only, every row sits in sum_positive and this read cannot tell money out from money in, so state the count and the amount without a direction. State the total from totals; when totals is null and the page is truncated, report the count as a floor.

success: false means the window is UNKNOWN, not empty. The read failed, so no count exists and returned and truncated are absent rather than zero. An empty records on a failed read is not "nothing is uncategorized" — treating it that way reports a clean list this read never produced. Say the list could not be read.

figure_rows keeps only the rows a money figure reads. A figure that sums one side of the window, such as a burn or a cost breakdown, reads no row of the other side and no row its sum excludes, so a gate on that figure must neither count nor list them. Pass the side the elected sign convention reads as money out (amount_sign: "negative" on a signed feed), and copy scope, exclude_internal_transfers, exclude_own_company and card_spend from the well_sum_transactions call that sums the figure. The read then keeps the rows of that side whose money moved and applies the sum's own transfer rules, so the rows, count and amounts are exactly the rows with no category that the figure reads. Never pass it on a feed that stores magnitudes only: there the sign says nothing about direction. Omit it where every row must carry a category whatever its side, as in a close. Pass the same figure_rows on every probe and read of one gate, a resumed one included.

Do not propose categories from this list. Where the classifier has a proposal it rides on the row, and the assignment surface is where a category is chosen.

When the user asks to see, list or fix these rows, call this tool directly: its card is the answer. ⚠️ This tool draws its card on EVERY call, the empty one included. So when nobody asked for the list and you only need to CHECK whether anything is left (the first pass of a gate, or a re-check after a repair), call well_get_worklist_status({ worklist: "uncategorized_window", from, to }) first, with the same scope you would pass here. It draws nothing. Call this tool after it only when it answers open: true.

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
toYesEXCLUSIVE end of the window, YYYY-MM-DD.
fromYesInclusive start of the window, YYYY-MM-DD.
limitNoMax rows to return (default 500).
deliveryNoWhatsApp only: `list` sends the numbered list (default), `page` sends one link to the categorize page and reads at most 50 rows. The calling skill picks it.
figure_rowsNoKeeps only the rows the money figure behind this gate reads. See the description.
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.
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.
exclude_transaction_idsNoTransaction ids to leave out: the rows parked in this conversation.

Output Schema

NameRequiredDescriptionDefault
pageNo
errorNo
totalsNo
windowYes
recordsYes
successYes
returnedNo
truncatedNo
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.
category_audienceNo
offeredCategoriesNo
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. Changed7 schema fields changed
    • addedOutput schema / properties / page / properties / line_ids / maxItems
      Added value: +50
    • changedOutput schema / properties / page / properties / line_proposals / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "context_hash": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "suggestion_id": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "suggestion_id",
      -      "context_hash"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "context_hash": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "suggestion_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "suggestion_id",
      +      "context_hash"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / page / properties / more_rows
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / page / required
      Previous value: -[
      -  "ref",
      -  "line_ids",
      -  "line_proposals"
      -]New value: +[
      +  "ref",
      +  "line_ids",
      +  "line_proposals",
      +  "more_rows"
      +]
    • 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"
      +]
    • changedOutput schema / properties / totals / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amounts": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "count_negative": {
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            "count_positive": {
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            "currency": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "sum_negative": {
      -              "type": "number"
      -            },
      -            "sum_positive": {
      -              "type": "number"
      -            }
      -          },
      -          "required": [
      -            "currency",
      -            "sum_negative",
      -            "count_negative",
      -            "sum_positive",
      -            "count_positive"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "count": {
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "unreadable_count": {
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "count",
      -      "amounts",
      -      "unreadable_count"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amounts": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "count_negative": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "count_positive": {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "currency": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "sum_negative": {
      +              "type": "number"
      +            },
      +            "sum_positive": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "currency",
      +            "sum_negative",
      +            "count_negative",
      +            "sum_positive",
      +            "count_positive"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "count": {
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "unreadable_count": {
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "count",
      +      "amounts",
      +      "unreadable_count"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed1 schema field changed
    • addedInput schema / properties / figure_rows / properties / card_spend
      Added value: +{
      +  "description": "As on the figure's `well_sum_transactions` call: `\"at_purchase\"` keeps the card purchases and drops the card repayments. Needs `exclude_internal_transfers: true`.",
      +  "enum": [
      +    "at_repayment",
      +    "at_purchase"
      +  ],
      +  "type": "string"
      +}
  3. Changed2 schema fields changed
    • addedOutput schema / properties / page / properties / line_proposals
      Added value: +{
      +  "items": {
      +    "anyOf": [
      +      {
      +        "additionalProperties": false,
      +        "properties": {
      +          "context_hash": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "suggestion_id": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "suggestion_id",
      +          "context_hash"
      +        ],
      +        "type": "object"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ]
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / page / required
      Previous value: -[
      -  "ref",
      -  "line_ids"
      -]New value: +[
      +  "ref",
      +  "line_ids",
      +  "line_proposals"
      +]
  4. Changed1 schema field changed
    • addedInput schema / properties / figure_rows
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Keeps only the rows the money figure behind this gate reads. See the description.",
      +  "properties": {
      +    "amount_sign": {
      +      "description": "The side the elected sign convention reads as money out: \"negative\" on a signed feed.",
      +      "enum": [
      +        "negative",
      +        "positive"
      +      ],
      +      "type": "string"
      +    },
      +    "exclude_internal_transfers": {
      +      "description": "As on the figure's `well_sum_transactions` call: drops a transfer between two owned accounts.",
      +      "type": "boolean"
      +    },
      +    "exclude_own_company": {
      +      "description": "As on the figure's `well_sum_transactions` call: drops a transfer to the workspace's own company.",
      +      "type": "boolean"
      +    },
      +    "scope": {
      +      "description": "The `scope` of the figure's `well_sum_transactions` call. It picks the accounts the two exclusions test; the rows stay this workspace's own.",
      +      "enum": [
      +        "own",
      +        "own_and_adopted"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "amount_sign",
      +    "scope"
      +  ],
      +  "type": "object"
      +}
  5. Changed2 schema fields changed
    • addedInput schema / properties / delivery
      Added value: +{
      +  "description": "WhatsApp only: `list` sends the numbered list (default), `page` sends one link to the categorize page and reads at most 50 rows. The calling skill picks it.",
      +  "enum": [
      +    "list",
      +    "page"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / page
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "line_ids": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "ref": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "ref",
      +    "line_ids"
      +  ],
      +  "type": "object"
      +}
  6. Changed1 schema field changed
    • addedOutput schema / properties / totals
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amounts": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "count_negative": {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "count_positive": {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "currency": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "sum_negative": {
      +                "type": "number"
      +              },
      +              "sum_positive": {
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "currency",
      +              "sum_negative",
      +              "count_negative",
      +              "sum_positive",
      +              "count_positive"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "count": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "unreadable_count": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "count",
      +        "amounts",
      +        "unreadable_count"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  7. 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."
  8. Changed1 schema field changed
    • addedOutput schema / properties / category_audience
      Added value: +{
      +  "enum": [
      +    "business",
      +    "household"
      +  ],
      +  "type": "string"
      +}
  9. Changed2 schema fields 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"
      +}
    • addedOutput schema / properties / offeredCategories
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  10. 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"
      +}
  11. Changed1 schema field changed
    • addedInput schema / properties / exclude_transaction_ids
      Added value: +{
      +  "description": "Transaction ids to leave out: the rows parked in this conversation.",
      +  "items": {
      +    "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"
      +  },
      +  "maxItems": 200,
      +  "type": "array"
      +}
  12. 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"
      +}
  13. Added

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only say readOnly/non-destructive; the description adds far more: the card is drawn on every call including empty ones, success:false means the window is UNKNOWN rather than empty, page reads cap at 50 rows, truncated/meta semantics, and totals cover the whole window rather than the page. These are non-obvious behaviors that change how an agent should phrase results.

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

Conciseness3/5

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

Front-loaded with the core purpose and date/measurement caveat, but the body runs very long with repeated restatements (the magnitude-only feed limitation is stated twice, and the page/totals mechanics go on at length). Much of the return-shape prose is recoverable from the output schema.

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 9-parameter read with nested figure_rows, enums, and an output schema, the description covers the sign-convention caveat, failure-mode semantics, pagination, and workspace selection ('pass workspace_id ... when it authorizes several'). Nothing an agent needs to call it correctly is missing.

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, but the description goes further than the schema: it spells out that `to` is exclusive with a concrete month recipe, that figure_rows must copy scope/exclude flags from the corresponding well_sum_transactions call, and that exclude_transaction_ids only affects this read and leaves rows uncategorized. It largely restates the delivery enum already documented in schema, hence not a 5.

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 resource ('List the transactions in a date window that carry no category') plus the reason it exists, and immediately distinguishes itself from well_set_transaction_category ('Do not propose categories from this list') and well_get_worklist_status. An agent can tell exactly what it returns versus its nearest siblings.

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 explicit routing rules: 'When the user asks to see, list or fix these rows, call this tool directly' versus 'when nobody asked ... call well_get_worklist_status ... first ... Call this tool after it only when it answers open: true.' It also states when to pass figure_rows and when never to (magnitude-only feeds, close workflows).

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