Skip to main content
Glama

Get connector coverage

well_get_connector_coverage
Read-only

Read what a workspace has CONNECTED and what it can connect. This draws nothing on the user's screen.

Use it for every coverage CHECK: a data skill confirming a bank is connected before it measures anything, a step that needs a workspace_connector_id, a health read on a connector the user asked about. Read each row's state and hand the answer back in your own words, in the same turn — there is no card to wait on here, and no acknowledgement to ask for.

⚠️ FOR A CONNECT STEP, CALL well_list_connectors INSTEAD. Same scope arguments, and its result draws the card with the install links and the Continue the user clicks. This tool cannot draw one, so a connect step run here leaves the user with prose and no way to act.

Do NOT read workspace_connectors records to work out connection coverage; this tool is that answer.

To tell whether the user has connected an AI app to Well over MCP, pass kind: "ai_client". A row with is_connected true is a connected AI app. On this one scope the two tools do not answer over the same set: a client Well does not recognise records its connection against a generic row, which this read carries and the install card leaves out. So ask this tool, not well_list_connectors, whether an AI app is connected.

Which rows come back: at most 14 rows, and fewer when the rows are long, kept in this order: connected rows, then rows with an unfinished, disabled or broken connection or a connect attempt that ended, then rows that carry evidence, then the rows install_all_url installs, then the other catalog rows. Connections the page did not hold can be added at the top of the first page (a browse, a slug read, or a search scoped to a kind). omitted_row_count counts every row of the page left out. connection_omitted_count counts the rows with a connection or an ended connect attempt that this result leaves out. It is 0 unless the scope holds more such rows than one result holds. When it is above 0, a kind with no connected row in this result is unchecked: say you could not check it, never that it is missing. A second read of the same scope returns the same rows, so do not repeat it; a read by slug of one tool the user names returns that tool's row. evidence_omitted_count counts the rows of this page that carry evidence and that this result leaves out. The bound keeps the evidence rows in the catalog's order, so the evidence rows returned are the first ones. A cut evidence row is unchecked, not missing: never say that Well has no reason to suggest a tool because its row is absent, and offer no install link for a tool whose row this result does not hold. To check a tool the user names whose row this result does not hold, read that tool by slug: the slug read returns its row, evidence and install link included, so answer about that tool from that row. Paging does not reach a cut row: offset + page_count moves past the whole page. When evidence_complete is true and connection_omitted_count is 0, an omitted row has no connection and no ended connect attempt, so it never changes the state of a kind: kind_states, when the result carries it, states the bank, accounting and invoicing kinds, and any other kind is answered from the rows returned, where a kind with no row that has a connection is missing. When evidence_complete is false on a catalog read (no scope, or a kind of "bank", "accounting" or "invoicing"), Well may not have read the workspace's connections: a kind with no connected row is then unchecked, so say you could not check it, never that it is missing. kind_states gives the state of each kind this read covers ("bank", "accounting" and "invoicing" with no kind, the one kind a kind of "bank", "accounting" or "invoicing" names), worked out from the rows of this workspace. Answer those kinds from it, never from the rows; in a read with one block per workspace, answer each workspace from the kind_states of its own block, next to its workspace_name, never from another block. connected: the tools in sources bring that data in: answer yes and name each one as the tool that brings it (for "bank", the cash movements), also when it is not a bank. connected_incomplete: connected, and each tool in sync_health left data out on its last run: keep going on its data and name it as incomplete beside the figure it feeds, with its summary, which names the records left out (top_target) and why (top_reason) when they are set. connecting: the tools in sources are authorised and connected, and their first data has not arrived yet: say the first sync is running. handshake: the tools in sources are still being authorised, so nothing is connected yet: say the connection is still being set up and offer to wait; never say it is connected or syncing, and never offer a new install for it. error: the tools in error_sources bring that data only once the user repairs them: say so, and do not answer a plain yes. Beside any other state, error_sources still names each tool of that kind owed a repair: name it too. missing: no tool of this workspace brings that kind. unchecked: this result cannot show every connection of that kind (a later page, a cut connection row, or a connection or evidence read that did not finish): say you could not check it, never that it is missing. sources and error_sources then name the tools of that kind this result does show, still connecting or owed a repair: name them, and do not answer a plain yes. sources and error_sources each name at most 3 tools; omitted_source_count, when present, counts the tools they leave out, whose rows name them. When the full lists would make the result too long, both lists come back empty with no sync_health: the state still holds, and the rows name each tool. A read scoped to a pick, to a named tool with no kind, or to upload_surface, storage or ai_client carries no kind_states. A result with no kind_states (one of those reads, or a result whose rows Well could not read) answers each kind from the rows: a kind is connected when a row whose connection_status is "enabled" or "processing" lists it in data_domains, whatever that tool is, so answer yes and name that tool as the one that brings that data in; a row in "need_reconnect" or "error" that lists the kind brings that data only once the user repairs it, so say so and do not answer a plain yes; a row in "to_configure" or "disabled" does not cover the kind. install_all_omitted names the service ids install_all_url does not carry: one link names a bounded number of connectors, and the row bound of this read can cut a row the link would install. This read can leave the rows those ids name out of connectors, so offer no install link for them from this result: their install links come from well_list_connectors, whose card is the connect step. On this read the list names at most 10 ids; install_all_omitted_count counts them all. To read one tool by name, pass slug. Page with offset + page_count.

The rows carry the fields of well_list_connectors, field for field. Its description carries the field reference, and this description does not repeat it, except for one rule. When the user asks what Well reads or changes in a tool, answer from the row's reads and writes only and name only their items, never data_domains, invoice_source, category_id or the tool's name. An empty reads means you do not know yet ("je ne sais pas encore" in French), and an empty writes means Well changes nothing in that tool from the chat. For a tool with is_connected false, give ONE install link, once, raw: the top-level install_all_url when it is non-null, else the row's install_url.

Before a step that runs in the user's own browser (a hand-off to the Well extension), read the top-level extension_installed. Present on a well_get_connector_coverage read only. Whether the person who asks has the Well browser extension in THIS workspace: installed, missing or unknown. The catalog rows never carry the extension, so read this field, never a records query on workspace_connectors. installed: this person opened this workspace in Well with the extension in their Chrome. Well cannot see an uninstall, so a browser hand-off can still stop; report that stop as it happens. missing: nobody has opened this workspace in Well with the extension, so a step that runs in a browser cannot run for this person yet; say so before you hand it off. unknown: Well cannot tell for this caller, for example when another member's extension is on record and this person has none; never say the extension is installed or missing, run the step and report what happens. The answer is for this person in this workspace only: another member's extension never counts as this person's, and the same person can read missing in another workspace.

Before a line that says how a payment in the user's own Chrome goes, read the top-level extension_pays_alone. Present on a well_get_connector_coverage read only. Whether Well may pay alone at the payment page of a task in the asking person's own Chrome, from that person's own pay-alone setting in THIS workspace, the same setting the payment check reads. on: the person chose that Well pays alone; Well then pays alone only under their limits, on a site the workspace trusts, and asks them first above the limits. off: Well asks the person before any payment. unknown: Well could not read it, so make no promise about how the payment goes beyond that nothing is paid before the payment page. A task in a Well browser always asks first, whatever this field says.

A row's move is null when Well is not moving that connection to a company workspace. Otherwise it is { phase, blocker }: the step the move is at and, when the move is parked, what holds it. A row with a move is in progress and never done: say the connection is being moved and takes a while, never that it moved or is ready in the new workspace. When blocker is set, say it is waiting and name the reason in plain words.

Before promising an invoice payment link, read the top-level payment_link_providers. Present on a well_get_connector_coverage read only. The providers (stripe, qonto) whose connection in THIS workspace can make an invoice payment link today, read from what each connection's token can reach. A connected, synced row that is missing here cannot make a link: never promise one for it. An absent field means the read did not run, which is not a provider that can make a link.

Before telling the user a pasted link, page, or resource on another product is out of reach ("I can't access that", "that's outside my reach", "only an admin there can do that"), call this read and check whether a connected connector could plausibly act on it. Match by the PRODUCT the link belongs to, not the raw hostname — a link on a subdomain like docs.superhuman.com or id.superhuman.com may still belong to a connector named "Superhuman Docs"; do not rule one out just because its display name and the URL's host look unrelated. If a plausible match exists, call well_list_connector_tools for it before deciding whether it actually covers the request. Only tell the user the request is out of reach after this read and finding no connector that could act on it.

Well never creates a payment card. Creating a payment card (a virtual card, a single-use card, a card with a spending cap) is not something Well does. Before you say so, when a bank is connected, read its tools with well_list_connector_tools, and never promise a card that no tool can create. Say in one line that Well cannot create the card, and that the person creates it in their bank's own app. Then offer what Well can do with the bank's data.

Input Schema

NameRequiredDescriptionDefault
qNoName search across the full catalog (e.g. a specific bank). With a `kind` of "bank", "accounting" or "invoicing", the first page also carries the tools of that kind the workspace already has. Omit for the curated view, which lists the tools with evidence first.
kindNoScope the card server-side. Three financial domains: "bank" (every bank and neobank, including the long tail of open-banking institutions, plus the platforms that hold an account like Qonto and Pennylane — never a payroll or billing tool that merely reports transactions), "accounting", and "invoicing". Plus two scopes the server resolves from display categories rather than from a financial domain: "upload_surface", the places invoices ARRIVE (mailboxes, messaging apps, file drives), and "storage", the drives Well FILES INTO (Google Drive, Dropbox, OneDrive). The last two are opposite directions on the same drives, so a workspace can hold both connections and each is offered on its own card. And "ai_client", the AI apps that read Well over MCP (Claude, Codex, the Well CLI and the like): read it to tell whether any AI app is connected. Its rows carry no install_url, since an AI app connects from its own settings. Use this for a connect-a-bank, a connect-where-invoices-arrive or a connect-where-Well-files step instead of filtering the default view yourself. Omit for every connectable connector.
slugNoExact connector slug: resolves the ONE named connector, of any kind (e.g. "notion" for a connect-Notion request). Use it when the request names a single connector, instead of `q` which name-searches. With a `kind` of "bank", "accounting" or "invoicing" (e.g. slug "pennylane" with kind "accounting"), the result also carries the tools of that kind the workspace already has, so one read answers "this tool, plus what I already have". An unknown slug returns an empty list; retry with `q` on the name then. Cannot be combined with `q`, `from_selection`, `counterparty_ids`, or any other `kind`.
limitNoMax connectors to return (1-100, default 50).
slugsNoExact connector slugs, one per tool the person named in one request (e.g. ["qonto", "pennylane"] for "connect Qonto and Pennylane"): resolves each named connector, and the result carries one `install_all_url` that installs every one of them that is not connected yet, in one browser tab. The card lists every named connector together, each one not connected yet ticked when the call also passes `intent: "connect"`. Use it instead of one call per tool when the request names two to 10 tools. A slug that matches nothing adds no row and no error, so compare the rows with the slugs you sent: your connect instructions say what to do for a named tool the read missed. Cannot be combined with `slug`, `q`, `kind`, `from_selection` or `counterparty_ids`.
intentNo"describe", with `slug` or `slugs` only: the person asked what Well does in the named tools, or whether Well can connect to them, and did not ask to connect them. "connect" changes nothing on this read, which ticks no tool.
offsetNoNumber of connectors to skip, for paging (default 0).
countryNoThe company's country as an ISO 3166-1 alpha-2 code (e.g. "FR"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. A bank brand sold in several countries (Revolut, Wise) shows that country's own connector, so pass the member's country when they name a bank. Use it on a connect-a-bank or a connect-an-accounting-tool step so the banks or accounting tools that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown: on a connect-a-bank step Well then ranks for the member's own country when it can read one, and otherwise by the banks the most Well workspaces connect, and the result says `country_unknown`.
suggestNoThe tools you suggest from something the person told you, which only you can read (their notes, your memory of them, what they said earlier): each a catalog service_id and a one-line reason in the person's language ("You told me you bank with Qonto"). Those rows gain note evidence, rank with the other tools that have evidence, and carry your reason as their suggestion_reason. Never name a tool here from a guess, an email domain or a category alone. At most 10.
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.
from_selectionNoScope the card to the connectors behind the counterparties the user picked on the missing-invoices card in this conversation, each installable one pre-checked. Use it for the connect step that FOLLOWS a vendor pick. It returns those vendors' connectors and NOTHING else: a picked connector that brings no invoices in is dropped, and no accounting or invoicing tool the user did not pick is offered here: that offer is its own step, scoped with `kind`. Cannot be combined with `q` or `kind`: those name a catalog to browse, and this names a set already decided. Returns an empty list when this conversation holds no pick for this workspace, or when no picked counterparty matched a connector.
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.
counterparty_idsNoScope the card to the connectors behind these counterparties, copied from the `company_id` of the missing-invoices rows. The explicit form of `from_selection`, for a caller holding the picked ids itself instead of a card click recorded in this session: it resolves the same connectors and filters them the same way. Passing counterparty_ids alone already scopes the card to the pick — from_selection is not needed alongside it; it cannot be combined with `q` or `kind`.
include_unsent_countsNoAdd the top-level `unsent_document_counts`: every tool Well forwards this workspace's documents to, each with how many documents it has not received yet. That array is the whole answer — it holds every one of the workspace's outbound connections, whatever catalog page was requested, and the rows carry no count at all. Off by default, because it costs an extra read. The figure is the workspace's whole backlog, not a period's.

