MCP App Store
by KeenEthics

Overview

Axis helps people track and manage finances, relationships, knowledge, habits, and focus. Its tools read private account data and create, update, or delete records only after OAuth consent.

Tools

axis_get_overview

ChatGPT
One-call daily or weekly review across modules. Returns one section per module the token can read (modules it cannot read are absent): habits (today's due/done counts and the names not done), focus (the running session, if any, and focus minutes in the period), knowledge (in-progress sources with percent complete and study minutes in the period), network (the 5 people most overdue for contact) and finance (net worth as of date with knownSubtotal, missing and excluded-account counts, plus spending in the period). A section that fails comes back as { error: { code, message } } and the rest still load. date is the user's local day (default: today in tz); tz is an IANA zone (default: the user's saved time zone, or UTC if none); period day = that date, week = the Monday-to-Sunday week containing it. Habits and net worth are always as of date; the other sections cover the period. Start a review here, then drill into a module's own tools.

finance_create_account

ChatGPT
Create a new account (bank, e-wallet, brokerage, credit card, loan and so on) with a name, kind and native currency; optionally mark it excluded from net worth. It does not set a balance, so follow with finance_set_opening_balance. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_create_category

ChatGPT
Create an expense category with a name and optional colour. Needs expectedCollectionRevision from finance_list_categories. Use the new categoryId when recording expenses. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_delete_account

ChatGPT
Permanently delete an account created by mistake. It must first be closed with finance_set_account_archived and must never have had any activity (an opening balance alone is fine); otherwise it is refused with conflict and should simply stay archived. Needs expectedAccountRevision. This cannot be undone. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_delete_category

ChatGPT
Permanently delete a category that no expense uses. Needs expectedCategoryRevision and expectedCollectionRevision from finance_list_categories. A category with spending must first be archived with finance_set_category_archived or have its spending moved with finance_reclassify_category. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_get_account

ChatGPT
Explain one account: opening balance, native balance, scope and the investment positions it holds. Use it to understand a surprising balance such as a negative Ryt cash balance, then call finance_list_activity with accountId to see the actual deposits and debits. If funding from another account (e.g. Maybank) was never recorded, the tool says so; never invent a transfer to fix it.

finance_get_budget_plan

ChatGPT
Read the budget for one month (month must be the first day, e.g. 2026-10-01): the amount allocated to each category, the plan's revision and collectionRevision, and when the month simply carries forward an earlier plan, that earlier plan's id and revision. Read it before finance_set_budget_plan. Past months are read-only.

finance_get_cash_flow

ChatGPT
Summarise money in and out between from and to: ordinary income, investment income, contributions (personal and external), spending, fees, refunds and transfers, each kept separate. Savings ratio is ordinary income minus net spending (spending after refunds); transfers and pension contributions are not salary. Optionally restrict to accountIds. For spending by category use finance_get_spending.

finance_get_fx_rate

ChatGPT
Get the exchange rate from one currency into the user's reporting currency on a date, e.g. from USD on 2026-10-08: rate is how many units of the reporting currency (to) one unit of from is worth. Use it before cross-currency transfers or trades to fill the FX rate. The target is always the reporting currency (see finance_get_settings). This is market data from an outside provider (Yahoo Finance or an FX source): it may be delayed or missing, in which case the call fails; tell the user and ask them for the figure instead of guessing.

finance_get_integrity

ChatGPT
Check the books for problems: legacy records not yet migrated, holdings with no account, category mismatches, history of unknown origin and accounts with negative cash. It only reports and explains; it never changes anything or creates a repair transfer. Page with nextCursor.

finance_get_net_worth

ChatGPT
Read net worth (cash and holdings minus debts) today or as of a date, e.g. asOf 2026-09-30. Cash is converted at the FX rate of that date. A holding's price counts as known when it is the latest quote or close on or before the date and at most 7 days old; it keeps its own price date, and an older price is only an estimate (stale_quote). If anything cannot be valued, netWorth is null, coverage.complete=false, missingComponents lists what is missing and knownSubtotal holds the rest; never report knownSubtotal as the actual net worth.

finance_get_net_worth_history

ChatGPT
Read net worth at the dates activity happened, between from and to (at most 366 days). Leave gaps as null instead of interpolating, and do not treat an account being added to or excluded from net worth as an investment return. For a single date use finance_get_net_worth.

finance_get_portfolio

ChatGPT
Value the user's investment holdings today or asOf a date, using dated prices. Cost basis here is the average price actually paid (weighted by purchase order), not market value. If any holding has no price, the total is null and the priced holdings are shown in a separate knownSubtotal. For net worth including cash and debts use finance_get_net_worth.

finance_get_quote

ChatGPT
Get the latest market price of one symbol and the currency it is quoted in (currency is null when the provider does not say). Use it before finance_record_trade to fill symbol, quoteCurrency and a sensible unitPrice; the price actually paid still comes from the user. This is market data from an outside provider (Yahoo Finance or an FX source): it may be delayed or missing, in which case the call fails; tell the user and ask them for the figure instead of guessing.

finance_get_settings

ChatGPT
Read the reporting currency and the savings target, plus the settings revision you need to pass to finance_update_settings. Start here when you need the user's reporting currency.

finance_get_spending

ChatGPT
Spending by category between from and to under each category's current name, with refunds counted on the date the money came back. Example: Family spending in September (find the categoryId with finance_list_categories). Renaming a category changes its name here immediately. Page with nextCursor.

finance_get_transaction

ChatGPT
Read one transaction by transactionId: its current details, its current revision and affectedRoots (the accounts, positions and categories it touches, each with its revision), plus its paged correction history. Call this immediately before finance_update_transaction, finance_void_transaction or finance_record_refund, because those need the transaction revision and affectedRoots copied from here.

finance_list_accounts

ChatGPT
List the user's accounts with each account's id, current revision (needed for every write that touches it), native currency, balance, reporting-currency value at that day's FX rate, net-worth scope (tracked or excluded) and a warning when cash is negative. Archived accounts are hidden unless includeArchived is true. Read this first to get accountId and revision for any write. Page with nextCursor.

finance_list_activity

ChatGPT
List dated money activity (income, expenses, transfers, trades, opening balances, balance adjustments, voids) with each row's transactionId (pass it to finance_get_transaction before editing, voiding or refunding) and positionIds. Filter by from/to dates, accountId, kinds or categoryIds. Older imported expense rows are history only and do not change any account's cash balance. Page with nextCursor.

finance_list_budget_plans

ChatGPT
List the months that have a stored budget plan, with each plan's id and revision. Filter with from/to and page with nextCursor. Use finance_get_budget_plan for a month's actual allocations.

finance_list_categories

ChatGPT
List expense categories with their id, current name, colour, revision and the collectionRevision (the version of the whole category list). Read this before creating, renaming, archiving, reordering, deleting or reclassifying categories, or setting a budget, because those writes need the revisions returned here. Archived categories are hidden unless includeArchived is true.

finance_list_positions

ChatGPT
List investment positions (holdings): positionId, symbol, asset class, the account holding it, average acquisition cost and the dated price evidence behind its value. Identify holdings by positionId, never by ticker; the same id ties a holding together across portfolio, net worth and activity. Use this to get positionId and revision before a trade, valuation or savings move. Page with nextCursor; use valuationFrom/valuationTo to page a single position's price history.

finance_migrate_legacy_record

ChatGPT
Apply a migration you previewed: pass the same inputs as finance_preview_migration plus its previewFingerprint. It turns the old record into a dated ledger entry, an opening position or an explicit exclusion, keeping its original id, and counts its value once. If anything changed since the preview it is refused with conflict and you must preview again. Never guess missing funding. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_move_savings

ChatGPT
Move cash in an account into (direction allocate) or out of (withdraw) a savings pocket holding such as Ryt savings; give the account, the pocket's positionId and revisions, amount and quantity. To fund the account from another one in the same step, add funding with the source account and its revision; otherwise record that transfer separately with finance_record_transfer. It is not a stock trade and not new money. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_preview_migration

ChatGPT
Dry run for moving one old (pre-ledger) record into the new accounting: shows what finance_migrate_legacy_record would do, any conflicts and a fingerprint, without changing anything. Choose a mode (opening_position, ledger_transaction or explicit_exclusion) and give the record, the account and the revisions you read. Always run this before finance_migrate_legacy_record. A record already linked to a holding must not be migrated twice.

finance_reclassify_category

ChatGPT
Move all past spending from one category (fromCategoryId) into another (toCategoryId). Needs both category revisions and expectedCollectionRevision from finance_list_categories. Only the category changes, never any amount, and it affects every existing record in the source category. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_contribution

ChatGPT
Record a contribution to a pension or investment holding, e.g. EPF. A personal contribution (type personal) names the account the money came from (sourceAccountId and expectedSourceAccountRevision). An employer or external contribution (type employer or external) names externalSource instead and takes no cash from any account. Give the holding (positionId and revision, or a new instrument), amount and quantity received. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_expense

ChatGPT
Record spending, e.g. RM50 Family bouldering, using a categoryId from finance_list_categories and the paying account with its revision. Spending on a credit card raises what is owed; paying the card bill later is finance_record_transfer, not another expense. Amount is a decimal string in the stated currency. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_income

ChatGPT
Record ordinary income such as salary received into an account on effectiveDate: it adds to a bank or wallet balance, or reduces what is owed on a card or loan. Needs the account's accountId and expectedAccountRevision and a source (e.g. employer name). For dividends use finance_record_investment_income; for money returned after a purchase use finance_record_refund. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_investment_income

ChatGPT
Record a dividend or similar payout from a holding (positionId and expectedPositionRevision). With treatment cash, the money lands in destinationAccountId and the quantity is unchanged. With treatment reinvested, also give the quantity and unitPrice of the units actually bought. It is not salary and not a contribution. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_opening_position

ChatGPT
Record a holding the user already owned on effectiveDate without recording a purchase or spending any cash, e.g. 1182.5 ADA at the cutover date. Give the account, the holding (existing positionId and revision, or a new instrument) and quantity; cost is optional, and when left out the cost stays unknown rather than being treated as the market value. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_refund

ChatGPT
Record money that actually came back for an earlier expense, e.g. RM20 returned for bouldering. Give the original expense's transactionId, its revision and affectedRoots (from finance_get_transaction), the account that received the money and the date it arrived. It is a separate dated entry that lowers spending on that date and leaves the original expense intact. If the expense was a mistake and no money came back, use finance_void_transaction. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_trade

ChatGPT
Record buying or selling an investment, e.g. buy 0.001 BTC on Luno today. Give the account and its revision, the existing holding (positionId and expectedPositionRevision from finance_list_positions) or, for a first purchase, a new instrument (symbol, assetClass, quoteCurrency), plus quantity, unitPrice and the real amounts in settlement. Give any fee in fee (account currency): totalSettlementAmount must be gross plus fee for a buy or gross minus fee for a sell, so the fee counts once. Cross-currency trades also need the FX rate (finance_get_fx_rate); use finance_search_tickers and finance_get_quote to find the symbol, quoteCurrency and a reference price. If the user already owned the holding and paid nothing now, use finance_record_opening_position. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_record_transfer

ChatGPT
Record moving money between two of the user's own accounts, such as Maybank to Ryt or paying a credit-card bill from Maybank. Give both accounts with their revisions and the amount that left the source; for different currencies also give destinationAmount, destinationCurrency and the FX rate used (finance_get_fx_rate can supply a market rate). Optionally add a fee. It is not income or spending. To move cash into a Ryt savings pocket use finance_move_savings. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_reorder_categories

ChatGPT
Set the display order of categories by passing categoryIds in the order wanted. Needs expectedCollectionRevision from finance_list_categories. Does not change any spending. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_search_tickers

ChatGPT
Look up an investment symbol by company or asset name (e.g. 'apple', 'bitcoin'): returns up to 8 matches with symbol, name, exchange and quoteType (asset type). Use it before finance_record_trade to get the exact symbol for a first purchase, then finance_get_quote for its price and quote currency. This is market data from an outside provider (Yahoo Finance or an FX source): it may be delayed or missing, in which case the call fails; tell the user and ask them for the figure instead of guessing.

finance_set_account_archived

ChatGPT
Close (archived true) or reopen (archived false) an account from effectiveDate. To close, the account needs an opening balance (so its cash is known), and its cash balance and every holding in it must be zero on that date; history is kept. Needs expectedAccountRevision. Use this instead of finance_delete_account for any account that has activity. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_set_budget_plan

ChatGPT
Set the full budget for one month (month is the first day, e.g. 2026-10-01): a list of categoryId and amount that replaces the whole plan for that month. Only the current or a future month can be set. Needs expectedPlanRevision (the plan revision from finance_get_budget_plan, or 0 when the month has no plan of its own yet) and expectedCollectionRevision from finance_list_categories. If the month currently carries forward an earlier plan, also pass that plan's sourcePlanId and sourcePlanRevision. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_set_category_archived

ChatGPT
Hide (archived true) or restore (archived false) a category. Needs expectedCategoryRevision and expectedCollectionRevision from finance_list_categories. Past spending keeps its category. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_set_opening_balance

ChatGPT
Record the balance an account had on effectiveDate, the date you start tracking it, and where the figure came from (source: manual, import, connection or system). Tracking starts on that date, so do not make up earlier history. Use finance_record_actual_balance later to compare against what the bank shows. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_set_position_valuation

ChatGPT
Record a price you were told or observed for a holding on effectiveDate. Give the positionId and revision, the currency and amount, whether amount is a unit_price or the total_value, and where it came from (source). It only supplies a price for valuation; it does not change cost or cash, and it is not a trade. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_update_account

ChatGPT
Change an account's name, kind, native currency or net-worth scope by sending only the changed fields in patch. Needs accountId and expectedAccountRevision from finance_list_accounts. Changing net-worth scope also needs effectiveDate, the date it starts to apply. Once the account has any activity, its kind and currency are fixed: changing either is refused with conflict. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_update_category

ChatGPT
Rename or recolour a category by sending only the changed fields in patch. Needs categoryId, expectedCategoryRevision and expectedCollectionRevision from finance_list_categories. The new name shows on past spending immediately; amounts do not change. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_update_settings

ChatGPT
Change the reporting currency or the savings target percentage by sending only the changed fields in patch. Needs expectedSettingsRevision from finance_get_settings. Recorded amounts stay in their own currency; reports re-express them at each date's FX rate. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_update_transaction

ChatGPT
Fix a recorded transaction by sending only the fields that change in patch (omitted fields keep their values). Call finance_get_transaction first for transactionId, expectedTransactionRevision and affectedRoots. Within 14 days of when it was recorded, a money change is applied on the original date. After that, give correctionEffectiveDate: the original stays as it was until that date and the change applies from then (when the user names no date, use the transaction's own date so the edit restates it). For a mistaken entry use finance_void_transaction instead. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

finance_void_transaction

ChatGPT
Cancel a transaction entered by mistake (what a user means by delete). Give transactionId, expectedTransactionRevision and affectedRoots from finance_get_transaction, a reason, and effectiveDate set to the transaction's own date so it drops out of every total; its history stays readable. If money really came back, use finance_record_refund. An expense that has a refund can be voided only after that refund is voided. A void cannot itself be undone. Money, quantities, prices and FX are decimal strings, e.g. "50.00". requestId is a unique id you make up per action; reuse the same one only to retry that exact call. Every expected...Revision is the revision you last read for that record: if it has changed since, the call is refused with conflict instead of overwriting, so re-read and retry.

focus_abandon_session

ChatGPT
Discard the running session: it is kept as abandoned and never counts toward focus time. Retry-safe: asking for the state the session is already in returns it unchanged. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_create_category

ChatGPT
Create a category that groups focus tasks, e.g. Work or Study. Names are unique per user (409 conflict if taken). Returns its id; use it with focus_create_task.

focus_create_task

ChatGPT
Create a focus task in a category (find categoryId with focus_list_categories). Sessions are always linked to a task. Returns its id.

focus_delete_category

ChatGPT
Permanently delete a focus category AND every task in it AND all of those tasks' sessions. Confirm with the user first; to keep history, move tasks elsewhere with focus_update_task before deleting.

focus_delete_session

ChatGPT
Permanently delete one focus session; it no longer counts toward any statistic.

focus_delete_task

ChatGPT
Permanently delete a focus task AND all of its sessions, which drops them from every focus statistic. Confirm with the user first; to keep the history, mark it done with focus_update_task instead.

focus_get_active_session

ChatGPT
Get the running focus session (paused counts as running: pausedAt is set), or null. If stale is true it has run past twice its planned length and was most likely left running: do not report it as live; ask the user, then abandon it or log the real time. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_get_distribution

ChatGPT
Focus minutes by hour the session started (0–23, in tz; the user's saved time zone when omitted, or UTC if none) over the last 90 days: when in the day the user focuses.

focus_get_heatmap

ChatGPT
Focus minutes per day from from to to inclusive (YYYY-MM-DD, at most 400 days), days in tz (the user's saved time zone when omitted, or UTC if none). Every day appears, with 0 when idle.

focus_get_session

ChatGPT
Get one focus session by id. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_get_streak

ChatGPT
Current and longest run of consecutive days (in tz) with at least one completed focus session. The current streak survives until today ends. Pass date as the user's local day (YYYY-MM-DD) to calculate as of that day; otherwise today in the user's saved time zone (UTC if none) is used.

focus_get_summary

ChatGPT
Completed focus sessions (breaks excluded) in a range: totalFocusSec and per-category focusSec in seconds, sessionCount, and completedTasks finished in the range.

focus_get_task

ChatGPT
Get one focus task by id.

focus_get_top_tasks

ChatGPT
Tasks ranked by completed focus time (focusSec, seconds) within a range, with sessionCount.

focus_list_categories

ChatGPT
List the user's focus categories in display order. This is a pure read and never creates anything. When the list is empty, offer to create categories with focus_create_category, suggesting the Focus app's defaults: Work, Study, Side Project and Personal. Returns items and hasMore (default 100, max 500); increase limit up to 500 when hasMore is true, or pass the returned nextCursor back to fetch the next page.

focus_list_sessions

ChatGPT
List focus and break sessions, newest first (default 50). Returns items and hasMore; if hasMore is true, increase limit up to 200, narrow by start time, or pass the returned nextCursor back to fetch the next page. Filter by start time: from / to take a date (YYYY-MM-DD, whole days in tz, to inclusive) or an ISO timestamp with offset. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_list_tasks

ChatGPT
List focus tasks, newest first. Returns items and hasMore; if hasMore is true, increase limit up to 200 or narrow by categoryId/completed, or pass the returned nextCursor back to fetch the next page. completedAt is an ISO timestamp or null.

focus_log_session

ChatGPT
Record a session that already happened, e.g. "I focused 9–10am on the report". For a timer starting now use focus_start_session. endedAt must be after startedAt and not in the future; overlapping another session is a 409 conflict. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_pause_session

ChatGPT
Pause the running session now. Retry-safe: asking for the state the session is already in returns it unchanged. A finished session is a 409 not_active. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_resume_session

ChatGPT
Resume a paused session now; the pause is excluded from its duration. Retry-safe: asking for the state the session is already in returns it unchanged. A finished session is a 409 not_active. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_start_session

ChatGPT
Start a live timer now for a task, when the user is about to focus or rest. For time already spent use focus_log_session instead. Only one session runs at a time (409 session_active; check focus_get_active_session). A stale running session is abandoned first. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_stop_session

ChatGPT
Finish the running session now and count it as completed. Retry-safe: asking for the state the session is already in returns it unchanged. A stale session (running past twice its planned length) is abandoned instead and answers 409 session_stale with the abandoned session in error.details.session (a retry answers the same); then record the real time with focus_log_session. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_update_category

ChatGPT
Rename, recolour or reorder a focus category. Only the fields given change.

focus_update_session

ChatGPT
Correct a finished session's note, task, times or paused seconds. Only the fields given change. A running session cannot be edited (409 session_active). pausedDurationSec cannot exceed endedAt − startedAt; new times must not overlap another session. Returns the session with durationSec (seconds actually focused, pauses excluded) and stale.

focus_update_task

ChatGPT
Rename a focus task, move it to another category, or mark it done (completedAt = an ISO timestamp with offset) or open again (completedAt = null).

habits_create_habit

ChatGPT
Create a habit. Binary habits are ticked done; quantified habits log an amount (give unit and targetValue, e.g. 20 pages). frequency daily = every day; weekly = frequencyTarget days per week; custom = only on scheduleDays (1 = Monday … 7 = Sunday, required for custom). Starts active unless status says otherwise. The free plan allows three habits.

habits_delete_completion

ChatGPT
Uncheck a habit for a day: removes that day's completion (and its amount and note). Pass habitId and date (YYYY-MM-DD) — the usual way — or a completion id from habits_list_completions. Unchecking a day that isn't checked succeeds with deleted=false.

habits_delete_habit

ChatGPT
Permanently delete a habit and, with it, every completion it has ever logged. This cannot be undone. To stop tracking a habit but keep its history, use habits_update_habit with status archived instead.

habits_get_consistency

ChatGPT
Get each habit's completion rate by weekday (byDay: 1 = Monday … 7 = Sunday, each 0–1) between from and to, as the Axis app's Analytics weekday bars. Active habits by default; status picks others. Only days since the habit started and before today count, so a habit younger than the span isn't diluted. Binary habits: the share of asked days logged (custom habits only on scheduled days). Quantified habits: the average amount against the target, capped at 1. Pass the user's local date and IANA time zone so the figures match the app.

habits_get_habit

ChatGPT
Get one habit's settings by id (name, trackingMode, unit, targetValue, frequency, scheduleDays, status). For streaks use habits_get_stats.

habits_get_stats

ChatGPT
Get each habit's name, status, current streak, best streak, start date and days logged, over its whole history. Active habits by default; pass status=all to include paused and archived ones. The source of truth for current and best streaks and each habit's start date. Pass the user's local date and IANA time zone: then the figures match the Axis app exactly (without them the user's saved time zone (UTC if none) is used, and a start can be a day off). Streaks count days for daily habits, scheduled days for custom ones (rest days skipped), and finished weeks for weekly ones; today never breaks a streak.

habits_get_streaks

ChatGPT
Get current and longest streak per habit (active by default; status=all includes paused and archived), with the last day logged, sorted by current streak. Uses the same rule as habits_get_stats and the Axis app: weekly habits count finished weeks, custom habits skip rest days, and today never breaks a streak. Pass the user's local date and IANA time zone so the figures match the app.

habits_get_summary

ChatGPT
The Axis app's Analytics page for any span, overall and per habit. Without from/to it reads the 30 days ending yesterday (the app's first page); pass from/to for any period (a month, a year) or allTime for the whole history. allTime starts at the earliest start among the habits status picks; weeks start at each habit's first week. The span always ends yesterday at the latest: rates read finished days only. Overall: done of due habit-days and overallConsistency (a whole percentage). Per habit: start, current and best streak, completions, rate (done/due/pct, from the habit's start; custom habits only on scheduled days, weekly habits pro-rated), averageAmount and atTarget for quantified habits, weeks (each week's share and figure: a percentage, or the average amount) and weekdays (1 = Monday … 7 = Sunday). status picks which habits: active (default, as the app), paused, archived or all. Pass the user's local date and IANA time zone so the figures match the app. For raw rows use habits_list_completions.

habits_get_today

ChatGPT
Get today's checklist: the active habits due today (weekly habits always show) with completed, the logged amount and current streak (the same rule as habits_get_stats). Pass the user's local date and IANA time zone so 'today' and the streaks match the Axis app; without them the user's saved time zone (UTC if none) is used.

habits_list_completions

ChatGPT
List raw completions (habitId, date, value, note), newest first, for every habit including paused and archived ones. Without from it reads the 90 days ending at to (or today); pass from (YYYY-MM-DD) for a longer span. Returns items and hasMore (default 200, max 1000); when hasMore is true, pass the returned nextCursor back to continue the same window, read an earlier interval with an earlier to, or increase limit. For streaks, rates and per-period figures use habits_get_stats or habits_get_summary instead of counting rows yourself.

habits_list_habits

ChatGPT
List habits with their settings, in the app's order. Returns items and hasMore (default 100, max 500); increase limit up to 500 when hasMore is true, or pass the returned nextCursor back to fetch the next page. Active habits by default; pass status=paused, archived or all. scheduleDays uses 1 = Monday … 7 = Sunday.

habits_log_completion

ChatGPT
Check a habit as done for a day; date is required (YYYY-MM-DD, the user's local day — not a word like today). One completion per habit per day: logging the same day again updates it, so a retry never doubles up. Fields you leave out are kept; pass null to clear value or note. For quantified habits pass value, the day's amount in the habit's unit. date can't be after the user's today; pass tz so 'today' is theirs. To uncheck, use habits_delete_completion.

habits_reorder_habits

ChatGPT
Set the order habits appear in: give each habit's id with its sortOrder (lower first). All or nothing: an unknown or repeated id is refused and nothing changes. Habits left out keep their sortOrder.

habits_update_habit

ChatGPT
Change a habit's settings. Only the fields you pass change; pass null to clear description, unit, targetValue, scheduleDays or color. To retire a habit but keep its history, set status to archived (or paused) rather than deleting it. Switching to custom frequency needs scheduleDays (1 = Monday … 7 = Sunday).

knowledge_create_source

ChatGPT
Add a learning source (book, article, video, film, podcast, paper, course, other) to the library. Status defaults to backlog. Returns the new source ID.

knowledge_delete_session

ChatGPT
Delete one logged session and recompute the source's progress from the sessions that remain. The source itself is kept.

knowledge_delete_source

ChatGPT
Permanently delete a source together with all its logged sessions and its progress. This cannot be undone. To keep the history, set status abandoned with knowledge_update_source instead. Returns not_found if the source does not exist.

knowledge_get_reading_trend

ChatGPT
Reading trend over the last count day/week/month buckets, oldest first; period is the bucket start (YYYY-MM-DD, weeks start Monday). Counts pages only: pagesRead sums pagesEnd − pagesStart of sessions with both page numbers, and pagesPerHour uses only those sessions. Video and audio progress is not counted in pagesRead; sessionMinutes includes every session.

knowledge_get_source

ChatGPT
Get one source with its progress: currentPage, currentPositionMins, percentComplete (0–1), startedAt, completedAt.

knowledge_get_source_analytics

ChatGPT
Analytics for one source: total minutes and sessions, average session minutes, average pages per hour (page-based sessions only), days since last session, sessions per week over the last 4 weeks, and the percent-complete curve (0–1) per session.

knowledge_get_summary

ChatGPT
Library summary: source counts by status, sessions in the last 7 days, total session minutes per source type, and in_progress sources with no session for over 14 days.

knowledge_list_sessions

ChatGPT
List sessions logged against one source, newest first. Returns items and hasMore (default 50, max 200); increase limit up to 200 when hasMore is true, or pass the returned nextCursor back to fetch the next page. durationMins is in minutes; pagesStart/pagesEnd are absolute page numbers.

knowledge_list_sessions_in_range

ChatGPT
List sessions across all sources that started between from and to (both inclusive), oldest first, each with its sourceTitle. Use it for "what did I read last week?". Both from and to are required ISO 8601 timestamps with a time zone offset, at most 366 days apart (e.g. a week: 2026-10-05T00:00:00+08:00 to 2026-10-11T23:59:59+08:00). Returns items and hasMore (default 200, max 500); narrow the range when hasMore is true, or pass the returned nextCursor back to fetch the next page. durationMins is in minutes; pagesStart/pagesEnd are absolute page numbers. For the sessions of one source use knowledge_list_sessions.

knowledge_list_sources

ChatGPT
List learning sources with their progress, newest added first. Filter by status, type, or query (case-insensitive substring of title or author). Returns items and hasMore (default 100, max 200); increase limit or filter further when hasMore is true, or pass the returned nextCursor back to fetch the next page.

knowledge_log_session

ChatGPT
Log a reading/viewing/listening session against a source and update its progress in the same step. pagesStart/pagesEnd are absolute page numbers (start and end page), not a page count; pagesEnd must be ≥ pagesStart and within the source's totalPages. Percent complete comes from pages (latest pagesEnd ÷ totalPages) when both are known, else from duration (latest positionEndMins ÷ totalDurationMins), else stays 0. Reaching 100% does not complete a source; use knowledge_update_source with status completed. Logging moves a backlog source to in_progress. Returns the session ID with the source's updated status and progress.

knowledge_update_session

ChatGPT
Edit one logged session and recompute the source's progress. Send null to clear a page or position. pagesStart/pagesEnd are absolute page numbers. Percent complete comes from pages (latest pagesEnd ÷ totalPages) when both are known, else from duration (latest positionEndMins ÷ totalDurationMins), else stays 0. Reaching 100% does not complete a source; use knowledge_update_source with status completed.

knowledge_update_source

ChatGPT
Update a source's details or status. Setting status completed stamps the finish date; moving a completed or abandoned source back to backlog or in_progress clears it. Changing totalPages or totalDurationMins recomputes percent complete; send null to clear either. totalPages cannot go below a page a logged session already reached (409 conflict): edit or delete those sessions first, or clear it with null.

network_add_person

ChatGPT
Add a person to the relationship graph and return their id. Check network_list_people with query first to avoid duplicates. Scores are 0–1. bond = long-term closeness (half-life ~8 months), contact = recency of contact (half-life ~1 month), edge = 0.6·bond + 0.4·contact. Bond never decays below the category floor (partner 0.50, family 0.35, friend 0.20, colleague 0.05, acquaintance 0). Optional starting bond/contact are kept as the person's starting point when their interactions are scored; a starting bond below the category floor is rejected with invalid_input.

network_delete_interaction

ChatGPT
Permanently delete one interaction; the person's scores are recomputed without it.

network_delete_person

ChatGPT
Permanently delete a person. This also deletes their scores and every interaction logged with them; it cannot be undone.

network_get_analytics

ChatGPT
Summary of the whole network with every score decayed to now: person count, average bond/contact/edge per category, the neglected list (people whose edge is below 0.30, weakest first) and interaction counts (all time and last 30 days). Scores are 0–1. bond = long-term closeness (half-life ~8 months), contact = recency of contact (half-life ~1 month), edge = 0.6·bond + 0.4·contact. Bond never decays below the category floor (partner 0.50, family 0.35, friend 0.20, colleague 0.05, acquaintance 0).

network_get_interaction

ChatGPT
Get one interaction by id (from network_list_interactions or network_log_interaction): its person, depth, notes, timestamp and the scores right after it (bondAfter/contactAfter/edgeAfter, before later decay; use network_get_person for today's scores).

network_get_person

ChatGPT
Get one person by id with their category, notes and scores decayed to now. Scores are 0–1. bond = long-term closeness (half-life ~8 months), contact = recency of contact (half-life ~1 month), edge = 0.6·bond + 0.4·contact. Bond never decays below the category floor (partner 0.50, family 0.35, friend 0.20, colleague 0.05, acquaintance 0).

network_list_interactions

ChatGPT
List interactions logged with one person, newest first (default 50). Returns items and hasMore; if hasMore is true, increase limit up to 200 or pass the returned nextCursor back to fetch the next page. bondAfter/contactAfter/edgeAfter are the scores right after each interaction, before later decay; use network_get_person for today's scores.

network_list_people

ChatGPT
List people in the relationship graph, strongest edge first, with scores decayed to now. Returns up to limit people (default 100, max 500) and hasMore; increase limit up to 500 or filter by name if hasMore is true. Scores are 0–1. bond = long-term closeness (half-life ~8 months), contact = recency of contact (half-life ~1 month), edge = 0.6·bond + 0.4·contact. Bond never decays below the category floor (partner 0.50, family 0.35, friend 0.20, colleague 0.05, acquaintance 0). Pass query to find someone by name (case-insensitive substring) before using their id.

network_log_interaction

ChatGPT
Log an interaction with a person; their whole history is rescored in time order. Returns the scores as of this interaction: for a backdated one, that is the moment it happened, not today (use network_get_person for today's scores). Scores are 0–1. bond = long-term closeness (half-life ~8 months), contact = recency of contact (half-life ~1 month), edge = 0.6·bond + 0.4·contact. Bond never decays below the category floor (partner 0.50, family 0.35, friend 0.20, colleague 0.05, acquaintance 0).

network_update_interaction

ChatGPT
Edit an interaction's depth, notes or timestamp; the person's whole history is rescored. Returns the scores as of this interaction (not today's). Pass notes: null to clear notes. Timestamp format: ISO 8601 with a time zone offset; future times are rejected.

network_update_person

ChatGPT
Update a person's name, notes or category. Changing category changes their bond floor and rescores their whole interaction history with it. Pass notes: null to clear notes.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

111

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily