Beeswax Shares MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BEESWAX_URL | No | Base URL of the Beeswax Shares app | http://localhost:3000 |
| BEESWAX_API_TOKEN | Yes | API token, sent as Authorization: Bearer <token> |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| whoamiA | Identify the authenticated Beeswax Shares user, the API token's scopes, and the SMSF funds the token can access (with their fund IDs). Call this FIRST in a session to discover fund IDs — almost every other tool needs a fund_id. |
| list_fundsA | List your SMSF funds with headline figures: total value, cost base, unrealised gain/loss, total income, true return percentages, active holdings count and current financial year. Use when you need fund-level numbers; use whoami if you only need fund IDs. |
| get_portfolioA | Full portfolio snapshot for one SMSF fund: fund summary (value, cost base, unrealised gain/loss, income, true return), asset allocation percentages, and every active holding with current value and returns. The best single call to answer 'how is the fund doing?' or 'what do we hold?'. All amounts AUD. |
| list_holdingsA | List holdings in a fund, with filters. Use to find a holding's ID by ticker or name (e.g. before record_cost or update_price), or to review holdings by status. Returns valuation and gain/loss per holding. |
| get_holding_analysisA | Deep analysis of a single holding: true return (income + growth − costs), annualised return, income totals (dividends, distributions, interest, rent, franking credits), costs to date, CGT discount eligibility, estimated CGT and net proceeds if sold today. Use when asked how a specific investment has really performed, or about the tax impact of selling. All amounts AUD. |
| search_transactionsA | Search the fund's transaction ledger across all holdings — this is the 'memory recall' tool for your SMSF record-keeping. Use to answer 'did we already record this dividend?', 'what did we buy in FY 2025-26?', or to check for duplicates before proposing a new record. Filter by type, financial year, date range and ticker. Results are newest-first and paginated. |
| create_holdingA | Create a brand-new holding (security/asset) in the fund — use ONLY when a security was purchased that the fund has never held before (check list_holdings first). For buys of an existing holding, use record_trade instead. Note: unlike the record_* tools, this writes the holding directly; the buy transaction itself should still go through record_trade for human review. |
| record_tradeA | Record a buy or sell directly to your SMSF ledger. This writes immediately — there is no review step. Use whenever a trade is found in an email, contract note or conversation. Identify the holding by ticker or holding_id; the holding must already exist (use create_holding first if it doesn't). Always pass external_ref when the source has a stable ID (e.g. email message id + ticker + date) — it is an idempotency key, so re-running the same import will not create duplicates. Pass reasoning to record why (it is saved on the ledger entry for the audit trail). Amounts in AUD unless currency says otherwise. |
| record_incomeA | Record an income event — dividend, distribution, interest or rental income — directly to your SMSF ledger. This writes immediately; there is no review step. Use when a dividend statement, distribution advice or rent receipt is found. Identify the holding by ticker or holding_id (it must already exist). Include franking_credits for franked dividends (important for SMSF tax). Always pass external_ref when the source has a stable ID so repeat imports are idempotent. Pass reasoning to record why (saved for the audit trail). All amounts AUD unless currency says otherwise. |
| upload_documentA | Upload a local PDF or CSV (broker statement, contract note, dividend statement, annual tax statement) into the fund's document store. Reads the file from disk, base64-encodes it and posts it; the server then automatically extracts statement lines and reconciles them against the ledger — unmatched lines become pending proposals in the Review Queue. Use get_document afterwards to check extraction and match results. |
| get_documentA | Fetch one uploaded document including its extracted statement lines, each with a match_status (matched / discrepancy / proposed / unmatched) against the ledger. Use after upload_document to check whether extraction finished (status field) and what the reconciliation found. Extraction runs in the background, so poll this if status is still 'processing'. |
| list_documentsA | List the fund's uploaded documents (statements, contract notes etc.), newest first, with extraction status and reconciliation summaries. Use to check whether a statement was already uploaded before uploading it again, or to find a document ID. |
| reconcile_documentA | Re-run reconciliation of a document's extracted statement lines against the fund's ledger. Returns the document with refreshed line match statuses plus a summary including matched, discrepancies, proposed, and missing_from_statement. Use after the ledger changed (e.g. proposals were approved) or when you want to re-check a statement. |
| record_costA | Record a holding-level cost/expense for the SMSF — e.g. property rates, insurance, management fees, registry fees. Writes directly to the holding's cost ledger (costs are low-risk records, unlike trades/income which go through proposals). Mark tax_deductible appropriately — it feeds the fund's true-return and tax calculations. Amounts in AUD. |
| update_priceA | Record a price observation for a holding (e.g. from a market quote, property valuation or fund unit price). Upserts by date and, if it is the newest observation, also updates the holding's current price so portfolio values refresh. Use when you have an updated valuation or a reliable quoted price. Price in AUD per unit. |
| list_brokersA | List the brokers known to Beeswax Shares (with broker IDs and CHESS sponsorship info). Use to find a broker_id before create_holding, or to interpret broker references in statements. |
| list_asset_typesA | List the asset types supported by Beeswax Shares (name, category, and whether the type carries tickers, dividends or franking credits). Use to pick a valid asset_type for create_holding or to understand the fund's asset allocation categories. |
| list_bank_accountsA | List the SMSF's bank accounts with current balance, opening balance, role and feed status. Use to find a bank_account_id before list_cash_transactions or record_cash_transaction, or to see cash on hand. All amounts AUD. |
| create_bank_accountA | Create a new cash/bank account under a fund — e.g. a nabtrade cash hub, term deposit or operating account — so its cash ledger can be tracked and reconciled. Use when a statement or CSV belongs to an account the fund doesn't have yet (check list_bank_accounts first to avoid duplicates). Returns the new account with its id; follow up with record_cash_transaction to load its movements. Currency is AUD (v1 is AUD-only). Opening balance defaults to 0. |
| list_cash_transactionsA | List the cash-ledger movements on a bank account — deposits, withdrawals, contributions, fees, interest, settlements — newest-first and paginated. Filter by category, match status, financial year or date range. Use to review cash flow, check whether a movement was already recorded, or find uncategorised/unmatched items. Amounts are signed (+ in / − out), AUD. |
| record_cash_transactionA | Record a cash movement directly on a bank account — a contribution, fee, interest, pension/benefit payment, transfer or tax payment — for accounts with no live bank feed, or one-off entries. Writes directly to the cash ledger (low-risk record-keeping, like record_cost; feed-sourced rows arrive automatically instead). Amount is SIGNED: positive = money in (credit), negative = money out (debit), AUD. Contributions and benefit payments require fund_member_id. Pass external_ref as an idempotency key so re-running an import won't duplicate. |
| update_cash_transactionA | Edit an existing cash-ledger row — most importantly to (re)assign its category (e.g. move a settlement credit from "uncategorised" to "settlement_sell"), but also its description, reference, posted date or amount. Find the row via list_cash_transactions. This is a plain field edit — it does NOT change settlement linkage or match status (use attribute_cash_transaction / detach_cash_transaction for income linkage). Blocked if the row's financial year is locked (reopen the year first). |
| attribute_cash_transactionA | Link an income credit already sitting on a bank account — e.g. a dividend or distribution that landed via the bank feed — to the holding that earned it. Recognises the income on a NEW security transaction (the single source of truth Holding, Fund and the tax summaries read income & franking from) and marks this cash row as its matched settlement leg, so income is counted exactly once. Unlike record_income this is a DIRECT write, NOT a Review-Queue proposal: the cash has already arrived, you are only saying which holding it belongs to. The row must be a credit (money in) that isn't already linked to a transaction — find candidates with list_cash_transactions (match_status "unmatched", category income_* or uncategorised). Identify the holding by ticker (preferred) or holding_id, and include franking_credits for franked dividends. Undo from the app (Detach) if you pick the wrong holding. |
| detach_cash_transactionA | Undo an attribution made with attribute_cash_transaction: discard the security transaction it recognised and return the bank credit to the unmatched pool, so it can be re-attributed to the right holding. Use this when income was attributed to the wrong holding or with the wrong details — detach, then attribute_cash_transaction again. Only works on rows YOU attributed (match_status "matched" with a settles_transaction_id); it will not touch auto-matched feed rows, whose transaction pre-existed, and returns an error if the row was never attributed. |
| get_smsf_returnA | Fetch a fund's SMSF annual return for a financial year: every section and field with its ATO label, computed value, and whether it's calculated/readonly/confirmed, plus per-member statements and the live gap register (what's blocking a complete return). Pass smsf_return_id from list output, or create one first with create_smsf_return. The figures auto-fill from the ledger; edit with update_smsf_return_field. |
| create_smsf_returnA | Open (or resume) the SMSF annual return for a fund + financial year. Idempotent — returns the existing return if one already exists for that year. Returns the full return with auto-filled figures and gaps. |
| update_smsf_return_fieldA | Override a single field on the return (e.g. an income or deduction amount). Goes through the same safe write path as the web app: calculated/readonly fields are rejected, totals recompute automatically, and a blank value reverts the field to its ledger-derived figure. Returns the recomputed return. |
| list_smsf_return_gapsA | List the data/functionality gaps blocking a complete, correct SMSF return (missing franking credits, EOFY valuations, member statements, depreciation, uncategorised expenses, etc.). Each gap is tagged blocking or advisory. Use to see what to fix before confirming sections or finalising. |
| list_financial_yearsA | List a fund's financial years with their status (open / closed / lodged) and close/lodge dates. Use to find the year label to reconcile, close or lodge. |
| reconcile_cash_transactionA | Tick a single cash row off against the bank statement (the line-level 'reconciled' flag, recording that it has been checked against the official statement). Writes immediately. Rejected if the row's financial year is already closed/lodged — reconcile before closing the year. |
| unreconcile_cash_transactionA | Remove the statement-reconciliation tick from a cash row, returning it to 'not yet checked against the statement'. The inverse of reconcile_cash_transaction. |
| record_statement_balanceA | Record (or correct) a bank statement's closing balance as at a date — the snapshot the year-end balance reconciliation proves the ledger against. One snapshot per date (re-recording the same date updates it). Use the statement's closing balance and its closing date. Amounts in AUD. |
| run_account_reconciliationA | Run the cash matcher over a bank account's unmatched feed rows — link settlement legs to trades/income, pair internal transfers, and categorise cash-only events (interest, fees). Returns the match summary. Use after recording trades/income to auto-link the matching bank rows. |
| reconcile_financial_yearB | Run reconciliation for a whole financial year: match cash, then compute a balance proof per bank account (opening + movements vs the statement closing balance). Returns the balance proofs and the run summary. Record statement balances first so accounts can reconcile rather than fall out of scope. |
| close_financial_yearA | Close a financial year — locks all dated rows in that year against further edits. Only works once the year is reconciled (every bank account has a reconciled or out-of-scope balance proof); otherwise returns an error explaining what's unresolved. Run reconcile_financial_year first. |
| lodge_financial_yearA | Mark a closed financial year as lodged with the ATO. Only works on a closed year. Use after the SMSF annual return has been submitted. |
| reopen_financial_yearA | Reopen a closed financial year (back to open), unlocking its rows for edits. Only works on a closed year — to revert a lodged year use unlodge_financial_year first. |
| unlodge_financial_yearA | Revert a lodged financial year back to closed (e.g. for an ATO amendment). Keeps an audit note. Only works on a lodged year. |
| attest_accountA | Manually sign off a bank account for a financial year as out of scope (no feed/statement proof) so the year can still close. Use for accounts with no statement to reconcile against. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/steamau/beeswax-desktop'
If you have feedback or need assistance with the MCP directory API, please join our Discord server