Well

io.github.WellApp-ai/well-mcp · v0.2.1 · finance-and-payments

Well is healthy: it completed an MCP handshake in 2912 ms and exposes 240 tools.

Connect your AI to your Well financial data - invoices, companies, contacts.

Endpoint: https://api.wellapp.ai/v1/mcp (streamable-http)

Repository · Website · JSON · Add to my inventory

Facts

Users (last 30 days)0
HandshakeHealthy
Auth neededNone
Tool count240
Latency2912 ms
Last checked (UTC)2026-10-15T02:35:39.114Z

Health history

Checked (UTC)StatusLatencyError
2026-10-15T02:35:39.114ZHealthy2912

Tools (100)

well_get_schemaDiscover available data types and fields. USAGE: - well_get_schema() → List ALL available roots, including the accounting graph (ledger_accounts, journals, journal_entries) plus account_balances, tax_rates, exchange_rates — query these for real financial statements (compte de résultat / balance she
well_query_recordsRead records from Well's context graph FOR YOUR OWN WORK. This draws nothing on the user's screen. Use it for every read whose answer is yours rather than the reader's: a gate checking whether a window holds transactions, a `totalCount` an answer has to quote, a sync log's latest status, a field a
well_create_companyCreate a new company in the current workspace. Use this tool when the user asks to create, add, or register a new company. REQUIRED: name OPTIONAL: description After creation, enrichment (logo, domain, industry, tax ID, description fill-in) runs asynchronously in the background. The new company i
well_create_personCreate a new person (contact) in the current workspace. Use this tool when the user asks to add, create, or register a new contact, employee, or person. REQUIRED: first_name OPTIONAL: last_name, job_title After creation, enrichment runs asynchronously in the background. Returns { success: true,
well_update_companyUpdate an existing company in the current workspace. Use this tool when the user asks to change, fix, rename, or edit a company's fields. REQUIRED: company_id OPTIONAL (only include fields the user wants changed): name, description, domain, registered_name, trade_name, tax_id_value, tax_id_type,
well_update_personUpdate an existing person (contact) in the current workspace. Use this tool when the user asks to change, fix, rename, or edit a person's fields. REQUIRED: person_id OPTIONAL (only include fields the user wants changed): first_name, last_name, job_title. NOT CHANGEABLE via this tool: emails, ph
well_delete_companyDelete a company from the current workspace (soft delete). Use this tool when the user asks to delete, remove, or archive a company. REQUIRED: company_id This soft-deletes the company and its company_person relationships. Linked people records themselves are NOT deleted. Invoices and documents re
well_delete_personDelete a person (contact) from the current workspace (soft delete). Use this tool when the user asks to delete, remove, or archive a contact. REQUIRED: person_id This soft-deletes the person and its company_person relationships. Linked companies themselves are NOT deleted. The authenticated user
well_update_invoiceUpdate an existing invoice in Well. Call well_get_schema("invoices") to discover all available fields. REQUIRED: invoice_id OPTIONAL (only pass fields you want changed): - reference_number, issue_date (ISO date), due_date (ISO date) - status (draft | paid | canceled). Never set a draft to issu
well_delete_invoiceDelete an invoice from Well (soft delete). REQUIRED: invoice_id Soft-deletes the invoice. Linked line items and payment_means rows are NOT cascade-deleted — they remain in the database, orphaned. The delete is reversible only at the database level.
well_add_contact_channelAdd a contact channel to a company or person. Wraps the resource-scoped REST endpoints (POST /v1/{companies,people}/:id/{emails,phones,web-links,locations}). channel + the matching value field: - email → value.email - phone → value.e164_number (E.164; a leading "+" is added if missin
well_remove_contact_channelRemove a contact channel from a company or person. Wraps the resource-scoped DELETE endpoints (DELETE /v1/{companies,people}/:id/{emails,phones,web-links,locations}/:channelId). Pass channel_id = the UUID of the specific channel row to remove (NOT the parent). Find it by reading the parent with we
well_update_web_linkChange one web link (a website, LinkedIn, X/Twitter, GitHub or other profile URL) of a company or a person in the current workspace. Use this tool when the user asks to fix, replace or edit a link the record already has. To add a new link use well_add_contact_channel; to remove one use well_remove_
well_get_entityRead ONE entity with its sub-resources nested in a single call. Convenience over well_get_schema + well_query_records: resolves the field paths for you and returns the single record with its related data expanded. depth (relation-nesting BOUNDARY, 1-3, default 1): 1 = the entity + its direct sub
well_list_connector_toolsDiscover the actions a connected provider exposes (e.g. "what can I do with Attio?"). WORKFLOW: 1. well_list_connectors() → pick the connected provider (connection_status "enabled" or "processing": a connection whose sync was started still serves its tools) and read its workspace_connector_id direc
well_invoke_connector_toolRun one tool on a connected provider's own MCP server, on behalf of this workspace's connection: an action the user asked to take there (create a record in Attio), or a read of content Well does not sync (a page in a docs tool, a note in a CRM, a file the user pasted a link to). It is NOT a way to
well_create_invoice_from_dataCreate an invoice in Well from data you extracted by reading an invoice (your own OCR) — you send the structured fields, not the file. Well persists the invoice + its line items + payment means using the same pipeline as uploaded documents. Fill every field you can read from the document: - issuer
well_issue_invoiceIssue a draft invoice: it becomes a full invoice. The invoice takes the workspace's next invoice number and, from then on, can no longer be edited or deleted. To correct an issued invoice, create a credit note that refers to it. REQUIRED: invoice_id, the draft invoice created with well_create_invoi
well_list_workspacesList the workspaces this connection is authorized to access. This draws nothing on the user's screen. Use this FIRST when a single token may cover more than one workspace, and use it for every case a caller can settle on its OWN: exactly one workspace, a hint that matches one, a pin this conversati
well_list_connectorsList the connectors a workspace can install AND everything it has already connected, each with a one-click install deep link. The result DRAWS THE CONNECT CARD the user clicks in. It is also the answer to "which connectors can bring this provider's invoices in" (browser extension, direct connector,
well_run_register_diffDiff a workspace's bank transactions against its accounting-register transactions (e.g. QuickBooks), and persist the result. - Every match — hard evidence (structured reference, IBAN, tax ID) or inference-only (memo/payee reading) — is raised as a review task with the candidate already attached (ra
well_resolve_reconciliation_taskApprove or reject one or more reconciliation review tasks (from well_run_register_diff or the in-app review queue). - approve: confirms the match — the link is flipped to active. - reject: dismisses the match — the candidate does not silently re-surface. Each task_id resolves independently; a fail
well_resolve_register_diff_gapPost a well_run_register_diff gap (one of missing_in_register_ids' review tasks) into QuickBooks as a Purchase or Deposit. Requires the exact ledger_account_id (a UUID, not a name) for both: - bank_ledger_account_id: the bank/cash account the money moved through (e.g. Checking). - category_ledger_a
well_get_investment_holdingsGet the live holdings/positions (what's currently held and its value) for a connected Plaid investment account — brokerage, IRA, 401k, etc. WORKFLOW: 1. well_list_connectors() → pick the ENABLED Plaid connector (connection_status: "enabled") and read its workspace_connector_id directly off the row.
well_render_cost_structurePut a cost breakdown YOU computed onto the cost-structure card. **This tool measures nothing.** It takes the slices and the method behind them as input and returns them for rendering. Call it only after you have computed the breakdown yourself and can state every field below from your own work, nev
well_get_own_companyGet which company the workspace itself is: the confirmed own-company anchor (`anchor`) and any detected companies not yet confirmed as it (`candidates`). Use this whenever a question turns on "mine" versus "theirs" — my payables, my receivables, invoices I owe, what we billed — and then filter by t
well_list_missing_invoicesList the supplier invoices a past period is still missing — the settled spend whose invoice has not been collected, one row per counterparty, exactly as the Well app's expense-invoices card shows them. Use it for "which invoices am I missing for <month>?" and as the input to fetching them. It does N
well_sum_missing_invoicesThe missing supplier invoices of one ISO week that has ended, as one total: how many suppliers still miss an invoice, and the spend they cover, in the currency of the lines and converted to the workspace base currency. It returns no rows. `week` is an ISO week, `YYYY-Www` (Monday to Sunday), for ex
well_list_periodsList the recent accounting months of the workspace, with each month's close status, its invoice-retrieval state, and the counts that describe how much work it holds. Use this to ask the user WHICH month or months to work on before any close, review, or month-scoped read — do not guess a month, and d
well_preview_invoice_fetchPreview which vendors a past period is still missing supplier invoices from, where each one's invoices are, and which route would obtain them. Use it for "what would happen if I fetched <month>'s missing invoices?" before anything runs. Name the period ONE way: `{ calendar_year, calendar_month }` (
well_switch_workspaceWrite this conversation's context: the one place its standing choices live. This is the tool the widget cards call when the user CLICKS them: the workspace pin and queue, the selected months, the selected counterparties, and the step acknowledgements are all recorded here, and every later tool call
well_list_counterpartiesList the workspace's counterparty companies and how each one is CATEGORIZED — the company-level industry labels a counterparty carries. Use it for "which suppliers have no category?", "what industries are my counterparties in?", and before categorizing a counterparty so you name real ids instead of
well_wait_for_selectionRead the user's card click, holding the turn open until it lands. Call it in the SAME turn, right after the tool whose card asks the user to click: well_list_workspaces (kind "workspace"), well_list_periods (kind "periods"), well_list_missing_invoices (kind "counterparties" — its card is the only on
well_wait_for_processWaits up to 5 seconds for one background process of the workspace and returns where it stands. Before each call, announce it with the sentence for its kind, and nothing else, unless the skill says to make that call with no announce sentence: - bank_sync: "Retrieving transactions from your bank…" - t
well_set_own_companyOpen the workspace's "Confirm your company" task for a company, or point to the one already open. This tool never anchors the company itself: a person confirms the company in Well, and only that confirmation writes it. The result carries confirmation_required: true and confirmation_task_id, and noth
well_get_design_tokensGet Well's colours, shape and type vocabulary, so a view you compose for Well data looks like Well rather than a generic page. Call this ONLY when you are about to render something yourself — an HTML artifact, a report, a chart you are drawing. You do not need it to answer in prose or in a markdown
well_create_statement_uploadMint a one-time, short-lived upload slot for a bank-statement file. Use this when the user has a statement file (PDF, or a large CSV/XML) to import; the file's bytes do not travel through the model. It returns a single-use upload URL + token; the client (or the user) POSTs the raw file bytes to tha
well_upsert_accounting_settingsSet the workspace's accounting settings: fiscal year start month, first fiscal year start date, country, base currency, accounting framework, chart-of-accounts confirmation, the next invoice number, the incorporation date, the tax ID (value and type together), the tax profile (VAT regime, VAT filing
well_search_contextSearch the workspace's recorded notes and context (meeting notes, tickets, imported documents, and the caller's own imported emails) for a query. Returns compact snippets — each result's "snippets" is an array of one or more matched passages from that note. The best note results also carry "content"
well_search_mailbox_for_receiptSearch the caller's own connected Gmail, now, for one supplier's mail in a date window: the sender name or domain, from `from` to `to` inclusive, sent mail excluded. Use it for a missing receipt or invoice, one call per supplier, with the window widened by about a week on each side of the payment da
well_get_memoryRead what Well remembers about this workspace and about the user: standing decisions (how a supplier's transactions are categorised, which company the workspace is), stated preferences (currency, report format), facts the user told Well before, and recent task outcomes. Call it once at the start of
well_rememberPropose lines for Well to remember, so its assistant uses them in later conversations: a standing decision, a preference or a fact about the business. Call it only when the user explicitly asks you to remember or save something, or for a typed line below; never for any other line on your own initiat
well_forget_memoryPropose that Well forget memory lines, when the user asks to forget or correct something Well remembers. Name the lines by the ids well_get_memory returns, in the same scope. Nothing is saved or forgotten by this call. It returns an approval link: give it to the user, say the change applies only aft
well_get_statement_import_resultRead the outcome of a bank-statement upload started with well_create_statement_upload, by the document_id that tool returned. well_create_statement_upload already renders a card from its own result — this tool does not create or redraw it. Call it once, shortly after the client has uploaded the fil
well_upload_statement_contentUpload a bank statement's TEXT CONTENT (a .csv, .txt, or .xml file) directly, as an alternative to well_create_statement_upload's out-of-band file POST. Use it when the user's statement is a small text file whose contents are verbatim in this conversation (1 MiB decoded limit). Send the content EXA
well_upload_statement_bytesUpload a bank statement file's BINARY CONTENT (PDF or image) as base64, so the file's real bytes reach Well without any out-of-band HTTP call. Use it for PDF and image statements up to 5 MiB decoded (the base64 text may be roughly a third larger). Base64-encode the file's bytes EXACTLY — never re-e
well_assign_accountAttach a bank account to a company, and say whether the workspace owns it. Use this when an account carries no company, or when its ownership is still `unknown` — the two states a figure that walks account ownership cannot be computed over. REQUIRED: account_id, plus at least one of company_id or
well_list_uncategorized_windowList the transactions in a date window that carry no category, so a figure that depends on categorization can say exactly what is missing before it is computed. `from` is inclusive and `to` is EXCLUSIVE — for whole months, pass the first day of the month after the last one you want. **These rows a
well_render_burnPut a burn figure YOU computed onto the burn card. **This tool measures nothing.** It takes the figure and its method as input and returns them for rendering. Call it only after you have computed the burn yourself and can state every field below from your own work — never to "get" a burn. The serv
well_sum_transactionsSum a workspace's transactions over a date window, grouped how you ask. Arithmetic only — this tool holds no definition of burn, spend, or runway, and returns no figure the app renders. Use it when you are computing a figure whose RULES you are stating yourself: a burn over a window you chose, a to
well_list_possible_double_debitsFind the pairs of outgoing bank movements that may be one charge taken twice, and say how many movements were scanned to find them. Use it for "was I charged twice?", "double debit", "prélevé deux fois" or "doublon de prélèvement" about a supplier. It reads the bank movements itself: do not scan `we
well_measure_subscriptionsMeasure the workspace's subscriptions from its bank and credit card outflows: which suppliers it pays on a regular cadence, what each costs per month and per year, and how the spend moved month by month. It draws no card. Call it when the user asks what they pay for on a regular basis, what their s
well_measure_category_trendMeasure ONE spending category for one month against its usual month: the month total, the usual amount, and the difference. It draws no card. Call it when the person asks how much they spent on one category in a month, or how a month compares to usual ("how much did I spend on groceries this month
well_measure_recurring_inflowsMeasure who pays the workspace on a regular cadence, from its bank and credit card inflows: each recurring payer, its cadence, what it brings in per month, and the total per currency. It draws no card. Call it when a cash forecast should count the inflows that keep arriving, or when the user asks w
well_render_category_trendPut a month-by-month trend with one line per category onto the category-trend card. **This tool measures nothing.** Pass a trend another tool measured, as it is: for subscriptions, one `category_trends` entry of `well_measure_subscriptions`; for a cost trend, the per-month category sums of `well_su
well_render_monthly_pivotPut a table of amounts per company and per month onto the monthly-pivot card: one row per company with its logo and name, an optional category column, then one column per month. The running month is drawn apart, at the end, marked as in progress. **This tool measures nothing.** Pass a pivot another
well_sum_invoicesSum a workspace's billed amounts over a window of whole months, grouped by month, currency and billing context. Arithmetic only — this tool holds no definition of MRR or recurrence, and returns no figure the app renders. Use it when you are computing a figure whose RULES you are stating yourself: r
well_sum_receivablesWhat the workspace's customers still owe it: the outstanding receivables, one figure per currency, with the overdue part and an aging breakdown. It draws nothing. Use it for any total of what customers owe: "who owes us money", "how much are we owed", "how much is overdue". State the totals it retu
well_sum_payslipsThe payroll total of a window of whole months, summed on the server from the payslips: gross pay, net pay, employee deductions, employer charges and the payslip cost, one group per currency, and per month when `axes` holds "month". It draws nothing. Use it for any payroll or payslip total: "what di
well_measure_customer_ltvMeasure the revenue lifetime value (LTV) of every customer the workspace invoiced over a window of whole months, with the portfolio churn and lifespan it rests on. It draws nothing. Use it to rank customers by lifetime value, or to state what a customer is worth over its life. Do not use it for rev
well_render_customer_ltvDraw the customer lifetime value (LTV) ranking as a bar chart card: one bar per customer, the highest first. **Call it once, after `well_measure_customer_ltv`, and send no figure.** It runs the measure itself for the workspace of the call and draws that result, so every name, flag and LTV on the ca
well_get_vat_summaryRead the VAT position of a workspace over a window of whole months, grouped by the date of its entries and invoices, straight from its book (VAT on posted invoices, which is the debit basis): per month, for the whole window as a CA3 by rate, and as totals with the net VAT payable. A French workspace
well_list_tax_deadlinesList a French company's upcoming tax deadlines, computed from its tax profile: the VAT returns (CA3 monthly or quarterly, or the annual CA12 with its July and December instalments), the corporate income tax instalments, balance and return, the CFE, and the filing of the annual accounts. Use it for "
well_prepare_vat_returnPrepare a French company's VAT return (CA3) for one period from its posted ledger, as a filled PDF stored in the workspace. Well prepares the return; the company files it on impots.gouv.fr. Nothing is filed, sent or paid. The PDF is the input of the `fill-ca3` browser skill, which types it into the
well_get_pennylane_statementsBuild a profit and loss (compte de résultat) and a balance sheet (bilan) from the trial balance of the workspace's connected Pennylane. Pennylane shares no ready profit and loss or balance sheet, only its trial balance (`getTrialBalance`). Well reads every page of it and computes the totals itself,
well_render_mrrPut an MRR figure YOU computed onto the MRR card. **This tool measures nothing.** It takes the figure and its method as input and returns them for rendering. Call it only after you have computed the recurring revenue yourself and can state every field below from your own work — never to "get" an MR
well_list_account_balancesList every account on the workspace with its stored balance. Rows only — this tool holds no definition of cash, and returns no figure the app renders. Use it when you are computing a cash figure whose RULES you are stating yourself: which accounts belong to the business, which account types count a
well_render_cash_positionPut a cash position YOU computed onto the cash card. **This tool measures nothing.** It takes the figure and its method as input and returns them for rendering. Call it only after you have totalled the balances yourself and can state every field below from your own work — never to "get" a cash posi
well_list_cash_scopeList the account types a reader can count as cash, each with what it holds. This is what the cash-scope card offers; it measures nothing `well_list_account_balances` did not already read. Each entry in `groups` is one account type: `account_type`, `account_count`, and `subtotals` — one native amoun
well_render_runwayPut a runway YOU computed onto the runway card. **This tool measures nothing.** It takes the cash and the burn you measured as input and returns them for rendering. Call it only after you have measured both yourself — never to "get" a cash or a burn. **The division is the server's.** Send the cash
well_get_figureMeasure the business's runway (how long the cash lasts), cash position (the cash it holds now) or average monthly burn, as it stands now, with every check the skill for that figure runs, in one call. It does not take a forecast or a scenario (a hire, a new cost, a change of revenue: "what if", "if
well_render_cash_forecastPut a cash forecast YOU computed onto the forecast card. **This tool measures nothing.** It takes the settled month-end series, the anchor, the burn and the projection you computed, and returns them for rendering. Call it only after you have computed both halves yourself: the month-end totals under
well_render_cash_flow_bridgePut a cash-flow bridge YOU computed onto the cash-flow waterfall card. **This tool measures nothing.** It takes the four terms of a bridge and the gap between them as input, draws the waterfall, and returns them. Call it only after you have read the opening and closing positions and summed the wind
well_list_burn_exemptionsList the categories a reader can exempt from burn over one window, each with the spend exempting it would remove. This is what the exemption card offers; it measures nothing the sum did not already measure. Each entry in `groups` is one category's OUTFLOW in the window: `category_key` (the id an ex
well_list_recurring_contextsList the billing contexts a reader can count as recurring revenue over one window, each with what counting it would add. This is what the recurring-contexts card offers; it measures nothing `well_sum_invoices` did not already measure. Each entry in `groups` is one billing context's revenue in the w
well_list_member_candidatesList the teammates a workspace can invite, exactly as the Well app's invite card shows them. Use it before well_invite_members, and for "who can I invite to this workspace?". Returns `candidates`, each with `person_id`, `name`, `email`, `avatar_url`, a `state` (`active` already has access, `pending
well_invite_membersInvite one or more teammates into a workspace, or into a workspace group. Use it after well_list_member_candidates, on the people the user chose. Pass `invites` — 1 to 20 entries, each `{ email, role }` or `{ phone, role }`, role `admin` or `member` — and a `target`: `{ kind: "workspace" }` for thi
well_get_workspace_invite_linkReturn the link that lets people join the user's OWN workspace, when the user asks for an invitation link into their account or workspace and names no person and no email address. When the user names one person or one address, use well_invite_members with `delivery: "link"` instead. For a link that
well_delete_workspace_invite_linkStop the workspace link of one role, when the user asks to stop, cancel or delete the invitation link into their own workspace. From then on the link admits nobody. The people who already joined through it stay in the workspace. Pass `role`: `admin` or `member`, the role of the link to stop. Ask th
well_get_general_invite_linkReturn the general invitation link to Well: the link a user forwards so that someone opens their OWN account on Well. It opens the WhatsApp chat with Well, and the person who uses it gets their own workspace, not the user's. Use it when the user asks for a link to invite someone to Well in general (
well_enqueue_invoice_fetchQueue invoice collection for named counterparties. This creates one durable backlog task per counterparty. The browser agent (a provider that carries a blueprint or a real portal URL) or the manual-upload route picks up each task later. Call this tool only after the user explicitly confirms the lau
well_list_missing_invoice_ownersList the settled expense TRANSACTIONS a past period is still missing a supplier invoice for, one row per line, each with its current owner SET. Use it for "who owes the missing invoices?" and as the input to well_assign_missing_invoice_owners. Each row reports its TRANSACTION owner SET. An empty `o
well_assign_missing_invoice_ownersSet the owner SET of the missing-invoice TRANSACTIONS you name — the only write for missing-invoice ownership. REQUIRED: transaction_ids — the settled lines still missing a supplier invoice, from well_list_missing_invoice_owners. owner_person_ids — the people who together owe those invoices; pass a
well_get_skillGet the Well procedure for a job, written by the Well team, and follow it exactly. Returns ONE markdown document: the instructions for the thing you are about to do. Its content is the instruction, not background reading — do what it says, in the order it says, and do not substitute your own plan f
well_search_skillFind the Well procedure (skill) for what the user asks, when no Well skill for the request is installed or loaded in this conversation. Returns the roster of Well skills with their descriptions; pick the one whose description matches the request, then call well_get_skill with its id and follow the
well_set_transaction_categorySet ONE transaction's category — the write that clears a categorization gate. REQUIRED: transaction_id, from well_list_uncategorized_window. category — the LABEL, exactly as that read returned it on the row's suggestion, or another label from the closed list this schema carries. The vocabulary is f
well_list_accounts_needing_companyList the workspace's accounts that cannot yet be placed on either side of a transfer, so a figure that depends on account ownership can say exactly what is missing before it is computed. Two states, ONE worklist, because they answer one question — whose account is this: - No company attached. Nothi
well_list_unposted_transactionsList the transactions of a fiscal period that carry a category or a role and have STILL not reached the ledger, so a close can say exactly what is holding it. This is the posting gap, not the categorization gap. A row here already has a category; what it lacks is the ledger account its journal entr
well_set_transaction_ledger_accountAttach ONE transaction to the ledger account its journal entry should post to — the write that clears a posting gap. REQUIRED: transaction_id, from `well_list_unposted_transactions`. ledger_account_id — an account id from that read's `ledgerCatalog`, or from the row's own `ledger_suggestions`. Pass
well_show_recordsPut a table of records IN FRONT OF THE USER. Use it when the user asked to SEE rows — "show me my invoices", "list my companies", "which suppliers have no category" — and when the answer you owe them IS the table. Without `columns`, the table is the root's display view in the Well web app's column
well_get_worklist_statusAsk whether a repair gate is still OPEN, without drawing its card. Call this BEFORE the worklist read whenever you are checking rather than repairing — the first pass of a gate, and every re-check after the reader has cleared one. `open: false` means the gate is settled: carry on, and call nothing
well_get_connector_coverageRead 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 a
well_show_workspace_pickerAsk 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: exa
well_get_session_digestGet everything a returning person's first answer needs, in one call: what happened in the workspace since they last looked, where the workspace stands now, and the Well skills that can take it forward. When the person asks what happened since last time, asks to be caught up, or opens a session, do
well_propose_next_stepsPut five next steps on a card, as five tiles the person can click. **This tool ranks nothing.** The five skills and their order come from well_get_session_digest's `suggested_steps`; pass them in that order. The server adds at most one tile of its own, described below. The sentence for each one is
well_search_company_registrySearch the public company registries for a company by name, to find the one a workspace IS before you create its company workspace. This draws nothing on the user's screen. Use it in the zero-company case: a membership workspace has no company attached and no detected candidate, so you search the r
well_create_company_candidateMint a company candidate from a registry hit, the step between finding the company and creating its workspace. This is the deliberate pick the confirm-your-company card makes. REQUIRED: registry_ref — the `id` of a well_search_company_registry hit. This tool hydrates that hit and mints the company
well_create_company_workspaceCreate the company workspace from a candidate, the step that turns a picked company into a workspace the close runs in. This anchors the candidate's company as the new workspace's own company and links it to the membership it was created under. REQUIRED: candidate_id — from well_create_company_cand
well_show_company_candidatesShow the user the detected COMPANY candidates on a card and let them pick which company is theirs: a tile per detected company candidate with its confidence, and a company-registry search at the top for the case where none was detected. ⚠️ ONLY when the user must choose or find the company to creat
well_list_detected_toolsList the TOOLS and ACCOUNTING TOOLS Well detected for this workspace, newest first: one row per tool, with its `status`, its detection `score` (0 to 1, null when none was stored), its `connection_status`, the newest discovery decision and the newest task for it. `status` is one of: `suggested` (a C