> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ai2fin.com/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP connector reference — tools, classes, permissions, errors

> Reference for connector reviewers and integrators: every 2Fin MCP tool with its Read / Write / Sensitive write class, inputs, side effects, confirmation, plan requirement, rate limit, outcome shapes and errors.

This page is generated from the server's tool registry, so it matches what `tools/list` returns. The same catalogue is served as JSON at [https://api.ai2fin.com/.well-known/mcp-server/tools.json](https://api.ai2fin.com/.well-known/mcp-server/tools.json) (no authentication, cached 5 minutes). For a guided start see the [Quickstart](/mcp/quickstart); for sign-in details see [Authentication](/mcp/authentication).

## Setup

* Server endpoint (Streamable HTTP, JSON-RPC 2.0): `https://api.ai2fin.com/mcp`
* Discovery: [https://api.ai2fin.com/.well-known/mcp-server](https://api.ai2fin.com/.well-known/mcp-server) · registry manifest: [https://api.ai2fin.com/.well-known/mcp-server/server.json](https://api.ai2fin.com/.well-known/mcp-server/server.json)
* Product documentation: [https://docs.ai2fin.com/mcp/introduction](https://docs.ai2fin.com/mcp/introduction)
* Connect from any MCP client that supports OAuth 2.1 with PKCE. The client registers itself (DCR) or
  presents a Client ID Metadata Document (CIMD), the user signs in to 2Fin and approves the requested
  scopes on the consent screen, and the client then calls `tools/list` and `tools/call`
  with the bearer token.

## Authentication and permissions

* OAuth 2.1 authorization code + PKCE (S256), exact redirect-URI match. Endpoints are published in the
  authorization server metadata at [https://api.ai2fin.com/mcp/.well-known/oauth-authorization-server](https://api.ai2fin.com/mcp/.well-known/oauth-authorization-server); the protected resource metadata is at
  [https://api.ai2fin.com/.well-known/oauth-protected-resource/mcp](https://api.ai2fin.com/.well-known/oauth-protected-resource/mcp).
* Dynamic Client Registration and Client ID Metadata Documents are both accepted.
* Scopes and what each unlocks:
  * `read:transactions` — every Read tool over transactions, spending, tax summaries, categories, lenses, budgets, income, insights, assets, places, expected income, upcoming money, account and plan.
  * `read:bills` — Read tools over bills and bill occurrences.
  * `write:transactions` — Write and Sensitive write tools (creating, updating, categorising, receipts, trips, budgets, assets, tax statements).
  * `write:bills` — the same write gate; either write scope unlocks the write tools.
  * `write:expenses`, `webhooks:manage` — Integration API scopes; they do NOT unlock MCP write tools.
* Read-only option: request only `read:*` scopes. A token without a write scope gets
  `insufficient_scope` on every Write tool and can never change data. A client that requests no scope
  receives the default scope set, shown on the consent screen.
* Every call is scoped to the signed-in user. Tokens carry the user, the client and the granted scopes;
  there is no cross-user or account-wide access.
* Per-client profile: a Meta Muse client (identified by its OAuth client id) is offered every Read tool plus
  the everyday writes listed below, never a delete action and never tax lodgement. See "Available to Muse".

## Tool classes

* **Read** — `readOnlyHint: true`; changes nothing; responses may be cached for 60 s.
* **Write** — creates or updates the user's own records; reversible in the app.
* **Sensitive write** — writes that change what the user claims or declares. Muse asks the user before
  every call to these. Currently: `manage_asset` (Changes the depreciating-asset register, which changes the depreciation the user claims); `manage_tax_filing` (Creates, changes and marks the status of tax statements (BAS/VAT/GST) the user lodges).

Published annotations per tool (`tools/list`): `title`, `readOnlyHint`,
`destructiveHint` (true when any action can delete), `openWorldHint` (true only for
`lookup_tax_reference`, which reads official tax-authority pages).

## Status and outcome handling

All responses are JSON-RPC 2.0. For `tools/call`:

| Outcome | Shape |
| - | - |
| Success | `result.content[]` carries the tool payload (text, and a UI resource for tools that render one); `result.structuredContent` carries the JSON payload where the tool provides one. The payload is `{ success: true, data, ... }`. |
| Write needs confirmation (non-Muse clients, first call without `confirmToken`) | `result.content[0].json = { ok: false, needsConfirmation: true, tool, confirmToken, expiresAtMs, preview: { tool, arguments } }`. Repeat the call with `confirmToken` added to the arguments. |
| Confirmation failed (token expired, reused, or arguments changed) | `error = { code: 403, message: "confirmation_required", data: { reason } }` |
| Token lacks a write scope | `error = { code: 403, message: "insufficient_scope", data: { reason, required: "write:*", granted: [...] } }` |
| Tool or action not offered to this client profile (Muse) | `result = { content: [{ type: "text", text }], isError: true }` — the text says to open 2Fin. |
| Plan does not include the tool | `error = { code: 400, message: "tool_failed", data: { message, requiredPlans \| requiredTier, upgradeUrl } }` |
| Already existed (retry-safe creates: `create_transaction`, `create_expense`, `manage_trip` create, `manage_budget` create\_goal / contribute\_goal) | Success with `data.alreadyExisted: true`, `data.message` and the existing record; nothing new is written. A would-be duplicate that is not retry-safe (e.g. a second budget limit for one category) is `tool_failed` with `data.message` naming what exists. |
| Tool failed | `error = { code: 400 (or 500 when retryable), message: "tool_failed", data: { errorType: "TOOL_EXECUTION_ERROR", tool, message, suggestion, retryable } }` |
| Per-tool rate limit hit | `error = { code: 429, message: "Rate limit exceeded", data: { tool, retryAfter (seconds), limit, window } }` |

## Errors

| Code | Meaning |
| - | - |
| HTTP 401 | Missing, expired or invalid bearer token. `WWW-Authenticate` points at the protected-resource metadata. |
| HTTP 429 | Global request limit on `/mcp` for the user. |
| JSON-RPC `-32602` | Invalid params (missing tool name, missing `uri`, unknown resource). |
| JSON-RPC `-32601` | Method not found. |
| JSON-RPC `-32603` | Internal error. |
| JSON-RPC `403 insufficient_scope` | Write tool called with a read-only token. |
| JSON-RPC `403 confirmation_required` | Two-step confirmation failed. |
| JSON-RPC `429` | Per-tool rate limit (see each tool). |
| JSON-RPC `400/500 tool_failed` | The tool ran and reported a problem; `data.message` explains, `data.retryable` says whether to retry. |

## Rate limits

A global per-user request limit applies to `/mcp`. On top of that, the tools below have a
per-user sliding-window limit, enforced on every call and listed per tool: heavy or bulk writes, AI analysis,
receipt processing and the one open-web lookup. Tools without a listed limit have only the global limit.

## Data handling

2Fin returns only the signed-in user's own records, including transactions from bank accounts the user has
connected, and never exposes other users' data. Before anything leaves the server it strips emails, card
numbers, bank account and BSB numbers, phone numbers, tax file numbers and the names of people in
person-to-person transfers; merchants, amounts, dates and record ids are kept. Privacy policy: [https://app.ai2fin.com/privacy](https://app.ai2fin.com/privacy). Support: [https://ai2fin.com/contact](https://ai2fin.com/contact).
Security contact: [security@ai2fin.com](mailto:security@ai2fin.com).

## Tool index

### Read (23)

| Tool | Title | Plan | Rate limit | Available to Muse |
| - | - | - | - | - |
| `query_transactions` | Find transactions | Every plan | global only | yes |
| `analyze_spending` | Analyse spending | Every plan | 30 calls per minute per user | yes |
| `get_tax_summary` | Tax deduction summary | Every plan | global only | yes |
| `query_bills` | Find bills and subscriptions | Every plan | global only | yes |
| `query_categories` | List categories | Every plan | global only | yes |
| `query_travel` | Find vehicle trips | Every plan | global only | yes |
| `query_rules` | List categorisation rules | Pro or higher | global only | yes |
| `get_user_info` | Account and plan | Every plan | global only | yes |
| `get_entity_details` | Explain a transaction or merchant | Every plan | global only | yes |
| `get_suggestions` | Suggestions and missed deductions | ai\_tax\_analysis feature (Pro, Elite+) — type=tax\_deductions only | global only | yes |
| `query_tax_filing` | Tax statements | tax\_filing feature (Elite+, Auto+) | global only | yes |
| `get_tax_filing_guidance` | Tax filing guidance | tax\_filing feature (Elite+, Auto+) | global only | yes |
| `query_tax_estimators` | Tax estimators | Every plan | global only | yes |
| `lookup_tax_reference` | Official tax sources | Every plan | 20 calls per minute per user | yes |
| `get_tax_estimate` | Estimate tax | tax\_filing feature (Elite+, Auto+) — write-offs inside the estimate; the estimate itself is on every plan | global only | yes |
| `query_lens` | List views | Elite+ or higher | global only | yes |
| `query_budget` | Budget status and savings goals | Every plan | global only | yes |
| `query_income` | Income | Every plan | global only | yes |
| `query_insights` | Cash flow and budget insights | Every plan | global only | yes |
| `query_assets` | Asset register | Elite+ or higher; tax\_filing feature (Elite+, Auto+) | global only | yes |
| `query_places` | Places and properties | tax\_filing feature (Elite+, Auto+) — view=write\_offs only | global only | yes |
| `query_expected_income` | Money you are owed | Every plan | global only | yes |
| `get_upcoming_money` | Upcoming money in and out | Every plan | global only | yes |

### Write (19)

| Tool | Title | Plan | Rate limit | Available to Muse |
| - | - | - | - | - |
| `create_transaction` | Add a transaction | Every plan | 30 calls per minute per user | yes |
| `modify_transactions` | Update transactions | Every plan | 20 calls per minute per user | yes |
| `analyze_transactions` | Categorise and check transactions | Pro or higher; ai\_categorization feature (Pro, Elite+) — categorize, smart\_categorize; ai\_tax\_analysis feature (Pro, Elite+) — tax, bulk\_tax | 20 calls per minute per user | no |
| `manage_bill_pattern` | Manage a recurring bill | Every plan | global only | partial (blocked: delete) |
| `manage_bill_payment` | Record a bill payment | Every plan | global only | partial (blocked: create, update, delete, batch\_update) |
| `link_bills` | Link transactions to bills | Every plan | global only | yes |
| `manage_category` | Manage a category | Every plan | global only | partial (blocked: delete) |
| `manage_category_set` | Manage a category set | Elite+ or higher | global only | partial (blocked: delete) |
| `process_receipt` | Save a receipt | receipt\_capture feature (Pro, Elite+) | 10 calls per minute per user | yes |
| `get_receipt_upload_url` | Get a receipt upload link | receipt\_capture feature (Pro, Elite+) | 10 calls per minute per user | yes |
| `manage_trip` | Log a vehicle trip | Every plan | 30 calls per minute per user | yes |
| `manage_rule` | Manage a categorisation rule | Pro or higher | global only | partial (blocked: update, delete) |
| `set_user_preferences` | Update preferences | Every plan | global only | no |
| `create_expense` | Add an expense | Every plan | 30 calls per minute per user | yes |
| `manage_lens` | Manage a view | Elite+ or higher | global only | yes |
| `manage_budget` | Manage budget and savings goals | Every plan | 30 calls per minute per user | partial (blocked: delete\_limit) |
| `manage_vehicle` | Manage a vehicle | Every plan | global only | partial (blocked: delete) |
| `manage_place` | Manage a place | Every plan | global only | yes |
| `record_expected_income` | Record money you are owed | Every plan | global only | yes |

### Sensitive write (2)

| Tool | Title | Plan | Rate limit | Available to Muse |
| - | - | - | - | - |
| `manage_tax_filing` | Manage tax statements | Elite+ or higher; tax\_filing feature (Elite+, Auto+) | global only | no |
| `manage_asset` | Manage an asset | Elite+ or higher; tax\_filing feature (Elite+, Auto+) | global only | partial (blocked: dispose, delete, dismiss\_unregistered, undismiss) |

## Tools

## Read tools

### `query_transactions` — Find transactions

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Query transactions. Use view="filter" for standard filters (date, merchant, amount, category, tax, property). Use view="intelligence" for AI keyword search (e.g. "travel-related", "marketing"). Filter-view rows carry place: the property each is at (\{ id, name, part, inherited — true when it is there through its bill }) or null.
* **Views:** `filter`, `intelligence`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `analyze_spending` — Analyse spending

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Analyze spending patterns. Views: "analytics" (enterprise analytics with flexible filters), "by\_category" (spending by category), "top\_merchants" (top vendors), "compare\_periods" (month-over-month etc.), "outlook" (blended actual + projected bills).
* **Views:** `analytics`, `by_category`, `top_merchants`, `compare_periods`, `outlook`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** 30 calls per minute per user
* **Available to Muse:** yes

### `get_tax_summary` — Tax deduction summary

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Get complete tax summary: total spending, deductible amount, percentage, breakdown by category, confidence analysis, GST/VAT claimable. Use for "What's my tax deductible percentage?", "How much can I claim?"
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_bills` — Find bills and subscriptions

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Query bills and bill data. Views: "patterns" (all recurring patterns), "upcoming" (bills due soon), "overdue" (past due unpaid), "occurrences" (flexible filter by paid/unpaid/date/merchant), "summary" (monthly totals), "financial" (FY summary per pattern), "transactions" (payment history for a bill).
* **Views:** `patterns`, `upcoming`, `overdue`, `occurrences`, `summary`, `financial`, `transactions`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_categories` — List categories

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Query categories and category sets. Views: "categories" (list categories with filters), "sets" (list category sets), "active\_set" (get currently active set), "all" (categories + sets together).
* **Views:** `categories`, `sets`, `active_set`, `all`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_travel` — Find vehicle trips

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Query travel data. Views: "profile" (preferences/currency), "vehicles" (list vehicles), "trips" (trip log with filters), "deduction\_summary" (FY mileage summary), "trip\_transactions" (expenses for a trip).
* **Views:** `profile`, `vehicles`, `trips`, `deduction_summary`, `trip_transactions`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_rules` — List categorisation rules

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Query custom rules. Returns list of rules with optional filters. Set testConditions to dry-run a rule against recent transactions.
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Pro or higher
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `get_user_info` — Account and plan

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Get user information. Views: "profile" (preferences, country, business type), "subscription" (plan, status, features), "feature\_access" (check specific feature), "quota" (usage limits), "all" (everything together).
* **Views:** `profile`, `subscription`, `feature_access`, `quota`, `all`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `get_entity_details` — Explain a transaction or merchant

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Get detailed entity information. Views: "relationships" (linked bills, trips, receipts, rules for a transaction), "receipts" (receipt files for a transaction), "history" (full change audit trail, Elite+), "field\_history" (changes to a specific field, Elite+), "all" (relationships + receipts together).
* **Views:** `relationships`, `receipts`, `history`, `field_history`, `all`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `get_suggestions` — Suggestions and missed deductions

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Get AI-powered suggestions. Types: "budgets" (realistic budget amounts based on spending), "rules" (automation rules based on categorization patterns), "tax\_deductions" (missed deduction opportunities).
* **Required inputs:** `type`
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** ai\_tax\_analysis feature (Pro, Elite+) — type=tax\_deductions only
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_tax_filing` — Tax statements

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Query tax filing data. Views: "jurisdictions", "statements", "statement", "audit", "auto\_populate". Use this for BAS/VAT/GST filing data retrieval.
* **Views:** `jurisdictions`, `statements`, `statement`, `audit`, `auto_populate`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** tax\_filing feature (Elite+, Auto+)
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `get_tax_filing_guidance` — Tax filing guidance

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Get country-specific tax filing guidance (BAS/VAT/GST): authority info, portal links, filing frequencies, exact period dates, export formats, and schema hints for user questions.
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** tax\_filing feature (Elite+, Auto+)
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_tax_estimators` — Tax estimators

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Statutory estimators computed from official published rates. Views: "overview" (which estimators exist for a country), "student\_loan" (compulsory study/training-loan repayment, e.g. AU HELP/HECS, from repaymentIncome), "superannuation" (mandatory retirement contributions, e.g. AU Superannuation Guarantee, from ordinaryEarnings). Indicative estimates — general information, not personal tax or financial advice.
* **Views:** `overview`, `student_loan`, `superannuation`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `lookup_tax_reference` — Official tax sources

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint true
* **Description:** Find the OFFICIAL tax-authority page(s) for a general tax question (deductibility rules, eligibility, thresholds, residency, deadlines, GST/VAT registration, super, study loans, CGT, crypto) so you can cite the source. Returns the authority, matching official pages with a verification status and the date each was last verified, a fallback search URL on the authority site, and the disclaimer to show. Use it when the user asks about a tax rule and a source is wanted; the returned URL is the citable address as published. Read-only. General information only — not personal advice.
* **Required inputs:** `question`
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** 20 calls per minute per user
* **Available to Muse:** yes

### `get_tax_estimate` — Estimate tax

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** The person's income tax estimate for the current tax year, as the app shows it: income by type, deductions, tax, tax already withheld, refund or amount owing, and notes on what is not counted. Also returns invoicesOwed: invoices still owed to them (never counted in the estimate; income counts when paid) with an optional what-if if they were paid by the end of the tax year. The what-if and owed invoices are not income received. Read-only.
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** tax\_filing feature (Elite+, Auto+) — write-offs inside the estimate; the estimate itself is on every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_lens` — List views

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** List the user's lenses (saved views / category sets they switch between: Tax, Project, Department, Client, Custom). Returns each lens's name, type, category count, which is primary, and whether the user's plan has access to the lens system (Elite+ / Auto+). Use this when the user asks about lenses, switching views, or 'what lenses do I have'.
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Elite+ or higher
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_budget` — Budget status and savings goals

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Check the user's budget and spending status ('am I on budget?', 'how much of my budget is left?'). Returns overall utilisation and over-budget categories. Set detail:true for a full per-category breakdown (budgeted vs actual, % used, RAG status), income/savings context, and what is still to come this cycle: `committed` (bills still due before the cycle ends — not spent yet, never part of actual) and `expectedIncome` (`received` = money that actually came in this cycle; `expected` and `estimated` = money still expected, not yet received). Figures are per currency and are not added across currencies. Set goals:true for savings goals ('how much a week to save \$5,000 by June?'): each goal's target, saved, remaining, deadline, percent and perWeekNeeded / perMonthNeeded (null when there is no deadline; overdue:true when the deadline has passed). If the user has no budget, returns guidance to set one up on the Allocations page.
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_income` — Income

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Show the user's income — recurring monthly income from detected income streams (salary, regular deposits), with a fallback to transaction-derived income when no streams are detected. Use for 'what's my income?', 'how much do I earn a month?', 'when's my next payday?'.
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_insights` — Cash flow and budget insights

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Financial insights snapshot. view 'cashflow' (default): income vs expenses, net, savings rate, and top expense categories over a period. view 'budget': overall budget utilisation and over-budget categories. Use for 'how am I doing?', 'where's my money going?', 'what's my savings rate?'.
* **Views:** `cashflow`, `budget`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_assets` — Asset register

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Read the depreciating asset register and the reports built on it. Views: "register" (assets on the register), "asset" (one asset by assetId), "unregistered" (capital purchases in the bank feed that are not on the register yet), "depreciation\_schedule" (decline in value per asset for one income year), "tpar" (taxable payments annual report — Australia only), "profit\_loss" (profit & loss for one income year), "explainer" (what depreciation is in the user's country, which methods apply, the write-off threshold, and which asset fields to collect). Reports are prepared under the user's stored tax country.
* **Views:** `register`, `asset`, `unregistered`, `depreciation_schedule`, `tpar`, `profit_loss`, `explainer`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Elite+ or higher; tax\_filing feature (Elite+, Auto+)
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_places` — Places and properties

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Read the user's properties (home, rental, vehicle, business premises) and what their money did at each. A property is a second axis beside the category — a repair at a rental is still "Repairs". Views: "list" (every property with kind, ownership/rented/business shares, the person's answers about a home — businessUse home\_office|place\_of\_business, rentalArrangement domestic|commercial|below\_market, null = not answered — active, and cash spent/received), "summary" (one property's cash picture: totals, the split between its rented, business and private parts, net rental cash, spend by category, its bills and assets; for a home that earns income also homeTreatment — what the answers counted private — and, in Australia, homePosition: the share the main residence exemption does not cover by period (each with how the business part was used then), weighted by days (overTime), the six-year rule and the market value rule, each notice with its source URL), "write\_offs" (ELITE+ only: depreciation of assets there and capital works on the building, with the split and net rental result including them, and where it is reported). Pick a property by placeId or name. Period: from/to (YYYY-MM-DD) or financialYear (the year the income year starts in); none means everything on record.
* **Views:** `list`, `summary`, `write_offs`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** tax\_filing feature (Elite+, Auto+) — view=write\_offs only
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `query_expected_income` — Money you are owed

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** What the user's clients owe and have paid, and the work behind it — for drafting an invoice in the user's own invoicing tool (2Fin does not make invoices). view 'open' (default): money still owed — expected, partly paid and overdue items, each with client, invoice number, amount, due date, what was received and what is outstanding. view 'by\_payer': income received per client/payer over a period (startDate/endDate, default the last 90 days). view 'work\_done': work activities and hours recorded for the user's home/business places, and business trips from the logbook, in a period. Use for 'who owes me?', 'what did Acme pay this year?', 'what should I invoice for last month?'.
* **Views:** `open`, `by_payer`, `work_done`
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `get_upcoming_money` — Upcoming money in and out

* **Class:** Read
* **Annotations:** readOnlyHint true, destructiveHint false, openWorldHint false
* **Description:** Money coming in and going out over the next days: bills due, expected income (invoices, rent, repayments), later dates of recurring income, and estimated pay days from the user's employers. Each row has direction (in/out), certainty (scheduled/estimated), status (upcoming, due\_today, overdue, partly\_received…) and the amount still to come; totals are per currency (different currencies are not added together). Expected money is not received money and is not income already earned. Read-only. Use for 'what's coming up this fortnight?', 'what do I owe before payday?', 'when is rent due?'.
* **Required inputs:** none
* **Side effects:** none
* **Confirmation:** none
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

## Write tools

### `create_transaction` — Add a transaction

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint false, openWorldHint false
* **Description:** Record a transaction the user tells you about (a manual entry written to their 2Fin ledger; bank-feed rows arrive on their own and are not created here). Custom rules run on it afterwards. Required: description and amount (negative for money out). Retry-safe: calling again with the same amount, date, description and merchant within 10 minutes returns the existing record with alreadyExisted:true instead of creating a second one.
* **Required inputs:** `description`, `amount`
* **Side effects:** Creates one transaction in the user's manual (non-bank-feed) records.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** 30 calls per minute per user
* **Available to Muse:** yes

### `modify_transactions` — Update transactions

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Modify transactions. Actions: "update" (bulk update fields like category, tax, notes, property — placeId/placeUse, and why it was business — expenseType/businessPurpose/attendees), "categorize" (bulk set category by merchant or IDs), "apply\_analysis" (apply AI categorization/tax analysis to a single transaction), "set\_splits" (replace a single transaction's split lines — each line its own category, property and tax flags; amounts must add up to the transaction's amount; \[] clears the split), "tag" / "untag" (add or remove an EXTRA category — a business trip, client or project from a project/client lens — on transactionIds or every expense between startDate and endDate, keeping each transaction's main category: "everything on my card in Sydney Mon–Fri is the Acme trip").
* **Actions:** `update`, `categorize`, `apply_analysis`, `set_splits`, `tag`, `untag`
* **Required inputs:** `action`
* **Side effects:** Updates category, tax flags, notes, place and split lines on the chosen transactions; tag/untag add or remove a secondary category. Deletes nothing.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** 20 calls per minute per user
* **Available to Muse:** yes

### `analyze_transactions` — Categorise and check transactions

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Analyze transactions with AI. Actions: "categorize" (suggest category for one), "tax" (analyze tax deductibility for one), "bulk\_tax" (analyze many for deductibility), "smart\_categorize" (AI categorization — not yet available via MCP), "find\_duplicates" (detect potential duplicates).
* **Actions:** `categorize` (blocked for Muse), `tax` (blocked for Muse), `bulk_tax` (blocked for Muse), `smart_categorize` (blocked for Muse), `find_duplicates` (blocked for Muse)
* **Required inputs:** `action`
* **Side effects:** Stores AI category and deductibility suggestions on the analysed transactions; the user's own classification is unchanged until modify\_transactions applies them.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Pro or higher; ai\_categorization feature (Pro, Elite+) — categorize, smart\_categorize; ai\_tax\_analysis feature (Pro, Elite+) — tax, bulk\_tax
* **Rate limit:** 20 calls per minute per user
* **Available to Muse:** no

### `manage_bill_pattern` — Manage a recurring bill

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage recurring patterns — bills you pay (money out) and income you receive (money in; patternType recurring\_income). Actions: "create" (new recurring bill or income), "update" (change amount/frequency/active status — use isActive to toggle), "delete" (permanently delete the pattern and its scheduled payments; its bank transactions are kept, unlinked; to pause instead, update isActive=false), "set\_splits" (replace the bill's percent-line template, applied to every future payment that has no lines of its own; percents must sum to 100; \[] clears it).
* **Actions:** `create`, `update`, `delete` (deletes, blocked for Muse), `set_splits`
* **Required inputs:** `action`
* **Side effects:** Creates, updates or deletes a recurring bill/income pattern and its generated occurrences; set\_splits replaces the pattern's split lines.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** partial (blocked: delete)

### `manage_bill_payment` — Record a bill payment

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage bill payments and occurrences. Actions: "pay" (mark as paid; links the given transactionId or optionally creates a transaction — money out only: refused for an income pattern unless a real deposit transactionId is given), "create" (manual one-time occurrence), "update" (change occurrence details), "delete" (remove occurrence), "batch\_update" (update multiple), "bulk\_pay" (mark multiple paid), "attach\_receipt" (link receipt to payment).
* **Actions:** `pay`, `create` (blocked for Muse), `update` (blocked for Muse), `delete` (deletes, blocked for Muse), `batch_update` (blocked for Muse), `bulk_pay`, `attach_receipt`
* **Required inputs:** `action`
* **Side effects:** Marks bill occurrences paid, creates/updates/deletes occurrences, optionally creates the payment transaction, attaches a receipt to an occurrence.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** partial (blocked: create, update, delete, batch\_update)

### `link_bills` — Link transactions to bills

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Link/unlink bills to transactions. Actions: "link" (connect occurrence to transaction), "unlink" (disconnect), "auto\_link" (match unlinked transactions to bills and WRITE the links; set dryRun:true to preview without writing), "suggest\_patterns" (analyze transactions and suggest recurring bill patterns; read-only).
* **Actions:** `link`, `unlink`, `auto_link`, `suggest_patterns`
* **Required inputs:** `action`
* **Side effects:** Links or unlinks a transaction and a bill occurrence; auto\_link creates links in bulk. suggest\_patterns changes nothing.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `manage_category` — Manage a category

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage individual categories. Actions: "create" (new category), "update" (change name/color/emoji/active status — use isActive to toggle), "delete" (remove category), "move\_to\_set" (move to different set, Elite+).
* **Actions:** `create`, `update`, `delete` (deletes, blocked for Muse), `move_to_set`
* **Required inputs:** `action`
* **Side effects:** Creates, updates or deletes a category; move\_to\_set moves it between category sets. Deleting reassigns its transactions to the default category.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** partial (blocked: delete)

### `manage_category_set` — Manage a category set

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage category sets (Elite+). Actions: "create" (new set), "update" (change name/color/active status), "delete" (remove set, categories move to migrateToSetId or the default set), "set\_active" (make a set the active one), "duplicate" (copy set with categories).
* **Actions:** `create`, `update`, `delete` (deletes, blocked for Muse), `set_active`, `duplicate`
* **Required inputs:** `action`
* **Side effects:** Creates, updates, duplicates or deletes a category set; set\_active switches the active set. Deleting moves its categories to another set.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Elite+ or higher
* **Rate limit:** global request limit only
* **Available to Muse:** partial (blocked: delete)

### `process_receipt` — Save a receipt

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint false, openWorldHint false
* **Description:** Process receipts and files. Modes: "smart" (extract fields, match bills AND write a transaction — this mode creates a record), "analyze\_only" (extract fields only; nothing is written), "commit" (write: link to an existing transaction or create one from analyzed data), "upload\_file" (import CSV/Excel expense file), "suggest\_splits" (propose a split from a transaction's matched receipt line items — read-only, never writes; use modify\_transactions set\_splits to apply it).
* **Required inputs:** none
* **Side effects:** Stores the receipt file in the user's receipt space; smart/commit modes create or link a transaction and may create or match a bill.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** receipt\_capture feature (Pro, Elite+)
* **Rate limit:** 10 calls per minute per user
* **Available to Muse:** yes

### `get_receipt_upload_url` — Get a receipt upload link

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint false, openWorldHint false
* **Description:** Get a short-lived upload URL for a receipt photo or PDF that is too large to send inline. Steps: 1) call this with the file's mimeType and size in bytes, 2) HTTP PUT the raw file bytes to uploadUrl with the returned headers (Content-Type and Content-Length must match exactly), 3) call process\_receipt with assetUrl (plus the same mimeType and size). The URL expires after 10 minutes. Accepts image/jpeg, image/png, image/heic, image/webp, application/pdf up to 10 MB.
* **Required inputs:** `mimeType`, `size`
* **Side effects:** Mints a short-lived presigned upload URL into the user's own receipt storage. No records change until process\_receipt commits the upload.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** receipt\_capture feature (Pro, Elite+)
* **Rate limit:** 10 calls per minute per user
* **Available to Muse:** yes

### `manage_trip` — Log a vehicle trip

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Log and edit vehicle trips (the logbook behind car travel deductions). Actions: "create" — e.g. "drove 45 km from home to the Acme office for a client meeting": give tripDate, purpose, distanceKm (odometer readings optional) and startLocation/endLocation; the vehicle defaults to the user's only vehicle. "update" (fix a trip), "bulk\_link\_transactions" (match tolls/parking/fuel to trips by date — suggestions only, links are not persisted).
* **Actions:** `create`, `update`, `bulk_link_transactions`
* **Required inputs:** `action`
* **Side effects:** Creates or updates a logbook trip on one of the user's vehicles; bulk\_link\_transactions attaches transactions to trips.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** 30 calls per minute per user
* **Available to Muse:** yes

### `manage_rule` — Manage a categorisation rule

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage custom rules. Actions: "create" (new rule), "update" (modify rule — use isActive to enable/disable), "delete" (remove rule).
* **Actions:** `create`, `update` (blocked for Muse), `delete` (deletes, blocked for Muse)
* **Required inputs:** `action`
* **Side effects:** Creates, updates or deletes a categorisation rule. Rules change how future transactions are categorised.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Pro or higher
* **Rate limit:** global request limit only
* **Available to Muse:** partial (blocked: update, delete)

### `set_user_preferences` — Update preferences

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Update user preferences: countryCode, businessType, industry, profession, aiContextInput, hasStudyLoan.
* **Required inputs:** none
* **Side effects:** Updates profile fields: country, business type, industry, profession, AI context note, study-loan flag.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** no

### `create_expense` — Add an expense

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint false, openWorldHint false
* **Description:** Record an expense the user tells you about (written to their 2Fin expense records; custom rules run on it afterwards). Required: description, amount (positive) and date. Retry-safe: calling again with the same amount, date and description within 10 minutes returns the existing record with alreadyExisted:true instead of creating a second one.
* **Required inputs:** `description`, `amount`, `date`
* **Side effects:** Creates one expense record and runs the user's own rules against it.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** 30 calls per minute per user
* **Available to Muse:** yes

### `manage_lens` — Manage a view

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage the user's lenses. Actions: 'set\_primary' (make a lens the default the app opens with), 'update' (change a lens's type or active state). Requires the lens id from query\_lens. Lens creation/deletion is done on the Categories page, not here.
* **Actions:** `set_primary`, `update`
* **Required inputs:** `action`, `lensId`
* **Side effects:** Changes a lens's type or active state, or makes it the primary lens.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Elite+ or higher
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `manage_budget` — Manage budget and savings goals

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Create or edit the user's budget. Actions: 'create\_budget' (new budget), 'set\_limit' (add a per-category OR per-category-set spending limit), 'update\_limit' (change a limit's amount/frequency), 'delete\_limit' (remove a limit), 'set\_income\_target' (set the budget's monthly income target), 'create\_goal' (new savings goal: name, targetAmount, optional deadline), 'update\_goal' (change a goal's name/targetAmount/deadline/isActive), 'contribute\_goal' (record money put toward a goal), 'withdraw\_goal' (record money taken out of a goal; cannot exceed its balance). Goals cannot be deleted here — deactivate with update\_goal isActive:false. Reading status and goal pace is via query\_budget (goals:true). Retry-safe: create\_goal with a name that already exists in the budget returns that goal (alreadyExisted:true) rather than a second one, and contribute\_goal with the same goalId, amount and note within 10 minutes returns the goal unchanged rather than moving the money twice. Writes money and limits, so confirm the change with the user first.
* **Actions:** `create_budget`, `set_limit`, `update_limit`, `delete_limit` (deletes, blocked for Muse), `set_income_target`, `create_goal`, `update_goal`, `contribute_goal`, `withdraw_goal`
* **Required inputs:** `action`
* **Side effects:** Creates a budget, adds/changes/deletes per-category limits, sets an income target, creates/updates savings goals and records contributions or withdrawals.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** 30 calls per minute per user
* **Available to Muse:** partial (blocked: delete\_limit)

### `manage_vehicle` — Manage a vehicle

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage the user's vehicles for travel/logbook (reading is via query\_travel view=vehicles). Actions: 'create' (registration + description required), 'update', 'delete'. Always confirm with the user before deleting a vehicle.
* **Actions:** `create`, `update`, `delete` (deletes, blocked for Muse)
* **Required inputs:** `action`
* **Side effects:** Creates, updates or deletes a vehicle on the user's logbook.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** partial (blocked: delete)

### `manage_place` — Manage a place

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint false, openWorldHint false
* **Description:** Organise the user's properties (free on every plan). Actions: "create" (name, kind home|rental|vehicle|business|other, optional ownershipPercent 1-100, rentalPercent, businessPercent — rented + business ≤ 100, the rest is private), "update" (rename / re-share), "archive" / "restore", "assign\_transactions" (put transactionIds at a property, optional placeUse shared|rental|business|private), "assign\_bill" (put a recurring bill at a property — every payment it matched, past and future, is then at the property), "clear" (take transactionIds and/or a bill off their property). Choose the property by placeId or placeName. Deleting a property is only possible in the app. Confirm with the user before writing.
* **Actions:** `create`, `update`, `archive`, `restore`, `assign_transactions`, `assign_bill`, `clear`
* **Required inputs:** `action`
* **Side effects:** Creates, updates, archives or restores a place and assigns transactions or bills to it; clear removes assignments. No delete is exposed.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

### `record_expected_income` — Record money you are owed

* **Class:** Write
* **Annotations:** readOnlyHint false, destructiveHint false, openWorldHint false
* **Description:** Record money the user is now waiting for — typically right after an invoice was sent from their own invoicing tool: 'I invoiced Acme \$2,400 due 15 Oct'. 2Fin does not create or send invoices; this only tracks what is owed, and matches the payment when it arrives in the bank feed. payerName, amount (GST included) and dueDate (YYYY-MM-DD) are required; reference is the invoice number from their tool. Confirm with the user before writing.
* **Required inputs:** `payerName`, `amount`, `dueDate`
* **Side effects:** Creates one expected-income record (money the user is owed). Sends nothing to anyone.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Every plan
* **Rate limit:** global request limit only
* **Available to Muse:** yes

## Sensitive write tools

### `manage_tax_filing` — Manage tax statements

* **Class:** Sensitive write — Creates, changes and marks the status of tax statements (BAS/VAT/GST) the user lodges.
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Manage tax statement records. 2Fin prepares statements; the person lodges them with the tax authority themselves, and nothing is sent to any authority. Actions: create/update/delete jurisdiction, create/update/delete statement, mark a final statement as lodged (records the date the person lodged it; needs the accepted declaration), start an amendment of a lodged statement, mark exported.
* **Actions:** `create_jurisdiction` (blocked for Muse), `update_jurisdiction` (blocked for Muse), `delete_jurisdiction` (deletes, blocked for Muse), `create_statement` (blocked for Muse), `update_statement` (blocked for Muse), `delete_statement` (deletes, blocked for Muse), `submit_statement` (blocked for Muse), `mark_lodged` (blocked for Muse), `start_amendment` (blocked for Muse), `mark_exported` (blocked for Muse)
* **Required inputs:** `action`
* **Side effects:** Creates, updates or deletes tax jurisdictions and statements and changes a statement's status (submitted, lodged, amended, exported). Nothing is sent to any tax authority.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Elite+ or higher; tax\_filing feature (Elite+, Auto+)
* **Rate limit:** global request limit only
* **Available to Muse:** no

### `manage_asset` — Manage an asset

* **Class:** Sensitive write — Changes the depreciating-asset register, which changes the depreciation the user claims.
* **Annotations:** readOnlyHint false, destructiveHint true, openWorldHint false
* **Description:** Change the depreciating asset register. Actions: "create" (add an asset), "update" (change fields on an asset), "dispose" (record a disposal: disposalDate + terminationValue), "delete" (remove an asset), "register\_from\_transaction" (add an asset seeded from a bank transaction — name, date, cost and property come from the purchase; supply method and effectiveLifeYears), "dismiss\_unregistered" (mark a capital purchase as not an asset), "undismiss" (bring it back). Confirm specifics with the user before writing.
* **Actions:** `create`, `update`, `dispose` (blocked for Muse), `delete` (deletes, blocked for Muse), `register_from_transaction`, `dismiss_unregistered` (blocked for Muse), `undismiss` (blocked for Muse)
* **Required inputs:** `action`
* **Side effects:** Registers, updates, disposes of or deletes a depreciating asset; register\_from\_transaction links a purchase. Changes the depreciation schedule and the tax estimate.
* **Confirmation:** Muse: the client asks the user before each write; other MCP clients: two-step confirmToken (first call returns needsConfirmation + confirmToken, the repeat call with confirmToken executes).
* **Plan requirement:** Elite+ or higher; tax\_filing feature (Elite+, Auto+)
* **Rate limit:** global request limit only
* **Available to Muse:** partial (blocked: dispose, delete, dismiss\_unregistered, undismiss)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.