Skip to main content
Glama

Show the workspace picker

well_show_workspace_picker
Read-only

Ask the user WHICH workspace to work in, on a card: one tile per authorized workspace, with its logo and the company behind it.

⚠️ ONLY when the token authorizes SEVERAL workspaces and no hint resolves to one. Every other case is yours to settle with well_list_workspaces, which draws nothing: exactly one workspace in the grant, a name or company the user already named, a pin this conversation itself wrote, or no workspace at all. A chooser over a set of one asks nothing, and a chooser you could have answered yourself asks the reader a question you already know the answer to. One narrow exception: a define-workspace run that requires a company workspace draws this card over the single company workspace under a membership, scoped with workspace_ids, so the person consents before the move; its Not now resolves unresolved and moves nothing.

⚠️ WAIT ON THE CARD IN THE TURN THAT DREW IT. Write your one line for the user FIRST — the wait holds the turn open for up to a minute, and a user looking at a card with no sentence beside it has been given no reason to click — then call well_wait_for_selection({ kind: "workspace" }), which this result's next_step also states. The click writes the pin server-side, so never follow it with well_switch_workspace.

⚠️ NEVER DEFAULT TO THE PRIMARY WORKSPACE on the user's behalf, and do not restate the workspaces in text under the card.

⚠️ WRITE reply IN THE USER'S LANGUAGE, WITH {picked} WHERE THE WORKSPACE NAME BELONGS. A click sends that sentence into the conversation as the person's own message, and the card puts the workspace they actually picked in place of the placeholder. A sentence left unwritten sends English to a reader who is not writing in English; a sentence that names a workspace itself is refused, because you are writing it before they have chosen.

The rows are the rows of well_list_workspaces, field for field. Its description carries the field reference, and this description does not repeat it.

Input Schema

NameRequiredDescriptionDefault
replyNoOne sentence, IN THE LANGUAGE THE USER IS WRITING IN, that the click sends into the conversation as their own message. Write what the PERSON would say about the workspace they pick, in their words, not an instruction to yourself. You write it BEFORE they click, so you cannot know what they will choose: put {picked} where the pick belongs and the card replaces it with the names they actually picked, one or several. In English it would read "Let's work on {picked}." Write the same shape in the user's language. {picked} is required: a sentence that names a pick itself names the one you guessed, so the card refuses it and sends its own English instead. At most 160 characters. Omitted sends an English sentence the card builds itself, which is wrong for any reader not writing in English.
titleNoHeading for the picker card, framing the step in its flow (e.g. "Which company are we closing?"). At most 120 characters. Omit to keep the default wording; an empty string is rejected rather than rendered as a blank heading.
subtitleNoSupporting line under the picker card's heading. At most 240 characters. Omit to keep the default wording; an empty string is rejected rather than rendered blank.
workspace_idNoTarget workspace. Optional: this tool describes the token itself rather than one workspace's data, so omitting it returns the same answer.
workspace_idsNoScope the tiles to this subset of the authorized workspaces, e.g. the company workspaces under one membership. Every id must be one this token authorizes; an id outside the grant refuses the call. Omit to draw every authorized workspace.
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.

Output Schema

