add_wallet
ChatGPTAdd a blockchain wallet by its public address. Call get_integration_metadata first for the chain’s provider id. Starts an initial sync of the address’s on-chain activity unless skipInitialSync is set. Enterprise workspaces must supply primaryPortfolioId. Takes public addresses only — never API keys, secrets or passwords; exchange accounts are connected in the Kryptos web app.
apply_rules
ChatGPTRe-evaluate every rule against all ledgers and regenerate all journals. Asynchronous — returns a task id; poll get_task. Rule-assigned legs are re-derived; manually assigned legs are kept. Journals already pushed to an ERP are not re-sent — push them again with sync_to_erp and explicit transactionIds.
assign_address_to_contact
ChatGPTLink a chain address to a contact. This resolves the matching counterparty and writes the contact name onto every ledger leg involving the address — the step that makes transaction history readable.
assign_ledger_accounts
ChatGPTAssign COA codes to a single ledger leg and regenerate its journal immediately. Codes come from list_chart_of_accounts; find untagged legs with list_coa_ledgers(missingCoa=true).
bulk_assign_ledger_accounts
ChatGPTAssign the SAME COA codes across many transactions at once. Takes transaction ids, not ledger ids — every eligible leg on each transaction is tagged, so the transactions should be of one kind. Queues a recompute rather than regenerating inline; poll get_task.
bulk_update_transaction_labels
ChatGPTApply the same label, description, notes or tags to many transactions at once (data holds the fields). One id in a locked period rejects the whole batch.
cancel_sync_job
ChatGPTCancel a running sync.
cancel_task
ChatGPTCancel a running background job.
check_contact_exists
ChatGPTWhether a contact name is already taken (case-insensitive). Call before create_contact to avoid duplicates.
check_spam_status
ChatGPTLook up the spam status of many asset/chain pairs at once. pairs is a list of { assetId, chainId }.
connect_erp
ChatGPTStart connecting Xero or QuickBooks. Returns an OAuth authorization URL the user must open in a browser and approve — the connection completes when the provider redirects back. Takes no credentials; Softledger, which uses client credentials, is connected in the Kryptos web app.
create_chart_of_account
ChatGPTCreate a custom GL account that exists only in Kryptos. Journals using it cannot be pushed to an ERP — create ERP accounts with create_erp_accounts instead.
create_contact
ChatGPTCreate a contact. Creating one does not label any transactions by itself — call assign_address_to_contact to link an address, which is what writes the name onto ledger legs.
create_contacts_upload_url
ChatGPTGet a 15-minute signed URL to upload a contacts CSV (up to 5 MB, 500 rows, the Kryptos contacts template: Name,Email,Telegram,Country,Postcode,Blockchain,Address) for import_contacts_from_csv. Only for clients that can run shell commands. Steps: (1) call this; (2) PUT the file: curl -X PUT -H "Content-Type: text/csv" --upload-file <local file> "<uploadUrl>"; (3) call import_contacts_from_csv with the returned gcsPath. Requires the ADMIN or OWNER role.
create_csv_upload_url
ChatGPTGet a 15-minute signed URL to upload a CSV, XLS or XLSX file of any size up to maxBytes straight to Kryptos storage. Only for clients that can run shell commands. Steps: (1) call this; (2) PUT the file: curl -X PUT -H "Content-Type: <contentType>" --upload-file <local file> "<uploadUrl>"; (3) call register_csv_upload with the returned filePath; (4) call start_csv_import with the uploadId.
create_custom_rule
ChatGPTCreate a categorisation rule. Existing rules are not re-evaluated automatically — call apply_rules afterwards to backfill. Use list_chart_of_accounts for valid coa codes and get_supported_labels for label.
create_default_rules
ChatGPTSeed the standard rule set. Only seeds when the workspace has no default rules (new workspaces already have them), so it will not restore one that was deleted.
create_erp_accounts
ChatGPTCreate or update GL accounts in the ERP itself (batch, up to 500; existing codes are updated). Writes to the external system — confirm with the user. Check the result for per-account errors.
create_manual_transaction
ChatGPTCreate a transaction by hand. Call get_supported_labels for a valid label and search_assets for each assetId — labels are a closed set and assetId must be a real catalog id, not a ticker. A trade needs both incomingAssets and outgoingAssets; a deposit only incoming; a withdrawal only outgoing.
create_portfolio
ChatGPTCreate a portfolio to group integrations.
delete_chart_of_account
ChatGPTDelete a GL account by code. Any ledger or rule referencing it has that reference nulled, so journals will need regenerating. Previously this tool ran with NO scope check at all.
delete_contact
ChatGPTDelete a contact. Unlinks its addresses, restores the affected counterparties to their previous state and strips the aliases from ledgers. Requires ADMIN or OWNER.
delete_integration
ChatGPTDisconnect an integration. Destructive: it queues a worker that removes the transactions, ledgers and holdings that came from it, which changes cost basis and tax figures. Confirm with the user first.
delete_portfolio
ChatGPTDelete a portfolio. Confirm with the user — integrations assigned to it are affected.
delete_rule
ChatGPTSoft-delete a rule (sets isWorking=false). Legs it already tagged keep their accounts until apply_rules re-evaluates them.
delete_transactions
ChatGPTPermanently delete transactions. Destructive and not undoable: it removes their ledgers and journals and re-runs transfer detection, which changes cost basis and tax figures. Confirm the exact ids with the user first.
detect_wallet_chains
ChatGPTDetect which EVM chains a wallet address has activity on. Use before add_wallet to avoid connecting empty chains.
disconnect_erp
ChatGPTDisconnect an ERP. Destructive: wipes the chart of accounts that came from it. Confirm with the user.
edit_transaction
ChatGPTRestate a transaction’s legs — assets, quantities, prices — and reprocess it so balances, cost basis and journals are recomputed. This is the correct way to fix a wrong amount or a wrong fiat value; there is no transaction-level value override in v2. Send the complete leg list, not a partial one.
generate_report
ChatGPTStart generating a tax report. Asynchronous — returns a task id; poll get_task, then get_report_link for the download. Accuracy depends on reconciliation being clean, so check get_reconciliation_summary first.
get_accounting_breakdown
ChatGPTDerived breakdown over a date range: income, expenses, gifts, other gains and unmatched items. Both bounds are required; for a tax year use its start and end. Refused, with the reason, if the range touches a tax year the plan does not cover.
get_accounting_settings
ChatGPTResolved accounting configuration actually in force: cost-basis method, fiscal-year boundaries and jurisdiction toggles.
get_accounting_status
ChatGPTWhen gains were last calculated and whether any output exists yet. Check this before trusting tax figures — a stale calculation is the usual reason numbers look wrong.
get_asset_graph
ChatGPTA single asset's value and cost-basis over time.
get_asset_holding
ChatGPTDetail for a single asset the workspace holds, including its per-wallet distribution. Resolve assetId with search_assets first.
get_asset_transaction_counts
ChatGPTTransaction count per asset — use before mark_spam to see how much data marking an asset would hide.
get_calculated_balances
ChatGPTBalances reconstructed from the ledger rather than reported by the provider. Compare against get_holdings to find sync gaps; get_missing_balances does that comparison for you.
get_contact
ChatGPTOne contact by id, with its linked chain addresses.
get_credential_status
ChatGPTValidity and expiry of one integration’s credentials.
get_csv_upload
ChatGPTStatus and row counts for one CSV upload.
get_csv_upload_errors
ChatGPTSigned download URL for the parse-error report of a CSV upload. Returns 404 when the file parsed cleanly.
get_dashboard
ChatGPTFull portfolio dashboard: net worth, cost basis, unrealised gains, 24h change, top holdings, allocation by asset and by wallet type, and counts of transactions/integrations/NFTs/DeFi positions. The best single call for "how is my portfolio doing".
get_dashboard_totals
ChatGPTJust the portfolio totals — net worth, liquid holdings, cost basis, unrealised gains and 24h change. Use this instead of summing get_holdings, which only ever returns one page.
get_defi_holdings
ChatGPTDeFi positions across protocols. Filter by category to get only staking, lending, farming, perpetuals and so on — there is no separate tool per category.
get_defi_networks
ChatGPTDistinct networks the workspace holds DeFi positions on — use to populate a filter before calling get_defi_holdings.
get_defi_totals
ChatGPTDeFi overview totals: total balance, amount borrowed, earned rewards and number of connected protocols.
get_email_verification_status
ChatGPTWhether the current user's email address has been verified.
get_erp_connection_status
ChatGPTWhether an ERP is connected and which organisation is selected.
get_holdings
ChatGPTList token holdings for the workspace with live prices. Returns one row per asset with quantity, market value, cost basis and unrealised gain. For portfolio-wide TOTALS use get_dashboard_totals — the totals of a single page of this list are not the portfolio total. Use get_defi_holdings for DeFi positions and get_nft_holdings for NFTs; neither appears here.
get_integration
ChatGPTDetail for one integration by id. Previously this filtered the full list client-side; it is now a direct lookup.
get_integration_assets
ChatGPTPer-asset breakdown held in one integration.
get_integration_counts_by_provider
ChatGPTNumber of active integrations per provider.
get_integration_metadata
ChatGPTCatalog of supported providers with the credential fields each one needs. Call this before add_wallet to learn the required credentialKind and fields for a provider.
get_integration_missing_balances
ChatGPTPer-asset differences between what this integration reports and what the ledger implies — the per-wallet version of get_missing_balances.
get_integration_sync_status
ChatGPTMost recent sync time for the workspace — use to tell whether data is stale.
get_integrations
ChatGPTList the connected wallets and exchanges (integrations) in the workspace, with sync state and asset counts.
get_interacted_assets
ChatGPTAssets the workspace has ever transacted in, with fuzzy search. Useful for building an asset filter that only offers assets actually present.
get_ledger
ChatGPTOne ledger leg by id.
get_liabilities
ChatGPTLiability positions (borrowed amounts). Reported separately from holdings, and already netted out of dashboard net worth.
get_live_rates
ChatGPTCurrent market rates for the top crypto assets, ranked. This is a paged listing, not a lookup — it takes no symbol filter. To price a specific asset use search_assets, or read market value from get_holdings.
get_lock_boundaries
ChatGPTValid period-end dates a lock may be placed on.
get_missing_balances
ChatGPTAssets where the provider-reported balance disagrees with the ledger-derived one. A negative difference implies a missing deposit, positive implies a missing withdrawal. The clearest signal that transaction history is incomplete.
get_missing_integrations
ChatGPTCounterparties that appear in transactions but belong to no connected wallet — candidates for wallets the user should connect. Rows are groups, not addresses: when the counterparty is a recognised exchange every address for that exchange collapses into ONE row (is_exchange_address=true, provider_name set, address null), because a single exchange rotates many deposit addresses and each would otherwise repeat the same "connect X" suggestion. An unrecognised address stays its own row (is_exchange_address=false, address set, provider_name null). Exchanges the workspace has already connected are excluded. id is an opaque group key, NOT a counterparty id — to dismiss a row pass each of its counter_party_ids to ignore_counterparty.
get_missing_prices
ChatGPTLedger legs with no resolved price, grouped by asset and wallet. An unpriced leg has no fiat value, so it silently understates gains. Fix with update_ledger.
get_missing_purchases
ChatGPTSells with no prior buy — the running balance goes negative, meaning an acquisition is missing. Usually an unconnected wallet or an incomplete import. Grouped by asset and wallet.
get_nft
ChatGPTDetail for one NFT by contract address and token id.
get_nft_collections
ChatGPTNFT holdings grouped by collection, with per-collection counts and value.
get_nft_holdings
ChatGPTNFTs held by the workspace, with floor-price estimates.
get_open_lots
ChatGPTOpen (unsold) lots as at a point in time, with their cost basis. Use to answer "what is my basis in X right now".
get_portfolio
ChatGPTDetail for one portfolio.
get_portfolio_graph
ChatGPTPortfolio value over time as a time series. Replaces the legacy day-count parameter with a fixed range.
get_recalculation_status
ChatGPTProgress of a COA journal regeneration, by task id. Without a task id, list_tasks(operationType: "coa-pipeline", limit: 1) shows whether one is running. sync_to_erp is refused while one is.
get_reconciliation_summary
ChatGPTReview-page badge counts and an overall data-quality percentage: how many transactions are missing prices, missing purchases, uncategorised, high-PnL unreviewed, or point at unidentified addresses. Start here before pulling any specific list.
get_report_catalog
ChatGPTReport types that can be generated for this workspace’s country, per tax year. Call before generate_report — the available set is country-specific.
get_report_link
ChatGPTSigned download URL for a completed report. Expires, so fetch it when needed.
get_supported_labels
ChatGPTCanonical transaction labels with their transaction type and tax treatment. Call this before update_transaction_label or create_custom_rule — labels are a closed set and an invalid one is rejected.
get_sync_job
ChatGPTStatus and progress of one sync job.
get_task
ChatGPTStatus, progress and result of one background job. Poll this after any tool that returns a task id — do not assume queued work has finished.
get_task_logs
ChatGPTAudit log for a background job — use to explain why one failed.
get_tax_loss_harvesting
ChatGPTUnderwater positions and the loss that would be realised by selling them — a simulation, nothing is changed. Note wash-sale/superficial-loss rules vary by jurisdiction and are not all modelled, so treat this as a starting point rather than advice.
get_tax_report_disposals
ChatGPTLot-level disposal drill-down for a fiscal year: each sale matched against the acquisitions it consumed, with per-lot gain. The audit trail behind the year’s gain total. Available only for tax years the workspace’s plan covers; for any other year the call returns an error code saying why (NO_TAX_YEAR_PLAN, ENTERPRISE_PLAN_REQUIRED or PLAN_TRANSACTION_LIMIT_EXCEEDED).
get_tax_settings
ChatGPTTax configuration: cost-basis method, fiscal year boundaries and jurisdiction-specific toggles. These drive every gain calculation.
get_transaction
ChatGPTOne transaction with its ledger legs, by id.
get_transaction_ledgers
ChatGPTOne transaction's ledger legs. Each leg carries its own asset, quantity, price and direction — this is the level at which value and cost basis are computed. Cost basis, proceeds and gains are never returned by this tool (always null) — they are not zero. For a tax year the plan covers, read gains from get_tax_report_disposals or generate the report.
get_transaction_lots
ChatGPTThe acquisition lots matched against this transaction’s disposals: for each lot the asset, quantity, acquisition and disposal dates, and the transaction that acquired it — which purchases a sale used up. Cost basis, proceeds and gain are not returned by this tool (always null, which does not mean zero); per-lot gains are in get_tax_report_disposals.
get_transaction_summary
ChatGPTWorkspace-wide transaction counts: total, per type, and the missing-price / missing-purchase badge counts. Computed server-side over every transaction — do not try to derive this by paging get_transactions.
get_transaction_types
ChatGPTTransaction types, each with the labels that belong to it.
get_transactions
ChatGPTList transactions with their ledger legs. Supports filtering by label, type, wallet, asset, address, time window, value and reconciliation flags. Spam and Ignore-labelled transactions are excluded unless you opt in. Cost basis, proceeds and gains are never returned by this tool (always null) — they are not zero. For a tax year the plan covers, read gains from get_tax_report_disposals or generate the report.
get_user_info
ChatGPTThe authenticated user: name, email, country, base currency and preferences. For the workspace the session is bound to, use get_workspace; for a portfolio summary, get_dashboard.
get_workspace
ChatGPTWorkspace settings: name, type, country, base currency, cost-basis method, timezone and last-sync timestamps.
get_year_end_lots
ChatGPTOpen lots at the start and end of a fiscal year — the carried-forward cost basis that ties one tax year to the next. Only for tax years the plan covers; otherwise refused with the reason.
ignore_counterparty
ChatGPTMark a counterparty as ignored so it stops appearing in the missing-integrations review list. Use for addresses that will never be named — burn addresses, dust senders. id must be a counter_parties id: from get_missing_integrations take an entry of the row's counter_party_ids, NOT its id, which is an opaque group key. An exchange row needs every one of its counter_party_ids ignored.
import_contacts_from_csv
ChatGPTCreate contacts in bulk from a CSV in Kryptos storage — uploaded with create_contacts_upload_url, or through the web app. Requires the ADMIN or OWNER role.
list_chart_of_accounts
ChatGPTThe workspace chart of accounts. Enterprise workspaces only — a retail workspace gets 403 ENTERPRISE_REQUIRED.
list_coa_ledgers
ChatGPTLedger legs from the accounting perspective. Filter to those still missing a COA code to find what blocks a clean journal set, optionally within a date window (e.g. the month being closed). meta.total is the count.
list_contact_addresses
ChatGPTChain addresses linked to a contact.
list_contacts
ChatGPTUser-created contacts — named people and businesses.
list_counterparties
ChatGPTAuto-detected counterparties — addresses the workspace has transacted with, each with a transaction count and whether it is already linked to a contact. Filter to unresolved ones to find what is worth naming.
list_countries
ChatGPTSupported countries with their tax rules, allowed cost-basis methods and default currency. Use to validate a country before creating a workspace or changing tax settings.
list_csv_uploads
ChatGPTCSV import history with per-file status.
list_erp_account_classes
ChatGPTValid account classes for the platform — the allowed values when creating accounts. Each ERP has its own enum.
list_erp_tenants
ChatGPTOrganisations/companies available in the connected ERP. Xero can expose several; QuickBooks one; Softledger returns its locations, with isRoot marking the consolidation root ("Global").
list_erps
ChatGPTERP integrations available to connect (Xero, QuickBooks, Softledger).
list_journals
ChatGPTGenerated double-entry journals with their ERP sync state (syncedToERP, erpError). Filter by the transaction date with startTime/endTime — e.g. a month being closed — and by sync state. A transaction with an untagged leg has no journal; find those with list_coa_ledgers(missingCoa: true).
list_ledgers
ChatGPTLedger legs across all transactions. Use when the question is about individual legs (missing prices, per-asset flows) rather than whole transactions. Cost basis, proceeds and gains are never returned by this tool (always null) — they are not zero. For a tax year the plan covers, read gains from get_tax_report_disposals or generate the report.
list_mfa_factors
ChatGPTSecond factors enrolled on the account. Read-only: enrolling and removing factors requires an OTP-confirmed flow not exposed here.
list_period_locks
ChatGPTFiled/frozen periods. Transactions dated inside a locked period cannot be edited or deleted — this is why an edit may be rejected.
list_portfolios
ChatGPTPortfolios in the workspace. Enterprise workspaces must assign every integration to one, so call this before add_wallet there.
list_reports
ChatGPTReports already generated for this workspace, with their status.
list_rules
ChatGPTCategorisation rules in rank order — the order they are evaluated in, first match winning.
list_spam
ChatGPTAssets marked as spam in this workspace. Spam assets are hidden from holdings, transactions and reports by default.
list_sync_jobs
ChatGPTSync history for the workspace, newest first.
list_tasks
ChatGPTBackground jobs for the workspace — syncs, recomputes, report generation, ERP pushes — with status and progress.
list_tax_report_years
ChatGPTFiscal years that have a computed tax report — use to populate a year picker.
list_tax_reports
ChatGPTPer-fiscal-year capital-gains summaries: proceeds, cost basis, realised gains and losses, disposal count and missing-purchase count. Income and expenses are not in it — use get_accounting_breakdown with the year’s bounds. year is the calendar year the tax year starts in. A year the plan does not cover comes back as a stub with locked: true and a lockReason.
list_workspaces
ChatGPTWorkspaces the user belongs to. Note the MCP session is bound to a single workspace at consent — every other tool acts on that one regardless of what this returns.
lock_period
ChatGPTFreeze a period as filed. Afterwards no transaction dated within it can be changed. Confirm with the user — unlocking is a separate deliberate act.
mark_spam
ChatGPTMark or unmark assets as spam. Marking is chain-scoped, so the same ticker on another chain is unaffected. entries is a list of { assetId, chainId, isSpam }. Airdropped scam tokens are the usual case.
merge_transactions
ChatGPTMerge several transactions into one — typically the two sides of a transfer between your own wallets that detection missed.
preview_csv_upload
ChatGPTRead what an uploaded file holds: its first row as headers plus the next rows, every cell as text (the first sheet of a spreadsheet). Use it to check a file's columns, date format or source exchange before or after importing it.
register_csv_upload
ChatGPTRecord a file PUT to a create_csv_upload_url URL as an upload, so start_csv_import can process it. Call it once per file, after the PUT has succeeded.
rename_journal
ChatGPTRename a journal. Marks it as manually titled so a later recompute preserves the name.
reorder_rules
ChatGPTSet the rank of many rules at once. Because the first match wins, reordering changes which account a leg gets — call apply_rules afterwards to make existing journals reflect it.
resync_all_integrations
ChatGPTRe-sync every matching integration in the workspace. Defaults to incremental. Expensive and rate-limited by providers — confirm with the user before calling. Pass syncMode 'resync_from_start' to wipe and re-import each one from scratch; that is far heavier still and destroys connector-sourced data, so confirm explicitly.
resync_integration
ChatGPTRe-sync one integration. Defaults to incremental (identical to sync_integration) — it is NOT destructive unless you ask for it. To actually re-import from scratch pass syncMode 'resync_from_start', which deletes the integration's prior data first; to backfill a gap without deleting, pass startTime.
search_assets
ChatGPTSearch the global asset catalog and return ranked candidates. Use this to find the assetId required by create_manual_transaction, edit_transaction and update_ledger. Prefer contractAddress when you have one — it is an exact match. A bare ticker in q is fuzzy and can match counterfeit tokens that reuse the symbol, so confirm the result before writing it to a transaction. An empty query returns the top assets by market rank.
search_contacts_and_wallets
ChatGPTOne search across contacts, counterparties and wallets. Use when the user names something and it is unclear which of the three they mean.
search_integrations
ChatGPTFuzzy search integrations by alias, address, account name or provider.
select_erp_tenant
ChatGPTChoose which ERP organisation to sync with (Xero), or set the fallback location (Softledger). For Softledger this does NOT decide where journals post — that comes from each journal's own lines — it only covers journals whose accounts carry no location at all.
split_transaction
ChatGPTSplit a merged transfer, swap or bridge back into its constituent transactions. The inverse of merge_transactions.
start_csv_import
ChatGPTBegin processing uploaded CSV/XLSX files — from upload_csv, register_csv_upload or the web app. Asynchronous; poll get_csv_upload.
sync_coa_from_erp
ChatGPTPull the chart of accounts from the ERP into Kryptos, reconciling accounts deleted upstream.
sync_integration
ChatGPTFetch new activity for one integration since its last sync. Asynchronous — poll get_sync_job with the returned id. Use resync_integration to re-import from scratch.
sync_to_erp
ChatGPTPush journals to the ERP. Asynchronous — returns a task id; poll get_task (a partial_success result lists the journals that failed). Writes to the external accounting system — confirm with the user. Refused while journals are being regenerated. Only journals whose accounts were synced from that ERP can be pushed, and the workspace base currency must match the ERP organisation’s.
test_integration_credentials
ChatGPTCheck whether an existing integration’s stored credentials still work. Use when a sync is failing to tell an expired key from a provider outage.
trigger_accounting_recompute
ChatGPTRecalculate cost basis and gains now, inside this request. It can take long on a large workspace, and the call may time out while the work carries on. Imports and edits already start a background recalculation; prefer trigger_recompute, which runs in the background and returns a task id.
trigger_recalculation
ChatGPTRegenerate all COA journals. Asynchronous — returns a task id; poll get_recalculation_status with it. By default it also re-derives every rule-assigned leg’s COA codes; manually assigned legs are kept.
trigger_recompute
ChatGPTRe-run the post-sync recompute pipeline (balances, transfer detection, accounting, COA). Asynchronous — it returns a task id; poll get_task for progress.
unassign_address_from_contact
ChatGPTUnlink an address from a contact. Restores the counterparty’s previous state and removes the alias from ledger legs. Note the address id (aid) is a path parameter in v2, not a body field.
unlock_period
ChatGPTUnfreeze a filed period so its transactions can be edited again. Doing so can change already-filed figures — confirm with the user.
update_contact
ChatGPTUpdate a contact. Renaming re-aliases every ledger leg that referenced the old name, so history changes too.
update_integration
ChatGPTRename an integration, move it between portfolios, or enable/disable its syncing.
update_ledger
ChatGPTCorrect one ledger leg — most often a missing or wrong price, which is how a transaction’s fiat value is fixed in v2. Read the leg first with get_transaction_ledgers. A price needs priceCurrency and priceTimestamp (normally the leg’s own timestamp); a price in another currency is converted onto the workspace currency. Regenerates the transaction’s journal. GL codes are set with assign_ledger_accounts, not here.
update_portfolio
ChatGPTRename a portfolio or change its default flag.
update_rule
ChatGPTChange a rule. Already-generated journals are unaffected until apply_rules runs.
update_tax_settings
ChatGPTChange the workspace’s advanced tax toggles and tag exceptions. These re-derive historical gains and trigger a recompute — confirm with the user, and expect previously-filed figures to change. The cost-basis METHOD is NOT settable here; it lives on the workspace record and is constrained by the country.
update_transaction_label
ChatGPTChange a transaction’s date/time, label, description, notes or tags, or dismiss a reconciliation flag. Does not touch amounts or prices — use edit_transaction for those. Changing a label can change tax treatment; moving the date can move the transaction into another tax year and is refused inside a locked period.
update_user_profile
ChatGPTUpdate the current user's own name, client type or language. Country, base currency, timezone and cost-basis method are WORKSPACE settings, not user fields — use get_workspace / update_tax_settings for those. Email and password need OTP-confirmed flows not available here.
upload_csv
ChatGPTUpload a CSV file by passing its text — for files up to 512 KB (a few thousand rows). Pass the file content exactly as it is: every row, unchanged, header included. The file is stored as uploaded; call start_csv_import with the returned uploadId to process it. For larger files or XLSX, use create_csv_upload_url if you can run shell commands; otherwise ask the user to upload the file in the Kryptos web app.