accept_bank_feed_suggested_matches
ChatGPTAccept the suggested match on pending bank feed transactions: each row is linked to the one match suggested on it, a Bill, an Invoice, a journal entry or another ledger transaction, creating the bill payment or customer payment the ledger needs (a journal entry line gets a payment only when it is on a receivable or payable account), or a transfer between two suggested bank feed rows. If the user asked to match, call with confirm true; the response still names every refused row and why. Call with confirm false only when the user asked what would match, or when it is unclear whether they want to match. Do not ask the user to confirm a match they already asked for. Nothing is written without confirm; a confirmed call queues a job and returns its ID to check with get_bank_feed_suggested_match_status. Readiness: a row needs exactly one suggestion. A row with none is refused, and a row with several is refused with its suggestions listed, so the user can pick one. Posted, matched, excluded, hidden, and in-flight rows are refused, and two rows pointing at the same target refuse each other. A refused row never blocks the rest of the batch. Results: a confirmed response only reports what was handed to the job, never what reached the ledger; a queued row can still be refused. Call get_bank_feed_suggested_match_status with the job ID for the matched and refused results, including the ledger entry the match created. Up to 100 IDs per call.
add_bank_feed_transaction_questions
ChatGPTAsk the client a question about pending bank feed transactions, as "Add question" does on the bank feeds page: each row gets its own question, answered in the client portal. Use only when the user asks to ask the client something; use add_question for ledger transactions and update_question to reply on an existing question. Rows that cannot take a new question are refused with a reason, and the rest still go through.
add_file_folder
ChatGPTCreates a new folder in the file library for a client. Can be created at the root level or nested inside an existing folder (use list_file_library to find folder IDs). Throws an error if a folder with the same name already exists in the parent.
add_file_to_client
ChatGPTAdds an uploaded file (from internal_upload_file / internal_confirm_upload) to a client's file library. Specify a folderId to place the file in a custom folder, or omit it to send to the Uploads Inbox (triggers automatic OCR scanning). Files are hidden from clients by default. Always call internal_upload_file first to obtain the fileKey and fileName.
add_question
ChatGPTCreate a new question for a client. Only one question can exist per transaction. The question will be submitted on behalf of the current user. Optionally attach files (call internal_upload_file first).
add_timer
ChatGPTCreate a new time tracking entry. Supports creating timers for specific clients or as firm-level entries. You can specify a workstream by ID or name, and optionally create timers on behalf of other users. If no endTime is provided, the timer is created as an active/running timer.
apply_organizer_template
ChatGPTApply an organizer template to one or more clients: each client gets a new organizer copied from the template (slides, flags, and conditional logic included). By default the organizers are created as drafts; pass published: true to publish them to the client portal immediately, which notifies the client. Discover template ids with list_organizer_templates and client ids with list_clients. Only users the practice's template permissions setting allows can apply templates.
build_deep_link
ChatGPTBuild a Double deep link for a supported entity by ID and type. Route-specific values go in params; the params shape depends on entityType. Use agent_run for a link to an agent run (the current run, this run, the run log); an agent's own deepLink opens its configuration, never a run. Use ai_chat for an Ask Double conversation that is not an agent run.
categorize_bank_feed_transactions
ChatGPTAssign categories to pending bank feed transactions in one of two modes. Explicit mode: Use the default mode only when the user explicitly asks to assign one category by ID or name. Do not turn a broad request to apply suggestions into an explicit category assignment. Saved-suggestions mode: Use mode='saved_suggestions' for a broad request to apply saved suggestions. It can apply only an unambiguous high-confidence saved category proposal and, when present, one saved payee proposal. Rows with existing values that differ from the saved proposal require review. Medium- and low-confidence proposals also require that you first display the exact category and payee proposal for each row, then receive the user's confirmation. Only then pass reviewConfirmed=true with the exact displayed confirmedSuggestions. A review-only request authorizes no write. Never fabricate, alter, or reuse proposals that were not displayed, and never use reviewConfirmed as independent proof of consent. Class, location, and customer remain direct assignments only: include their IDs only when the user explicitly names those values. This tool never infers dimension suggestions, creates payees, or clears a payee because a proposal has payeeId=null. Clearing: In explicit mode, pass null for classId, locationId, or customerId, or clearPayee=true, only when the user explicitly asks to remove that value from one transaction. Clearing works on exactly one transaction per call. Omit categoryId and categoryName to keep the transaction's current category, whether or not it has one; the category itself cannot be cleared. Results: Every distinct requested transaction is reported once, in first-requested order; duplicate IDs are collapsed. A transaction can be updated, unchanged because it already has the requested values, or refused. Posted, matched, excluded, in-flight, hidden, transfer-conflicting, or foreign transactions are refused without changing the rest of the batch. Each change carries previousName and newName so the user can audit it at a glance: when you summarize updated rows, show the previous category next to the new one. Say "Unassigned" only when previousValue is null; when previousValue is set but previousName is null, say the previous name is unavailable rather than calling it unassigned.
create_account_reconciliation_task
ChatGPTCreate an account reconciliation task for a specific ledger account within a monthly close period (EndClose). Requires an accountId (ledger account ID from QBO or Sage) and an endCloseId. Fails with an error if a reconciliation task for this account already exists in the given close.
create_accrual_from_transaction
ChatGPTCreates accruals from a ledger transaction - one accrual by selected transaction line, linked to the transaction and it leaves the New tab of the accrual account. Each amount is read from the ledger line, never passed. The account must already be tracked as an accrual account (create_accrual_account); its tracking task in the target close is reused or created.
create_accrued_expense
ChatGPTCreates an accrued expense for a QuickBooks Online client: accrues the amount each month against the liability account, posts the journal entries, and schedules the reversal per the chosen method. Reuses the existing accrual tracking task for the account or creates one. Before asking the user for duration, reversal method, or expense account, call get_accrual_presets — a matching preset defaults those, so only ask for what it doesn't cover. The schedule is computed server-side — never compute it yourself. Confirm the details with the user before calling. Amounts are in dollars.
create_agent_config
ChatGPTCreate a AI agent configuration for the current user in this practice. If no model is specified by the user, default to gpt-5.6-luna-high
create_bank_feed_suggested_vendors
ChatGPTCreate the vendors that the bank feeds page suggests in "For review: New vendors" (list_bank_feed_suggested_vendors), and give each one to the transactions with that suggested name. For each name, the tool creates the vendor in QuickBooks, reuses an active vendor with the exact name, or assigns an existing payee the user picked. New vendors use the client's base currency and no 1099 tracking. A refused or failed name never blocks the others. Its reason says what to tell or ask the user. When ledgerCacheGaps is not empty, say that an existing payee can be missed. The payee goes to every open transaction of the client with the suggested name, in every account, including excluded and hidden ones, as on the page. Report otherAccountRowCount and excludedOrHiddenRowCount when they are above zero. Use set_bank_feed_transaction_payee to change one transaction.
create_client
ChatGPTCreate a new unconnected client. Specify a name and optionally a workflow type, close cadence (monthly or quarterly), assignees (preparer, reviewer, manager), and a branch. Tax workflows (tax_only, close_and_tax) are only available when the practice has Tax Suite enabled.
create_closing_task
ChatGPTCreate a new task within a monthly close period (EndClose). Closing tasks are part of the month-end bookkeeping workflow for a client. Requires an endCloseId — get this from list_tasks results on existing closing tasks for the same client/month. Use "custom" for ad-hoc tasks in the Additional Items section, or "preCheck" for pre-close tasks. Tasks in Account Reconciliation, Transaction Review, Payee/Entity Review, Final Review, Accruals, and Allocations sections are managed by the system and cannot be created through this tool. For tasks not tied to a monthly close, use create_custom_task instead.
create_contact
ChatGPTCreate a new portal contact. Validates that the contact does not already exist in the practice and that the user has access to the specified clients.
create_custom_task
ChatGPTCreate a custom task that is NOT part of a monthly close. Use this for ad-hoc to-dos, reminders, or any work item tied to a specific client. These tasks appear in the "Custom tasks" section. For practice-level tasks not tied to a client, use create_firm_task. For tasks that are part of month-end bookkeeping (reconciliations, transaction reviews, etc.), use create_closing_task instead.
create_end_close
ChatGPTCreate a new close period for a client. Optionally specify a monthDate in MM-YYYY format (e.g. "05-2026") — if omitted, the next logical close period is created based on the client's fiscal settings. The monthDate cannot be more than one month in the future (or one quarter for quarterly clients). For quarterly clients, the monthDate must also fall on a valid quarter-end month. Use list_clients to find client IDs.
create_firm_task
ChatGPTCreate a practice-level firm task not tied to any specific client. Use this for internal to-dos, reminders, or work items that apply to the whole practice. These tasks appear in the "Firm tasks" section. For client-specific tasks, use create_custom_task instead. For monthly close tasks, use create_closing_task.
create_loan
ChatGPTCreates a loan and its amortization schedule from terms, plus a loan task. Confirm the terms with the user before calling. Amounts are in dollars.
create_metrics_tab
ChatGPTCreate a new tab on the Metrics page. When copying tabs between clients, create them sequentially in ascending orderIndex and pass each source orderIndex to preserve their positions. Fails with CONFLICT if a tab with the same name (or a report tab of the same type with identical filters) already exists — surface the conflict to the user instead of silently overwriting. The Metrics feature is only available for QuickBooks and Xero clients. Cash Flow tabs are QuickBooks only.
create_metrics_variable
ChatGPTCreate a variable (row) on a custom Metrics tab. Fails with CONFLICT if a variable with the same name exists on the tab — when copying between clients, surface the conflict and ask the user whether to skip, rename, or overwrite (overwrite = update_metrics_variable) instead of silently overwriting. Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
create_metrics_visual
ChatGPTCreate ONE visual (chart) on the Metrics page. It appears alone on a new full-width row at the top of the grid. Creating more than one visual? Use create_metrics_visual_grid instead — it takes the visuals as rows and lays them out side by side in a single call. Repeated calls to this tool leave a column of full-width charts, which reads poorly. Fails with CONFLICT if a visual with the same name exists — when copying between clients, surface the conflict and ask the user whether to skip, rename, or create anyway (allowDuplicateName: true) instead of silently overwriting. Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
create_metrics_visual_grid
ChatGPTCreate several visuals (charts) on the Metrics page in one call, laid out as a grid. Use this instead of repeated create_metrics_visual calls whenever you are creating more than one visual — create_metrics_visual puts every visual on its own full-width row, which reads poorly. Creates visuals only. Tabs and the variables a visual plots must already exist — use create_metrics_tab and create_metrics_variable first when building a Metrics page from scratch. Each entry in rows is one row of the grid, rendered top to bottom, left to right; visuals in a row split the width evenly. A layout where every row holds a single visual is almost never what the user wants. The new rows are added above the client's existing visuals, which keep their current layout. A new visual therefore cannot join a row that already holds an existing one — when the user wants them side by side, follow this call with reorder_metrics_visuals, using the positions grid in this response as the starting point. Layout conventions, unless the user asks for something else: - An explicit layout from the user, or the layout of a dashboard being copied, wins over these defaults. - Summary KPI cards go above charts. Order charts from high-level trends down to detailed breakdowns. - Never put a KPI card and a non-card chart on the same row. Cards are sized for 3-across and read badly stretched to half a row. - Group KPI cards 2–3 per row, avoiding an orphan: 2+2 for four cards, 3+2 for five. - Pair related non-card charts 2 per row. Keep a primary, dense, or unrelated chart on its own full-width row. All-or-nothing: nothing is created unless every visual validates. Errors name the offending row and column so you can fix that one spec and retry. Name collisions with existing visuals are reported together as a CONFLICT — surface them and ask the user whether to rename, skip, or create anyway (allowDuplicateName: true) instead of silently overwriting. Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
create_note
ChatGPTCreate a new note for a client. The note will be attributed to the current user. Pass fileKeys to attach uploaded files to the new note.
create_organizer
ChatGPTCreate a new organizer for a client. The organizer starts as an empty draft with no slides — add slides with update_organizer, and publish it to the client portal with update_organizer status: "published" (publishing requires a name and at least one slide). If name is omitted, a name like "00 Organizer" is auto-generated; duplicate and empty names are allowed at creation. Use list_clients to find client IDs and list_organizers to see the client's existing organizers.
create_project_task
ChatGPTCreate a task inside a tax project. Use this for work items tied to a specific client tax project (tax return, extension, etc.). These tasks appear under the project in the Tax Return view. For month-end bookkeeping tasks, use create_closing_task. For ad-hoc client tasks not tied to a project, use create_custom_task. For practice-level tasks, use create_firm_task.
create_property_column
ChatGPTCreate a new property column (e.g. "Industry") for clients in the practice. Supports text, picker (dropdown), multiSelect, datePicker, userPicker, checkbox, amount, percentage, and attachment types. For "picker" and "multiSelect" types you must provide at least one option in pickerOptions. This tool only creates the column definition; it does not set values on individual clients. To set values on a client, use upsert_client_properties.
create_recurring_question
ChatGPTSet up a client question that repeats on a weekly or monthly schedule, posting a new question to the client portal on every occurrence. Use add_question instead for a one-off question. The question is created on behalf of the current user.
create_user
ChatGPTCreate a new team member / user in the practice. Restricted to admins. Sends the standard invite email to the new user.
delete_bank_feed_rule
ChatGPTDelete bank feed rules of one client by rule ID, 1 to 10 per call, as listed by list_bank_feed_rules. Effect: a deleted rule is gone for good, like a rule deleted on the bank rules page. Transactions keep the values it set; nothing is reverted. The preview gives each rule's name and how many open transactions still show a value it set. Confirm: a preview (confirm false) is the default. Use it when the user asks what a delete would do, or when it is unclear whether they want to delete, and show the preview; once the user agrees, call again with confirm true and the same IDs. If the user asked to delete the rules, call with confirm true right away: do not ask the user to confirm a change they already asked for. An ID that isn't one of the client's rules is refused and never blocks the others. If a confirmed call fails or times out, call list_bank_feed_rules before calling again: an ID it no longer lists was deleted.
delete_metrics_tab
ChatGPTDelete a Metrics tab and its variables. This is destructive — before calling, list what will be deleted and confirm with the user. Fails with CONFLICT if visuals reference the tab's variables (retry with deleteReferencedVisuals: true after user confirmation) or if formulas on other tabs reference them (those must be fixed manually). Only available for QuickBooks and Xero clients.
delete_metrics_variable
ChatGPTDelete a variable from a custom Metrics tab. Fails with CONFLICT naming the visuals or formulas that reference it — those must be updated or deleted first. Confirm with the user before deleting. Only available for QuickBooks and Xero clients.
delete_metrics_visual
ChatGPTDelete a visual from the Metrics page. Remaining visuals keep their order. Confirm with the user before deleting. Only available for QuickBooks and Xero clients.
get_accrual_new_transactions
ChatGPTResolves an accrual task (or a tracked ledger account) to its accrual account — type, tracked account and configured recognition accounts — and lists the transactions in its Accruals → New tab: posted transactions with a line on that account that are not accrued, linked or excluded yet. Call it FIRST when the user wants to accrue something from an accrual task (e.g. the task in visibleContext.selectedTask): the returned type is the accrualType and the returned rows are the candidate transactions, so neither needs to be asked. The rows are what the user sees on the task in Double, limited to the dates of the task (dateRange); pass startDate/endDate outside them only when the user asks for other dates. To narrow the candidates (only expenses, a vendor, a date range, a reference) call it again with transactionType, dimensions, startDate/endDate or search — never get_transactions, which also returns transactions that are already accrued.
get_accrual_presets
ChatGPTLists the client's accrual presets for a given accrual type.
get_accrual_reversal_schedule
ChatGPTComputes the reversal entry for an accrued expense awaiting manual reversal, without booking anything. Use it to show the user the booked entries and the reversal entry before calling reverse_accrued_expense. The entry is computed server-side — never compute it yourself.
get_accruals_needing_review
ChatGPTLists the accrued expenses awaiting a manual reversal (created with the REV_MANUAL method and not reversed yet) on an accrued-expense account. Use it to find the accrual to reverse before calling get_accrual_reversal_schedule.
get_ap_aging_report
ChatGPTGet the Accounts Payable (AP) Aging report for a client. Only supported for QBO clients.
get_ar_aging_report
ChatGPTGet the Accounts Receivable (AR) Aging report for a client. Only supported for QBO clients.
get_balance_sheet_report
ChatGPTGet the Balance Sheet report for a client. Supports date ranges, dimension filters, and summarization (Month, Quarter, FiscalQuarter, Classes, Departments, Total). Balance Sheet figures are balances as of each column's end date, not activity: never add date columns together. The balance for a multi-column period is its last column. On calls without dimension filters, each row includes metricsVariableId — the exact id to reference that row in metrics formulas/visuals (copy verbatim; never construct ids from account names). Filtered calls are not annotated: ids for filtered report tabs come from list_metrics_variables. Rows reflect activity in the requested period only — to enumerate every referenceable metrics row, use list_metrics_variables.
get_bank_feed_suggested_match_status
ChatGPTGet the status of an accept_bank_feed_suggested_matches job, and its final matched and refused results once it is COMPLETED. Pass the same client ID and the job ID from the confirmed response. PENDING or RUNNING means the job is still working and the results are null: wait a few seconds and call again. Keep polling until the status is COMPLETED or FAILED, or about a minute has passed, and only then report back to the user; a RUNNING status is not a result.
get_bank_feed_transaction_post_status
ChatGPTGet the status of a post_bank_feed_transactions job, and its final posted and refused results once it is COMPLETED. Pass the same client ID and the job ID from the confirmed response. PENDING or RUNNING means the job is still working and the results are null: wait a few seconds and call again. Keep polling until the status is COMPLETED or FAILED, or about a minute has passed, and only then report back to the user; a RUNNING status is not a result.
get_cash_flow_report
ChatGPTGet the Cash Flow Statement for a client. Supports date ranges, dimension filters, and summarization (Month, Quarter, FiscalQuarter, Classes, Departments, Total). On calls without dimension filters, each row includes metricsVariableId — the exact id to reference that row in metrics formulas/visuals (copy verbatim; never construct ids from account names). Filtered calls are not annotated: ids for filtered report tabs come from list_metrics_variables. Rows reflect activity in the requested period only — to enumerate every referenceable metrics row, use list_metrics_variables.
get_client
ChatGPTGet full details for a single client by ID. Returns accounting platform, settings, and configuration.
get_end_close
ChatGPTGet full details for a single monthly close period by ID. Returns status, assignees, due date, and other metadata.
get_expenses_by_vendor_report
ChatGPTQBO ONLY. Get total expenses grouped by vendor for a client. Returns a flat list of vendors with their total spend over the period. Not available for Xero, Sage, NetSuite, or Puzzle clients.
get_file
ChatGPTSearches the file library for a file by name and returns a download link. Searches both custom folders and auto-organized folders (Closing Sections, Uploads Inbox, Transactions, etc.). If multiple files match, results are paginated — use page and pageSize to navigate. The download link is for sharing with the user — it does not load the file for you to read. To read a file yourself, pass its id to load_attachments_to_chat: source "File Library" ids as fileSystemNodeIds, source "Attachment" ids as attachmentIds.
get_loan
ChatGPTGets the full metadata for a single loan. Does not return payment schedule rows.
get_loan_reconciliation_balance
ChatGPTGets loan balances for account reconciliation as of a cutoff date. Returns balances by loan account ID.
get_organizer
ChatGPTGet one organizer with its full structure: every slide with its type, heading, position, section nesting, required/hidden flags and options, the conditional logic rules that reveal hidden slides, and the completion percentage when published. Pass pdf to also get a download link for a published organizer as a document — "pdf" for the PDF alone or "pdf_and_files" for a ZIP that adds the files the client uploaded. Use get_organizer_responses to read client responses, update_organizer to make changes, and list_organizers to discover organizer ids.
get_organizer_responses
ChatGPTGet the client responses for an organizer: one entry per question slide with the client's answer. Responses are filled in by the client in the client portal (or by a firm user on their behalf). Use get_organizer for the full organizer structure (slide fields, options, conditional logic) and list_organizers to discover organizer IDs. Published organizers with a responses visibility other than "unrestricted" can only be read by the permitted user roles.
get_profit_loss_report
ChatGPTGet the Profit & Loss (Income Statement) report for a client. Supports date ranges, dimension filters, and summarization (Month, Quarter, FiscalQuarter, Classes, Departments, Total). On calls without dimension filters, each row includes metricsVariableId — the exact id to reference that row in metrics formulas/visuals (copy verbatim; never construct ids from account names). Filtered calls are not annotated: ids for filtered report tabs come from list_metrics_variables. Rows reflect activity in the requested period only — to enumerate every referenceable metrics row, use list_metrics_variables.
get_property_columns
ChatGPTGet all property column definitions for the practice, including available options for picker/multiSelect types. Use this to discover valid column IDs and option values before calling upsert_client_properties.
get_questions
ChatGPTList client questions. Returns a paginated list of questions with their messages, assignees, and metadata. Pass clientIds to scope to specific clients, or omit it to list questions across every client the current user can access. Filterable by question type, resolved status.
get_sales_by_customer_report
ChatGPTQBO ONLY. Get total income grouped by customer for a client, based on the QBO "Income by Customer Summary" report. Returns a flat list of customers with their total income over the period. Not available for Xero, Sage, NetSuite, or Puzzle clients.
get_similar_transactions
ChatGPTFind historical transactions similar to a given transaction — those sharing its payee (vendor/customer/employee) or description. Prefer this over get_transactions when analyzing a specific transaction (e.g. deciding how to categorize it or checking how similar activity was coded before): the similarity matching is built in, so you do not need to reconstruct payee/description filters yourself. Returns the matching transactions plus payeeStats and accountStats summarizing how the similar transactions were coded (e.g. "Hall Properties is coded to Rent or Lease 88% of the time"). Supports the same filters as get_transactions to narrow the returned rows. Results are paginated: each call returns at most 100 transactions, total counts the matches after your filters, and hasMore tells you whether to fetch the next page. The stats always describe the complete unfiltered similarity set — filters narrow the rows and total but never the stats — so you rarely need more than the first page.
get_task
ChatGPTGet full details for a single task by ID. You must specify the correct kind based on the task category: use kind="closing" for tasks with category "closing" (monthly close tasks tied to an endCloseId), use kind="custom" for tasks with category "nonclosing" or "firm" (custom tasks). The category is available in list_tasks results.
get_task_templates
ChatGPTRetrieve all task templates available for the practice, including the tasks within each template. Returns template names, IDs, and their tasks (closing, custom, project, and client question tasks). Access is controlled by the template permissions practice setting: admins always have access, managers when the setting allows, and standard users only when set to everyone.
get_transaction_accounts
ChatGPTList all accounts in the chart of accounts for a client, including inactive accounts. Returns each account with its ID, name, type, number, classification, and isActive status.
get_transaction_dimensions
ChatGPTGet dimension values for a given type and client (e.g., all vendors, all classes, all locations). Returns each value with its ID, name, and status.
get_transaction_types
ChatGPTList the transaction types available for a client, as { value, label } options. Use the value field when filtering get_transactions / get_transactions_count by transactionType; label is the human-readable name shown in get_transactions results.
get_transactions
ChatGPTSearch for and retrieve transactions from the accounting ledger. Returns matching transactions with their line details and a URL to view them in the accounting platform. Results are paginated: each call returns at most 100 transactions and hasMore tells you whether another page exists. Fetch further pages only when the answer needs every match; otherwise narrow the filters (dates, account, type, dimensions, search). For the total number of matches use get_transactions_count.
get_transactions_count
ChatGPTCount transactions matching the given filters from the accounting ledger. Use this only when you need the exact number of matches — get_transactions reports hasMore, so paging through it does not need a count.
get_user
ChatGPTGet full details for a single user by ID. Returns name, email, role, and profile information.
internal_confirm_upload
ChatGPT[Internal - widget only] Validates and moves an uploaded file from quarantine to the main bucket. Do NOT call this tool directly — use internal_upload_file instead.
internal_get_upload_url
ChatGPT[Internal - widget only] Returns a presigned S3 PUT URL and the uploadId for this session. Do NOT call this tool directly — use internal_upload_file instead.
internal_upload_file
ChatGPTOpens an interactive file picker UI that the USER must interact with to select and upload a file from their device. IMPORTANT: You (the AI) cannot upload or attach files yourself — you have no access to the user's filesystem. Whenever a task requires a file from the user (e.g. upload an attachment, attach a receipt, add a document), call this tool immediately to open the picker — do NOT ask the user to upload the file in the chat or via another method. If the user expresses any intent of what to do with the file (e.g. attach it to a specific task, or to a client), pass a postUpload spec so the action is taken automatically without a second round-trip. This tool returns immediately after displaying the widget. When the user interacts again, assume the upload was completed and request the widget context to check if the upload succeeded, and to fetch the widget response. The file goes through quarantine validation (executable check, malware scan, MIME type correction) before being stored.
list_activity_log
ChatGPTRetrieve activity log entries with optional filters for client, user, contact, entity type, action, and date range. Returns paginated results with details about who performed each action. Only accessible by admin users (practiceAdmin or superAdmin).
list_activity_log_actions
ChatGPTReturns all valid activity log action values that can be used to filter results in list_activity_log.
list_agents
ChatGPTList the current user's AI agents for this practice, sorted by most recently updated.
list_bank_feed_accounts
ChatGPTList bank-feed accounts, mappings, pending counts, and connection status. Use this for a bank-feed overview or an unscoped pending-transaction request: show account names and counts, then ask which account to inspect. Do not load transaction details across accounts unless the user explicitly asks for multiple or all accounts. Use one summary table for bank connections and one for manual imports. In Account columns and detail headings, show linkedLedgerAccount.name first, followed by a dash and a short source label. For manual_import use Manual bank feed without the numeric suffix from the source name. For bank_connection use institutionName and the mask when available, avoiding long product names; otherwise use a concise source account name without inventing details. Preserve the full linked ledger account name. If its name is unavailable, use the source label alone. Keep source IDs for tool calls, not display labels. Defaults to mapped accounts; use includeUnmapped only for an explicit full inventory. connectionId includes all accounts in that qualifying connection. When fetchConnectionStatus is false, omit the status column and say: Connection status wasn’t checked. Ask me to check it.
list_bank_feed_payees
ChatGPTList the cached accounting vendors, customers, and employees a bank-feed client can be assigned as a payee. Covers all three types and includes inactive payees by default; narrow with payeeTypes. Ids: A payee id is unique within its type, so pair id with payeeType when passing one on. Transaction counts: Every payee list includes counts from cached ledger transactions, not bank-feed pending transactions or live QBO totals. Render a null count as unavailable, never as zero, and explain any ledgerCacheGaps. Display: Always render a table with Payee, Type, Status, and Transactions columns. Warn that cached data is incomplete when ledgerCacheGaps is nonempty.
list_bank_feed_rules
ChatGPTList bank-feed rules with their cases in priority order, each case’s conditions, and the vendor, category, dimension, or text each action applies. This tool only reads stored rules and never applies or changes them. Scope: Rules belong to the client. Answer a rules request from clientId alone; do not ask the user for an account and do not report an account scope. Display: Refer to accounts, vendors, and categories by name when present. When a name is null, show the ID; if its kind is in ledgerCacheGaps, add that the name is pending the ledger sync. Never claim a record was deleted. Render a null posting type as Purchase / Deposit and any other null action value as not set; never print the word null. Precedence: where rules overlap on a transaction, the most recently saved rule wins for each value it sets, and a value only an older rule sets still applies. Editing a rule makes it the most recently saved. Inside a rule, the first case a transaction matches wins. Format: Always render one table with the columns Rule, Case, If, Then, one row per case, whatever the number or complexity of the rules. Put the rule name in its first row only. Write only "ALL" or "ANY" in the Case column, in uppercase, with no case number or parentheses. Write each condition as a short phrase such as "Amount out greater than $100" or "Description contains AMZN", joined with "and" for ALL and "or" for ANY. Write each action as a short phrase such as "Set category to Office supplies" or "Append recurring to description", separated by semicolons. Use plain hyphens and never em dashes.
list_bank_feed_suggested_vendors
ChatGPTList the bank feeds page's "For review: New vendors" section, grouped by suggested vendor name. Use it when the user asks about suggested or new vendors. Each name has its transactions, accounts, the most common category with the AI's reason for that category, the website, and whether a payee already holds the name. Only transactions that have no vendor yet are listed. Payee status: - exact_vendor: an active vendor has this exact name. Creating the name reuses it. - held_by_customer_or_employee: a customer or employee has the name. Offer to assign that payee instead when it is active; an inactive one must be reactivated in QuickBooks first. - inactive_vendor: an inactive vendor has the name. The user must reactivate it in QuickBooks. - similar_vendors: active vendors have a similar name. Ask the user whether to use one of them or create the new name. - new: no payee has the name. The status comes from cached payees. When ledgerCacheGaps is not empty, say that an existing payee can be missing. Counts: lookingUpCount and withVendorCount are transactions of the section that are not in the list. bankFeedAccountId narrows them, search does not. Mention them when they are above zero, as counts for the whole section, not for the searched names. Next step: create_bank_feed_suggested_vendors creates or assigns the vendors, and posts them when the user asks. Display: one table with Suggested vendor, Transactions, Total, Accounts, Category, and Status columns. Name each account as list_bank_feed_accounts does: the ledger account name first, then a dash and a short source label. For manual_import, the label is Manual bank feed. For bank_connection, it is the institution name and the mask when available. If the ledger account name is unknown, show the source label alone. Never show account IDs.
list_bank_feed_transactions
ChatGPTList bank-feed transactions. Users mean the Pending tab when they ask for transactions, including "all transactions" or "every transaction", so request only the pending view. Add the posted or excluded view only when the user asks for posted, matched, excluded, or deleted transactions by name. Combine filters with AND. Scope: For an unscoped request, use list_bank_feed_accounts to show pending counts and ask which account to inspect. Use one established bankFeedAccountId per call; compare named accounts with separate calls. Use allAccounts only for explicit requests across every account. Pagination remains global. Display: Match each account block to list_bank_feed_accounts metadata, fetching it when unknown. Use that tool's ledger-first display label, never a transaction category as the mapped account name. Render one heading and one table per account. Columns: Date, Description, Amount, Status (view), Review group (reviewGroup), Assigned vendor, Assigned category, Suggested vendors, Suggested categories. Include assigned class, location, or customer only when enabledDimensions reports that field as available. Keep status, review group, assignments, and suggestions separate. Show one row per transaction ID, including repeated dates, descriptions, and amounts. Do not aggregate rows or add Qty, Quantity, or Amount each columns.
list_client_properties
ChatGPTList custom properties and their values for one client, several clients, or every client the current user can access — one call covers them all. Returns one row per client and property, with resolved display values (e.g. picker option names instead of IDs). Pass clientIds to scope to specific clients, or omit it for every accessible client; pass propertyColumnIds to read specific properties, or omit it for all of them. Clients with no value stored for a property are omitted. Use get_property_columns to discover column IDs and valid options before updating.
list_clients
ChatGPTList clients in the current practice. Returns a paginated list with basic information including name, accounting platform, and archive status.
list_contacts
ChatGPTList portal contacts in the current practice. Returns a paginated list filterable by client ID. Only contacts linked to clients the user has access to are returned.
list_end_close_statuses
ChatGPTList all available statuses for monthly close periods. Returns practice-specific custom statuses and the reasons configured for each status. Use the status id and reason id values when calling update_end_close.
list_end_closes
ChatGPTList monthly close periods. Optionally filter by client. Returns a paginated list with status and assignees.
list_file_library
ChatGPTReturns all folders and subfolders in the file library for a client as a nested tree. Each folder may contain children (subfolders). Use the returned folder IDs with add_file_folder (as parentFolderId), list_files (as folderId), and add_file_to_client (as folderId).
list_files
ChatGPTLists file names and upload dates for a client, covering both custom-folder files and client-portal uploads in the Uploads Inbox. Does not return download links — use get_file to retrieve a specific file. To read a file yourself, pass its id to load_attachments_to_chat (File Library ids as fileSystemNodeIds, Uploads Inbox ids as attachmentIds). Each result has a source: "File Library" ids belong to rename_file_system_node / move_file_system_nodes, while "Uploads Inbox" ids belong to rename_attachment / move_attachables. Can be filtered by folder (and its subfolders), by date range, or to a single source. When folderId is set, Uploads Inbox files are excluded.
list_loan_payments
ChatGPTLists scheduled loan payments with optional inclusive date filters. Results are paginated and ordered by payment date.
list_loans
ChatGPTLists loans for a client with enough information to identify the relevant loan and its archive state. Use get_loan or a payments-specific tool for full details and payment schedules.
list_metrics_tabs
ChatGPTList the tabs on a client's Metrics page, including the built-in Profit and Loss / Balance Sheet / Cash Flow report tabs (isDefault: true, not editable) and any custom or filtered report tabs. User-created tabs include orderIndex, their position relative to each other. Only available for QuickBooks and Xero clients.
list_metrics_variables
ChatGPTList the variables (rows) of a client's Metrics tabs. Each variable has an id (e.g. TabName.VariableName) used to reference it in formulas and visuals. type 'number' variables hold manual month values; type 'formula' variables compute from other rows; type 'report' rows are the referenceable rows of a report tab: sections, summary rows, and every chart-of-accounts account (even without recent activity). On P&L and Balance Sheet tabs, section rows carry their section's total (e.g. "ProfitLoss.Income" IS total income) — separate "Total X" rows are not listed and should not be referenced. On the Cash Flow tab, computed totals (e.g. "Net cash provided by operating activities") are their own rows and ARE listed. Without tabId, lists the stored variables of every custom tab. With a report tab id ("ProfitLoss", "BalanceSheet", "CashFlow", or a filtered report tab's id), lists that report's rows with their exact ids — ALWAYS look report row ids up this way (or copy metricsVariableId from the report tools), never construct them from account names: ids keep characters like "&" and the ":" sub-account separator (e.g. "ProfitLoss.Repairs&maintenance", "ProfitLoss.RentalIncome:RentalIncomeAPT1"). Report row listing is QuickBooks-only; for Xero, reference rows as shown on the Metrics page (TabName.RowName). Only available for QuickBooks and Xero clients.
list_metrics_visuals
ChatGPTList the visuals (charts) on a client's Metrics page, in grid order. position is the {rowIndex, columnIndex} cell in the visuals grid; variables lists the plotted variable ids. Visuals are client-level — they reference variables from any tab rather than belonging to one. Only available for QuickBooks and Xero clients.
list_notes
ChatGPTList all notes for a client. Returns a paginated list including date, title, body, the user who created each note, and any files attached to it.
list_organizer_templates
ChatGPTList the practice-wide organizer templates with their id and name. Templates are reusable organizer blueprints for creating client organizers; every user of the practice sees the same templates. A template is not an organizer and belongs to no client: to answer a question about a specific client's organizers, use list_organizers instead. Only users the practice's template permissions setting allows can list templates. Practices that do not use organizers have none at all: say so plainly rather than linking the user to the templates page. Apply one to clients with apply_organizer_template.
list_organizers
ChatGPTList tax organizers for a single client (pass clientId) or across all clients you can access. These are the organizers that belong to clients, not the practice's reusable organizer templates — use list_organizer_templates for those. Organizers move through statuses: "draft" (create_organizer creates drafts, not yet visible to the client), "in_progress" (published, awaiting client responses), "completed", and "archived"; filter with status ("published" matches both in_progress and completed). Organizers with a restricted responsesVisibility are included in this list, but reading them via get_organizer or get_organizer_responses may require additional permissions. Results are paginated, most recently active first.
list_projects
ChatGPTList tax projects for a client. Tax projects are yearly containers (e.g. "2024 Taxes") that hold tax project tasks. Use this to discover available projectIds before calling create_project_task or update_project_task. Results are sorted by year descending.
list_question_tags
ChatGPTList available tags for non-transaction client questions. Use the returned tag IDs when filtering questions by tag or updating a question tag.
list_recurring_questions
ChatGPTList the questions a client is asked on a repeating weekly or monthly schedule, with each schedule and its next occurrence dates. Use it to find the recurringQuestionId that update_recurring_question needs. These are the schedules themselves, not the individual questions they post — use get_questions for those.
list_sections
ChatGPTList all valid task sections where tasks can be manually created. Returns both built-in default sections and custom sections created by the practice. Excludes system-managed sections (Account Reconciliation, Transaction Review, Payee/Entity Review, Final Review, Accruals, Allocations) where tasks cannot be created directly. Categories include: "closing" (monthly close sections), "nonclosing" (ongoing/custom task sections), "firm" (firm-level sections), and "tax" (tax-related sections).
list_task_filter_options
ChatGPTList the available filter options for list_tasks. Returns the task statuses configured for this practice (practices can customize statuses, so call this instead of assuming defaults; isCompleted groups them into completed vs not-completed), the monthly close periods (monthDate filter values), and the tax project years (projectYear filter values). For the remaining filter options use: list_users (assignedTo, nextSignOffUser), list_clients (clientId), list_sections (sectionId), and list_task_tags (tagId).
list_task_tags
ChatGPTList available tags that can be applied to tasks. Use the returned tag IDs when creating or updating tasks via the tagId field.
list_tasks
ChatGPTList and filter tasks across all categories (closing, non-closing, and firm tasks). Returns a paginated table of tasks for the current practice. Use category field in results to determine task kind: "closing" tasks belong to a monthly close (use closing task tools), "nonclosing" and "firm" tasks are custom tasks (use custom task tools). Supports filtering by client, assignee, status, and due date range.
list_timers
ChatGPTRetrieve time tracking entries with optional filters for user, client, workstream, and date range. Returns paginated results. Access is role-based: standard users only see their own timers, managers see timers for their assigned clients, and admins see all practice timers.
list_users
ChatGPTList users in the current practice. Returns a paginated list with name, email, and role for each user.
list_workstreams
ChatGPTList available workstreams for time tracking. Workstreams categorize timer entries. Each workstream has a type ("client" or "firm") indicating which kind of timer it applies to. Use this to discover valid workstream IDs and names before creating or filtering timers.
move_attachables
ChatGPTMove attachable file(s) to another attachable key or into a custom folder, including across clients and between practice- and client-level. IMPORTANT: moving a file to an attachable target creates a NEW attachment (new id) and invalidates the input attachment id. The result returns movedAttachments mapping each previousId to its newId; use newId for any subsequent move or operation. Folder targets do not produce attachment ids and omit movedAttachments.
move_file_system_nodes
ChatGPTMove custom-folder file/folder node(s) into another custom folder or out to an attachable key, including across clients. IMPORTANT: a cross-client move, or any move to an attachable target, invalidates the input node id (the node is replaced by a new node, or becomes an attachment). The result returns movedNodes mapping each previousNodeId to its newNodeId (folder target) or newAttachmentId (attachable target); use the new id for any subsequent operation.
ping
ChatGPTHealth check — returns pong
post_bank_feed_transactions
ChatGPTPost pending bank feed transactions to the client's ledger (QuickBooks Online). If the user asked to post, call with confirm true; the response still names every refused row and why. Call with confirm false only when the user asked what would post, or when it is unclear whether they want to post. Do not ask the user to confirm a post they already asked for. Nothing is written without confirm; a confirmed call queues a job and returns its ID to check with get_bank_feed_transaction_post_status. Readiness: a row needs a category, a description, a non-zero amount, and a vendor unless it is a transfer or a credit card payment. A row with a possible match and no category is refused until the match is accepted with accept_bank_feed_suggested_matches or a category is set. Posted, matched, excluded, hidden, and in-flight rows are refused. A refused row never blocks the rest of the batch. Results: a confirmed response only reports what was handed to the job, never what reached the ledger; a queued row can still be refused. Call get_bank_feed_transaction_post_status with the job ID for the posted and refused results. Up to 100 IDs per call.
preview_accrual_from_transaction
ChatGPTDry run of create_accrual_from_transaction. Resolves the ledger transaction, reads each selected line amount from the ledger, computes the schedule server-side and reports what would be created - WITHOUT creating. Always call it first, show the user the result as a review table, and get an explicit confirmation before calling create_accrual_from_transaction.
preview_loan_schedule
ChatGPTComputes the amortization schedule for a loan from its terms, WITHOUT creating or persisting anything. Use this to show the user the resulting payment schedule for review before creating a loan with create_loan. All monetary amounts are in dollars.
rename_attachment
ChatGPTRenames a file attached to a task, transaction, organizer, or other auto-organized section. For files in custom folders, use rename_file_system_node instead. Client attachments: provide clientId + attachmentId. Firm task attachments: clientId null + attachmentId (preferred) or fileKey (fallback).
rename_file_system_node
ChatGPTRenames a file or folder in the client file library (custom folders). For task/transaction/auto-organized attachments, use rename_attachment instead. Extension is preserved if omitted. Throws if a node with the same name already exists at that location.
reorder_metrics_visuals
ChatGPTReorder the visuals grid on the Metrics page. Fetch the current layout with list_metrics_visuals first, then send the complete new grid. Use this to rearrange visuals that already exist, and to pair a newly created visual with an existing one: create_metrics_visual_grid only adds rows above the current grid, so it cannot place a new visual into a row that already holds one. Creating a chart to sit beside an existing chart takes both calls. When the new visuals fill their own rows, create_metrics_visual_grid already applied that layout and no follow-up reorder is needed. Layout conventions, unless the user asks for something else: - An explicit layout from the user, or the layout of a dashboard being copied, wins over these defaults. - Summary KPI cards go above charts. Order charts from high-level trends down to detailed breakdowns. - Never put a KPI card and a non-card chart on the same row. Cards are sized for 3-across and read badly stretched to half a row. - Group KPI cards 2–3 per row, avoiding an orphan: 2+2 for four cards, 3+2 for five. - Pair related non-card charts 2 per row. Keep a primary, dense, or unrelated chart on its own full-width row. - Preserve the existing layout unless the user asks for a redesign; move only what needs moving. Only available for QuickBooks and Xero clients.
restore_bank_feed_transactions
ChatGPTRestore excluded bank feed transactions to the bank feeds page, as "Undo exclude" does on the Excluded tab. Rows that are not excluded are refused with a reason and never block the rest. Client questions deleted when a row was excluded do not come back.
reverse_accrued_expense
ChatGPTBooks the reversal of an accrued expense awaiting manual reversal: posts the reversal journal entry to the ledger and marks the accrual reversed. The reversal entry is computed server-side from the accrued balance — preview it with get_accrual_reversal_schedule and confirm with the user before calling.
run_agent
ChatGPTTrigger an AI agent config to run in the background. Returns the created chatId and pending run log.
search_app_navigation
ChatGPTFind the Double page for a task or question: firm, settings and template pages with their exact URLs, and pages belonging to one client with the build_deep_link arguments they need. Call it whenever you need to point the user at a page and no tool has returned its deepLink.
set_bank_feed_transaction_payee
ChatGPTSet the payee on pending bank feed transactions. Identify the payee with payeeId or payeeName, never both. When known, pass payeeType from list_bank_feed_payees to restrict the lookup; otherwise all three payee types are searched. Scope: Acts on pending rows only. Posted, matched, excluded, in-flight, hidden, and transfer rows are refused with a per-row reason in results; the rest of the batch still goes through. Credit card payments accept only a vendor. To clear a payee, use categorize_bank_feed_transactions with clearPayee=true. Creating a vendor: For the suggested vendors in "For review: New vendors", use list_bank_feed_suggested_vendors and create_bank_feed_suggested_vendors instead. createVendorIfMissing requires payeeType vendor or an omitted payeeType. It writes a new vendor to QuickBooks and also links every other pending transaction whose suggested vendor carries the same name, so confirm with the user before setting it. Report otherTransactionsLinked when it is above zero. Misses: An unknown payeeName is refused with near matches to confirm with the user rather than guessed at. A freshly created vendor can lag in cached reads, so trust the name in this response over a later list_bank_feed_payees page.
set_file_visibility
ChatGPTShows or hides an existing client file in the client portal. This only changes visibility; it does not move, copy, upload, or attach files. Use attachmentId for attachment-backed files and fileSystemNodeId for custom file-library files.
update_bank_feed_rule
ChatGPTEdit bank feed rules of one client: 1 to 10 rules per call. Each rule is replaced whole and keeps its ID: send its name and every case, condition and value as they should be after the edit. Read the rule with list_bank_feed_rules first and send the parts that don't change too; anything left out is removed. Cases: a rule has 1 to 10 cases, checked in order like "if … else if …". Each case has ALL or ANY conditions and the values it sets; a transaction takes the values of the first case it matches and ignores the rest. References: give the category, payee (vendor or customer), class, location, customer, and each bank account by ID or by exact name, never both. Names match exactly, ignoring case; a name that is missing, shared by several active records, or inactive refuses that rule with a reason. Ask the user which one they mean rather than guessing. The same checks as the bank rules page apply: class, location and customer need that tracking turned on for the client; a transfer needs a balance sheet category; a credit card payment needs a Bank or Credit Card category. Effect: saving an edited rule runs it on every open transaction (not posted, not matched, not a possible match) and overwrites the values it sets there, including values a user or the AI set. Transactions the old version changed that the new one doesn't match keep their values, and a value the old version set that the new one no longer sets stays on the transactions. The preview says how many open transactions it matches and how many of them already have a different category it would replace, with examples. Where rules overlap, the most recently saved rule wins for each value it sets, so an edited rule wins over the client's other rules there; within one call, later rules in the list win. Confirm: a preview (confirm false) is the default. Use it when the user asks what the edit would do, or when it is unclear whether they want to save it, and show the preview; once the user agrees, call again with confirm true and the same rules. If the user asked to make the edit, call with confirm true right away: do not ask the user to confirm a change they already asked for. The response still gives the counts and names every refused rule and why. A refused rule, including an ID that isn't one of the client's rules, never blocks the others.
update_closing_task
ChatGPTUpdate a closing task (category "closing" in list_tasks). Only use this for tasks that belong to a monthly close period (have an endCloseId). Only provide fields you want to change — omitted fields remain unchanged. To mark a task complete, set status to "done". To change the due date, provide dueDate along with optional dueDateBusinessDayType and dueDateBusinessDayValue for recurring business-day calculations. For custom/firm tasks, use update_custom_task instead.
update_contact
ChatGPTUpdate an existing portal contact. Supports updating name, phone number, client access, and permissions. Does not support deleting contacts.
update_custom_task
ChatGPTUpdate a custom task (category "nonclosing" in list_tasks). Use this for client-specific tasks that are NOT part of a monthly close. Only provide fields you want to change — omitted fields remain unchanged. To mark a task complete, set status to "done". For practice-level firm tasks, use update_firm_task. For closing tasks, use update_closing_task.
update_end_close
ChatGPTUpdate a close period. Only provide fields you want to change — omitted fields remain unchanged. Use list_end_close_statuses to see valid status and reason values for the practice. A reason must belong to the effective status (the new one if being set, otherwise the existing one), and is required when setting a status that has reason options. To set a due date: use dueDate (YYYY-MM-DD) for a direct date, or provide dueDateBusinessDayType + dueDateBusinessDayValue + dueDateTargetMonth (YYYY-MM) for business-day-based due dates (useful for 4-4-5 clients where the due date varies by month). Set dueDate to null to clear. WARNING: Changing the due date will also shift the due dates of all tasks belonging to this close if the new due date falls in a different month than the existing one (tasks have due dates relative to the close due month; if no due date is set, the reference month defaults to the close monthDate + 1 month). Do not update the due date unless the user is explicitly aware of this side effect and has approved it. WARNING: Updating a preparer, reviewer, or manager will automatically reassign all closing tasks and custom tasks for the period from the prior assignee to the new one (inclusive of sign-offs), and will subscribe the new assignee to the client notification digest. This operation is irreversible.
update_firm_task
ChatGPTUpdate a practice-level firm task (category "firm" in list_tasks). Use this for tasks that are NOT tied to any specific client. Only provide fields you want to change — omitted fields remain unchanged. To mark a task complete, set status to "done". For client-specific custom tasks, use update_custom_task. For closing tasks, use update_closing_task.
update_metrics_tab
ChatGPTRename a Metrics tab. Variable ids embed the tab name, so all visuals and formulas referencing this tab's variables are rewritten automatically (referencesUpdated reports how many). Only available for QuickBooks and Xero clients.
update_metrics_variable
ChatGPTUpdate a variable on a custom Metrics tab: rename it, change month values (merged), change its formula, row style, indentation, or position. Renaming rewrites all visuals and formulas that reference the variable (referencesUpdated reports how many). Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
update_metrics_visual
ChatGPTUpdate a visual on the Metrics page in place; other visuals are unaffected. Only provided fields change. Report-row references (P&L / Balance Sheet rows) are validated against the live report on QuickBooks clients: never construct them from account names — look exact ids up with list_metrics_variables using the report tab's id. On Xero clients ids cannot be listed; reference rows as shown on the Metrics page (TabName.RowName). If the response includes warnings (rows with no activity in the current window), surface them to the user. Only available for QuickBooks and Xero clients.
update_note
ChatGPTUpdate an existing note. You can update the title, body, or both. Pass fileKeys to attach uploaded files to the note, leaving title and body untouched.
update_organizer
ChatGPTDeclaratively update an organizer as a single document write: read the current state with get_organizer, modify it, and send the desired state back. Only the sections you provide are touched. "name" renames the organizer (blocked once completed). "responsesVisibility" changes who can view responses (practice admins and super admins only; you cannot pick a level that would lock yourself out). "slides" is the FULL desired slide state: array order is display order, nesting a node under a section places it in that section, nodes without an id create new slides (give them a ref so logic and the result can reference them), and any existing slide missing from the payload is DELETED — deletions require confirmDeletions: true. Slide content is merged per slide: for existing slides, omitted fields and flags keep their stored values; type is always required and must match the stored type. "logic" is the FULL desired conditional-logic state: rules without an id are created, rules with an id are replaced, and existing rules missing from the payload are deleted (no confirmDeletions needed). Conditions and show targets reference slides by slideId, or by slideRef for new slides from the same call; show targets must be hidden slides. "status" transitions the organizer lifecycle: "published" publishes a draft to the client portal (requires a name and at least one slide); "draft" reverts a published organizer to a draft, removing it from the client portal while preserving client responses for re-publish (rejected once completed); "completed" marks a published organizer complete on behalf of the client (rejected for drafts; irreversible). Completing an organizer that still has unanswered required slides is rejected unless confirmIncomplete is true — set it only after that rejection; the user is then asked to approve the call before it runs, and the result carries a note. "archived" archives (true — published organizers only; archiving one still in progress removes it from the client portal and returns a note) or unarchives (false) the organizer. Archived organizers cannot be updated at all except to unarchive them. Slide and logic changes additionally require the organizer to be a draft (not published). Operations apply in order: archived false, name, responsesVisibility, status "draft", slides, logic, status "published" / "completed", archived true — so a published organizer can be reverted and edited in one call, slides can be added and published in one call, and a just-completed organizer can be archived in one call. Re-read the organizer with get_organizer after updates.
update_organizer_responses
ChatGPTWrite client responses on an organizer's slides on behalf of the client: pre-fill a draft (the values appear in the client portal once published) or edit the responses of a published or completed organizer. Read the slide ids, types, and options with get_organizer, and the current responses with get_organizer_responses. Values are validated per slide type (and against the configured options for dropdown / multiple_choice) before anything is written, so a rejected call writes nothing. Set value: null to clear a response (the slide returns to unanswered), and notApplicable: true to mark a non-required slide as N/A. File slides are not answered here — they are answered by uploading files. Archived organizers cannot be updated, and organizers with a restricted responsesVisibility require the matching role.
update_project_task
ChatGPTUpdate a task inside a tax project. Only provide fields you want to change — omitted fields remain unchanged. To mark a task complete, set status to "done". To move the task to a different section, pass sectionId with the target tax section ID from list_sections. Pass checklists to create/rename checklists and create/update their sub-tasks; prefer checklists over listing items in the description — checklists and sub-tasks cannot be deleted. For ad-hoc client tasks not tied to a project, use update_custom_task. For practice-level firm tasks, use update_firm_task. For closing tasks, use update_closing_task.
update_property_column
ChatGPTUpdate an existing property column. Supports renaming the column (any type) and adding dropdown options (picker and multiSelect only). Renaming cascades to existing property values on clients and to saved view configurations. Deleting dropdown options is not supported. Color selection is not supported. This tool does not edit property values on individual clients — use upsert_client_properties for that.
update_question
ChatGPTUpdate an existing client question. Supports resolving (closing) or re-opening threads, changing assignees, and adding response messages. Optionally attach files to the reply (call internal_upload_file first).
update_recurring_question
ChatGPTUpdate an existing recurring client question: its text, subject, tag, assigned contacts, email notification setting, or schedule. Only the fields you pass are changed; pass null to clear an optional field. Changing the schedule replaces it, and moving the next occurrence to today posts that question within the hour.
update_user
ChatGPTUpdate an existing user. Supports updating name, phone number, role (practiceEmployee, manager, practiceAdmin), client access (selectedAccounts), and branch assignments. Does not support deleting users.
upsert_client_properties
ChatGPTCreate or update custom property values for a client. Supports text, picker, multiSelect, datePicker, userPicker, checkbox, amount, percentage, and attachment types. For attachment columns: call internal_upload_file first, then — as soon as the fileKey is injected into context — call this tool with that fileKey as the value. Do not wait for the user to ask. Use get_property_columns first to discover available columns, their IDs, and valid options.