Set workspace preference
well_upsert_preferenceSet a workspace preference. scope: "workspace" with no namespace sets the workspace-wide default, which only a workspace owner or admin can set; a namespaced workspace value is open to any member. scope: "member" sets the CALLER's own override for themselves; only an owner or admin can pass member_id to set another member's action_trust level.
Known keys: invoice_default_layout, invoice_design, action_trust, preferred_name, form_of_address, mail_sender_choice, timezone, bank_account_offer, invoice_payment_account, payment_link_reconnect_offer, sunday_routines, customer_facts_note_id. An unrecognized key is refused, never silently accepted.
action_trust: how far Well may act alone for one kind of action. The namespace is the kind code (for examplesend_in_name,change_record) and the value isconfirmoract_alone. Over this MCP server a level can be lowered toconfirmbut never raised toact_alone: the person raises it in Well's own chat. Payments, bank detail changes and password changes always ask and have no level.invoice_default_layout: the workspace's house invoice design, one of the layouts the invoice-design card offers.invoice_design: the invoice design options object the invoice-design card hands you:{ layout, theme, locale, payment_terms_note_id, tax_rate_id, legal_mentions_note_id, payment_means_id }, each optional, ids as uuid or null. It is the exact objectwell_generate_documenttakes asdesign, so store it with those keys. Never store thedesign_*attributes: that spelling belongs only towell_update_invoice_design, and is converted to (layout→design_layout,payment_means_id→design_payment_means_id, …) only when calling that tool.preferred_name: the name the person chose to be called by, as text (e.g. "Max"). It belongs to that person alone: save it withscope: "member"and nonamespace; any other scope or namespace is refused.timezone: the person's own IANA time zone name (e.g. "Europe/Paris"), used to read the times they say. It belongs to that person alone: save it withscope: "member"and nonamespace; any other scope or namespace is refused.form_of_address: the register Well writes to the person in,informalorformal, for a language that separates two (French "tu" or "vous"). It belongs to that person alone, likepreferred_name:scope: "member"and nonamespace.mail_sender_choice: the caller's private choice for one mail sender. Save it only withscope: "member"; the workspace scope and amember_idthat names another member are refused. Thenamespaceis thenamespacethatwell_list_mail_sendersreturns for that sender (sender:and a 40-character hash of the address): pass it back unchanged and never compute it. The value is{ "choice": "keep" | "skip" | "unsubscribe", "sender": "<address>" }, andsenderis the address that namespace was made from.bank_account_offer: where the one offer to add a bank account the invoices print stands for the caller:offeredwhen the offer is made, thendeclinedoraddedwith the person's answer. It belongs to that person alone: save it withscope: "member"and nonamespace. Any saved value means the offer is never made again.invoice_payment_account: the account the workspace marks as primary, which an invoice prints when no earlier invoice of the issuing company printed one of its own accounts. The value is{ "payment_means_id": "<uuid>" }, the id of one payment means of the workspace's own company, never an account of another company or of a person. Save it only withscope: "workspace"and nonamespace, when the person asks in words for that account by default; only a workspace owner or admin can set it.payment_link_reconnect_offer: where the one offer to reconnect the provider that makes payment links (Stripe or Qonto) stands for the caller:offeredwhen the offer is made, thendeclinedwhen the person says no. It belongs to that person alone: save it withscope: "member"and nonamespace. Any saved value means the offer is never made again.sunday_routines: whether the caller's routines (the morning brief, routine reports and reminders) run on Sunday in their own time zone. By default they do not, unless a business meeting is on the caller's calendar that Sunday or the caller often writes to Well on Sundays. Savereceive, the only value, when the person asks to get them on Sunday too, from now on. Save nothing for one Sunday only ("not this Sunday", "skip the brief tomorrow"): this key is permanent. It belongs to that person alone: save it withscope: "member"and nonamespace. For one routine on Sunday only, name Sunday in that routine's rhythm instead. When the person asks never to get anything on Sunday, even when they have meetings, save nothing: say that Sundays are already held back by default, and that only a business meeting on their calendar that Sunday, an explicit ask or a habit of writing to Well on Sundays lifts it.customer_facts_note_id: the one note whose text Well may tell the shop's customers when it answers them on the shop's own WhatsApp Business number (hours, prices, stock, delivery rules). Well tells them nothing else from the workspace. The value is thenote_idof one shared note written in Well: a private note, a note synced from another tool (Notion, Drive and similar), a deleted note or a note of another workspace is refused. Save it only withscope: "workspace"and nonamespace, when the person names that note as what customers may be told; only a workspace owner or admin can set it. To stop customer answers, delete the key withwell_delete_preference. The facts stay in the note: a change to the note reaches the next customer answer, so never save the facts themselves here.
namespace keeps a separate value of the same key per subject. To save a design for one customer, set namespace: "customer:<id>", where is the customer's company_id or person_id, and read it back with the same namespace. Omit namespace for the value that applies to no particular subject. A namespaced value never falls back to the un-namespaced one.
scope: "member" requires a caller with a resolvable person identity in this workspace. A caller with no person attached (an API key) can set only a namespaced workspace value: a member override or the workspace-wide default fails closed rather than falling back to another scope.
The result includes previous_value: the value that sat at this exact (workspace, scope, namespace) row immediately before this write, or null if this is the first write to that row. Use it to revert a change the user asks to undo, without a separate read.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The preference key to set. | |
| scope | Yes | "workspace" sets the shared default; "member" sets the caller's own override. | |
| value | Yes | The value to store: text for a text key, the JSON object for invoice_design, mail_sender_choice or invoice_payment_account. | |
| member_id | No | Owner or admin only: the membership_id of the member whose action_trust level to set. Omit for the caller's own. | |
| namespace | No | Keeps a separate value per subject, e.g. "customer:<company_id or person_id>". Omit for none. | |
| workspace_id | No | Target workspace. Omit when the token authorizes one workspace. Required when it authorizes several — a write lands in exactly one workspace and this call would not say which. | |
| conversation_id | No | 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. | |
| idempotency_key | No | Optional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation. | |
| workspace_scope | No | 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. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| error | No | ||
| scope | No | ||
| value | No | ||
| success | Yes | ||
| namespace | No | ||
| calendar_zone | No | A time zone write only: the zone the person's calendar last showed, or null when none was read. | |
| previous_value | No | The value that sat at this exact row before this write, or null if none existed yet. | |
| conversation_id | No | The conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation. | |
| newly_connected | No | 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. | |
| calendar_out_of_date | No | A time zone write only: true when the calendar still shows another zone than the one just saved. | |
| conversation_id_note | No | Present only when the server opened a fresh lane, stating that no choice recorded earlier was read. | |
| conversation_id_source | No | Where the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened. |