Skip to main content
Glama
740,720 tools. Updated 2026-11-03 23:15

"Wells Fargo" matching MCP tools:

  • Get recent complaints against a specific company (e.g., 'Wells Fargo', 'Citibank'). Everyday names are resolved to CFPB's exact registered spelling automatically ("Wells Fargo" -> "WELLS FARGO & COMPANY"), and the response reports which name was actually queried. Returns narratives, company responses, and resolution details sorted newest first.
    ConnectorNo auth
  • List mnemon (lore/memory) entries for an Argo campaign. Optional filters: `title` (case-insensitive substring on entry title only) and `type` (e.g. NPC, Location, Quest). To find entries by what they CONTAIN, use search_mnemons instead. Returns up to `limit` entries (default 100); when `hasMore` is true, call again with `offset` = the returned `nextOffset` to fetch the next page. Each entry includes both `title` and `entryId` (shown inline as `[id: …]` and in structuredContent.idMap). Use the `entryId` verbatim for any tool that takes one; refer to entries by `title` in prose to the user.
    ConnectorNo auth
  • Remove one stopped Claude Code session from the person's list of sessions. Use it when the person asks to remove a session from the list. Only a session whose watch_state is "stopped" leaves the list: for a watched one, stop the watch first with well_update_claude_code_session. It does not close the tab and does not stop the session on claude.ai. Find the id first with well_list_claude_code_sessions. REQUIRED: claude_code_session_id. Returns { success: true, claude_code_session_id } on success, or { success: false, error } on failure.
    Connector
    Destructive
    No auth
  • Read the complete forecast from today onward for up to 10 days. Use this for the coming days; use `well_get_weather` for today's current conditions and raw weather facts. The forecast includes each complete day's local date, minimum and maximum temperature, condition, top precipitation probability, and top wind speed. Precipitation probability and wind speed are null when the forecast does not provide them. `available` is false, and `forecast` is null, when no city is given and the workspace has no own company location with a city (`reason: "no_location"`), or when the forecast could not be read (`reason: "unavailable"`). 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.
    ConnectorNo auth
  • List all Argo campaigns the current grant token has access to, including the access level ("read" or "read+write") for each. Call this first when the user has not provided a campaign ID. Each entry includes both `campaignName` and `id` (shown inline as `[id: …]` and also in structuredContent.idMap). Use the `id` verbatim for any subsequent tool call that takes a `campaignId`. In prose to the user, refer to campaigns by `campaignName`; do not print the raw `id` unless asked.
    ConnectorNo auth
  • Create a relationship between two mnemon entries. The label decides everything: its kind (containment or association) and how it reads (one_way or mutual) belong to the word itself — never send a per-edge override. All 16 labels: MEMBER (NPC ∈ Faction, mutual), ALLY (mutual), ENEMY (one-way), RIVAL (one-way), PARENT_OF (Location hierarchy — sourceEntryId is the outer/larger place, e.g. Region → City → District → Tavern), CONTAINS (Location → NPC present there), LOCATED_IN (NPC → Location; inverse of CONTAINS), HAS_SUBQUEST (Quest → subquest Quest), QUEST_GIVER (Quest → the NPC who gives it), QUEST_LOCATION (Quest → the Location where it is given or set), QUEST_RELATED_NPC (Quest → NPC), QUEST_RELATED_LOCATION (Quest → Location), SESSION_ATTENDEE_CHARACTER (SessionSummary → a character's Player), SESSION_ATTENDEE_NPC (SessionSummary → NPC), SESSION_FEATURED_QUEST (SessionSummary → Quest), SESSION_FEATURED_LOCATION (SessionSummary → Location). sourceEntryId is the 'from' side; targetEntryId is the 'to' side — which end is which matters. Call describe_mnemon_types for the full valid (sourceType, label, targetType) matrix. For faction membership prefer memberNpcEntryIds on the faction or affiliationEntryIds on the NPC; for a quest's giver, location and parent prefer giverId / locationId / parentQuestId on the quest, which keep each to one link. Session-summary links have no array equivalent — the SESSION_* labels are the only way to set them.
    ConnectorNo auth

Matching MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables live querying of oil & gas and geothermal well data from state regulator ArcGIS services, including searchable well records, operators, nearby wells, and raw queries, plus DOE GDR and Global Energy Monitor lookups.
    8
    MIT

Matching MCP Connectors

  • Read records from Well's context graph FOR YOUR OWN WORK. This draws nothing on the user's screen. Use it for every read whose answer is yours rather than the reader's: a gate checking whether a window holds transactions, a `totalCount` an answer has to quote, a sync log's latest status, a field a later step needs, the rows behind a figure you are about to compute. ⚠️ TO SHOW THE USER A TABLE, CALL `well_show_records` INSTEAD. Same arguments, same rows, and it renders the root's own table. This tool cannot put one on screen, so a request to "show me my invoices" answered here leaves the user with prose where a table belongs. ⚠️ WORKFLOW: 1. Call well_get_schema(root) FIRST to discover the available fields. 2. Name in `fields` ONLY the extra values you need (5-15 typically). They are ADDED to the root's default projection in the payload you read. 3. Filter with `whereClause` so the read answers the question. A count under a filter beats reading rows and counting them yourself. ROOTS (read-only — all 73): companies, people, connectors, workspaces, workspace_connectors, invoices, documents, notes, transactions, accounts, memberships, payment_means, invoice_payment_means, cards, checks, chat_conversations, ledger_accounts, journals, journal_entries, tax_rates, exchange_rates, invoice_transactions, media, emails, phones, web_links, locations, categories, invoice_items, account_balances, tasks, workspace_connector_sync_logs, blueprint_runs, billing_events, payslips, messages, calendars, calendar_events, projects, shipments, activities, company_relations, connector_filters, employment_contracts, field_definitions, payslip_line_rubrics, subscriptions, supplier_payment_terms, workspace_category_overrides, workspace_groups, products, inventories, inventory_movements, daily_metrics, allocations, project_changes, shipment_events, statutory_values, adoption_scopes, browser_skills, canvas_views, connector_requests, document_layouts, expense_notes, field_rules, flow_runs, memory_units, share_links, skills, transaction_category_rules, workspace_posting_mappings, workspace_schedules, workspace_views (The accounting graph — ledger_accounts, journals, journal_entries — and balances/rates are read-only projections owned by the sync/posting pipelines; query them for financial context, you cannot create/update them here. Sub-resources like emails/phones/locations are usually richer when read via their parent company/person.) ("messages" holds the messages Well sent outbound on a member's behalf — emails and WhatsApp; notifications to the member are not stored. A message is visible to its sender only, so a read returns the caller's own messages. Filter by sender_membership, recipient_person or recipient_address, message_category, channel, status.) CATEGORY CATALOGS: "categories" holds two independent taxonomies, separated by `category_type`. Always filter on it — an unfiltered read mixes them: - `whereClause: { category_type: { _eq: "company" } }` is the COMPANY-CATEGORY catalog: the industry labels a counterparty carries, and the ids `well_update_company({ category_ids })` accepts. There is no curated allowlist — the labels are minted during enrichment — so read them here rather than inventing a taxonomy. - `whereClause: { category_type: { _eq: "transaction" } }` is the management/transaction taxonomy. TRANSACTION FIELD NAMES (root "transactions"; a path opens with "transactions", e.g. ["transactions", "counterparty"]): - The name of the other side is counterparty: the company paid on an outflow, the one who paid on an inflow. When it is empty, provider_label holds the name the bank gives that side. Both are computed when the row is read: select them, but never filter, sort or total on them. To filter on a supplier, filter creditor_payment_means.company.name. - remittance.unstructured is the payment reference the bank carries: an invoice number, or a code of the bank such as fx_card. It is never the name of the other side: never give it as a name, and never quote a bank code to the user. When counterparty and provider_label are both empty, use it only to say in plain words what the movement is: fx_card on a Qonto account is a Qonto currency exchange fee ("frais de change Qonto"). - The amount is instructed_amount.amount with instructed_amount.currency. Its sign gives the direction (negative for an outflow) only when amount_sign is "signed"; on any other row, give the amount as it is and never call it an outflow or an inflow. The date is executed_at. status says where the payment stands. - A list of transactions for the user reads executed_at, counterparty, provider_label, remittance.unstructured, instructed_amount.amount, instructed_amount.currency and status, newest first (orderBy executed_at, desc). TRANSACTION CATEGORY FIELDS (root "transactions"): Well's category of a transaction is on the transaction row itself: - category_normalized: the category label. category_key: the stable key of that label. - category_status: the categorization state (values: "categorized", "uncategorized", "classifier_abstained", "classifier_failed", "pending", "legacy_unmapped"). "pending" means a categorization run is queued or in flight. Whether the transaction has a category is decided by category_normalized alone. When category_normalized is empty, tell the user the transaction is not categorized yet, in the language of your reply. - category_source: who wrote the category (values: "classifier", "user", "connector", "rule"). - To find the transactions that have a category, read or filter these fields, for example whereClause { category_normalized: { _is_null: false } }. To find the transactions without one, use { category_normalized: { _is_null: true } }. - The transaction_categories relation holds only the labels that an accounting connector sent with the transaction. A bank-feed transaction usually has none, and Well never writes one. Never read or filter transaction_categories to say that a transaction has a category or has no category. ACCOUNT FIELD NAMES (root "accounts"; a path opens with "accounts", e.g. ["accounts", "account_name"]): - The label of an account is account_name. The accounts root has no name column: never select or filter "name" on it. From the account_balances root, the label is account.account_name. - Never filter accounts on a bank name. bank_company stays empty until Well identifies the bank, and account_name is the label the provider sends (for example "Plaid Checking"), so such a filter returns no row for an account the workspace holds. - For the accounts or the balance at a named bank, call well_list_account_balances and keep the rows whose institution_name is that bank. Never say that the workspace has no account at a bank from a records read. CONNECTED TOOLS: do NOT use this tool to show the user what they have connected — call well_list_connectors instead. It owns that job: connection status, and an install link for anything not connected yet. Query root "workspace_connectors" here only for genuine RECORD-level needs — reading sync timestamps, filtering connections, joining them with other roots. ("connectors" is the installable catalog; "workspace_connector_sync_logs" is per-sync history.) Well already syncs the providers' data into the roots above — invoices, transactions, accounts, the accounting graph. ALWAYS read it from here. well_invoke_connector_tool and a provider's own tools are for an ACTION the user explicitly asked to take on that provider (e.g. "create this record in Attio"), never a way to fetch data Well already holds. FILTERING (whereClause): - Uses Well's whereClause operators (underscore-prefixed, e.g. _eq, _ilike, _and) on field names. - Safe operators (work on ALL field types): _eq, _neq, _in, _nin, _is_null - Numeric/date only: _gt, _gte, _lt, _lte - Text only: _like, _ilike - When unsure of a field's type, prefer _eq or _in (they always work). - Combine with _and, _or, _not - For relationship fields, use nested syntax: { "issuer": { "company_id": { "_eq": "<company_id>" } } } - NEVER select the workspace's OWN records by matching a company name. One legal entity appears under several labels — a registered name, a trade name, a bank-issued label — so a name filter silently drops rows and the total reads as complete. On the invoices root, pass `partyScope` instead: it resolves the workspace's own side on the server, so this query needs no id lookup and no extra call. Call well_get_own_company for the id only when a root has no `partyScope` and you must filter on the nested company_id yourself. - Match a counterparty by id too whenever you have one. Reach for _ilike on a name only to DISCOVER candidates to show the user, never to compute a figure you will report. Examples: { "status": { "_eq": "unpaid" } } { "grand_total": { "_gt": 1000 } } { "local_currency": { "_eq": "EUR" } } { "_and": [{ "status": { "_eq": "unpaid" } }, { "grand_total": { "_gte": 500 } }] } { "issuer": { "company_id": { "_eq": "<company_id from well_get_own_company>" } } } SORTING (orderBy): - Sort by any field: { field: "grand_total", direction: "desc" } - Default sort is newest first on `created_at`; transactions sort on `executed_at`, companies and people by name. ⚠️ RULES: - `fields` is ADDITIVE — it widens the data you receive on top of the root's default projection - Omitting fields (default view) or naming a few extras both beat allFields - Field paths from schema: "invoices.issuer.name" → ["invoices", "issuer", "name"] - NEVER guess a field name. Common misses: a transaction has no `amount` column (read ["transactions", "instructed_amount", "amount"] and its "currency"), an account has no `name` (read ["accounts", "account_name"]). An unknown field fails the call and the error lists the valid fields of the root: retry once with one of them. - Default 50 records per request, max 500. - Reading whether ANYTHING matches is one call at `limit: 1`: read `totalCount`, not the rows. EXAMPLE - does the window hold any transactions at all? well_query_records({ root: "transactions", limit: 1, whereClause: { "executed_at": { "_gte": "2026-06-01", "_lt": "2026-09-01" } } }) // totalCount answers it. One row comes back and you ignore it. EXAMPLE - answer "how much are our customers still owing us?": well_query_records({ root: "invoices", partyScope: "sales", limit: 1, whereClause: { "payment_status": { "_in": ["unpaid", "partial"] } }, sum: ["balance_due"] }) // `totals` answers it: one balance_due sum per currency, over every unpaid // invoice issued by the workspace. Quote it; never add up the rows, which are a page. // `partyScope` picks the side: "sales" is owed TO the workspace, "purchase" is owed BY it. When `party_scope.side_unknown` is true the workspace has no resolved own company, so no side filter was applied: the rows and totals cover every invoice on both sides, and the side is not known. Say the side is unknown, never that the figure is the requested side's. ONE CALL IS THE ANSWER — do not walk the root: Every response carries `totalCount` (ALL matches, not just this page) and `records_url` (the full web-app table, with your filter and sort already applied). Hand the link to the user for anything past this page. - A non-null `nextCursor` is NOT a to-do. It means more rows exist, which `totalCount` already told you and the link already covers. - Never compute a total from the rows. They are a page, so a figure added up from them changes with `limit`, `orderBy` and `cursor`, and the same question gets two answers. Pass `sum` and quote `totals`: it covers every match. A count is `totalCount`. - Never paginate to "be thorough". Large roots will exhaust the output limit mid-walk, and the user ends up with nothing legible. - Paginate ONLY for per-row work over every match that no aggregate can express, and tell the user the cost before starting. Then: pass the returned `nextCursor` as `cursor`; `nextCursor: null` is the last page. Returns { rows, totalCount, nextCursor, totals (when `sum` was passed), party_scope (when `partyScope` was passed), success }.
    ConnectorNo auth
  • Attach a bank account to a company, and say whether the workspace owns it. Use this when an account carries no company, or when its ownership is still `unknown` — the two states a figure that walks account ownership cannot be computed over. REQUIRED: account_id, plus at least one of company_id or ownership. `ownership` is one of: - "workspace" — the business's own account - "counterparty" — someone else's, seen on an invoice or a payment - "unknown" — not yet classified **This changes figures, not just a label.** An account marked "workspace" puts its transactions inside the internal-transfer rule: a movement with both legs on owned accounts stops counting as money leaving the business. Marking a counterparty's account as the workspace's own therefore removes real spend from the burn, quietly and consistently, with no error anywhere. So do not guess it. An account's owner cannot be read off its name, its bank, or the company that appears most often beside it. Ask, or leave it `unknown` — "not yet classified" is a truthful state and a wrong classification is not. `company_id` must name a company in the SAME workspace as the account; a company from another workspace is refused rather than resolved. Pass `company_id: null` to detach. Returns { success: true, account_id, ownership, company_id } on success.
    Connector
    Destructive
    No auth
  • Put a burn figure YOU computed onto the burn card. **This tool measures nothing.** It takes the figure and its method as input and returns them for rendering. Call it only after you have computed the burn yourself and can state every field below from your own work — never to "get" a burn. The server derives no burn of its own. The figure on the card is the one you state here, which is why every field below is required: the policy behind a number is the only thing that makes it checkable. **At its smallest size the card draws the figure alone.** It carries the figure, the window it averages and the trend chip. At its wider sizes it also draws the months as bars, from `per_month` for the window and `history_per_month` for the months before it, against one line at `amount` (see `history_per_month` below). The fields below other than `amount`, `currency` and `window` are not drawn. Every field you send comes back to you in this tool's text result, which is what you write the prose from. The card is the measure; the explanation is yours. REQUIRED, because a figure whose method is not stated cannot be checked: - `amount` — the outflow per month, as a POSITIVE magnitude in `currency` - `window` — the months the average divides by, not the months that carried spend - `convention` — "signed", and the counts you elected it from - `months_in_window` and `months_with_data` — a window with dark months reports LOWER than its typical month. When the two differ you MUST say so in prose: how many months recorded an outflow, and that the average still divides by the whole window - `excluded` — what fell out, in named groups. `internal_transfers` is the sum's `excluded_multi_leg`; send `null` when the sum could not count it - `transaction_count` and `unplaceable_count` — how much of the window could be placed inside or outside the transfer rule at all. `unplaceable_count` is the sum's `excluded_no_owned_leg`. Send `null` when the sum could not count it. Never send 0 for that, because zero says every row was placed REFUSED rather than rendered: - a negative `amount` — a burn is a magnitude; a negative one means a signed subtotal was used without taking its magnitude - `convention: "magnitude"` — that feed keeps direction in a field no grouping here reaches, so no outflow was measured - `months_with_data` above `months_in_window`, or a measured `unplaceable_count` above `transaction_count` - one of `unplaceable_count` and `excluded.internal_transfers` `null` without the other: one cancelled count nulls both - a `months_in_window` that disagrees with the months `window` spans — the two state one fact, and a reader cannot tell which is the lie - `signed` elected from ZERO negative rows: whatever the convention was called, that window measured no outflow - `convention_counts` summing past `transaction_count`, or `months_with_data` disagreeing with the months `per_month` shows carrying an outflow — your own prose states both, so a contradiction between them is a sentence that refutes itself - a `window` whose bounds are not each the first of a month, or that fits inside one month: a month average divides by whole months - a `per_month` series that is not the window's own months, in order, averaging to `amount` — a dark month belongs in it as a zero, and a series that disagrees with the figure is not the working behind it - a `currency` outside ISO-4217 — the code is checked against the catalog, not its shape OPTIONAL, and only as a pair: - `baseline` and `change` — the earlier window you compared against, its own average, and the signed percentage between them. Send both or neither: a percentage whose baseline the reader cannot name is exactly the unchecked number this tool refuses everywhere else. The card draws the CHIP alone and never the baseline, so sending the pair obliges you to NAME that comparison in prose: the baseline window and its own average. Compute the baseline the same way you computed the figure, over a window of the same length; the two may overlap, and when they do say so too. `change` is checked against `amount` and `baseline.value` and refused when it does not follow from them, so send the percentage you actually divided. Do not send a direction: down is GOOD for a burn, and the card's green is decided server-side from `change` rather than read off its sign. OPTIONAL, for the card's wider sizes: - `history_per_month` — the months immediately BEFORE `window`, up to 9, oldest first, each `{ month, amount, has_data }`. Measure them with the same sum, the same convention, the same exemptions and the same conversion as `per_month`. A month with no outflow is `has_data: false` with amount 0. The server derives `forms.m` (the window and the months just before it, up to 4 months in all) and `forms.l` (the window and every month sent, up to 12): the months each size draws. Every size draws its bars against one line at `amount`, the window's figure, so the card states no second average and neither does your prose: do not average the drawn months yourself. Without `history_per_month`, both sizes draw the window alone. - REFUSED: more than 9 months, a month inside or after `window`, a month named twice, months out of order, a gap between two months, or a last month that is not the month just before `window.from`. 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.
    ConnectorNo auth
  • List the teammates a workspace can invite, exactly as the Well app's invite card shows them. Use it before well_invite_members, and for "who can I invite to this workspace?". Returns `candidates`, each with `person_id`, `name`, `email`, `avatar_url`, a `state` (`active` already has access, `pending` was invited and has not accepted, `not_member` can be invited), a `source` (`detected` was computed from the workspace's own people, `provided` was named in `person_ids` or resolved from the assigned gap owners), and a `reason` on a detected row: `same_email_domain` when they share the owner's corporate email domain, `seen_in_two_tools` when they appear in two or more of the workspace's connected internal tools and in no other company, which is the signal an owner on a personal address has instead of a shared domain. A `provided` row carries no reason. Never invite a candidate whose state is `active`. Alongside them it returns `targets` — this workspace plus any workspace group you belong to, each an option for where the invite lands — `roles` (`admin` or `member`, with a hint), and `me_person_id` so you never offer to invite the caller. On a demo workspace, which holds sample data, `candidates` and `targets` are empty and `refusal_reason` is `DEMO_WORKSPACE`: tell the user to invite the team in their own workspace. Three ways to source the candidates: - Default: the detected teammates who hold no membership, each with its reason. - `person_ids`: resolve specific people you already hold the ids for, with their membership state. Set `include_detected` false to return only those. - `from_assigned_gaps: true`: resolve the owners of the settled expense transactions still missing a supplier invoice for the period, server-side, with their membership state — the invite step of a close or fetch flow uses this so it never depends on remembering who was assigned on the owner card. It returns only those owners (the detected teammates are omitted). Name the period ONE way — `{ calendar_year, calendar_month }` or `{ fiscal_year, fiscal_period }` — or name no period to use the months selected on the period card this session. Every month must have ended. ⚠️ **This tool draws its invite card on EVERY call, the empty one included.** When the user asks who they can invite, call it directly: the card, with its contact search, is the answer. But in the invite step of a close or missing-invoice flow, where you read with `from_assigned_gaps: true` only to find out whether an owner of the period's gaps still needs an invitation, call `well_get_worklist_status({ worklist: "gap_owners_to_invite" })` first, with the same period you would pass here or none for this conversation's selected months. It draws nothing, and its `count` is how many of those owners are `pending` or `not_member`. Make the `from_assigned_gaps` call only when that count is above zero. A solo workspace whose owner assigned the gaps to themselves answers 0: nobody is left to invite, so no card is drawn. An ABSENT count is not a zero: `success: false` means the probe could not read the owners. ⚠️ WAIT ON THE CARD IN THE TURN THAT DREW IT. Write your one line for the user FIRST, then call `well_wait_for_selection({ kind: "invite_ack" })`, which this result's `next_step` also states. The card's own footer sends the invitations and writes the acknowledgement, so never call `well_invite_members` yourself after a click. The outcome the click carries says which button it was: "done" sent the invitations, "keep_for_later" set the step aside. Both end the step. 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.
    ConnectorNo auth
  • Set the category of one or more transactions to ONE label — the write that clears a categorization gate. REQUIRED: transaction_ids, the ids of the rows from a read (well_list_uncategorized_window, a transaction list, a query). category — the LABEL, exactly as that read returned it on the row's suggestion, or another label from the closed list this schema carries. The vocabulary is fixed: there is no free-text category and no way to mint one. **A yes, "valide la proposition" or "ok" after another message since the list or proposal it answers names no row. Do not call this tool for that reply. Read the remaining rows again with the uncategorized-window read so Well shows a fresh list; a pick on that list then saves.** **`decision` records HOW the category was chosen, and it changes what the row keeps.** - `accepted_classifier_suggestion` — the user affirmed the label the classifier had already put on the row. The row keeps `category_source: "classifier"` and its confidence score, and the affirmation is stamped as `category_confirmed_at`. Send this ONLY when the label equals the classifier's own stored suggestion. - `user_choice` — the user picked the label themselves. The row records `category_source: "user"` with no score. The server verifies an `accepted_classifier_suggestion` claim against the row it is writing and downgrades it to `user_choice` when the stored suggestion is not that label, so the claim can never manufacture classifier provenance. Omitting `decision` is a `user_choice`. **A row from `well_list_uncategorized_window` never qualifies for the affirmation.** That read returns rows carrying NO category at all, so there is no stored classifier value to affirm and the claim would be downgraded every time. Its `categorySuggestions` are PENDING proposals, not a stored category. Clearing that gate is always a `user_choice`; the affirmation exists for a surface that lists rows the classifier already categorized. Categorizing a row does NOT move it in or out of the internal-transfer rule — that rule counts payment-means legs and no label affects it. What a category DOES change is exemption matching: an uncategorized row can never be matched by an exemption and always stays in a sum. **Send `category: null` to set the row back to no category.** Use it when the user asks to remove or empty a transaction's category. The row then has no category, and the user owns that state: neither the classifier nor a counterparty rule fills it again. A null category takes no `decision`. "Uncategorised / suspense" is NOT "no category": it is a real category that books the line to the suspense account. Never send it to remove a category. The server refuses a null category with the typed reason `TRANSACTION_CATEGORY_BOOKED_IN_LEDGER` when the row's category is already booked in the ledger. Tell the user the category is booked in the ledger, and offer to change it to another category instead. **One call for every row that takes the same label.** When the person names many rows for one category ("put the 12 Uber rides under Transport"), read the rows, then send ALL their ids in `transaction_ids` on ONE call: never one call per row. Up to 50 ids per call; for more rows, split them into calls of at most 50. Rows that take different labels go in separate calls, one per label. `decision` applies to every row of the call, and the server checks an affirmation row by row. Each row is saved on its own. The answer gives `written` and `failed` and one entry per row in `results`. When some rows failed, say which rows were not changed: never report them as done. `totals` sums the saved rows, one amount per currency, signed as the bank books them: say each amount without its sign, a whole amount with no decimals (€412, never €412.00), and never add up amounts yourself. **When every row saved, answer with ONE read-back line**: "Saved: the <written> <the rows, in the person's words>, <total> in total, are under <the category, in the person's words>." For example "Saved: the 12 Uber rides, €412 in total, are under Transport." For one row, name it: "Saved: transaction Figma, €45, 12 Oct: category Software." Add nothing else: no list of the rows, no question. **The list depends on the workspace.** A personal space files household categories, a company workspace business categories, and both file the shared ones. A label outside the workspace's list writes nothing and returns `refusal_reason` with `allowed_categories`: send a `label` from that list. **A name that fits more than one label is a question, never a pick.** When the words the person used fit two or more labels of the list (for example "Logiciels" or "software" fits both "Developer & engineering software" and "Business & productivity software"), do not call this tool: ask which one, naming each label that fits in the person's words, and call it once they answer. Never choose the nearer label, and never put two labels on one call. **`confirm_first`: true when the person's message asks that nothing change before they approve** (for example "ne modifie rien avant mon accord", "show me first", "wait for my OK"). Omit it otherwise. In Well's own sessions the call then waits on Well's confirmation card, even when the person lets Well act alone for this kind of change. In another assistant connected to Well with the person's own sign-in, Well shows no card and a flagged call changes nothing: it returns `awaiting_confirmation: true`. Show the person the transaction and the label, ask for their OK in the conversation, then call again without the flag. Without the flag, your host's own approval of the call is the confirmation. Well checks that the person is signed in and a member of the workspace, and that the label is a category of this workspace. A connection made with an API key cannot change a category. **This write changes Well's copy of the transaction only.** The bank or tool the row was synced from keeps its own category: no call reaches it. When the person named that bank or tool, say that it stays unchanged. 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.
    ConnectorNo auth
  • Put a cash-flow bridge YOU computed onto the cash-flow waterfall card. **This tool measures nothing.** It takes the four terms of a bridge and the gap between them as input, draws the waterfall, and returns them. Call it only after you have read the opening and closing positions and summed the window's flows yourself — never to "get" a bridge. A bridge rests on one law: the opening, plus the inflows, minus the outflows, lands on the closing. The closing is measured on its own rather than summed from the flows, so the law is a check rather than a given. State the gap as `unexplained` and the tool verifies the five figures add up; state figures that do not and it refuses. REQUIRED: - `currency` — every figure below is in it, each converted before you stated it - `period_start`, `period_end` — the inclusive calendar days the flows cover - `opening` — `amount` (SIGNED, a workspace can be overdrawn), `as_of` (the day before `period_start`), and `derived` (true only when you solved it from the law because the reading could not be taken) - `inflows`, `outflows` — gross magnitudes, both positive; the direction lives in which bar they are - `unexplained` — the SIGNED gap `closing - (opening + inflows - outflows)`, computed from the figures as you rounded them; zero when they meet - `closing` — `amount` (SIGNED) and `as_of`, the moment the reading was taken - `reconciles` — true when the gap is inside the tolerance below, false when it is past it - `partial` — true when any term is incomplete: an anchor some accounts had no reading for, flows with rows no owned account could be placed against, rows that could not be read, or a currency with no rate. A cut-short read returns no rows and stops the run before this call The tolerance is the product's own: 1% of the closing position's size, never less than 1 in the base currency. A bridge that does not reconcile draws an Unexplained bar between the outflows and the closing; one that does draws none. REFUSED rather than rendered, each because your own figures disagree: - five figures that do not add up to within a cent - `reconciles: true` with a gap past the tolerance, or `false` with one inside it - a negative `inflows` or `outflows`; each is a magnitude, so a negative one was re-signed - an opening not dated the day before `period_start` - a window ending more than a day from the day the closing was read - a window that starts after it ends, or a date that names no real day - a derived opening with any gap, on a partial read, or over a window with no flows - a closing `as_of` in the future 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.
    ConnectorNo auth
  • Sum a workspace's billed amounts over a window of whole months, grouped by month, currency and billing context. Arithmetic only — this tool holds no definition of MRR or recurrence, and returns no figure the app renders. Use it when you are computing a figure whose RULES you are stating yourself: recurring revenue over a window you chose, a total restricted to the billing contexts a reader confirmed, a per-month series behind a trend you are about to describe. The server derives no MRR of its own, so an MRR figure starts here: state the rules, sum exactly those rows, then put the result on a card with `well_render_mrr`. **The window is whole months.** `from` and `to` are both the first day of a month, as YYYY-MM-01; `from` is inclusive and `to` is EXCLUSIVE, so June to August is `2026-06-01` to `2026-09-01`. A bound inside a month is refused rather than widened, and so is a window longer than 36 months. **Which rows are billed amounts is decided here, and stated so you can say it.** A draft is left out, because it has not been issued, and so is a canceled invoice. `excluded_draft_count` counts the drafts left out: a connector or document import can keep a real invoice at draft, so state the count beside any total whenever it is not zero. Billing documents count: invoices, debit notes, credit notes and subscription billing statements, so a proforma and the invoice it precedes are not summed twice, and a quote or a payment advice never is. A paid sales order counts, its unpaid rest is owed. A sales order the customer paid in full or in part is a sale for its full total, and counts as the order while no invoice bills it, then as the invoice once one does, so a store's sale counts once. An unpaid order is no sale yet. While Well is unsure that an order and an invoice are one sale, it counts the sale once, as the paid order: `pending_pairing` gives those sales per currency, with their count and net amount, already inside `totals`. When it is not empty, state "N sales to confirm" beside the total. It is `null` when the read failed. A row with no document type is read as an invoice. Every amount is NET of tax (`items_total`), because tax collected is owed onward rather than earned. **`party_scope` is required, and it decides whose invoice this is.** `sales` is what the workspace ISSUED — its receivables, and the only side revenue can come from. `purchase` is what it received. The two are the same rows read from opposite ends, so no default is offered: a server choosing a side would answer a different question from the one asked. `intra_self` is an invoice between two companies the workspace owns, and `unattributed` is one Well could place on neither side. **Those four scopes partition every invoice exactly once**, which is what makes an incomplete picture visible rather than silent. `unattributed_count` comes back on every call, whatever scope you asked for: it counts the invoices in the window that landed in that fourth bucket. State it beside any total, because an unattributed invoice may still belong in the figure and nothing here can tell you whether it does. **Every row carries ONE month, ONE currency and ONE billing context.** Currency is always a grouping key, named or not: adding EUR to USD gives a number denominated in nothing, and no field on the result would tell you it happened. Convert the per-currency subtotals yourself, at a rate you can state, before you add them. **`totals` carries one figure per currency over the whole window**: the rows of that currency folded across months and billing contexts on the server, rounded to the cent. When your figure covers every row of the call, read it from `totals` and never add rows yourself. A figure restricted to some billing contexts, such as an MRR over the contexts a reader confirmed, still comes from the rows: `totals` folds every context in, the `null` ones too. **`sum` is already net of credit notes.** A credit note subtracts its magnitude from its own month-currency-context bucket, whichever sign it was stored with; `credit_note_sum` and `credit_note_count` report what that removed, so you can say what the figure netted. Do not subtract them a second time. A bucket whose credit notes outweigh its invoices nets negative, and that is a real state rather than an error. **`billing_context` is `null` on rows that name no billing arrangement** — none stored, `unknown`, or a value Well has no label for — and that is a third answer rather than a kind of one-off. The field is filled by extraction, not by a billing system, so a workspace can carry real recurring revenue on rows that say nothing about it. `unclassified_count` totals those rows. The recurring-contexts card offers them as one choice, keyed `"unclassified"`, so apply that key to these rows and only these. Counted or not, report the count rather than letting a reader read the remainder as "everything else". `corrected_or_consolidated_count` counts the corrected and consolidated invoices among the rows. Each replaces invoices Well holds no link to, so when those originals fall in the same window the sum counts that billing twice. The rows keep them, because dropping them would lose the revenue whenever the originals fall outside the window. State the count beside any total whenever it is not zero. `excluded_malformed` counts billing documents in the window with no readable net amount or no currency. They are in none of the rows and none of the sums, so state the count beside any total. It comes back `null` when the count could not be read, which is NOT `0`: zero says every row was readable, null says nobody counted. `source_count` counts the distinct connector ids on readable, billed invoices in the requested side and window; manual invoices do not count. `synced_at` is the oldest successful sync among those sources when every source is live and has synced, and is `null` if any source is missing or has never synced. `fresh_enough` is true only when all counted sources synced within the last 24 hours. A manual-only window has zero sources, `synced_at: null`, and `fresh_enough: false`. If `source_count` is zero, say there is no connector sync time to assess. If `fresh_enough` is false and `source_count` is greater than zero, never present the sum as current: say that source data may be old or lack a successful sync, and name `synced_at` when it is available. When `party_scope.side_unknown` is true the workspace has no resolved own company, so no side filter was applied: the totals cover every invoice on both sides, and the side is not known. Say the side is unknown, never that the figure is the requested side's. When `completeness.personal_mode` is true, read `party_scope.side_unknown`, `party_scope.applied` and `sums.by_counterparty` together. With `side_unknown: true` and `applied: false`, describe personal spend or income by counterparty using the issuer/receiver buckets and their resolved labels. Do not call these amounts sales or purchases, revenue or business expenses, and do not present them as an answer for the requested side. A counterparty bucket alone does not prove which party is the person: if that is unresolved, state who billed whom and ask before assigning spend or income. Keep estimated attribution and conflicting evidence separate from this personal result. If `by_counterparty.available` is false or its `truncated` flag is true, state that limitation; do not invent a complete split. `partial: true` means the aggregate was cut short and every figure is a FLOOR rather than a measurement. **`axes` splits the window, only when you pass it.** `["counterparty"]` gives one group per other party of the invoice (the issuer on `purchase`, the receiver on `sales`), with its `counterparty_id` and `counterparty_name`. `["category"]` gives one group per category, where the category of an invoice is the confirmed transaction category the workspace holds for that party (declared by the person, or learned from corrections): an invoice carries no category of its own. Both keys together split by both. A key you asked for is `null` on the group of invoices with no value for it: no party on the invoice, or a party with no confirmed category. `groups` is folded across months and sorted largest first within each currency, net of tax and of credit notes like `rows`. `axes` takes `party_scope` `purchase` or `sales` only. `groups_truncated: true` means groups were dropped at the group cap: the groups then do not add up to `totals`, and a ranking from them may miss a larger group. The figure of the window still comes from `totals`. `groups` is empty when `party_scope.side_unknown` is true: the side filter did not apply, so no group is a supplier or a customer. The category comes from the rules of the workspace the call names: on a call that covers several workspaces, the invoices of the others fall in the `null` category. 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.
    ConnectorNo auth
  • 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.
    ConnectorNo auth
  • Put a cost breakdown YOU computed onto the cost-structure card. **This tool measures nothing.** It takes the slices and the method behind them as input and returns them for rendering. Call it only after you have computed the breakdown yourself and can state every field below from your own work, never to "get" a cost structure. The server derives no breakdown of its own. The chart draws the slices you state here, which is why every field below is required: the policy behind a grouping is the only thing that makes it checkable. **The card draws the ring, the legend and the month.** Everything else you state below is REQUIRED and reaches no pixel. All of it comes back to you in this tool's text result, which is what you write the prose from. The chart is the measure; the explanation is yours. REQUIRED, because a breakdown whose method is not stated cannot be checked: - `entries`: the slices, largest first, each a POSITIVE magnitude in `currency`. Send NO share: this tool derives every share from the amounts and returns them, and an entry carrying `pct` is refused as an unknown field. At most 4 named slices plus one rolled-up `Other`, because the card performs no rollup of its own - `period_start` and `period_end`: the INCLUSIVE bounds of the single calendar month covered. Never a quarter, never a span, never a month still running - `rung`: which grouping produced these categories. State it in prose too, so the reader knows whether they are looking at their own ledger's categories or Well's - `label_provenance`: whether a person owns those labels. A chart of accounts synced from an accounting tool is `machine`, not `curated`: the names came from the provider, not from anyone at the company - `coverage`: the outflow rows the elected grouping could label, against every outflow row the month held. This is the evidence the rung was elected on, and your prose states it - `convention` and `convention_counts`: which sign means money leaving, and the row counts you elected it from - `excluded`: what fell out, in four named groups. `no_asset_movement` is where CREDIT CARD SPEND lands, because the transfer rule drops a row with no owned asset leg and a credit card charge moves a liability. A debit card charge from a linked bank account has one asset leg, so it is an outflow like any other and is not in this group. It contains `no_owned_leg`, so never add them. Send an unmeasured LEG count as `null` rather than `0`, because zero says the rule removed nothing, and one cancelled leg count nulls all three. `unreadable_rows` is always measured and takes a number. `own_company` is the sum's `excluded_own_company`: transfers to or from the same company's account in another workspace, which your prose names inside the internal-transfers group. Send it as the sum returned it, `null` included. Under `card_spend: "at_purchase"`, `no_asset_movement` holds no card spend (the purchases are in the slices), and `card_settlement` is the sum's `excluded_card_settlement` with the outflow per currency of `excluded_card_settlement_sums` under your convention: the card repayments left out because their purchases already count. Send `count: null` and `amounts: null` when it was not measured REFUSED rather than rendered: - an entry carrying `pct`, or any other field this schema does not name. The shares are DERIVED here from the amounts, so a share you send is a second opinion the card has no way to reconcile - entries out of descending-amount order, more than 4 named slices, or an `Other` slice that is not last - a negative `amount`: a breakdown is made of magnitudes - a `period_start`/`period_end` pair that is not exactly one whole calendar month, or that names a month which has not ended - `category_key` on any rung but `category_key`, or on the rolled-up `Other` slice, which is many categories and is therefore not one of them - any `label_provenance` but `unlabelled` on a rung that carries no category: `curated`, `machine` and `mixed` each claim that someone or something chose labels the chart never shows. The converse is NOT refused, because a rung elects over the month's rows while the provenance describes the ones that survived into the slices, so a labelled rung whose labelled rows all dropped is legitimately `unlabelled` - `rung: "uncategorised"` sent beside named category slices, which is a breakdown claiming to be the absence of one - `convention: "magnitude"`: that feed keeps direction in a field no grouping reaches, so no outflow was measured. `signed` elected from ZERO negative rows is the same finding, demonstrated rather than declared - coverage wider than the month it covers, or a labelled rung that could label no rows at all - one of `excluded.internal_transfers`, `excluded.no_owned_leg` and `excluded.no_asset_movement` `null` while the others are measured: one cancelled count nulls all three, and the refusal is filed against `excluded.no_asset_movement` - a `currency` outside ISO-4217: the code is checked against the catalog, not its shape An EMPTY `entries` array is accepted, and it means nothing is categorized for that month. Say that, rather than reporting zero spend: a month with no outflow at all is a different answer and the card says so differently. 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.
    ConnectorNo auth
  • List the workspace's chart of accounts (COA) — every ledger account a counterparty default or a transaction can be assigned to. Use it to name a real `ledger_account_id` in a write instead of guessing one. Each account carries `id` (the `ledger_account_id` the writes take), `name`, and `code` (its account number, e.g. "401" for a vendor or "411" for a customer under the FR PCG) where the account has one. `truncated: true` means the chart holds MORE accounts than this page carries; read the rest with `well_query_records` on the `ledger_accounts` root. **`success: false` means the chart could not be read, NOT that the workspace has none.** An empty `accounts` on a failed read is unknown, never "no chart of accounts". 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.
    ConnectorNo auth
  • Show one of the workspace's saved canvases as a board — the blocks it holds, at the positions its author put them, exactly as stored. Answers with an ARRANGEMENT, not a measure. NO figure is resolved: every block that names a feed carries its source, type, binding and empty params, and tiles_resolved is false. Such a block stores no figure; the board is drawn with its figures by the resolve-board skill, which measures each block and calls well_render_canvas. Ask a KPI tool (well_render_cash_position, well_render_burn, well_render_runway, well_render_logged_time) for one figure; ask this when the question is about a board the workspace saved. WORKFLOW: - well_show_canvas() → the canvas the workspace touched most recently, plus every other canvas's name and id so a different one can be named. - well_show_canvas({ canvas_view_id }) → that canvas. - well_show_canvas({ origin_template: "investor-report" }) → the newest canvas built from that template. Provenance is not identity: a workspace may hold several from one template. - Add measuring: true to any of these when you read the board in order to measure it and draw it with well_render_canvas. The result is the same read. Drawn from this read alone, every figure block shows that it is not resolved yet. A note ("text") carries its own words. can_edit says whether this caller may change the board. Only its author, a workspace admin or the owner can; every other member reads it. When can_edit is false, do not offer to rearrange, rename, delete or share it: say who can change it, naming its author from author_name, and offer to ask them. Do NOT use this to save, create or rearrange a board — that is well_upsert_canvas — and do not read first to look up a board you are about to create. Read only before an UPDATE, where well_upsert_canvas needs the version this read returns.
    ConnectorNo auth
  • Show the user what Well can fetch from a provider's own web app, and the Deploy action that fetches it. Draws a "deploy agent" card with one row per provider. Each row lists every file the agent can download, each with its `export_id`, label, format and whether it is `selected`. The row's `deploy_url` opens Well's `/collect` page, the same page that deploys the invoice agents, naming the provider in `providers` and the selected files in `fetch`. When the user starts the export there, the Well browser extension opens the provider in a new tab and its agent downloads the selected files, one at a time, in the user's own signed-in session, then files each one in this workspace. Use it when the user wants data from a provider that Well cannot connect to directly, asks to "download", "export", "fetch everything" or "get the CSV" from a provider, or when the connector route is unavailable. Pass `provider_slugs` to preview the providers the user named; omit it to show every provider Well can fetch from. Pass `export_ids` when the user asked for specific files; omit it to fetch every file. A provider Well has no export for comes back in `unknown_provider_slugs`, and a file it does not list in `unknown_export_ids`: say plainly that Well cannot fetch it yet. A row whose `export_ids` matched none of its files selects nothing and has a null `deploy_url`: offer its listed files instead. This tool starts nothing and downloads nothing. Never say a file was fetched by this call: the run happens in the browser extension after the user clicks, and the extension's side panel reports it. A row's `last_run` is the one record of an earlier run in this workspace: when the user asks whether a run worked, report its `status`, when it ended and its `files_filed` as returned, and nothing more. When `refresh_due` is true, offer to fetch the files again with the row's Deploy; Well never re-runs on its own. When `harness_access` is `refused`, no row has a `deploy_url`: say this browser agent is not open to the user's account yet, and offer the upload route. When the user wants several providers at once and `deploy_all_url` is set, offer it: it deploys every row with a link, one provider after the other. When it is null, offer each row's own `deploy_url`. Give each `deploy_url` and `deploy_all_url` as returned and never build or edit one. The run needs the Well browser extension, and the user must be signed in to the provider in that browser; when a login or a two-factor code stands in the way, the agent hands the tab back to the user. When `error` is set, report it and do not read `harness_access`. 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.
    ConnectorNo auth
  • Draw the customer lifetime value (LTV) ranking as a bar chart card: one bar per customer, the highest first. **Call it once, after `well_measure_customer_ltv`, and send no figure.** It runs the measure itself for the workspace of the call and draws that result, so every name, flag and LTV on the card is the server's. You pass only: `window` as the measure's result echoed it (`from`, `to` and `month_count`), `counterparty_alias_sets` exactly as you passed them to the measure, the `currency` the card draws, `left_off_currencies` and `conversions`. Read the figures for your answer from the measure's result, not from this tool's. Do not call it when the measure returned no row: say there is nothing to rank instead. **One currency per card.** Set `currency` to the currency the card draws. Every other currency in the measure's `currencies` goes in exactly one of two places. Convert it: add a `conversions` entry with the rate into `currency` and its date, from the currency conversion step, and the tool applies it to each customer's LTV. Or leave it off: name it in `left_off_currencies`, which keeps its customers off the card, because Well has no rate for it or because converting it is not allowed. The card's own currency is never converted and never left off. A card that converts draws only when no currency on it, the card's own currency included, has more than 100 customers, because the measure cuts rows past that. Otherwise draw the card's own currency alone and name the others in `left_off_currencies`. The card draws at most 12 customers, never a summed "other" bar, and its small form quotes the average LTV per customer. The result states `average_ltv`, `customer_count` (the customers the average covers) and `left_out_count` (customers not drawn): say how many customers the card leaves out when it is above zero. REFUSED rather than drawn: - a window that reaches the running month or covers more than 60 months - a measured currency that is neither converted nor left off, or a currency the measure did not find - the card's own currency in `left_off_currencies` or in `conversions` - a rate more than 1% away from Well's stored rate for the pair on its rate date, a rate dated outside the window's last complete month, or two rates for one currency - a card that converts when the measure cut rows from a currency on it Because the measure runs again here, a ranking reads the invoices twice. That is by design: it is what ties the card to the server's figures. When `party_scope.side_unknown` is true the workspace has no resolved own company, so no side filter was applied and the ranking covers invoices on both sides. Say the side is unknown, never that these are the customers' figures. 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.
    ConnectorNo auth
  • Generate a document as a PDF and store it in the workspace. It never emails or sends anything, so a request to email or send a document is not a request to generate one. Pass exactly one source: - `params`: values you provide, with a `document_slug`. Call well_list_generative_documents first: it gives each design's document_slug and the JSON Schema its params must satisfy. Values that do not match are refused with the path and reason of each problem, so fix them and call again. The design prints light unless `params.theme` is "dark". Each call prints and stores a new document, unless you pass `document_id`. - `document_id` (with `params` only): when the user asks to change, fix or redo a document you already generated in this conversation, pass its document_id so it is replaced in place instead of adding a new file. Its document_id and links keep working and serve the new PDF. Only a document this tool generated from values can be replaced. - `invoice_id`: an invoice already in Well. The PDF prints that invoice, in its own chosen ink, and is attached to it as its document. Pass a `document_slug` to choose the design; without one, the invoice's own chosen design prints. Refused when the invoice already carries a file a user or connector supplied: a generated PDF never replaces one. Generating again updates that same document in place, so its document_id and links keep working. - `design` (with `invoice_id` only): the options the invoice-design card returned, passed exactly as the card gave them. `layout`, `theme` and `locale` choose the design, the ink and the language of this print, on an issued invoice too. `payment_terms_note_id`, `tax_rate_id`, `legal_mentions_note_id` and `payment_means_id` must equal what is saved on the invoice, or be null when nothing is saved: an id that differs is refused, so save a change with well_update_invoice_design first. Each option is optional, and every option left out keeps the value the invoice already holds. `theme` is a key of `design`, not a top-level input. Do not pass `design.layout` together with a different `document_slug`, or `design.locale` together with a different `locale`: the call is refused. Totals are never supplied: every sum is computed from the lines, so a printed total cannot disagree with the lines above it. The tool returns the stored PDF's document_id. `file` carries the PDF's name and size plus the links to fetch it. The result renders as a card with Download and View in Well; when no card is shown, hand the user `download_url`. - `download_url` saves the PDF and `signed_url` opens it in a browser. Both work with a plain HTTP GET and no auth header, and stop working at `expires_at`. - `preview_url` is a PNG image of the first page, for showing the document; add `page=N` for page N, up to `page_count`. Same token and expiry as the other links. - `sheet_url` is the document's HTML sheet, which the card draws with zoom and pan. Same token and expiry. - When the user wants to do more with a PDF already generated (attach it to an email, upload it elsewhere, read or analyse it, pass it to another tool), fetch `download_url` with a plain HTTP GET to get the bytes. - If the links have expired, call this tool again: with `params` it prints a new document with fresh links; with `invoice_id` it refreshes the same document and its links. - `app_url` opens the document in Well and never expires. - The links grant access to the file on their own: share them only with the user, never in a public place. With `invoice_id` of an issued invoice, the PDF is the issued invoice and `portal_url` is its customer page, the page its QR code opens, for the owner to forward to the customer. It is null when the invoice has no customer page.
    ConnectorNo auth
  • Save the final text of an email draft into the user's own Gmail or Outlook drafts, or hand it to the user's own email app. Well sends nothing itself. The card that `well_draft_email` shows calls this when the user presses Send. Do not call it yourself to send on the user's behalf. Draw the card with `well_draft_email` and let the user press Send. REQUIRED: `to` (at least one address), `subject` and `body_lines` (the paragraphs), all exactly as the user last saw them. `attachment_ids` are `document_id`s of this workspace. Pass the card's `draft_id` unchanged: it keys the durable write, so a second press of the same card replays the first result and never creates a second draft. Returns `status: "draft_created"` (with `mailbox_address`, `drafts_url`, and `gmail_drafts_url` holding the same link) when a draft now waits in the member's mailbox, `"draft_queued"` when the write is still owed, or `"mailto"` with a `mailto_url` — and a `fallback_reason` when the mailbox path declined. Every status carries `mailto_url`: on `draft_queued` the card keeps it as the way out, and a call after the owed write gave up answers `mailto` with the reason, so the member always keeps a way to send. `sent` is false on every one of them: the member sends the draft, never Well. The attached documents travel as the download links the body already carries, which do not expire while the document exists. Well sent nothing, so never tell the user the email was sent. A failure carries an `error_reason`; nothing was sent. 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.
    ConnectorNo auth