NameRequiredDescriptionDefault
errorNo
sessionNoWhat this conversation's card clicks recorded so far; null/empty fields when nothing was clicked yet.
successYes
next_stepNoWhat to do with the card this result renders. Added by the dispatcher when the card asks for a click.
workspacesYes
field_legendNo
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
default_workspace_idYesThe tile the picker card preselects on a brand-new account: the demo workspace, when the grant holds exactly one demo and every other workspace is still empty (no company of its own, no registered name, currency or fiscal year, no connected source, no business data) and this conversation has not pinned another workspace. Null otherwise, and on a scoped picker. It chooses nothing: nothing acts on it without the person's click. Not the same as is_primary.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / field_legend
      Added value: +{
      +  "type": "string"
      +}
  2. Changed31 schema fields changed
    • removedOutput schema / properties / default_workspace_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / default_workspace_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / session / properties / pinned_workspace_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / session / properties / pinned_workspace_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / session / properties / selected_counterparties / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "counterparties": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "company_id": {
      -              "type": "string"
      -            },
      -            "matched_connector_service_id": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "description": "The connector that can fetch this counterparty's invoices; null when none matched."
      -            }
      -          },
      -          "required": [
      -            "company_id",
      -            "matched_connector_service_id"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "workspace_id": {
      -        "description": "The workspace the picked company ids belong to.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "workspace_id",
      -      "counterparties"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "counterparties": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "company_id": {
      +              "type": "string"
      +            },
      +            "matched_connector_service_id": {
      +              "description": "The connector that can fetch this counterparty's invoices; null when none matched.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "company_id",
      +            "matched_connector_service_id"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "workspace_id": {
      +        "description": "The workspace the picked company ids belong to.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "workspace_id",
      +      "counterparties"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / workspaces / items / properties / has_bank_transactions / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / has_bank_transactions / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / holds_records / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / holds_records / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / base_currency / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / base_currency / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / country / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / country / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / country_default_fiscal_year_start_month / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / country_default_fiscal_year_start_month / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / domain / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / domain / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / fiscal_year_start_month / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / fiscal_year_start_month / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / registered_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / registered_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / registered_value / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / registered_value / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / identity / properties / trade_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / trade_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / lineage_parent_workspace_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / lineage_parent_workspace_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / own_company_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / own_company_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / workspaces / items / properties / workspace_name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / workspaces / items / properties / workspace_name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  3. Changed6 schema fields changed
    • changedOutput schema / properties / newly_connected / description
      Previous value: -"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. Start the reply with one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."New value: +"Tools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: \"<name> is connected.\". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later."
    • changedOutput schema / properties / workspaces / items / properties / holds_records / description
      Previous value: -"On a membership row (no own_company_id and no lineage_parent_workspace_id), whether the workspace holds anything a new company workspace would leave behind: a data source connected or still connecting, or any transaction, invoice, document or journal entry. true means it holds records, false means it holds none, null means the signal could not be read or the row is not a membership row. Only false shows the membership is empty."New value: +"On a row whose workspace_situation is personal or unmarked_root, whether the workspace holds anything a new company workspace would leave behind: a data source connected or still connecting, or any transaction, invoice, document or journal entry. true means it holds records, false means it holds none, null means the signal could not be read or the row is another class. Only false shows the workspace is empty."
    • changedOutput schema / properties / workspaces / items / properties / own_company_id / description
      Previous value: -"The public id of the company this workspace is anchored to, or null. A row that carries it is a company workspace, the one the close flow runs in; a row without it is a membership workspace."New value: +"The public id of the company this workspace is anchored to, or null when there is no live anchor — including a company workspace whose anchor company was deleted. A row without it is NOT thereby a membership workspace; workspace_situation says what the workspace is."
    • changedOutput schema / properties / workspaces / items / properties / role / description
      Previous value: -"\"membership\" on the person's own space, which files household categories. null on a company workspace, a demo, and a space older than the marker, which file business categories."New value: +"\"membership\" on the person's own space, which files household categories. null on a company workspace, a demo, a space older than the marker, and a row that cannot be resolved. workspace_situation says what the workspace is; role is the stored marker behind its \"personal\" class, not a signal to combine with other fields."
    • addedOutput schema / properties / workspaces / items / properties / workspace_situation
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "personal",
      +        "demo",
      +        "company_child",
      +        "legacy_child",
      +        "company",
      +        "unmarked_root"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "What the workspace IS for the account, already decided — never re-derive it from the other fields. \"personal\": the person's own space, which files household categories. \"demo\": the sample-data workspace a sign-up opens with; never report its figures as the company's own. \"company_child\": a company workspace created under another workspace, which lineage_parent_workspace_id names. \"legacy_child\": a company workspace created under another workspace by the old parent pointer, whose company no person has confirmed yet (own_company_id is null until a person confirms it); it has no lineage_parent_workspace_id. \"company\": a company's own workspace — the close flow runs in one — even when own_company_id is null. \"unmarked_root\": a real workspace carrying no mark: not the person's own space, anchored to nothing, created under nothing. null when the class could not be read; say the workspace's class is unknown rather than guess."
      +}
    • changedOutput schema / properties / workspaces / items / required
      Previous value: -[
      -  "workspace_id",
      -  "workspace_name",
      -  "is_primary",
      -  "kind",
      -  "own_company_id",
      -  "role",
      -  "lineage_parent_workspace_id",
      -  "holds_records",
      -  "has_bank_transactions",
      -  "identity"
      -]New value: +[
      +  "workspace_id",
      +  "workspace_name",
      +  "is_primary",
      +  "kind",
      +  "own_company_id",
      +  "role",
      +  "workspace_situation",
      +  "lineage_parent_workspace_id",
      +  "holds_records",
      +  "has_bank_transactions",
      +  "identity"
      +]
  4. Changed3 schema fields changed
    • changedOutput schema / properties / workspaces / items / properties / read_only / description
      Previous value: -"In Well's in-app chat only: true on a company workspace the turn does not act in — one created under the turn's membership and listed beside it, or a family child the turn's grant carries. Either way the row names the turn's workspace as its lineage_parent_workspace_id, so the membership can be told apart from its companies. No tool of this turn acts in it; only a switch moves the chat there. Absent on the turn's own workspace, and on every row over MCP."New value: +"In Well's in-app chat only: true on a company workspace the turn does not act in — one created under the turn's membership and listed beside it, or a family child the turn's grant carries. Either way the row names the turn's workspace as its lineage_parent_workspace_id, so the membership can be told apart from its companies. No tool of this turn acts in it; only a switch moves the chat there. Absent on the turn's own workspace, on every row over MCP, and on WhatsApp on a company workspace of the person's own that a call reaches by its workspace_id."
    • addedOutput schema / properties / workspaces / items / properties / role
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "membership"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "\"membership\" on the person's own space, which files household categories. null on a company workspace, a demo, and a space older than the marker, which file business categories."
      +}
    • changedOutput schema / properties / workspaces / items / required
      Previous value: -[
      -  "workspace_id",
      -  "workspace_name",
      -  "is_primary",
      -  "kind",
      -  "own_company_id",
      -  "lineage_parent_workspace_id",
      -  "holds_records",
      -  "has_bank_transactions",
      -  "identity"
      -]New value: +[
      +  "workspace_id",
      +  "workspace_name",
      +  "is_primary",
      +  "kind",
      +  "own_company_id",
      +  "role",
      +  "lineage_parent_workspace_id",
      +  "holds_records",
      +  "has_bank_transactions",
      +  "identity"
      +]
  5. Changed2 schema fields changed
    • addedInput schema / properties / workspace_scope
      Added value: +{
      +  "description": "Restrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.",
      +  "enum": [
      +    "family"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / workspaces / items / properties / read_only / description
      Previous value: -"In Well's in-app chat only: true on a company workspace created under the turn's membership, listed beside it so the membership can be told apart from its companies. No tool of this turn acts in it; only a switch moves the chat there. Absent on every row of the grant."New value: +"In Well's in-app chat only: true on a company workspace the turn does not act in — one created under the turn's membership and listed beside it, or a family child the turn's grant carries. Either way the row names the turn's workspace as its lineage_parent_workspace_id, so the membership can be told apart from its companies. No tool of this turn acts in it; only a switch moves the chat there. Absent on the turn's own workspace, and on every row over MCP."
  6. 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"
      +}
  7. Changed1 schema field changed
    • addedOutput schema / properties / workspaces / items / properties / read_only
      Added value: +{
      +  "const": true,
      +  "description": "In Well's in-app chat only: true on a company workspace created under the turn's membership, listed beside it so the membership can be told apart from its companies. No tool of this turn acts in it; only a switch moves the chat there. Absent on every row of the grant.",
      +  "type": "boolean"
      +}
  8. Changed4 schema fields changed
    • addedOutput schema / properties / default_workspace_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The tile the picker card preselects on a brand-new account: the demo workspace, when the grant holds exactly one demo and every other workspace is still empty (no company of its own, no registered name, currency or fiscal year, no connected source, no business data) and this conversation has not pinned another workspace. Null otherwise, and on a scoped picker. It chooses nothing: nothing acts on it without the person's click. Not the same as is_primary."
      +}
    • addedOutput schema / properties / workspaces / items / properties / holds_records
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "On a membership row (no own_company_id and no lineage_parent_workspace_id), whether the workspace holds anything a new company workspace would leave behind: a data source connected or still connecting, or any transaction, invoice, document or journal entry. true means it holds records, false means it holds none, null means the signal could not be read or the row is not a membership row. Only false shows the membership is empty."
      +}
    • changedOutput schema / properties / workspaces / items / required
      Previous value: -[
      -  "workspace_id",
      -  "workspace_name",
      -  "is_primary",
      -  "kind",
      -  "own_company_id",
      -  "lineage_parent_workspace_id",
      -  "has_bank_transactions",
      -  "identity"
      -]New value: +[
      +  "workspace_id",
      +  "workspace_name",
      +  "is_primary",
      +  "kind",
      +  "own_company_id",
      +  "lineage_parent_workspace_id",
      +  "holds_records",
      +  "has_bank_transactions",
      +  "identity"
      +]
    • changedOutput schema / required
      Previous value: -[
      -  "workspaces",
      -  "success"
      -]New value: +[
      +  "workspaces",
      +  "default_workspace_id",
      +  "success"
      +]
  9. Changed2 schema fields changed
    • addedOutput schema / properties / workspaces / items / properties / kind
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "real",
      +        "demo"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "\"demo\" for the sample-data workspace a sign-up opens with, \"real\" for the company's own workspace, or null when the workspace cannot be resolved."
      +}
    • changedOutput schema / properties / workspaces / items / required
      Previous value: -[
      -  "workspace_id",
      -  "workspace_name",
      -  "is_primary",
      -  "own_company_id",
      -  "lineage_parent_workspace_id",
      -  "has_bank_transactions",
      -  "identity"
      -]New value: +[
      +  "workspace_id",
      +  "workspace_name",
      +  "is_primary",
      +  "kind",
      +  "own_company_id",
      +  "lineage_parent_workspace_id",
      +  "has_bank_transactions",
      +  "identity"
      +]
  10. Changed5 schema fields changed
    • addedInput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id
      Added value: +{
      +  "description": "The conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_note
      Added value: +{
      +  "description": "Present only when the server opened a fresh lane, stating that no choice recorded earlier was read.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / conversation_id_source
      Added value: +{
      +  "description": "Where the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.",
      +  "enum": [
      +    "host_meta",
      +    "argument",
      +    "minted"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / session / description
      Previous value: -"What this session's card clicks recorded so far; null/empty fields when nothing was clicked yet."New value: +"What this conversation's card clicks recorded so far; null/empty fields when nothing was clicked yet."
  11. Changed10 schema fields changed
    • addedInput schema / properties / reply
      Added value: +{
      +  "description": "One sentence, IN THE LANGUAGE THE USER IS WRITING IN, that the click sends into the conversation as their own message. Write what the PERSON would say about the workspace they pick, in their words, not an instruction to yourself. You write it BEFORE they click, so you cannot know what they will choose: put {picked} where the pick belongs and the card replaces it with the names they actually picked, one or several. In English it would read \"Let's work on {picked}.\" Write the same shape in the user's language. {picked} is required: a sentence that names a pick itself names the one you guessed, so the card refuses it and sends its own English instead. At most 160 characters. Omitted sends an English sentence the card builds itself, which is wrong for any reader not writing in English.",
      +  "maxLength": 160,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / subtitle
      Added value: +{
      +  "description": "Supporting line under the picker card's heading. At most 240 characters. Omit to keep the default wording; an empty string is rejected rather than rendered blank.",
      +  "maxLength": 240,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / title
      Added value: +{
      +  "description": "Heading for the picker card, framing the step in its flow (e.g. \"Which company are we closing?\"). At most 120 characters. Omit to keep the default wording; an empty string is rejected rather than rendered as a blank heading.",
      +  "maxLength": 120,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / workspace_ids
      Added value: +{
      +  "description": "Scope the tiles to this subset of the authorized workspaces, e.g. the company workspaces under one membership. Every id must be one this token authorizes; an id outside the grant refuses the call. Omit to draw every authorized workspace.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / country_default_fiscal_year_start_month
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The jurisdiction's default fiscal-year-start month for this country, or null when the country has no single confident default (non-null for France only today)."
      +}
    • addedOutput schema / properties / workspaces / items / properties / identity / properties / fiscal_year_start_month_source
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "derived",
      +        "registry",
      +        "user"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Where fiscal_year_start_month came from: \"registry\" from a company registry, \"derived\" from the country fallback, \"user\" from a human. Null when never set. Tells a confirmed fiscal year from one resting on a default."
      +}
    • changedOutput schema / properties / workspaces / items / properties / identity / required
      Previous value: -[
      -  "registered_name",
      -  "trade_name",
      -  "registered_value",
      -  "country",
      -  "domain",
      -  "base_currency",
      -  "fiscal_year_start_month"
      -]New value: +[
      +  "registered_name",
      +  "trade_name",
      +  "registered_value",
      +  "country",
      +  "domain",
      +  "base_currency",
      +  "fiscal_year_start_month",
      +  "fiscal_year_start_month_source",
      +  "country_default_fiscal_year_start_month"
      +]
    • addedOutput schema / properties / workspaces / items / properties / lineage_parent_workspace_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The workspace_id of the membership this workspace was created under, or null when it has no active lineage. Its parent's own row is the membership whose id this points at."
      +}
    • addedOutput schema / properties / workspaces / items / properties / own_company_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The public id of the company this workspace is anchored to, or null. A row that carries it is a company workspace, the one the close flow runs in; a row without it is a membership workspace."
      +}
    • changedOutput schema / properties / workspaces / items / required
      Previous value: -[
      -  "workspace_id",
      -  "workspace_name",
      -  "is_primary",
      -  "has_bank_transactions",
      -  "identity"
      -]New value: +[
      +  "workspace_id",
      +  "workspace_name",
      +  "is_primary",
      +  "own_company_id",
      +  "lineage_parent_workspace_id",
      +  "has_bank_transactions",
      +  "identity"
      +]
  12. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say readOnlyHint/openWorldHint=false/destructiveHint=false; the description adds far more: the wait holds the turn open for up to a minute, the click itself writes the pin server-side (so no switch call is needed), and the card rejects a `reply` that names a workspace or omits `{picked}`. It also discloses the 'Not now' path leaving the run unresolved, which is exactly the kind of consequence annotations cannot express. No contradiction with readOnlyHint, since the tool only draws the card while the user's click performs the write.

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

Conciseness4/5

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

Front-loaded with a one-sentence purpose, then three clearly delimited ⚠️ blocks for gating, waiting, and `reply` wording, so an agent can scan rather than read linearly. It loses a point for redundancy — the `{picked}`/language rule is stated in the body and again, at similar length, in the schema's `reply` description — and for ending on a meta-sentence about not repeating another tool's field reference.

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

Completeness5/5

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

For a zero-required-parameter, seven-parameter interactive-card tool with an output schema and full annotation coverage, the description supplies everything an agent needs to decide: the gating rule, the exact next call, the wording constraint, and the anti-patterns to avoid. Return-value shape is properly delegated to the output schema and to `well_list_workspaces`.

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%, so the schema already documents `reply`, `title`, `subtitle`, `workspace_ids`, `conversation_id`, and `workspace_scope` in detail; the description largely restates the `{picked}` rule. Its only real addition is the explicit cross-reference that output rows mirror `well_list_workspaces` field for field, plus the scoping use of `workspace_ids` in the single-workspace exception. Baseline 3 is appropriate when the schema carries the load.

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

Purpose5/5

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

States a specific verb and resource — 'Ask the user WHICH workspace to work in, on a card: one tile per authorized workspace, with its logo and the company behind it' — which is concrete enough to picture the output. It also explicitly contrasts itself with `well_list_workspaces`, 'which draws nothing,' so an agent can separate the two without opening either schema.

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

Usage Guidelines5/5

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

Gives a hard precondition ('ONLY when the token authorizes SEVERAL workspaces and no hint resolves to one'), then enumerates the disqualifying cases: single-workspace grant, a name the user already gave, an existing pin, or no workspace at all. It names the alternative tool, describes the one narrow exception (define-workspace consent over a single company workspace scoped with `workspace_ids`), and prescribes the required follow-up call `well_wait_for_selection({ kind: "workspace" })` while forbidding `well_switch_workspace`.

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