Output Schema

NameRequiredDescriptionDefault
errorNo
limitNoThe page size that was REQUESTED. The catalog may return fewer.
scopeNoWhat this result is a list OF: the requested kind, the picked vendors' connectors, or the curated catalog when neither was asked for. The card words itself from this, so it never describes the rows as a domain that was not requested.
totalNoEvery connector matching the query, across all pages — NOT the length of `connectors`.
offsetNoHow many catalog rows this page skipped.
successYes
row_countNoHow many rows this result returns, prepended rows included; omitted_row_count counts the rest of the page. Not a paging cursor: page_count is.
connectorsNo
page_countNoThe catalog page's own length, and the ONLY safe paging cursor: advance by `offset + page_count`. `connectors` can be longer (connections the page did not hold can be prepended on the first page) or shorter (omitted_row_count rows left out), so never page by the array's length.
kind_statesNokind_states gives the state of each kind this read covers ("bank", "accounting" and "invoicing" with no kind, the one kind a kind of "bank", "accounting" or "invoicing" names), worked out from the rows of this workspace. Answer those kinds from it, never from the rows; in a read with one block per workspace, answer each workspace from the kind_states of its own block, next to its workspace_name, never from another block. connected: the tools in sources bring that data in: answer yes and name each one as the tool that brings it (for "bank", the cash movements), also when it is not a bank. connected_incomplete: connected, and each tool in sync_health left data out on its last run: keep going on its data and name it as incomplete beside the figure it feeds, with its summary, which names the records left out (top_target) and why (top_reason) when they are set. connecting: the tools in sources are authorised and connected, and their first data has not arrived yet: say the first sync is running. handshake: the tools in sources are still being authorised, so nothing is connected yet: say the connection is still being set up and offer to wait; never say it is connected or syncing, and never offer a new install for it. error: the tools in error_sources bring that data only once the user repairs them: say so, and do not answer a plain yes. Beside any other state, error_sources still names each tool of that kind owed a repair: name it too. missing: no tool of this workspace brings that kind. unchecked: this result cannot show every connection of that kind (a later page, a cut connection row, or a connection or evidence read that did not finish): say you could not check it, never that it is missing. sources and error_sources then name the tools of that kind this result does show, still connecting or owed a repair: name them, and do not answer a plain yes. sources and error_sources each name at most 3 tools; omitted_source_count, when present, counts the tools they leave out, whose rows name them. When the full lists would make the result too long, both lists come back empty with no sync_health: the state still holds, and the rows name each tool. A read scoped to a pick, to a named tool with no kind, or to upload_surface, storage or ai_client carries no kind_states. A result with no kind_states (one of those reads, or a result whose rows Well could not read) answers each kind from the rows: a kind is connected when a row whose connection_status is "enabled" or "processing" lists it in data_domains, whatever that tool is, so answer yes and name that tool as the one that brings that data in; a row in "need_reconnect" or "error" that lists the kind brings that data only once the user repairs it, so say so and do not answer a plain yes; a row in "to_configure" or "disabled" does not cover the kind.
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
country_unknownNoPresent on a bank list when no country is known for this member at all, so the banks are ranked by how many Well workspaces connected them. Ask which country the member's bank is in, then call again with `country`.
install_all_urlYesOne link that installs every installable connector in this result. Null when the result offers nothing to install, or when its scope names a set the reader has not chosen. When it is non-null it is the ONLY install link the answer offers — do not list the rows' own install_url beside it. When it is null, the rows' own install_url is the offer instead.
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.
evidence_completeNoFalse when Well could not read every source of evidence for this workspace. A row with empty `evidence` is then UNCHECKED, not clean: say you could not check, and never say there is no sign yet. True or absent means every source was read. Only a catalog read (no scope, or a `kind` of `bank`, `accounting` or `invoicing`, with or without `q` or `slug`) reads evidence: the picked-vendor (`from_selection`, `counterparty_ids`), `upload_surface`, `storage` and `ai_client` scopes read no workspace evidence. A row holds only a note you passed in `suggest`, otherwise empty `evidence`. These scopes always report false.
omitted_row_countNoHow many rows of this catalog page the result leaves out, every group included. When evidence_complete is true and connection_omitted_count is 0, an omitted row has no connection and no ended connect attempt, so it never changes the state of a kind: kind_states, when the result carries it, states the bank, accounting and invoicing kinds, and any other kind is answered from the rows returned, where a kind with no row that has a connection is missing. When evidence_complete is false on a catalog read (no scope, or a kind of "bank", "accounting" or "invoicing"), Well may not have read the workspace's connections: a kind with no connected row is then unchecked, so say you could not check it, never that it is missing.
ranked_for_countryNoPresent on a bank list when the call named no country and the workspace has none: the country Well read from the member (their phone number on WhatsApp, else their sign-up, address or bank account) and ranked the banks for. Never say where it came from. If the member's bank is in another country, ask once and call again with `country`.
resolved_workspaceNoThe workspace that answered, when the caller named none and the token authorizes several.
extension_installedNoPresent on a `well_get_connector_coverage` read only. Whether the person who asks has the Well browser extension in THIS workspace: `installed`, `missing` or `unknown`. The catalog rows never carry the extension, so read this field, never a records query on workspace_connectors. `installed`: this person opened this workspace in Well with the extension in their Chrome. Well cannot see an uninstall, so a browser hand-off can still stop; report that stop as it happens. `missing`: nobody has opened this workspace in Well with the extension, so a step that runs in a browser cannot run for this person yet; say so before you hand it off. `unknown`: Well cannot tell for this caller, for example when another member's extension is on record and this person has none; never say the extension is installed or missing, run the step and report what happens. The answer is for this person in this workspace only: another member's extension never counts as this person's, and the same person can read `missing` in another workspace.
install_all_omittedYesinstall_all_omitted names the service ids install_all_url does not carry: one link names a bounded number of connectors, and the row bound of this read can cut a row the link would install. This read can leave the rows those ids name out of connectors, so offer no install link for them from this result: their install links come from `well_list_connectors`, whose card is the connect step. On this read the list names at most 10 ids; install_all_omitted_count counts them all.
unfinished_connectsNoConnect attempts in this workspace the person has not been told about yet, newest first. `outcome` is `stopped` (the person closed the connect before it finished), `timed_out` (nobody finished it within the hour), or `still_connecting` (it started within the last 10 minutes and is still open; past that it is no longer listed). An empty array means there is nothing to tell; an absent field means nothing was read. Name a tool by its `name`. For each entry, say one short line in the reply: on `stopped` or `timed_out`, offer to connect it again or to skip it for now; on `still_connecting`, offer to wait or to skip it for now. Once the reply says the lines, call `well_mark_connects_told` with the `workspace_connector_id` of each entry it said, so a later read does not repeat them. An entry the reply did not say stays unmarked and comes back on the next read.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
extension_pays_aloneNoPresent on a `well_get_connector_coverage` read only. Whether Well may pay alone at the payment page of a task in the asking person's own Chrome, from that person's own pay-alone setting in THIS workspace, the same setting the payment check reads. `on`: the person chose that Well pays alone; Well then pays alone only under their limits, on a site the workspace trusts, and asks them first above the limits. `off`: Well asks the person before any payment. `unknown`: Well could not read it, so make no promise about how the payment goes beyond that nothing is paid before the payment page. A task in a Well browser always asks first, whatever this field says.
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.
evidence_omitted_countNoevidence_omitted_count counts the rows of this page that carry evidence and that this result leaves out. The bound keeps the evidence rows in the catalog's order, so the evidence rows returned are the first ones. A cut evidence row is unchecked, not missing: never say that Well has no reason to suggest a tool because its row is absent, and offer no install link for a tool whose row this result does not hold. To check a tool the user names whose row this result does not hold, read that tool by slug: the slug read returns its row, evidence and install link included, so answer about that tool from that row. Paging does not reach a cut row: offset + page_count moves past the whole page.
payment_link_providersNoPresent on a `well_get_connector_coverage` read only. The providers (`stripe`, `qonto`) whose connection in THIS workspace can make an invoice payment link today, read from what each connection's token can reach. A connected, synced row that is missing here cannot make a link: never promise one for it. An absent field means the read did not run, which is not a provider that can make a link.
unsent_document_countsNoEvery tool this workspace forwards documents to, each with the documents it has not received yet, biggest backlog first. Present only when `include_unsent_counts` was set. THIS IS THE ONLY PLACE THE BACKLOG IS REPORTED: it is not a page, it carries the workspace's whole set of outbound connections whether or not the requested catalog page holds their rows, and the catalog rows carry no count. An empty array means the workspace forwards to nothing; an absent field means nothing was measured. `unsent_document_count_is_upper_bound: true` means a document filter applies to that connection, so the count is a maximum and reads as `up to <n>`. Every count is read off Well's own forward record, so it measures what Well wrote down rather than what the tool confirmed. Name a tool by its `name`. An entry reading `0` is a tool that is up to date: say nothing about it.
picked_vendors_filteredNoHow many of the picked vendors' connectors were dropped for bringing no invoices in. Present on the `picked_vendors` scope only. Above zero means the card is SHORTER than the pick: say that those vendors' tools cannot deliver an invoice, rather than letting the gap read as a pick the user never made.
connection_omitted_countNoconnection_omitted_count counts the rows with a connection or an ended connect attempt that this result leaves out. It is 0 unless the scope holds more such rows than one result holds. When it is above 0, a kind with no connected row in this result is unchecked: say you could not check it, never that it is missing. A second read of the same scope returns the same rows, so do not repeat it; a read by slug of one tool the user names returns that tool's row.
install_all_omitted_countYesHow many service ids install_all_url does not carry, the ids install_all_omitted leaves out included.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • changedOutput schema / properties / connectors / items / properties / sync_health / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "reading": {
      -        "enum": [
      -          "data_incomplete",
      -          "runs_failing",
      -          "no_recent_sync"
      -        ],
      -        "type": "string"
      -      },
      -      "summary": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "reading",
      -      "summary"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "reading": {
      +        "enum": [
      +          "data_incomplete",
      +          "runs_failing",
      +          "no_recent_sync"
      +        ],
      +        "type": "string"
      +      },
      +      "summary": {
      +        "type": "string"
      +      },
      +      "top_reason": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "provider_read_failed",
      +              "access_missing",
      +              "format_not_matched",
      +              "linked_record_missing",
      +              "rows_not_stored",
      +              "fields_missing",
      +              "rows_left_out"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "top_target": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "company",
      +              "people",
      +              "invoice",
      +              "transaction",
      +              "account",
      +              "ledger_account",
      +              "journal",
      +              "journal_entry",
      +              "journal_entry_line",
      +              "account_balance",
      +              "invoice_item",
      +              "email",
      +              "payment_means",
      +              "invoice_transaction",
      +              "document",
      +              "invoice_payment",
      +              "note",
      +              "payslip",
      +              "employment_contract",
      +              "payslip_line",
      +              "activity",
      +              "subscription",
      +              "product",
      +              "project",
      +              "task",
      +              "daily_metric",
      +              "client_opportunity",
      +              "proposal",
      +              "proposal_item",
      +              "inventory"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "reading",
      +      "summary",
      +      "top_reason",
      +      "top_target"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / kind_states / description
      Previous value: -"kind_states gives the state of each kind this read covers (\"bank\", \"accounting\" and \"invoicing\" with no kind, the one kind a kind of \"bank\", \"accounting\" or \"invoicing\" names), worked out from the rows of this workspace. Answer those kinds from it, never from the rows; in a read with one block per workspace, answer each workspace from the kind_states of its own block, next to its workspace_name, never from another block. connected: the tools in sources bring that data in: answer yes and name each one as the tool that brings it (for \"bank\", the cash movements), also when it is not a bank. connected_incomplete: connected, and each tool in sync_health left data out on its last run: keep going on its data and name it as incomplete beside the figure it feeds, with its summary. connecting: the tools in sources are authorised and connected, and their first data has not arrived yet: say the first sync is running. handshake: the tools in sources are still being authorised, so nothing is connected yet: say the connection is still being set up and offer to wait; never say it is connected or syncing, and never offer a new install for it. error: the tools in error_sources bring that data only once the user repairs them: say so, and do not answer a plain yes. Beside any other state, error_sources still names each tool of that kind owed a repair: name it too. missing: no tool of this workspace brings that kind. unchecked: this result cannot show every connection of that kind (a later page, a cut connection row, or a connection or evidence read that did not finish): say you could not check it, never that it is missing. sources and error_sources then name the tools of that kind this result does show, still connecting or owed a repair: name them, and do not answer a plain yes. sources and error_sources each name at most 3 tools; omitted_source_count, when present, counts the tools they leave out, whose rows name them. When the full lists would make the result too long, both lists come back empty with no sync_health: the state still holds, and the rows name each tool. A read scoped to a pick, to a named tool with no kind, or to upload_surface, storage or ai_client carries no kind_states. A result with no kind_states (one of those reads, or a result whose rows Well could not read) answers each kind from the rows: a kind is connected when a row whose connection_status is \"enabled\" or \"processing\" lists it in data_domains, whatever that tool is, so answer yes and name that tool as the one that brings that data in; a row in \"need_reconnect\" or \"error\" that lists the kind brings that data only once the user repairs it, so say so and do not answer a plain yes; a row in \"to_configure\" or \"disabled\" does not cover the kind."New value: +"kind_states gives the state of each kind this read covers (\"bank\", \"accounting\" and \"invoicing\" with no kind, the one kind a kind of \"bank\", \"accounting\" or \"invoicing\" names), worked out from the rows of this workspace. Answer those kinds from it, never from the rows; in a read with one block per workspace, answer each workspace from the kind_states of its own block, next to its workspace_name, never from another block. connected: the tools in sources bring that data in: answer yes and name each one as the tool that brings it (for \"bank\", the cash movements), also when it is not a bank. connected_incomplete: connected, and each tool in sync_health left data out on its last run: keep going on its data and name it as incomplete beside the figure it feeds, with its summary, which names the records left out (top_target) and why (top_reason) when they are set. connecting: the tools in sources are authorised and connected, and their first data has not arrived yet: say the first sync is running. handshake: the tools in sources are still being authorised, so nothing is connected yet: say the connection is still being set up and offer to wait; never say it is connected or syncing, and never offer a new install for it. error: the tools in error_sources bring that data only once the user repairs them: say so, and do not answer a plain yes. Beside any other state, error_sources still names each tool of that kind owed a repair: name it too. missing: no tool of this workspace brings that kind. unchecked: this result cannot show every connection of that kind (a later page, a cut connection row, or a connection or evidence read that did not finish): say you could not check it, never that it is missing. sources and error_sources then name the tools of that kind this result does show, still connecting or owed a repair: name them, and do not answer a plain yes. sources and error_sources each name at most 3 tools; omitted_source_count, when present, counts the tools they leave out, whose rows name them. When the full lists would make the result too long, both lists come back empty with no sync_health: the state still holds, and the rows name each tool. A read scoped to a pick, to a named tool with no kind, or to upload_surface, storage or ai_client carries no kind_states. A result with no kind_states (one of those reads, or a result whose rows Well could not read) answers each kind from the rows: a kind is connected when a row whose connection_status is \"enabled\" or \"processing\" lists it in data_domains, whatever that tool is, so answer yes and name that tool as the one that brings that data in; a row in \"need_reconnect\" or \"error\" that lists the kind brings that data only once the user repairs it, so say so and do not answer a plain yes; a row in \"to_configure\" or \"disabled\" does not cover the kind."
    • addedOutput schema / properties / kind_states / properties / accounting / properties / sync_health / items / properties / top_reason
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "provider_read_failed",
      +        "access_missing",
      +        "format_not_matched",
      +        "linked_record_missing",
      +        "rows_not_stored",
      +        "fields_missing",
      +        "rows_left_out"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / kind_states / properties / accounting / properties / sync_health / items / properties / top_target
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "company",
      +        "people",
      +        "invoice",
      +        "transaction",
      +        "account",
      +        "ledger_account",
      +        "journal",
      +        "journal_entry",
      +        "journal_entry_line",
      +        "account_balance",
      +        "invoice_item",
      +        "email",
      +        "payment_means",
      +        "invoice_transaction",
      +        "document",
      +        "invoice_payment",
      +        "note",
      +        "payslip",
      +        "employment_contract",
      +        "payslip_line",
      +        "activity",
      +        "subscription",
      +        "product",
      +        "project",
      +        "task",
      +        "daily_metric",
      +        "client_opportunity",
      +        "proposal",
      +        "proposal_item",
      +        "inventory"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / kind_states / properties / accounting / properties / sync_health / items / required
      Previous value: -[
      -  "source",
      -  "reading",
      -  "summary"
      -]New value: +[
      +  "reading",
      +  "summary",
      +  "top_reason",
      +  "top_target",
      +  "source"
      +]
    • addedOutput schema / properties / kind_states / properties / bank / properties / sync_health / items / properties / top_reason
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "provider_read_failed",
      +        "access_missing",
      +        "format_not_matched",
      +        "linked_record_missing",
      +        "rows_not_stored",
      +        "fields_missing",
      +        "rows_left_out"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / kind_states / properties / bank / properties / sync_health / items / properties / top_target
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "company",
      +        "people",
      +        "invoice",
      +        "transaction",
      +        "account",
      +        "ledger_account",
      +        "journal",
      +        "journal_entry",
      +        "journal_entry_line",
      +        "account_balance",
      +        "invoice_item",
      +        "email",
      +        "payment_means",
      +        "invoice_transaction",
      +        "document",
      +        "invoice_payment",
      +        "note",
      +        "payslip",
      +        "employment_contract",
      +        "payslip_line",
      +        "activity",
      +        "subscription",
      +        "product",
      +        "project",
      +        "task",
      +        "daily_metric",
      +        "client_opportunity",
      +        "proposal",
      +        "proposal_item",
      +        "inventory"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / kind_states / properties / bank / properties / sync_health / items / required
      Previous value: -[
      -  "source",
      -  "reading",
      -  "summary"
      -]New value: +[
      +  "reading",
      +  "summary",
      +  "top_reason",
      +  "top_target",
      +  "source"
      +]
    • addedOutput schema / properties / kind_states / properties / invoicing / properties / sync_health / items / properties / top_reason
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "provider_read_failed",
      +        "access_missing",
      +        "format_not_matched",
      +        "linked_record_missing",
      +        "rows_not_stored",
      +        "fields_missing",
      +        "rows_left_out"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / kind_states / properties / invoicing / properties / sync_health / items / properties / top_target
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "company",
      +        "people",
      +        "invoice",
      +        "transaction",
      +        "account",
      +        "ledger_account",
      +        "journal",
      +        "journal_entry",
      +        "journal_entry_line",
      +        "account_balance",
      +        "invoice_item",
      +        "email",
      +        "payment_means",
      +        "invoice_transaction",
      +        "document",
      +        "invoice_payment",
      +        "note",
      +        "payslip",
      +        "employment_contract",
      +        "payslip_line",
      +        "activity",
      +        "subscription",
      +        "product",
      +        "project",
      +        "task",
      +        "daily_metric",
      +        "client_opportunity",
      +        "proposal",
      +        "proposal_item",
      +        "inventory"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / kind_states / properties / invoicing / properties / sync_health / items / required
      Previous value: -[
      -  "source",
      -  "reading",
      -  "summary"
      -]New value: +[
      +  "reading",
      +  "summary",
      +  "top_reason",
      +  "top_target",
      +  "source"
      +]
  2. Changed11 schema fields changed
    • changedInput schema / properties / country / description
      Previous value: -"The company's country as an ISO 3166-1 alpha-2 code (e.g. \"FR\"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. A bank brand sold in several countries (Revolut, Wise) shows that country's own connector, so pass the member's country when they name a bank. Use it on a connect-a-bank or a connect-an-accounting-tool step so the banks or accounting tools that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown, and the order is left unchanged."New value: +"The company's country as an ISO 3166-1 alpha-2 code (e.g. \"FR\"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. A bank brand sold in several countries (Revolut, Wise) shows that country's own connector, so pass the member's country when they name a bank. Use it on a connect-a-bank or a connect-an-accounting-tool step so the banks or accounting tools that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown: on a connect-a-bank step Well then ranks for the member's own country when it can read one, and otherwise by the banks the most Well workspaces connect, and the result says `country_unknown`."
    • addedOutput schema / properties / connectors / items / properties / attempt_in_progress
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / connectors / items / properties / connection_status / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "enabled",
      -      "processing",
      -      "error",
      -      "need_reconnect",
      -      "to_configure",
      -      "disabled"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "enabled",
      +      "processing",
      +      "error",
      +      "need_reconnect",
      +      "to_configure",
      +      "disabled",
      +      "connecting"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "slug",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "reads",
      -  "writes",
      -  "domain",
      -  "country_codes",
      -  "invoice_source",
      -  "reason",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "match_source",
      -  "evidence",
      -  "suggestion_reason",
      -  "is_connected",
      -  "connection_status",
      -  "connect_failure_cause",
      -  "last_connect_outcome",
      -  "sync_health",
      -  "reconnect_reason",
      -  "scope_coverage",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url",
      -  "reinstall_url",
      -  "countries",
      -  "direct_connector_service_id",
      -  "connection_paths"
      -]New value: +[
      +  "service_id",
      +  "slug",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "reads",
      +  "writes",
      +  "domain",
      +  "country_codes",
      +  "invoice_source",
      +  "reason",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "match_source",
      +  "evidence",
      +  "suggestion_reason",
      +  "is_connected",
      +  "connection_status",
      +  "connect_failure_cause",
      +  "attempt_in_progress",
      +  "last_connect_outcome",
      +  "sync_health",
      +  "reconnect_reason",
      +  "scope_coverage",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "reinstall_url",
      +  "countries",
      +  "direct_connector_service_id",
      +  "connection_paths"
      +]
    • addedOutput schema / properties / country_unknown
      Added value: +{
      +  "const": true,
      +  "description": "Present on a bank list when no country is known for this member at all, so the banks are ranked by how many Well workspaces connected them. Ask which country the member's bank is in, then call again with `country`.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / kind_states / description
      Previous value: -"kind_states gives the state of each kind this read covers (\"bank\", \"accounting\" and \"invoicing\" with no kind, the one kind a kind of \"bank\", \"accounting\" or \"invoicing\" names), worked out from the rows of this workspace. Answer those kinds from it, never from the rows; in a read with one block per workspace, answer each workspace from the kind_states of its own block, next to its workspace_name, never from another block. connected: the tools in sources bring that data in: answer yes and name each one as the tool that brings it (for \"bank\", the cash movements), also when it is not a bank. connected_incomplete: connected, and each tool in sync_health left data out on its last run: keep going on its data and name it as incomplete beside the figure it feeds, with its summary. connecting: the tools in sources are connected and their first data has not arrived yet. error: the tools in error_sources bring that data only once the user repairs them: say so, and do not answer a plain yes. Beside any other state, error_sources still names each tool of that kind owed a repair: name it too. missing: no tool of this workspace brings that kind. unchecked: this result cannot show every connection of that kind (a later page, a cut connection row, or a connection or evidence read that did not finish): say you could not check it, never that it is missing. sources and error_sources then name the tools of that kind this result does show, still connecting or owed a repair: name them, and do not answer a plain yes. sources and error_sources each name at most 3 tools; omitted_source_count, when present, counts the tools they leave out, whose rows name them. When the full lists would make the result too long, both lists come back empty with no sync_health: the state still holds, and the rows name each tool. A read scoped to a pick, to a named tool with no kind, or to upload_surface, storage or ai_client carries no kind_states. A result with no kind_states (one of those reads, or a result whose rows Well could not read) answers each kind from the rows: a kind is connected when a row whose connection_status is \"enabled\" or \"processing\" lists it in data_domains, whatever that tool is, so answer yes and name that tool as the one that brings that data in; a row in \"need_reconnect\" or \"error\" that lists the kind brings that data only once the user repairs it, so say so and do not answer a plain yes; a row in \"to_configure\" or \"disabled\" does not cover the kind."New value: +"kind_states gives the state of each kind this read covers (\"bank\", \"accounting\" and \"invoicing\" with no kind, the one kind a kind of \"bank\", \"accounting\" or \"invoicing\" names), worked out from the rows of this workspace. Answer those kinds from it, never from the rows; in a read with one block per workspace, answer each workspace from the kind_states of its own block, next to its workspace_name, never from another block. connected: the tools in sources bring that data in: answer yes and name each one as the tool that brings it (for \"bank\", the cash movements), also when it is not a bank. connected_incomplete: connected, and each tool in sync_health left data out on its last run: keep going on its data and name it as incomplete beside the figure it feeds, with its summary. connecting: the tools in sources are authorised and connected, and their first data has not arrived yet: say the first sync is running. handshake: the tools in sources are still being authorised, so nothing is connected yet: say the connection is still being set up and offer to wait; never say it is connected or syncing, and never offer a new install for it. error: the tools in error_sources bring that data only once the user repairs them: say so, and do not answer a plain yes. Beside any other state, error_sources still names each tool of that kind owed a repair: name it too. missing: no tool of this workspace brings that kind. unchecked: this result cannot show every connection of that kind (a later page, a cut connection row, or a connection or evidence read that did not finish): say you could not check it, never that it is missing. sources and error_sources then name the tools of that kind this result does show, still connecting or owed a repair: name them, and do not answer a plain yes. sources and error_sources each name at most 3 tools; omitted_source_count, when present, counts the tools they leave out, whose rows name them. When the full lists would make the result too long, both lists come back empty with no sync_health: the state still holds, and the rows name each tool. A read scoped to a pick, to a named tool with no kind, or to upload_surface, storage or ai_client carries no kind_states. A result with no kind_states (one of those reads, or a result whose rows Well could not read) answers each kind from the rows: a kind is connected when a row whose connection_status is \"enabled\" or \"processing\" lists it in data_domains, whatever that tool is, so answer yes and name that tool as the one that brings that data in; a row in \"need_reconnect\" or \"error\" that lists the kind brings that data only once the user repairs it, so say so and do not answer a plain yes; a row in \"to_configure\" or \"disabled\" does not cover the kind."
    • changedOutput schema / properties / kind_states / properties / accounting / properties / state / enum
      Previous value: -[
      -  "connected",
      -  "connected_incomplete",
      -  "connecting",
      -  "error",
      -  "missing",
      -  "unchecked"
      -]New value: +[
      +  "connected",
      +  "connected_incomplete",
      +  "connecting",
      +  "handshake",
      +  "error",
      +  "missing",
      +  "unchecked"
      +]
    • changedOutput schema / properties / kind_states / properties / bank / properties / state / enum
      Previous value: -[
      -  "connected",
      -  "connected_incomplete",
      -  "connecting",
      -  "error",
      -  "missing",
      -  "unchecked"
      -]New value: +[
      +  "connected",
      +  "connected_incomplete",
      +  "connecting",
      +  "handshake",
      +  "error",
      +  "missing",
      +  "unchecked"
      +]
    • changedOutput schema / properties / kind_states / properties / invoicing / properties / state / enum
      Previous value: -[
      -  "connected",
      -  "connected_incomplete",
      -  "connecting",
      -  "error",
      -  "missing",
      -  "unchecked"
      -]New value: +[
      +  "connected",
      +  "connected_incomplete",
      +  "connecting",
      +  "handshake",
      +  "error",
      +  "missing",
      +  "unchecked"
      +]
    • addedOutput schema / properties / ranked_for_country
      Added value: +{
      +  "description": "Present on a bank list when the call named no country and the workspace has none: the country Well read from the member (their phone number on WhatsApp, else their sign-up, address or bank account) and ranked the banks for. Never say where it came from. If the member's bank is in another country, ask once and call again with `country`.",
      +  "enum": [
      +    "AD",
      +    "AE",
      +    "AF",
      +    "AG",
      +    "AI",
      +    "AL",
      +    "AM",
      +    "AO",
      +    "AQ",
      +    "AR",
      +    "AS",
      +    "AT",
      +    "AU",
      +    "AW",
      +    "AX",
      +    "AZ",
      +    "BA",
      +    "BB",
      +    "BD",
      +    "BE",
      +    "BF",
      +    "BG",
      +    "BH",
      +    "BI",
      +    "BJ",
      +    "BL",
      +    "BM",
      +    "BN",
      +    "BO",
      +    "BQ",
      +    "BR",
      +    "BS",
      +    "BT",
      +    "BV",
      +    "BW",
      +    "BY",
      +    "BZ",
      +    "CA",
      +    "CC",
      +    "CD",
      +    "CF",
      +    "CG",
      +    "CH",
      +    "CI",
      +    "CK",
      +    "CL",
      +    "CM",
      +    "CN",
      +    "CO",
      +    "CR",
      +    "CU",
      +    "CV",
      +    "CW",
      +    "CX",
      +    "CY",
      +    "CZ",
      +    "DE",
      +    "DJ",
      +    "DK",
      +    "DM",
      +    "DO",
      +    "DZ",
      +    "EC",
      +    "EE",
      +    "EG",
      +    "EH",
      +    "ER",
      +    "ES",
      +    "ET",
      +    "FI",
      +    "FJ",
      +    "FK",
      +    "FM",
      +    "FO",
      +    "FR",
      +    "GA",
      +    "GB",
      +    "GD",
      +    "GE",
      +    "GF",
      +    "GG",
      +    "GH",
      +    "GI",
      +    "GL",
      +    "GM",
      +    "GN",
      +    "GP",
      +    "GQ",
      +    "GR",
      +    "GS",
      +    "GT",
      +    "GU",
      +    "GW",
      +    "GY",
      +    "HK",
      +    "HM",
      +    "HN",
      +    "HR",
      +    "HT",
      +    "HU",
      +    "ID",
      +    "IE",
      +    "IL",
      +    "IM",
      +    "IN",
      +    "IO",
      +    "IQ",
      +    "IR",
      +    "IS",
      +    "IT",
      +    "JE",
      +    "JM",
      +    "JO",
      +    "JP",
      +    "KE",
      +    "KG",
      +    "KH",
      +    "KI",
      +    "KM",
      +    "KN",
      +    "KP",
      +    "KR",
      +    "KW",
      +    "KY",
      +    "KZ",
      +    "LA",
      +    "LB",
      +    "LC",
      +    "LI",
      +    "LK",
      +    "LR",
      +    "LS",
      +    "LT",
      +    "LU",
      +    "LV",
      +    "LY",
      +    "MA",
      +    "MC",
      +    "MD",
      +    "ME",
      +    "MF",
      +    "MG",
      +    "MH",
      +    "MK",
      +    "ML",
      +    "MM",
      +    "MN",
      +    "MO",
      +    "MP",
      +    "MQ",
      +    "MR",
      +    "MS",
      +    "MT",
      +    "MU",
      +    "MV",
      +    "MW",
      +    "MX",
      +    "MY",
      +    "MZ",
      +    "NA",
      +    "NC",
      +    "NE",
      +    "NF",
      +    "NG",
      +    "NI",
      +    "NL",
      +    "NO",
      +    "NP",
      +    "NR",
      +    "NU",
      +    "NZ",
      +    "OM",
      +    "PA",
      +    "PE",
      +    "PF",
      +    "PG",
      +    "PH",
      +    "PK",
      +    "PL",
      +    "PM",
      +    "PN",
      +    "PR",
      +    "PS",
      +    "PT",
      +    "PW",
      +    "PY",
      +    "QA",
      +    "RE",
      +    "RO",
      +    "RS",
      +    "RU",
      +    "RW",
      +    "SA",
      +    "SB",
      +    "SC",
      +    "SD",
      +    "SE",
      +    "SG",
      +    "SH",
      +    "SI",
      +    "SJ",
      +    "SK",
      +    "SL",
      +    "SM",
      +    "SN",
      +    "SO",
      +    "SR",
      +    "SS",
      +    "ST",
      +    "SV",
      +    "SX",
      +    "SY",
      +    "SZ",
      +    "TC",
      +    "TD",
      +    "TF",
      +    "TG",
      +    "TH",
      +    "TJ",
      +    "TK",
      +    "TL",
      +    "TM",
      +    "TN",
      +    "TO",
      +    "TR",
      +    "TT",
      +    "TV",
      +    "TW",
      +    "TZ",
      +    "UA",
      +    "UG",
      +    "UM",
      +    "US",
      +    "UY",
      +    "UZ",
      +    "VA",
      +    "VC",
      +    "VE",
      +    "VG",
      +    "VI",
      +    "VN",
      +    "VU",
      +    "WF",
      +    "WS",
      +    "YE",
      +    "YT",
      +    "ZA",
      +    "ZM",
      +    "ZW"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / unfinished_connects / description
      Previous value: -"Connect attempts in this workspace the person has not been told about yet, newest first. `outcome` is `stopped` (the person closed the connect before it finished), `timed_out` (nobody finished it within the hour), or `still_connecting` (it is still open). An empty array means there is nothing to tell; an absent field means nothing was read. Name a tool by its `name`. For each entry, say one short line in the reply: on `stopped` or `timed_out`, offer to connect it again or to skip it for now; on `still_connecting`, offer to wait or to skip it for now. Once the reply says the lines, call `well_mark_connects_told` with the `workspace_connector_id` of each entry it said, so a later read does not repeat them. An entry the reply did not say stays unmarked and comes back on the next read."New value: +"Connect attempts in this workspace the person has not been told about yet, newest first. `outcome` is `stopped` (the person closed the connect before it finished), `timed_out` (nobody finished it within the hour), or `still_connecting` (it started within the last 10 minutes and is still open; past that it is no longer listed). An empty array means there is nothing to tell; an absent field means nothing was read. Name a tool by its `name`. For each entry, say one short line in the reply: on `stopped` or `timed_out`, offer to connect it again or to skip it for now; on `still_connecting`, offer to wait or to skip it for now. Once the reply says the lines, call `well_mark_connects_told` with the `workspace_connector_id` of each entry it said, so a later read does not repeat them. An entry the reply did not say stays unmarked and comes back on the next read."
  3. Changed2 schema fields changed
    • changedInput schema / properties / country / description
      Previous value: -"The company's country as an ISO 3166-1 alpha-2 code (e.g. \"FR\"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. Use it on a connect-a-bank or a connect-an-accounting-tool step so the banks or accounting tools that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown, and the order is left unchanged."New value: +"The company's country as an ISO 3166-1 alpha-2 code (e.g. \"FR\"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. A bank brand sold in several countries (Revolut, Wise) shows that country's own connector, so pass the member's country when they name a bank. Use it on a connect-a-bank or a connect-an-accounting-tool step so the banks or accounting tools that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown, and the order is left unchanged."
    • addedOutput schema / properties / connectors / items / properties / brand_country_codes
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  4. Changed1 schema field changed
    • changedOutput schema / properties / connectors / items / properties / reconnect_reason / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "auth_revoked",
      -      "auth_missing",
      -      "scope_insufficient",
      -      "login_required",
      -      "account_choice_required",
      -      "provider_identity_collision",
      -      "provider_identity_missing",
      -      "credential_rejected",
      -      "owner_not_member",
      -      "connector_replaced",
      -      "access_ending_soon",
      -      "well_side_refusal",
      -      "strong_auth_required",
      -      "provider_settings_invalid",
      -      "unknown"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "auth_revoked",
      +      "auth_missing",
      +      "scope_insufficient",
      +      "login_required",
      +      "account_choice_required",
      +      "provider_identity_collision",
      +      "provider_identity_missing",
      +      "credential_rejected",
      +      "owner_not_member",
      +      "connector_replaced",
      +      "access_ending_soon",
      +      "well_side_refusal",
      +      "strong_auth_required",
      +      "provider_settings_invalid",
      +      "phone_number_not_registered",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  5. Changed1 schema field changed
    • changedOutput schema / properties / connectors / items / properties / reads / items / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "company",
      -      "people",
      -      "invoice",
      -      "transaction",
      -      "account",
      -      "ledger_account",
      -      "journal",
      -      "journal_entry",
      -      "journal_entry_line",
      -      "account_balance",
      -      "invoice_item",
      -      "email",
      -      "payment_means",
      -      "invoice_transaction",
      -      "document",
      -      "invoice_payment",
      -      "note",
      -      "payslip",
      -      "employment_contract",
      -      "payslip_line",
      -      "activity",
      -      "subscription",
      -      "product",
      -      "project",
      -      "task"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "enum": [
      -      "calendar_event"
      -    ],
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "company",
      +      "people",
      +      "invoice",
      +      "transaction",
      +      "account",
      +      "ledger_account",
      +      "journal",
      +      "journal_entry",
      +      "journal_entry_line",
      +      "account_balance",
      +      "invoice_item",
      +      "email",
      +      "payment_means",
      +      "invoice_transaction",
      +      "document",
      +      "invoice_payment",
      +      "note",
      +      "payslip",
      +      "employment_contract",
      +      "payslip_line",
      +      "activity",
      +      "subscription",
      +      "product",
      +      "project",
      +      "task",
      +      "daily_metric"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "enum": [
      +      "calendar_event"
      +    ],
      +    "type": "string"
      +  }
      +]
  6. Changed41 schema fields changed
    • removedOutput schema / properties / connectors / items / properties / borrowed_from_workspace_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / borrowed_from_workspace_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / connect_failure_cause / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / connect_failure_cause / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / direct_connector_service_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / direct_connector_service_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / domain / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / domain / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / first_listing_complete / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / first_listing_complete / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / install_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / install_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / connectors / items / properties / last_connect_outcome / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "at": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "cause": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "cause",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "cause": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "cause",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / connectors / items / properties / last_successful_sync_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / last_successful_sync_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / lender_last_successful_sync_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / lender_last_successful_sync_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / logo_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / logo_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / match_score / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / match_score / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / connectors / items / properties / reconnect_reason / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "auth_revoked",
      -      "auth_missing",
      -      "scope_insufficient",
      -      "login_required",
      -      "account_choice_required",
      -      "provider_identity_collision",
      -      "provider_identity_missing",
      -      "credential_rejected",
      -      "owner_not_member",
      -      "connector_replaced",
      -      "access_ending_soon",
      -      "well_side_refusal",
      -      "unknown"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "auth_revoked",
      +      "auth_missing",
      +      "scope_insufficient",
      +      "login_required",
      +      "account_choice_required",
      +      "provider_identity_collision",
      +      "provider_identity_missing",
      +      "credential_rejected",
      +      "owner_not_member",
      +      "connector_replaced",
      +      "access_ending_soon",
      +      "well_side_refusal",
      +      "strong_auth_required",
      +      "provider_settings_invalid",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / connectors / items / properties / reinstall_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / reinstall_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / connectors / items / properties / scope_coverage / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "missing_scopes": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "reconnect_url": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "state": {
      -        "enum": [
      -          "complete",
      -          "missing",
      -          "unknown"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "missing_scopes",
      -      "reconnect_url"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "missing_scopes": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "reconnect_url": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "state": {
      +        "enum": [
      +          "complete",
      +          "missing",
      +          "unknown"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "missing_scopes",
      +      "reconnect_url"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / connectors / items / properties / slug / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / slug / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / suggestion_reason / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / suggestion_reason / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / teammate_connection / properties / held_by / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / teammate_connection / properties / held_by / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / teammate_connection / properties / own_install_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / teammate_connection / properties / own_install_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / connectors / items / properties / workspace_connector_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / connectors / items / properties / workspace_connector_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / install_all_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / install_all_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / resolved_workspace / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / resolved_workspace / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / unfinished_connects / items / properties / at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / unfinished_connects / items / properties / at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  7. Changed1 schema field changed
    • addedOutput schema / properties / extension_pays_alone
      Added value: +{
      +  "description": "Present on a `well_get_connector_coverage` read only. Whether Well may pay alone at the payment page of a task in the asking person's own Chrome, from that person's own pay-alone setting in THIS workspace, the same setting the payment check reads. `on`: the person chose that Well pays alone; Well then pays alone only under their limits, on a site the workspace trusts, and asks them first above the limits. `off`: Well asks the person before any payment. `unknown`: Well could not read it, so make no promise about how the payment goes beyond that nothing is paid before the payment page. A task in a Well browser always asks first, whatever this field says.",
      +  "enum": [
      +    "on",
      +    "off",
      +    "unknown"
      +  ],
      +  "type": "string"
      +}
  8. Changed3 schema fields changed
    • changedOutput schema / properties / connectors / items / properties / reads / items / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "company",
      -      "people",
      -      "invoice",
      -      "transaction",
      -      "account",
      -      "ledger_account",
      -      "journal",
      -      "journal_entry",
      -      "journal_entry_line",
      -      "account_balance",
      -      "invoice_item",
      -      "email",
      -      "payment_means",
      -      "invoice_transaction",
      -      "document",
      -      "invoice_payment",
      -      "note",
      -      "payslip",
      -      "employment_contract",
      -      "payslip_line"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "enum": [
      -      "calendar_event"
      -    ],
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "company",
      +      "people",
      +      "invoice",
      +      "transaction",
      +      "account",
      +      "ledger_account",
      +      "journal",
      +      "journal_entry",
      +      "journal_entry_line",
      +      "account_balance",
      +      "invoice_item",
      +      "email",
      +      "payment_means",
      +      "invoice_transaction",
      +      "document",
      +      "invoice_payment",
      +      "note",
      +      "payslip",
      +      "employment_contract",
      +      "payslip_line",
      +      "activity",
      +      "subscription",
      +      "product",
      +      "project",
      +      "task"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "enum": [
      +      "calendar_event"
      +    ],
      +    "type": "string"
      +  }
      +]
    • addedOutput schema / properties / connectors / items / properties / teammate_connection / properties / held_by
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / connectors / items / properties / teammate_connection / required
      Previous value: -[
      -  "own_install_url"
      -]New value: +[
      +  "held_by",
      +  "own_install_url"
      +]
  9. Changed1 schema field changed
    • addedInput schema / properties / intent
      Added value: +{
      +  "description": "\"describe\", with `slug` or `slugs` only: the person asked what Well does in the named tools, or whether Well can connect to them, and did not ask to connect them. \"connect\" changes nothing on this read, which ticks no tool.",
      +  "enum": [
      +    "describe",
      +    "connect"
      +  ],
      +  "type": "string"
      +}
  10. Changed5 schema fields changed
    • addedOutput schema / properties / connectors / items / properties / reads / items / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "company",
      +      "people",
      +      "invoice",
      +      "transaction",
      +      "account",
      +      "ledger_account",
      +      "journal",
      +      "journal_entry",
      +      "journal_entry_line",
      +      "account_balance",
      +      "invoice_item",
      +      "email",
      +      "payment_means",
      +      "invoice_transaction",
      +      "document",
      +      "invoice_payment",
      +      "note",
      +      "payslip",
      +      "employment_contract",
      +      "payslip_line"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "enum": [
      +      "calendar_event"
      +    ],
      +    "type": "string"
      +  }
      +]
    • removedOutput schema / properties / connectors / items / properties / reads / items / enum
      Removed value: -[
      -  "company",
      -  "people",
      -  "invoice",
      -  "transaction",
      -  "account",
      -  "ledger_account",
      -  "journal",
      -  "journal_entry",
      -  "journal_entry_line",
      -  "account_balance",
      -  "invoice_item",
      -  "email",
      -  "payment_means",
      -  "invoice_transaction",
      -  "document",
      -  "invoice_payment",
      -  "note",
      -  "payslip",
      -  "employment_contract",
      -  "payslip_line"
      -]
    • removedOutput schema / properties / connectors / items / properties / reads / items / type
      Removed value: -"string"
    • addedOutput schema / properties / kind_states
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "kind_states gives the state of each kind this read covers (\"bank\", \"accounting\" and \"invoicing\" with no kind, the one kind a kind of \"bank\", \"accounting\" or \"invoicing\" names), worked out from the rows of this workspace. Answer those kinds from it, never from the rows; in a read with one block per workspace, answer each workspace from the kind_states of its own block, next to its workspace_name, never from another block. connected: the tools in sources bring that data in: answer yes and name each one as the tool that brings it (for \"bank\", the cash movements), also when it is not a bank. connected_incomplete: connected, and each tool in sync_health left data out on its last run: keep going on its data and name it as incomplete beside the figure it feeds, with its summary. connecting: the tools in sources are connected and their first data has not arrived yet. error: the tools in error_sources bring that data only once the user repairs them: say so, and do not answer a plain yes. Beside any other state, error_sources still names each tool of that kind owed a repair: name it too. missing: no tool of this workspace brings that kind. unchecked: this result cannot show every connection of that kind (a later page, a cut connection row, or a connection or evidence read that did not finish): say you could not check it, never that it is missing. sources and error_sources then name the tools of that kind this result does show, still connecting or owed a repair: name them, and do not answer a plain yes. sources and error_sources each name at most 3 tools; omitted_source_count, when present, counts the tools they leave out, whose rows name them. When the full lists would make the result too long, both lists come back empty with no sync_health: the state still holds, and the rows name each tool. A read scoped to a pick, to a named tool with no kind, or to upload_surface, storage or ai_client carries no kind_states. A result with no kind_states (one of those reads, or a result whose rows Well could not read) answers each kind from the rows: a kind is connected when a row whose connection_status is \"enabled\" or \"processing\" lists it in data_domains, whatever that tool is, so answer yes and name that tool as the one that brings that data in; a row in \"need_reconnect\" or \"error\" that lists the kind brings that data only once the user repairs it, so say so and do not answer a plain yes; a row in \"to_configure\" or \"disabled\" does not cover the kind.",
      +  "properties": {
      +    "accounting": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "error_sources": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "omitted_source_count": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 9007199254740991,
      +          "type": "integer"
      +        },
      +        "sources": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "state": {
      +          "enum": [
      +            "connected",
      +            "connected_incomplete",
      +            "connecting",
      +            "error",
      +            "missing",
      +            "unchecked"
      +          ],
      +          "type": "string"
      +        },
      +        "sync_health": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "reading": {
      +                "enum": [
      +                  "data_incomplete",
      +                  "runs_failing",
      +                  "no_recent_sync"
      +                ],
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "summary": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "source",
      +              "reading",
      +              "summary"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "sources",
      +        "error_sources"
      +      ],
      +      "type": "object"
      +    },
      +    "bank": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "error_sources": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "omitted_source_count": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 9007199254740991,
      +          "type": "integer"
      +        },
      +        "sources": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "state": {
      +          "enum": [
      +            "connected",
      +            "connected_incomplete",
      +            "connecting",
      +            "error",
      +            "missing",
      +            "unchecked"
      +          ],
      +          "type": "string"
      +        },
      +        "sync_health": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "reading": {
      +                "enum": [
      +                  "data_incomplete",
      +                  "runs_failing",
      +                  "no_recent_sync"
      +                ],
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "summary": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "source",
      +              "reading",
      +              "summary"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "sources",
      +        "error_sources"
      +      ],
      +      "type": "object"
      +    },
      +    "invoicing": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "error_sources": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "omitted_source_count": {
      +          "exclusiveMinimum": 0,
      +          "maximum": 9007199254740991,
      +          "type": "integer"
      +        },
      +        "sources": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "state": {
      +          "enum": [
      +            "connected",
      +            "connected_incomplete",
      +            "connecting",
      +            "error",
      +            "missing",
      +            "unchecked"
      +          ],
      +          "type": "string"
      +        },
      +        "sync_health": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "reading": {
      +                "enum": [
      +                  "data_incomplete",
      +                  "runs_failing",
      +                  "no_recent_sync"
      +                ],
      +                "type": "string"
      +              },
      +              "source": {
      +                "type": "string"
      +              },
      +              "summary": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "source",
      +              "reading",
      +              "summary"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "sources",
      +        "error_sources"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / properties / omitted_row_count / description
      Previous value: -"How many rows of this catalog page the result leaves out, every group included. When evidence_complete is true and connection_omitted_count is 0, an omitted row has no connection and no ended connect attempt, so it never changes the state of a kind: answer each kind from the rows returned, and a kind with no row that has a connection is missing. When evidence_complete is false on a catalog read (no scope, or a kind of \"bank\", \"accounting\" or \"invoicing\"), Well may not have read the workspace's connections: a kind with no connected row is then unchecked, so say you could not check it, never that it is missing."New value: +"How many rows of this catalog page the result leaves out, every group included. When evidence_complete is true and connection_omitted_count is 0, an omitted row has no connection and no ended connect attempt, so it never changes the state of a kind: kind_states, when the result carries it, states the bank, accounting and invoicing kinds, and any other kind is answered from the rows returned, where a kind with no row that has a connection is missing. When evidence_complete is false on a catalog read (no scope, or a kind of \"bank\", \"accounting\" or \"invoicing\"), Well may not have read the workspace's connections: a kind with no connected row is then unchecked, so say you could not check it, never that it is missing."
  11. Changed2 schema fields changed
    • changedOutput schema / properties / connectors / items / properties / move / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "blocker": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "run_open",
      -              "fence_lost",
      -              "member_custody_lost",
      -              "bank_slot_over_limit",
      -              "bank_limit_unreadable",
      -              "holder_survivor_gone",
      -              "target_outside_lineage",
      -              "unique_blocked",
      -              "merge_chain",
      -              "books_not_voidable",
      -              "verify_failed",
      -              "check_failed",
      -              "not_authorized",
      -              "third_target_present",
      -              "rollback_conflict"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "phase": {
      -        "enum": [
      -          "capacity",
      -          "parties",
      -          "accounts",
      -          "payment_means",
      -          "documents",
      -          "transactions",
      -          "invoices",
      -          "statements",
      -          "followers",
      -          "links",
      -          "keyed",
      -          "owed",
      -          "books",
      -          "verify",
      -          "flip",
      -          "repost",
      -          "settle"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "phase",
      -      "blocker"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "blocker": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "run_open",
      +              "fence_lost",
      +              "member_custody_lost",
      +              "bank_slot_over_limit",
      +              "bank_limit_unreadable",
      +              "holder_survivor_gone",
      +              "target_outside_lineage",
      +              "unique_blocked",
      +              "merge_chain",
      +              "books_not_voidable",
      +              "verify_failed",
      +              "check_failed",
      +              "not_authorized",
      +              "third_target_present",
      +              "rollback_conflict",
      +              "category_links_over_cap"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "phase": {
      +        "enum": [
      +          "capacity",
      +          "parties",
      +          "accounts",
      +          "payment_means",
      +          "documents",
      +          "transactions",
      +          "invoices",
      +          "statements",
      +          "followers",
      +          "links",
      +          "keyed",
      +          "owed",
      +          "books",
      +          "verify",
      +          "flip",
      +          "repost",
      +          "settle"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "phase",
      +      "blocker"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / connectors / items / properties / reconnect_reason / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "auth_revoked",
      -      "auth_missing",
      -      "scope_insufficient",
      -      "login_required",
      -      "account_choice_required",
      -      "provider_identity_collision",
      -      "provider_identity_missing",
      -      "credential_rejected",
      -      "owner_not_member",
      -      "connector_replaced",
      -      "access_ending_soon",
      -      "unknown"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "auth_revoked",
      +      "auth_missing",
      +      "scope_insufficient",
      +      "login_required",
      +      "account_choice_required",
      +      "provider_identity_collision",
      +      "provider_identity_missing",
      +      "credential_rejected",
      +      "owner_not_member",
      +      "connector_replaced",
      +      "access_ending_soon",
      +      "well_side_refusal",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  12. Changed2 schema fields changed
    • addedOutput schema / properties / connectors / items / properties / install_opens_service_id
      Added value: +{
      +  "const": "gmail",
      +  "type": "string"
      +}
    • addedOutput schema / properties / connectors / items / properties / teammate_connection
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "own_install_url": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "required": [
      +    "own_install_url"
      +  ],
      +  "type": "object"
      +}
  13. Changed1 schema field changed
    • addedOutput schema / properties / connectors / items / properties / first_listing_complete
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  14. Changed1 schema field changed
    • changedInput schema / properties / slugs / description
      Previous value: -"Exact connector slugs, one per tool the person named in one request (e.g. [\"qonto\", \"pennylane\"] for \"connect Qonto and Pennylane\"): resolves each named connector, and the result carries one `install_all_url` that installs every one of them that is not connected yet, in one browser tab. Use it instead of one call per tool when the request names two to 10 tools. A slug that matches nothing adds no row; retry that one tool with `q` on its name. Cannot be combined with `slug`, `q`, `kind`, `from_selection` or `counterparty_ids`."New value: +"Exact connector slugs, one per tool the person named in one request (e.g. [\"qonto\", \"pennylane\"] for \"connect Qonto and Pennylane\"): resolves each named connector, and the result carries one `install_all_url` that installs every one of them that is not connected yet, in one browser tab. The card lists every named connector together, each one not connected yet ticked when the call also passes `intent: \"connect\"`. Use it instead of one call per tool when the request names two to 10 tools. A slug that matches nothing adds no row and no error, so compare the rows with the slugs you sent: your connect instructions say what to do for a named tool the read missed. Cannot be combined with `slug`, `q`, `kind`, `from_selection` or `counterparty_ids`."
  15. Changed2 schema fields changed
    • addedOutput schema / properties / connectors / items / properties / move
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "blocker": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "run_open",
      +                "fence_lost",
      +                "member_custody_lost",
      +                "bank_slot_over_limit",
      +                "bank_limit_unreadable",
      +                "holder_survivor_gone",
      +                "target_outside_lineage",
      +                "unique_blocked",
      +                "merge_chain",
      +                "books_not_voidable",
      +                "verify_failed",
      +                "check_failed",
      +                "not_authorized",
      +                "third_target_present",
      +                "rollback_conflict"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "phase": {
      +          "enum": [
      +            "capacity",
      +            "parties",
      +            "accounts",
      +            "payment_means",
      +            "documents",
      +            "transactions",
      +            "invoices",
      +            "statements",
      +            "followers",
      +            "links",
      +            "keyed",
      +            "owed",
      +            "books",
      +            "verify",
      +            "flip",
      +            "repost",
      +            "settle"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "phase",
      +        "blocker"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / connectors / items / properties / reconnect_reason / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "auth_revoked",
      -      "auth_missing",
      -      "scope_insufficient",
      -      "login_required",
      -      "account_choice_required",
      -      "provider_identity_collision",
      -      "provider_identity_missing",
      -      "credential_rejected",
      -      "owner_not_member",
      -      "connector_replaced",
      -      "unknown"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "auth_revoked",
      +      "auth_missing",
      +      "scope_insufficient",
      +      "login_required",
      +      "account_choice_required",
      +      "provider_identity_collision",
      +      "provider_identity_missing",
      +      "credential_rejected",
      +      "owner_not_member",
      +      "connector_replaced",
      +      "access_ending_soon",
      +      "unknown"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  16. Changed8 schema fields changed
    • addedOutput schema / properties / connection_omitted_count
      Added value: +{
      +  "description": "connection_omitted_count counts the rows with a connection or an ended connect attempt that this result leaves out. It is 0 unless the scope holds more such rows than one result holds. When it is above 0, a kind with no connected row in this result is unchecked: say you could not check it, never that it is missing. A second read of the same scope returns the same rows, so do not repeat it; a read by slug of one tool the user names returns that tool's row.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / evidence_omitted_count
      Added value: +{
      +  "description": "evidence_omitted_count counts the rows of this page that carry evidence and that this result leaves out. The bound keeps the evidence rows in the catalog's order, so the evidence rows returned are the first ones. A cut evidence row is unchecked, not missing: never say that Well has no reason to suggest a tool because its row is absent, and offer no install link for a tool whose row this result does not hold. To check a tool the user names whose row this result does not hold, read that tool by slug: the slug read returns its row, evidence and install link included, so answer about that tool from that row. Paging does not reach a cut row: offset + page_count moves past the whole page.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / install_all_omitted / description
      Previous value: -"The service ids install_all_url could not carry, because one link names a bounded number of connectors. Offer these rows their own install_url instead of promising the batch link covers them."New value: +"install_all_omitted names the service ids install_all_url does not carry: one link names a bounded number of connectors, and the row bound of this read can cut a row the link would install. This read can leave the rows those ids name out of connectors, so offer no install link for them from this result: their install links come from `well_list_connectors`, whose card is the connect step. On this read the list names at most 10 ids; install_all_omitted_count counts them all."
    • addedOutput schema / properties / install_all_omitted_count
      Added value: +{
      +  "description": "How many service ids install_all_url does not carry, the ids install_all_omitted leaves out included.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / omitted_row_count
      Added value: +{
      +  "description": "How many rows of this catalog page the result leaves out, every group included. When evidence_complete is true and connection_omitted_count is 0, an omitted row has no connection and no ended connect attempt, so it never changes the state of a kind: answer each kind from the rows returned, and a kind with no row that has a connection is missing. When evidence_complete is false on a catalog read (no scope, or a kind of \"bank\", \"accounting\" or \"invoicing\"), Well may not have read the workspace's connections: a kind with no connected row is then unchecked, so say you could not check it, never that it is missing.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / page_count / description
      Previous value: -"The catalog page's own length, and the ONLY safe paging cursor: advance by `offset + page_count`. `connectors` can be LONGER — on the first page of an unsearched browse the workspace's already-connected rows are prepended so they cannot be lost to the catalog's ordering — so paging by the array's length silently skips exactly that many catalog rows on every later request."New value: +"The catalog page's own length, and the ONLY safe paging cursor: advance by `offset + page_count`. `connectors` can be longer (connections the page did not hold can be prepended on the first page) or shorter (omitted_row_count rows left out), so never page by the array's length."
    • changedOutput schema / properties / row_count / description
      Previous value: -"How many rows this result puts ON THE CARD, prepended rows included. `0` on a `picked_vendors` scope means the pick has no connector behind it that can bring an invoice in: the card carries nothing to tick, so say so in half a sentence and move on. Not a paging cursor — `page_count` is."New value: +"How many rows this result returns, prepended rows included; omitted_row_count counts the rest of the page. Not a paging cursor: page_count is."
    • changedOutput schema / required
      Previous value: -[
      -  "install_all_url",
      -  "install_all_omitted",
      -  "success"
      -]New value: +[
      +  "install_all_url",
      +  "install_all_omitted",
      +  "success",
      +  "install_all_omitted_count"
      +]
  17. Changed7 schema fields changed
    • changedInput schema / properties / q / description
      Previous value: -"Name search across the full catalog (e.g. a specific bank). Omit for the curated view, which lists the tools with evidence first."New value: +"Name search across the full catalog (e.g. a specific bank). With a `kind` of \"bank\", \"accounting\" or \"invoicing\", the first page also carries the tools of that kind the workspace already has. Omit for the curated view, which lists the tools with evidence first."
    • changedInput schema / properties / slug / description
      Previous value: -"Exact connector slug: resolves the ONE named connector, of any kind (e.g. \"notion\" for a connect-Notion request). Use it when the request names a single connector, instead of `q` which name-searches. An unknown slug returns an empty list; retry with `q` on the name then. Cannot be combined with `q`, `kind`, `from_selection` or `counterparty_ids`."New value: +"Exact connector slug: resolves the ONE named connector, of any kind (e.g. \"notion\" for a connect-Notion request). Use it when the request names a single connector, instead of `q` which name-searches. With a `kind` of \"bank\", \"accounting\" or \"invoicing\" (e.g. slug \"pennylane\" with kind \"accounting\"), the result also carries the tools of that kind the workspace already has, so one read answers \"this tool, plus what I already have\". An unknown slug returns an empty list; retry with `q` on the name then. Cannot be combined with `q`, `from_selection`, `counterparty_ids`, or any other `kind`."
    • addedOutput schema / properties / connectors / items / properties / borrowed_from_workspace_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / connection_paths
      Added value: +{
      +  "items": {
      +    "enum": [
      +      "direct",
      +      "native_mcp",
      +      "open_banking"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / connectors / items / properties / lender_last_successful_sync_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "slug",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "reads",
      -  "writes",
      -  "domain",
      -  "country_codes",
      -  "invoice_source",
      -  "reason",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "match_source",
      -  "evidence",
      -  "suggestion_reason",
      -  "is_connected",
      -  "connection_status",
      -  "connect_failure_cause",
      -  "last_connect_outcome",
      -  "sync_health",
      -  "reconnect_reason",
      -  "scope_coverage",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url",
      -  "reinstall_url",
      -  "countries",
      -  "direct_connector_service_id"
      -]New value: +[
      +  "service_id",
      +  "slug",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "reads",
      +  "writes",
      +  "domain",
      +  "country_codes",
      +  "invoice_source",
      +  "reason",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "match_source",
      +  "evidence",
      +  "suggestion_reason",
      +  "is_connected",
      +  "connection_status",
      +  "connect_failure_cause",
      +  "last_connect_outcome",
      +  "sync_health",
      +  "reconnect_reason",
      +  "scope_coverage",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "reinstall_url",
      +  "countries",
      +  "direct_connector_service_id",
      +  "connection_paths"
      +]
    • 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."
  18. Changed1 schema field changed
    • addedOutput schema / properties / payment_link_providers
      Added value: +{
      +  "description": "Present on a `well_get_connector_coverage` read only. The providers (`stripe`, `qonto`) whose connection in THIS workspace can make an invoice payment link today, read from what each connection's token can reach. A connected, synced row that is missing here cannot make a link: never promise one for it. An absent field means the read did not run, which is not a provider that can make a link.",
      +  "items": {
      +    "enum": [
      +      "lago",
      +      "qonto",
      +      "stripe"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  19. Changed1 schema field changed
    • addedInput schema / properties / slugs
      Added value: +{
      +  "description": "Exact connector slugs, one per tool the person named in one request (e.g. [\"qonto\", \"pennylane\"] for \"connect Qonto and Pennylane\"): resolves each named connector, and the result carries one `install_all_url` that installs every one of them that is not connected yet, in one browser tab. Use it instead of one call per tool when the request names two to 10 tools. A slug that matches nothing adds no row; retry that one tool with `q` on its name. Cannot be combined with `slug`, `q`, `kind`, `from_selection` or `counterparty_ids`.",
      +  "items": {
      +    "maxLength": 120,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "minItems": 2,
      +  "type": "array"
      +}
  20. Changed6 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 / connectors / items / properties / reconnect_reason
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "auth_revoked",
      +        "auth_missing",
      +        "scope_insufficient",
      +        "login_required",
      +        "account_choice_required",
      +        "provider_identity_collision",
      +        "provider_identity_missing",
      +        "credential_rejected",
      +        "owner_not_member",
      +        "connector_replaced",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / reinstall_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / scope_coverage
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "missing_scopes": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "reconnect_url": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "state": {
      +          "enum": [
      +            "complete",
      +            "missing",
      +            "unknown"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "missing_scopes",
      +        "reconnect_url"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "slug",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "reads",
      -  "writes",
      -  "domain",
      -  "country_codes",
      -  "invoice_source",
      -  "reason",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "match_source",
      -  "evidence",
      -  "suggestion_reason",
      -  "is_connected",
      -  "connection_status",
      -  "connect_failure_cause",
      -  "last_connect_outcome",
      -  "sync_health",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url",
      -  "countries",
      -  "direct_connector_service_id"
      -]New value: +[
      +  "service_id",
      +  "slug",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "reads",
      +  "writes",
      +  "domain",
      +  "country_codes",
      +  "invoice_source",
      +  "reason",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "match_source",
      +  "evidence",
      +  "suggestion_reason",
      +  "is_connected",
      +  "connection_status",
      +  "connect_failure_cause",
      +  "last_connect_outcome",
      +  "sync_health",
      +  "reconnect_reason",
      +  "scope_coverage",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "reinstall_url",
      +  "countries",
      +  "direct_connector_service_id"
      +]
    • addedOutput schema / properties / extension_installed
      Added value: +{
      +  "description": "Present on a `well_get_connector_coverage` read only. Whether the person who asks has the Well browser extension in THIS workspace: `installed`, `missing` or `unknown`. The catalog rows never carry the extension, so read this field, never a records query on workspace_connectors. `installed`: this person opened this workspace in Well with the extension in their Chrome. Well cannot see an uninstall, so a browser hand-off can still stop; report that stop as it happens. `missing`: nobody has opened this workspace in Well with the extension, so a step that runs in a browser cannot run for this person yet; say so before you hand it off. `unknown`: Well cannot tell for this caller, for example when another member's extension is on record and this person has none; never say the extension is installed or missing, run the step and report what happens. The answer is for this person in this workspace only: another member's extension never counts as this person's, and the same person can read `missing` in another workspace.",
      +  "enum": [
      +    "installed",
      +    "missing",
      +    "unknown"
      +  ],
      +  "type": "string"
      +}
  21. 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"
      +}
  22. Changed10 schema fields changed
    • changedInput schema / properties / q / description
      Previous value: -"Name search across the full catalog (e.g. a specific bank). Omit for the curated, matched-first view."New value: +"Name search across the full catalog (e.g. a specific bank). Omit for the curated view, which lists the tools with evidence first."
    • addedInput schema / properties / suggest
      Added value: +{
      +  "description": "The tools you suggest from something the person told you, which only you can read (their notes, your memory of them, what they said earlier): each a catalog service_id and a one-line reason in the person's language (\"You told me you bank with Qonto\"). Those rows gain note evidence, rank with the other tools that have evidence, and carry your reason as their suggestion_reason. Never name a tool here from a guess, an email domain or a category alone. At most 10.",
      +  "items": {
      +    "properties": {
      +      "reason": {
      +        "maxLength": 120,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "maxLength": 120,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "service_id",
      +      "reason"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
    • addedOutput schema / properties / connectors / items / properties / direct_connector_service_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / evidence
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "count": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "count_is_lower_bound": {
      +        "type": "boolean"
      +      },
      +      "kind": {
      +        "enum": [
      +          "open_task",
      +          "payments",
      +          "invoices",
      +          "user_pick",
      +          "note"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "count",
      +      "count_is_lower_bound"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / connectors / items / properties / reads
      Added value: +{
      +  "items": {
      +    "enum": [
      +      "company",
      +      "people",
      +      "invoice",
      +      "transaction",
      +      "account",
      +      "ledger_account",
      +      "journal",
      +      "journal_entry",
      +      "journal_entry_line",
      +      "account_balance",
      +      "invoice_item",
      +      "email",
      +      "payment_means",
      +      "invoice_transaction",
      +      "document",
      +      "invoice_payment",
      +      "note",
      +      "payslip",
      +      "employment_contract",
      +      "payslip_line"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / connectors / items / properties / suggestion_reason
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / writes
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "slug",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "domain",
      -  "country_codes",
      -  "invoice_source",
      -  "reason",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "match_source",
      -  "is_connected",
      -  "connection_status",
      -  "connect_failure_cause",
      -  "last_connect_outcome",
      -  "sync_health",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url",
      -  "countries"
      -]New value: +[
      +  "service_id",
      +  "slug",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "reads",
      +  "writes",
      +  "domain",
      +  "country_codes",
      +  "invoice_source",
      +  "reason",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "match_source",
      +  "evidence",
      +  "suggestion_reason",
      +  "is_connected",
      +  "connection_status",
      +  "connect_failure_cause",
      +  "last_connect_outcome",
      +  "sync_health",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "countries",
      +  "direct_connector_service_id"
      +]
    • addedOutput schema / properties / evidence_complete
      Added value: +{
      +  "description": "False when Well could not read every source of evidence for this workspace. A row with empty `evidence` is then UNCHECKED, not clean: say you could not check, and never say there is no sign yet. True or absent means every source was read. Only a catalog read (no scope, or a `kind` of `bank`, `accounting` or `invoicing`, with or without `q` or `slug`) reads evidence: the picked-vendor (`from_selection`, `counterparty_ids`), `upload_surface`, `storage` and `ai_client` scopes read no workspace evidence. A row holds only a note you passed in `suggest`, otherwise empty `evidence`. These scopes always report false.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / unfinished_connects
      Added value: +{
      +  "description": "Connect attempts in this workspace the person has not been told about yet, newest first. `outcome` is `stopped` (the person closed the connect before it finished), `timed_out` (nobody finished it within the hour), or `still_connecting` (it is still open). An empty array means there is nothing to tell; an absent field means nothing was read. Name a tool by its `name`. For each entry, say one short line in the reply: on `stopped` or `timed_out`, offer to connect it again or to skip it for now; on `still_connecting`, offer to wait or to skip it for now. Once the reply says the lines, call `well_mark_connects_told` with the `workspace_connector_id` of each entry it said, so a later read does not repeat them. An entry the reply did not say stays unmarked and comes back on the next read.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "outcome": {
      +        "enum": [
      +          "stopped",
      +          "timed_out",
      +          "still_connecting"
      +        ],
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "type": "string"
      +      },
      +      "workspace_connector_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "workspace_connector_id",
      +      "service_id",
      +      "name",
      +      "outcome",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  23. Changed5 schema fields changed
    • addedOutput schema / properties / connectors / items / properties / connect_failure_cause
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / last_connect_outcome
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "at": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "cause": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "cause",
      +        "at"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / match_source
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "email",
      +        "bank",
      +        "tool",
      +        "accounting",
      +        "transaction",
      +        "scoring",
      +        "invoice",
      +        "crm",
      +        "enrichment",
      +        "user"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / sync_health
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "reading": {
      +          "enum": [
      +            "data_incomplete",
      +            "runs_failing",
      +            "no_recent_sync"
      +          ],
      +          "type": "string"
      +        },
      +        "summary": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "reading",
      +        "summary"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "slug",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "domain",
      -  "country_codes",
      -  "invoice_source",
      -  "reason",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "is_connected",
      -  "connection_status",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url",
      -  "countries"
      -]New value: +[
      +  "service_id",
      +  "slug",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "domain",
      +  "country_codes",
      +  "invoice_source",
      +  "reason",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "match_source",
      +  "is_connected",
      +  "connection_status",
      +  "connect_failure_cause",
      +  "last_connect_outcome",
      +  "sync_health",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "countries"
      +]
  24. Changed2 schema fields changed
    • addedInput schema / properties / slug
      Added value: +{
      +  "description": "Exact connector slug: resolves the ONE named connector, of any kind (e.g. \"notion\" for a connect-Notion request). Use it when the request names a single connector, instead of `q` which name-searches. An unknown slug returns an empty list; retry with `q` on the name then. Cannot be combined with `q`, `kind`, `from_selection` or `counterparty_ids`.",
      +  "maxLength": 120,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedOutput schema / properties / connectors / items / properties / reason / enum
      Previous value: -[
      -  "catalog",
      -  "picked_vendor"
      -]New value: +[
      +  "catalog",
      +  "picked_vendor",
      +  "named_connector"
      +]
  25. Changed4 schema fields changed
    • addedOutput schema / properties / connectors / items / properties / country_codes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / domain
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / connectors / items / properties / slug
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "invoice_source",
      -  "reason",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "is_connected",
      -  "connection_status",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url",
      -  "countries"
      -]New value: +[
      +  "service_id",
      +  "slug",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "domain",
      +  "country_codes",
      +  "invoice_source",
      +  "reason",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "is_connected",
      +  "connection_status",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "countries"
      +]
  26. Changed5 schema fields changed
    • addedInput schema / properties / counterparty_ids
      Added value: +{
      +  "description": "Scope the card to the connectors behind these counterparties, copied from the `company_id` of the missing-invoices rows. The explicit form of `from_selection`, for a caller holding the picked ids itself instead of a card click recorded in this session: it resolves the same connectors and filters them the same way. Passing counterparty_ids alone already scopes the card to the pick — from_selection is not needed alongside it; it cannot be combined with `q` or `kind`.",
      +  "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,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • changedInput schema / properties / country / description
      Previous value: -"The company's country as an ISO 3166-1 alpha-2 code (e.g. \"FR\"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. Use it on a connect-a-bank step so the banks that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown, and the order is left unchanged."New value: +"The company's country as an ISO 3166-1 alpha-2 code (e.g. \"FR\"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. Use it on a connect-a-bank or a connect-an-accounting-tool step so the banks or accounting tools that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown, and the order is left unchanged."
    • changedInput schema / properties / kind / description
      Previous value: -"Scope the card server-side. Three financial domains: \"bank\" (every bank and neobank, including the long tail of open-banking institutions, plus the platforms that hold an account like Qonto and Pennylane — never a payroll or billing tool that merely reports transactions), \"accounting\", and \"invoicing\". Plus two scopes the server resolves from display categories rather than from a financial domain: \"upload_surface\", the places invoices ARRIVE (mailboxes, messaging apps, file drives), and \"storage\", the drives Well FILES INTO (Google Drive, Dropbox, OneDrive). The last two are opposite directions on the same drives, so a workspace can hold both connections and each is offered on its own card. Use this for a connect-a-bank, a connect-where-invoices-arrive or a connect-where-Well-files step instead of filtering the default view yourself. Omit for every connectable connector."New value: +"Scope the card server-side. Three financial domains: \"bank\" (every bank and neobank, including the long tail of open-banking institutions, plus the platforms that hold an account like Qonto and Pennylane — never a payroll or billing tool that merely reports transactions), \"accounting\", and \"invoicing\". Plus two scopes the server resolves from display categories rather than from a financial domain: \"upload_surface\", the places invoices ARRIVE (mailboxes, messaging apps, file drives), and \"storage\", the drives Well FILES INTO (Google Drive, Dropbox, OneDrive). The last two are opposite directions on the same drives, so a workspace can hold both connections and each is offered on its own card. And \"ai_client\", the AI apps that read Well over MCP (Claude, Codex, the Well CLI and the like): read it to tell whether any AI app is connected. Its rows carry no install_url, since an AI app connects from its own settings. Use this for a connect-a-bank, a connect-where-invoices-arrive or a connect-where-Well-files step instead of filtering the default view yourself. Omit for every connectable connector."
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "bank",
      -  "accounting",
      -  "invoicing",
      -  "upload_surface",
      -  "storage"
      -]New value: +[
      +  "bank",
      +  "accounting",
      +  "invoicing",
      +  "upload_surface",
      +  "storage",
      +  "ai_client"
      +]
    • changedOutput schema / properties / scope / enum
      Previous value: -[
      -  "catalog",
      -  "bank",
      -  "accounting",
      -  "invoicing",
      -  "upload_surface",
      -  "storage",
      -  "picked_vendors"
      -]New value: +[
      +  "catalog",
      +  "bank",
      +  "accounting",
      +  "invoicing",
      +  "upload_surface",
      +  "storage",
      +  "ai_client",
      +  "picked_vendors"
      +]
  27. Changed7 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"
      +}
    • changedInput schema / properties / from_selection / description
      Previous value: -"Scope the card to the connectors behind the counterparties the user picked on the missing-invoices card this session, each installable one pre-checked. Use it for the connect step that FOLLOWS a vendor pick. It returns those vendors' connectors and NOTHING else: a picked connector that brings no invoices in is dropped, and no accounting or invoicing tool the user did not pick is offered here — that offer is its own step, scoped with `kind`. Cannot be combined with `q` or `kind` — those name a catalog to browse, and this names a set already decided. Returns an empty list when the session holds no pick for this workspace, or when no picked counterparty matched a connector."New value: +"Scope the card to the connectors behind the counterparties the user picked on the missing-invoices card in this conversation, each installable one pre-checked. Use it for the connect step that FOLLOWS a vendor pick. It returns those vendors' connectors and NOTHING else: a picked connector that brings no invoices in is dropped, and no accounting or invoicing tool the user did not pick is offered here: that offer is its own step, scoped with `kind`. Cannot be combined with `q` or `kind`: those name a catalog to browse, and this names a set already decided. Returns an empty list when this conversation holds no pick for this workspace, or when no picked counterparty matched a connector."
    • addedInput schema / properties / include_unsent_counts
      Added value: +{
      +  "const": true,
      +  "description": "Add the top-level `unsent_document_counts`: every tool Well forwards this workspace's documents to, each with how many documents it has not received yet. That array is the whole answer — it holds every one of the workspace's outbound connections, whatever catalog page was requested, and the rows carry no count at all. Off by default, because it costs an extra read. The figure is the workspace's whole backlog, not a period's.",
      +  "type": "boolean"
      +}
    • 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"
      +}
    • addedOutput schema / properties / unsent_document_counts
      Added value: +{
      +  "description": "Every tool this workspace forwards documents to, each with the documents it has not received yet, biggest backlog first. Present only when `include_unsent_counts` was set. THIS IS THE ONLY PLACE THE BACKLOG IS REPORTED: it is not a page, it carries the workspace's whole set of outbound connections whether or not the requested catalog page holds their rows, and the catalog rows carry no count. An empty array means the workspace forwards to nothing; an absent field means nothing was measured. `unsent_document_count_is_upper_bound: true` means a document filter applies to that connection, so the count is a maximum and reads as `up to <n>`. Every count is read off Well's own forward record, so it measures what Well wrote down rather than what the tool confirmed. Name a tool by its `name`. An entry reading `0` is a tool that is up to date: say nothing about it.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "name": {
      +        "type": "string"
      +      },
      +      "service_id": {
      +        "type": "string"
      +      },
      +      "unsent_document_count": {
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "unsent_document_count_is_upper_bound": {
      +        "type": "boolean"
      +      },
      +      "workspace_connector_id": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "service_id",
      +      "name",
      +      "workspace_connector_id",
      +      "unsent_document_count",
      +      "unsent_document_count_is_upper_bound"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  28. Changed5 schema fields changed
    • changedInput schema / properties / kind / description
      Previous value: -"Scope the card server-side. Three financial domains: \"bank\" (every bank and neobank, including the long tail of open-banking institutions, plus the platforms that hold an account like Qonto and Pennylane — never a payroll or billing tool that merely reports transactions), \"accounting\", and \"invoicing\". Plus \"upload_surface\": the places invoices ARRIVE — mailboxes, messaging apps, file drives — which is a set of display categories rather than a financial domain, resolved by the server. Use this for a connect-a-bank or a connect-where-invoices-arrive step instead of filtering the default view yourself. Omit for every connectable connector."New value: +"Scope the card server-side. Three financial domains: \"bank\" (every bank and neobank, including the long tail of open-banking institutions, plus the platforms that hold an account like Qonto and Pennylane — never a payroll or billing tool that merely reports transactions), \"accounting\", and \"invoicing\". Plus two scopes the server resolves from display categories rather than from a financial domain: \"upload_surface\", the places invoices ARRIVE (mailboxes, messaging apps, file drives), and \"storage\", the drives Well FILES INTO (Google Drive, Dropbox, OneDrive). The last two are opposite directions on the same drives, so a workspace can hold both connections and each is offered on its own card. Use this for a connect-a-bank, a connect-where-invoices-arrive or a connect-where-Well-files step instead of filtering the default view yourself. Omit for every connectable connector."
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "bank",
      -  "accounting",
      -  "invoicing",
      -  "upload_surface"
      -]New value: +[
      +  "bank",
      +  "accounting",
      +  "invoicing",
      +  "upload_surface",
      +  "storage"
      +]
    • changedOutput schema / properties / connectors / items / properties / connection_status / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "enabled",
      -      "processing",
      -      "error",
      -      "need_reconnect",
      -      "to_configure",
      -      "suspended",
      -      "disabled"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "enabled",
      +      "processing",
      +      "error",
      +      "need_reconnect",
      +      "to_configure",
      +      "disabled"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / row_count
      Added value: +{
      +  "description": "How many rows this result puts ON THE CARD, prepended rows included. `0` on a `picked_vendors` scope means the pick has no connector behind it that can bring an invoice in: the card carries nothing to tick, so say so in half a sentence and move on. Not a paging cursor — `page_count` is.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / scope / enum
      Previous value: -[
      -  "catalog",
      -  "bank",
      -  "accounting",
      -  "invoicing",
      -  "upload_surface",
      -  "picked_vendors"
      -]New value: +[
      +  "catalog",
      +  "bank",
      +  "accounting",
      +  "invoicing",
      +  "upload_surface",
      +  "storage",
      +  "picked_vendors"
      +]
  29. Changed8 schema fields changed
    • changedInput schema / properties / from_selection / description
      Previous value: -"Scope the card to the connectors behind the counterparties the user picked on the missing-invoices card this session, each installable one pre-checked. Use it for the connect step that FOLLOWS a vendor pick, where the user has already chosen and the card must offer only what they chose. Cannot be combined with `q` or `kind` — those name a catalog to browse, and this names a set already decided. Returns an empty list when the session holds no pick for this workspace, or when no picked counterparty matched a connector."New value: +"Scope the card to the connectors behind the counterparties the user picked on the missing-invoices card this session, each installable one pre-checked. Use it for the connect step that FOLLOWS a vendor pick. It returns those vendors' connectors and NOTHING else: a picked connector that brings no invoices in is dropped, and no accounting or invoicing tool the user did not pick is offered here — that offer is its own step, scoped with `kind`. Cannot be combined with `q` or `kind` — those name a catalog to browse, and this names a set already decided. Returns an empty list when the session holds no pick for this workspace, or when no picked counterparty matched a connector."
    • changedInput schema / properties / kind / description
      Previous value: -"Scope the catalog to one financial domain: \"bank\" (every bank and neobank, including the long tail of open-banking institutions, plus the platforms that hold an account like Qonto and Pennylane — never a payroll or billing tool that merely reports transactions), \"accounting\", or \"invoicing\". Use this for a connect-a-bank or connect-an-accounting-tool step instead of filtering the default view yourself. Omit for every connectable connector."New value: +"Scope the card server-side. Three financial domains: \"bank\" (every bank and neobank, including the long tail of open-banking institutions, plus the platforms that hold an account like Qonto and Pennylane — never a payroll or billing tool that merely reports transactions), \"accounting\", and \"invoicing\". Plus \"upload_surface\": the places invoices ARRIVE — mailboxes, messaging apps, file drives — which is a set of display categories rather than a financial domain, resolved by the server. Use this for a connect-a-bank or a connect-where-invoices-arrive step instead of filtering the default view yourself. Omit for every connectable connector."
    • changedInput schema / properties / kind / enum
      Previous value: -[
      -  "bank",
      -  "accounting",
      -  "invoicing"
      -]New value: +[
      +  "bank",
      +  "accounting",
      +  "invoicing",
      +  "upload_surface"
      +]
    • addedOutput schema / properties / connectors / items / properties / invoice_source
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / connectors / items / properties / reason
      Added value: +{
      +  "enum": [
      +    "catalog",
      +    "picked_vendor"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "is_connected",
      -  "connection_status",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url",
      -  "countries"
      -]New value: +[
      +  "service_id",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "invoice_source",
      +  "reason",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "is_connected",
      +  "connection_status",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "countries"
      +]
    • addedOutput schema / properties / picked_vendors_filtered
      Added value: +{
      +  "description": "How many of the picked vendors' connectors were dropped for bringing no invoices in. Present on the `picked_vendors` scope only. Above zero means the card is SHORTER than the pick: say that those vendors' tools cannot deliver an invoice, rather than letting the gap read as a pick the user never made.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / scope / enum
      Previous value: -[
      -  "catalog",
      -  "bank",
      -  "accounting",
      -  "invoicing",
      -  "picked_vendors"
      -]New value: +[
      +  "catalog",
      +  "bank",
      +  "accounting",
      +  "invoicing",
      +  "upload_surface",
      +  "picked_vendors"
      +]
  30. Changed3 schema fields changed
    • addedInput schema / properties / country
      Added value: +{
      +  "description": "The company's country as an ISO 3166-1 alpha-2 code (e.g. \"FR\"). When set, the connectors that serve that country sort first, then the ones that serve its region, then the rest — the order only, no row is dropped. Use it on a connect-a-bank step so the banks that fit the company appear first; take it from the workspace identity's country. Omit when the country is unknown, and the order is left unchanged.",
      +  "enum": [
      +    "AD",
      +    "AE",
      +    "AF",
      +    "AG",
      +    "AI",
      +    "AL",
      +    "AM",
      +    "AO",
      +    "AQ",
      +    "AR",
      +    "AS",
      +    "AT",
      +    "AU",
      +    "AW",
      +    "AX",
      +    "AZ",
      +    "BA",
      +    "BB",
      +    "BD",
      +    "BE",
      +    "BF",
      +    "BG",
      +    "BH",
      +    "BI",
      +    "BJ",
      +    "BL",
      +    "BM",
      +    "BN",
      +    "BO",
      +    "BQ",
      +    "BR",
      +    "BS",
      +    "BT",
      +    "BV",
      +    "BW",
      +    "BY",
      +    "BZ",
      +    "CA",
      +    "CC",
      +    "CD",
      +    "CF",
      +    "CG",
      +    "CH",
      +    "CI",
      +    "CK",
      +    "CL",
      +    "CM",
      +    "CN",
      +    "CO",
      +    "CR",
      +    "CU",
      +    "CV",
      +    "CW",
      +    "CX",
      +    "CY",
      +    "CZ",
      +    "DE",
      +    "DJ",
      +    "DK",
      +    "DM",
      +    "DO",
      +    "DZ",
      +    "EC",
      +    "EE",
      +    "EG",
      +    "EH",
      +    "ER",
      +    "ES",
      +    "ET",
      +    "FI",
      +    "FJ",
      +    "FK",
      +    "FM",
      +    "FO",
      +    "FR",
      +    "GA",
      +    "GB",
      +    "GD",
      +    "GE",
      +    "GF",
      +    "GG",
      +    "GH",
      +    "GI",
      +    "GL",
      +    "GM",
      +    "GN",
      +    "GP",
      +    "GQ",
      +    "GR",
      +    "GS",
      +    "GT",
      +    "GU",
      +    "GW",
      +    "GY",
      +    "HK",
      +    "HM",
      +    "HN",
      +    "HR",
      +    "HT",
      +    "HU",
      +    "ID",
      +    "IE",
      +    "IL",
      +    "IM",
      +    "IN",
      +    "IO",
      +    "IQ",
      +    "IR",
      +    "IS",
      +    "IT",
      +    "JE",
      +    "JM",
      +    "JO",
      +    "JP",
      +    "KE",
      +    "KG",
      +    "KH",
      +    "KI",
      +    "KM",
      +    "KN",
      +    "KP",
      +    "KR",
      +    "KW",
      +    "KY",
      +    "KZ",
      +    "LA",
      +    "LB",
      +    "LC",
      +    "LI",
      +    "LK",
      +    "LR",
      +    "LS",
      +    "LT",
      +    "LU",
      +    "LV",
      +    "LY",
      +    "MA",
      +    "MC",
      +    "MD",
      +    "ME",
      +    "MF",
      +    "MG",
      +    "MH",
      +    "MK",
      +    "ML",
      +    "MM",
      +    "MN",
      +    "MO",
      +    "MP",
      +    "MQ",
      +    "MR",
      +    "MS",
      +    "MT",
      +    "MU",
      +    "MV",
      +    "MW",
      +    "MX",
      +    "MY",
      +    "MZ",
      +    "NA",
      +    "NC",
      +    "NE",
      +    "NF",
      +    "NG",
      +    "NI",
      +    "NL",
      +    "NO",
      +    "NP",
      +    "NR",
      +    "NU",
      +    "NZ",
      +    "OM",
      +    "PA",
      +    "PE",
      +    "PF",
      +    "PG",
      +    "PH",
      +    "PK",
      +    "PL",
      +    "PM",
      +    "PN",
      +    "PR",
      +    "PS",
      +    "PT",
      +    "PW",
      +    "PY",
      +    "QA",
      +    "RE",
      +    "RO",
      +    "RS",
      +    "RU",
      +    "RW",
      +    "SA",
      +    "SB",
      +    "SC",
      +    "SD",
      +    "SE",
      +    "SG",
      +    "SH",
      +    "SI",
      +    "SJ",
      +    "SK",
      +    "SL",
      +    "SM",
      +    "SN",
      +    "SO",
      +    "SR",
      +    "SS",
      +    "ST",
      +    "SV",
      +    "SX",
      +    "SY",
      +    "SZ",
      +    "TC",
      +    "TD",
      +    "TF",
      +    "TG",
      +    "TH",
      +    "TJ",
      +    "TK",
      +    "TL",
      +    "TM",
      +    "TN",
      +    "TO",
      +    "TR",
      +    "TT",
      +    "TV",
      +    "TW",
      +    "TZ",
      +    "UA",
      +    "UG",
      +    "UM",
      +    "US",
      +    "UY",
      +    "UZ",
      +    "VA",
      +    "VC",
      +    "VE",
      +    "VG",
      +    "VI",
      +    "VN",
      +    "VU",
      +    "WF",
      +    "WS",
      +    "YE",
      +    "YT",
      +    "ZA",
      +    "ZM",
      +    "ZW"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / connectors / items / properties / countries
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / connectors / items / required
      Previous value: -[
      -  "service_id",
      -  "name",
      -  "category_id",
      -  "status",
      -  "direction",
      -  "data_domains",
      -  "logo_url",
      -  "popularity_score",
      -  "is_matched",
      -  "is_selected",
      -  "match_score",
      -  "is_connected",
      -  "connection_status",
      -  "workspace_connector_id",
      -  "last_successful_sync_at",
      -  "sync_in_progress",
      -  "is_preselected",
      -  "install_url"
      -]New value: +[
      +  "service_id",
      +  "name",
      +  "category_id",
      +  "status",
      +  "direction",
      +  "data_domains",
      +  "logo_url",
      +  "popularity_score",
      +  "is_matched",
      +  "is_selected",
      +  "match_score",
      +  "is_connected",
      +  "connection_status",
      +  "workspace_connector_id",
      +  "last_successful_sync_at",
      +  "sync_in_progress",
      +  "is_preselected",
      +  "install_url",
      +  "countries"
      +]
  31. Added

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark this as read-only, non-destructive, and closed-world, but the description adds substantial behavioral context: no card is drawn, rows are bounded and ordered, omitted counts alter what can be concluded, and repeated reads are stable. It also discloses special return fields such as extension_installed, extension_pays_alone, payment_link_providers, and move state, plus the risk of false conclusions from omitted rows.

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?

The description is front-loaded with a clear purpose and organized by operational concern, and most detail is relevant to a high-complexity coverage tool. However, it is extremely long and repeatedly restates the same omission and unchecked-state rules, so it is not concise even though the repetition serves correctness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 15 parameters, output schema, and read-only annotations, the description covers the operational context an agent needs: when to use it, how to interpret partial coverage, how to handle paging, and how to avoid claiming a connector is missing when the result is incomplete. It also covers specialized top-level fields and the key exception for AI-client connectivity.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains every parameter in detail, including kind, slug, slugs, country, intent, suggest, workspace_id, from_selection, counterparty_ids, and paging. The description reinforces a few important parameter uses, such as kind: "ai_client" and slug reads, but most parameter meaning is already carried by the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: read what a workspace has CONNECTED and can connect, with the explicit scope that it draws nothing. It clearly distinguishes this coverage read from the connect-action sibling well_list_connectors and from reading workspace_connectors records directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance for coverage checks, data-skill preconditions, workspace_connector_id lookups, and health checks, while explicitly routing connect steps to well_list_connectors. It also names a special case where this tool is preferred over well_list_connectors: checking whether an AI app is connected via kind: "ai_client".

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