{"name":"axis","version":"1.6.0","protocol":{"mcp":"2025-06-18","transport":"streamable-http","endpoint":"/mcp"},"tools":[{"name":"list_card_benefits","title":"List card benefits","description":"Read the benefit checklist for one owned card, or up to 100 personal cards. Each benefit includes whether it has been used, its current period, the next reset, and whether it is a protection or a spendable credit. Includes issuer-sourced benefits and rewards, custom perks, revisions, and recent usage history. Annual periods reset without deleting history. Anniversary credits use the card’s benefit_anchor_date. Multi-year and one-time perks stay checked until their eligibility is reviewed.","inputSchema":{"type":"object","properties":{"card_id":{"type":"string","description":"Optional owned finance_credit_cards id from list_finance_records."}}},"outputSchema":{"type":"object","properties":{"cards":{"type":"array","items":{"type":"object"}}},"required":["cards"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"set_card_benefit_usage","title":"Set card benefit usage","description":"Record whether a card benefit was used. Read list_card_benefits first and pass the exact benefit key, the current period start, and the revision (null for a new checklist entry). Optionally record amount_used and notes. A concurrent change or a new period is refused. Does not enroll in benefits, spend money, or move funds.","inputSchema":{"type":"object","properties":{"card_id":{"type":"string","description":"Credit card id from list_finance_records."},"benefit_key":{"type":"string","description":"Benefit key from list_card_benefits."},"period_start":{"type":"string","description":"Exact current period.start from list_card_benefits."},"used":{"type":"boolean","description":"Whether the benefit is marked used."},"expected_revision":{"type":["string","null"],"description":"Revision from the last read, or null when the checklist entry is new."},"notes":{"type":"string","description":"Evidence or owner confirmation, up to 6000 characters."},"amount_used":{"type":"number","description":"Optional verified amount in currency units, not cents."}},"required":["card_id","benefit_key","period_start","used","expected_revision"]},"outputSchema":{"type":"object","properties":{"usage":{"type":"object"}},"required":["usage"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_spend_bonuses","title":"List spend bonuses","description":"List credit-card sign-up spend bonuses and their progress. Qualifying spend is purchases minus refunds on the linked card during the inclusive window. Payments, balance transfers, cash advances, and fees are excluded when identified. Each row includes spent, remaining, days_left, daily_pace, weekly_pace, on_track, and status (in_progress, met, missed). Pass today as the user's local YYYY-MM-DD; otherwise the date is the account's local date.","inputSchema":{"type":"object","properties":{"today":{"type":"string","description":"User's local YYYY-MM-DD. Omit to use the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"bonuses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reward":{"type":"string"},"spend_target":{"type":"number"},"start_date":{"type":"string"},"end_date":{"type":"string"},"plaid_account_id":{"type":["string","null"]},"manual_account_id":{"type":["string","null"]},"notes":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"linked":{"type":"boolean"},"progress":{"type":"object","properties":{"spent":{"type":"number"},"pending":{"type":"number"},"remaining":{"type":"number"},"target":{"type":"number"},"days_left":{"type":"number"},"days_total":{"type":"number"},"daily_pace":{"type":["number","null"]},"weekly_pace":{"type":["number","null"]},"on_track":{"type":"boolean"},"status":{"type":"string","enum":["in_progress","met","missed"]},"phase":{"type":"string","enum":["upcoming","open","closed"]},"percent":{"type":"number"},"behind":{"type":"number"}},"required":["spent","remaining","days_left","on_track","status"]}},"required":["id","name","progress"]}}},"required":["bonuses"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"get_spend_bonus_progress","title":"Get spend bonus progress","description":"Progress for one spend bonus: spent, remaining, days left, the daily and weekly pace still required, and on_track. Spent is net qualifying purchases in the window (refunds reduce it). Off pace means spend is behind a straight line from the start date. Pass today as the user's local YYYY-MM-DD; otherwise the date is the account's local date.","inputSchema":{"type":"object","properties":{"bonus_id":{"type":"string","description":"Spend bonus id."},"today":{"type":"string","description":"User's local YYYY-MM-DD. Omit to use the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}},"required":["bonus_id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reward":{"type":"string"},"spend_target":{"type":"number"},"start_date":{"type":"string"},"end_date":{"type":"string"},"plaid_account_id":{"type":["string","null"]},"manual_account_id":{"type":["string","null"]},"notes":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"linked":{"type":"boolean"},"progress":{"type":"object","properties":{"spent":{"type":"number"},"pending":{"type":"number"},"remaining":{"type":"number"},"target":{"type":"number"},"days_left":{"type":"number"},"days_total":{"type":"number"},"daily_pace":{"type":["number","null"]},"weekly_pace":{"type":["number","null"]},"on_track":{"type":"boolean"},"status":{"type":"string","enum":["in_progress","met","missed"]},"phase":{"type":"string","enum":["upcoming","open","closed"]},"percent":{"type":"number"},"behind":{"type":"number"}},"required":["spent","remaining","days_left","on_track","status"]}},"required":["id","name","progress"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_spend_bonus","title":"Create spend bonus","description":"Create a sign-up spend bonus. name, reward, spend_target (dollars), and start_date are required. end_date defaults to start_date plus window_months (default 3). Leave both account ids unset to track an offer before a card is linked. Does not move money.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Card or offer name, e.g. Chase Sapphire Preferred."},"reward":{"type":"string","description":"What the bonus pays, e.g. 75,000 points."},"spend_target":{"type":"number","description":"Required qualifying spend in dollars, not cents."},"start_date":{"type":"string","description":"YYYY-MM-DD, usually the approval date. Inclusive."},"end_date":{"type":"string","description":"YYYY-MM-DD deadline, inclusive. Defaults to start_date plus window_months."},"window_months":{"type":"number","description":"Window length when end_date is omitted. Default 3, max 36. Ignored when end_date is set."},"plaid_account_id":{"type":["string","null"],"description":"Linked account id from list_accounts. Null leaves the card unlinked. Do not also set manual_account_id."},"manual_account_id":{"type":["string","null"],"description":"Manual credit account id. Null leaves the card unlinked."},"notes":{"type":["string","null"],"description":"Optional note, up to 2000 characters, or null to clear it."}},"required":["name","reward","spend_target","start_date"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reward":{"type":"string"},"spend_target":{"type":"number"},"start_date":{"type":"string"},"end_date":{"type":"string"},"plaid_account_id":{"type":["string","null"]},"manual_account_id":{"type":["string","null"]},"notes":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"linked":{"type":"boolean"},"progress":{"type":"object","properties":{"spent":{"type":"number"},"pending":{"type":"number"},"remaining":{"type":"number"},"target":{"type":"number"},"days_left":{"type":"number"},"days_total":{"type":"number"},"daily_pace":{"type":["number","null"]},"weekly_pace":{"type":["number","null"]},"on_track":{"type":"boolean"},"status":{"type":"string","enum":["in_progress","met","missed"]},"phase":{"type":"string","enum":["upcoming","open","closed"]},"percent":{"type":"number"},"behind":{"type":"number"}},"required":["spent","remaining","days_left","on_track","status"]}},"required":["id","name","progress"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_spend_bonus","title":"Update spend bonus","description":"Edit a spend bonus. Read it first and pass expected_updated_at. Only supplied fields change. Set either account id to null to unlink the card. Setting one account clears the other. Pass window_months without end_date to recompute the deadline from the start date. Does not move money.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Card or offer name, e.g. Chase Sapphire Preferred."},"reward":{"type":"string","description":"What the bonus pays, e.g. 75,000 points."},"spend_target":{"type":"number","description":"Required qualifying spend in dollars, not cents."},"start_date":{"type":"string","description":"YYYY-MM-DD, usually the approval date. Inclusive."},"end_date":{"type":"string","description":"YYYY-MM-DD deadline, inclusive. Defaults to start_date plus window_months."},"window_months":{"type":"number","description":"Window length when end_date is omitted. Default 3, max 36. Ignored when end_date is set."},"plaid_account_id":{"type":["string","null"],"description":"Linked account id from list_accounts. Null leaves the card unlinked. Do not also set manual_account_id."},"manual_account_id":{"type":["string","null"],"description":"Manual credit account id. Null leaves the card unlinked."},"notes":{"type":["string","null"],"description":"Optional note, up to 2000 characters, or null to clear it."},"bonus_id":{"type":"string","description":"Spend bonus id."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_spend_bonuses."}},"required":["bonus_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"reward":{"type":"string"},"spend_target":{"type":"number"},"start_date":{"type":"string"},"end_date":{"type":"string"},"plaid_account_id":{"type":["string","null"]},"manual_account_id":{"type":["string","null"]},"notes":{"type":["string","null"]},"updated_at":{"type":["string","null"]},"linked":{"type":"boolean"},"progress":{"type":"object","properties":{"spent":{"type":"number"},"pending":{"type":"number"},"remaining":{"type":"number"},"target":{"type":"number"},"days_left":{"type":"number"},"days_total":{"type":"number"},"daily_pace":{"type":["number","null"]},"weekly_pace":{"type":["number","null"]},"on_track":{"type":"boolean"},"status":{"type":"string","enum":["in_progress","met","missed"]},"phase":{"type":"string","enum":["upcoming","open","closed"]},"percent":{"type":"number"},"behind":{"type":"number"}},"required":["spent","remaining","days_left","on_track","status"]}},"required":["id","name","progress"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_spend_bonus","title":"Delete spend bonus","description":"Permanently delete one spend bonus. This is not a soft delete — the offer is gone and can be recreated. Does not delete the card, its transactions, or move money.","inputSchema":{"type":"object","properties":{"bonus_id":{"type":"string","description":"Spend bonus id."}},"required":["bonus_id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_finance_records","title":"List finance records","description":"Read finance records with their editable fields and updated_at revisions: manual accounts/transactions, bank transaction annotations, budgets, savings goals, categories, rules, cards, benefits/rewards, recurring overrides, holdings and net-worth history. Bank data and snapshots are authoritative, not editable. Recurring overrides confirm/dismiss detected merchants; snapshots describe previously tracked bills. Positive transaction amounts mean money out, negative mean money in. Rules take effect on subsequent bank sync. Read before editing.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["manual_account","manual_transaction","bank_transaction","budget","savings_goal","category","rule","credit_card","card_benefit","card_reward","card_benefit_usage","recurring_override","holding","net_worth_snapshot"]},"record_id":{"type":"string","description":"Record id from the matching list tool."},"limit":{"type":"number","description":"Default 100, cap 500."},"offset":{"type":"number","description":"Pagination offset, default 0. Use next_offset to continue."},"from":{"type":"string","description":"For transaction/snapshot kinds only, YYYY-MM-DD inclusive."},"to":{"type":"string","description":"For transaction/snapshot kinds only, YYYY-MM-DD inclusive."}},"required":["kind"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"records":{"type":"array","items":{"type":"object"}},"next_offset":{"type":["number","null"]}},"required":["kind","records","next_offset"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_manual_account","title":"Create manual account","description":"Create a manual account you track yourself: checking, savings, credit, investment, loan, or other. name, type, and current_balance are the usual fields; name and current_balance are required. The balance is stored as entered. This does not connect a bank and does not move money.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name."},"type":{"type":"string","enum":["depository","credit","investment","loan","other"],"description":"Account type: depository, credit, investment, loan, or other."},"current_balance":{"type":"number","description":"Balance in currency units (dollars), not cents."},"iso_currency":{"type":"string","description":"Three-letter currency code, such as USD."},"notes":{"type":["string","null"],"description":"Free-text note, up to 10000 characters."},"apr":{"type":["number","null"],"description":"Annual percentage rate, or null."},"min_payment":{"type":["number","null"],"description":"Minimum payment in currency units, or null."},"archived":{"type":"boolean","description":"True hides the record from the active list."}},"required":["name","current_balance"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_manual_account","title":"Update manual account","description":"Edit one manual account. Read it with list_finance_records (kind manual_account) and pass record_id plus expected_updated_at. Only the fields you send change. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"name":{"type":"string","description":"Display name."},"type":{"type":"string","enum":["depository","credit","investment","loan","other"],"description":"Account type: depository, credit, investment, loan, or other."},"current_balance":{"type":"number","description":"Balance in currency units (dollars), not cents."},"iso_currency":{"type":"string","description":"Three-letter currency code, such as USD."},"notes":{"type":["string","null"],"description":"Free-text note, up to 10000 characters."},"apr":{"type":["number","null"],"description":"Annual percentage rate, or null."},"min_payment":{"type":["number","null"],"description":"Minimum payment in currency units, or null."},"archived":{"type":"boolean","description":"True hides the record from the active list."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_manual_transaction","title":"Create manual transaction","description":"Record a manual transaction. name, amount, and date are required. Positive amount is money out; negative amount is money in. Amounts are currency units, not cents. This does not move money.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name."},"amount":{"type":"number","description":"Currency units. On a manual transaction, positive is money out and negative is money in."},"date":{"type":"string","description":"YYYY-MM-DD."},"merchant_name":{"type":["string","null"],"description":"Merchant name, or null."},"iso_currency":{"type":"string","description":"Three-letter currency code, such as USD."},"notes":{"type":["string","null"],"description":"Free-text note, up to 10000 characters."},"category_id":{"type":["string","null"],"description":"Finance category id from list_finance_records, or null."},"manual_account_id":{"type":["string","null"],"description":"Manual account id, or null."}},"required":["name","amount","date"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_manual_transaction","title":"Update manual transaction","description":"Edit one manual transaction. Read it first and pass record_id plus expected_updated_at. Only the fields you send change. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"name":{"type":"string","description":"Display name."},"amount":{"type":"number","description":"Currency units. On a manual transaction, positive is money out and negative is money in."},"date":{"type":"string","description":"YYYY-MM-DD."},"merchant_name":{"type":["string","null"],"description":"Merchant name, or null."},"iso_currency":{"type":"string","description":"Three-letter currency code, such as USD."},"notes":{"type":["string","null"],"description":"Free-text note, up to 10000 characters."},"category_id":{"type":["string","null"],"description":"Finance category id from list_finance_records, or null."},"manual_account_id":{"type":["string","null"],"description":"Manual account id, or null."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"update_bank_transaction","title":"Update bank transaction","description":"Edit local annotations on one bank transaction: category, notes, tags, and the hidden, recurring, and reviewed flags. Amounts and dates stay as imported. Read it first and pass record_id plus expected_updated_at. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"category_id":{"type":["string","null"],"description":"Finance category id from list_finance_records, or null."},"notes":{"type":["string","null"],"description":"Free-text note, up to 10000 characters."},"is_hidden":{"type":"boolean","description":"Hide this bank transaction from totals."},"is_recurring":{"type":"boolean","description":"Mark this bank transaction as recurring."},"is_reviewed":{"type":"boolean","description":"Mark this bank transaction as reviewed."},"tags":{"type":"array","items":{"type":"string"},"description":"Up to 50 short labels."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_budget","title":"Create budget","description":"Create a budget for one category and period. category_id and amount are required. period is monthly, weekly, or annual. A category can have only one budget per period; update the existing row instead of creating a second. This does not move money.","inputSchema":{"type":"object","properties":{"category_id":{"type":["string","null"],"description":"Finance category id from list_finance_records, or null."},"period":{"type":"string","enum":["monthly","weekly","annual"],"description":"monthly, weekly, or annual. Defaults to monthly."},"amount":{"type":"number","description":"Currency units. On a manual transaction, positive is money out and negative is money in."},"rollover":{"type":"boolean","description":"Carry unused budget into the next period."}},"required":["category_id","amount"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_budget","title":"Update budget","description":"Edit one budget. Read it first and pass record_id plus expected_updated_at. Only the fields you send change. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"category_id":{"type":["string","null"],"description":"Finance category id from list_finance_records, or null."},"period":{"type":"string","enum":["monthly","weekly","annual"],"description":"monthly, weekly, or annual. Defaults to monthly."},"amount":{"type":"number","description":"Currency units. On a manual transaction, positive is money out and negative is money in."},"rollover":{"type":"boolean","description":"Carry unused budget into the next period."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_savings_goal","title":"Create savings goal","description":"Create a savings goal (a money target, separate from a productivity goal). name and target_amount are required. Amounts are currency units. This does not move money.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name."},"target_amount":{"type":"number","description":"Savings target in currency units."},"current_amount":{"type":"number","description":"Amount saved so far, in currency units."},"target_date":{"type":["string","null"],"description":"YYYY-MM-DD, or null."},"linked_project_id":{"type":["string","null"],"description":"Project id, or null."}},"required":["name","target_amount"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_savings_goal","title":"Update savings goal","description":"Edit one savings goal. Read it first and pass record_id plus expected_updated_at. Only the fields you send change. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"name":{"type":"string","description":"Display name."},"target_amount":{"type":"number","description":"Savings target in currency units."},"current_amount":{"type":"number","description":"Amount saved so far, in currency units."},"target_date":{"type":["string","null"],"description":"YYYY-MM-DD, or null."},"linked_project_id":{"type":["string","null"],"description":"Project id, or null."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_finance_category","title":"Create finance category","description":"Create a finance category for budgets and transactions. name is required. parent_id nests it under another category you own. This does not move money.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name."},"icon":{"type":["string","null"],"description":"Short icon or emoji, or null."},"color":{"type":["string","null"],"description":"Display color, or null."},"parent_id":{"type":["string","null"],"description":"Parent category id, or null."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_finance_category","title":"Update finance category","description":"Edit one finance category. Read it first and pass record_id plus expected_updated_at. Only the fields you send change. A parent cannot create a cycle.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"name":{"type":"string","description":"Display name."},"icon":{"type":["string","null"],"description":"Short icon or emoji, or null."},"color":{"type":["string","null"],"description":"Display color, or null."},"parent_id":{"type":["string","null"],"description":"Parent category id, or null."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_finance_rule","title":"Create finance rule","description":"Create a rule that assigns a category when a later bank sync sees a matching merchant, name, or amount. pattern and category_id are required. It does not retag transactions already stored.","inputSchema":{"type":"object","properties":{"match_type":{"type":"string","enum":["merchant","name","amount"],"description":"merchant, name, or amount."},"pattern":{"type":"string","description":"Text to match, or a number when match_type is amount."},"category_id":{"type":"string","description":"Finance category id from list_finance_records, or null."},"priority":{"type":"number","description":"Whole-number priority. Higher runs first."}},"required":["pattern","category_id"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_finance_rule","title":"Update finance rule","description":"Edit one finance rule. Read it first and pass record_id plus expected_updated_at. The rule applies on the next bank sync and does not retag history.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"match_type":{"type":"string","enum":["merchant","name","amount"],"description":"merchant, name, or amount."},"pattern":{"type":"string","description":"Text to match, or a number when match_type is amount."},"category_id":{"type":"string","description":"Finance category id from list_finance_records, or null."},"priority":{"type":"number","description":"Whole-number priority. Higher runs first."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_credit_card","title":"Create credit card","description":"Save credit-card details: name, issuer, last4, statement day, due day, fee, and limit. name is required. This stores the card in Axis and does not connect a bank or move money.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name."},"issuer":{"type":["string","null"],"description":"Card issuer, or null."},"network":{"type":["string","null"],"description":"Card network, or null."},"catalog_id":{"type":["string","null"],"description":"Built-in card catalog id, or null."},"benefit_anchor_date":{"type":["string","null"],"description":"YYYY-MM-DD anniversary used by anniversary credits, or null."},"last4":{"type":["string","null"],"description":"Four digits, or null."},"annual_fee":{"type":"number","description":"Annual fee in currency units. Setting it marks the fee as a custom amount."},"statement_day":{"type":["number","null"],"description":"Statement close day, from 1 to 31, or null."},"due_day":{"type":["number","null"],"description":"Payment due day, from 1 to 31, or null."},"credit_limit":{"type":["number","null"],"description":"Credit limit in currency units, or null. A bank-linked card keeps the bank limit."},"current_balance":{"type":["number","null"],"description":"Balance in currency units (dollars), not cents."},"notes":{"type":["string","null"],"description":"Free-text note, up to 10000 characters."},"archived":{"type":"boolean","description":"True hides the record from the active list."},"plaid_account_id":{"type":["string","null"],"description":"Bank account id from list_accounts, or null. A bank-linked card keeps the bank balance and limit."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_credit_card","title":"Update credit card","description":"Edit saved credit-card details. Read the card first and pass record_id plus expected_updated_at. A bank-linked card keeps its bank balance and limit. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"name":{"type":"string","description":"Display name."},"issuer":{"type":["string","null"],"description":"Card issuer, or null."},"network":{"type":["string","null"],"description":"Card network, or null."},"catalog_id":{"type":["string","null"],"description":"Built-in card catalog id, or null."},"benefit_anchor_date":{"type":["string","null"],"description":"YYYY-MM-DD anniversary used by anniversary credits, or null."},"last4":{"type":["string","null"],"description":"Four digits, or null."},"annual_fee":{"type":"number","description":"Annual fee in currency units. Setting it marks the fee as a custom amount."},"statement_day":{"type":["number","null"],"description":"Statement close day, from 1 to 31, or null."},"due_day":{"type":["number","null"],"description":"Payment due day, from 1 to 31, or null."},"credit_limit":{"type":["number","null"],"description":"Credit limit in currency units, or null. A bank-linked card keeps the bank limit."},"current_balance":{"type":["number","null"],"description":"Balance in currency units (dollars), not cents."},"notes":{"type":["string","null"],"description":"Free-text note, up to 10000 characters."},"archived":{"type":"boolean","description":"True hides the record from the active list."},"plaid_account_id":{"type":["string","null"],"description":"Bank account id from list_accounts, or null. A bank-linked card keeps the bank balance and limit."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_card_benefit","title":"Create card benefit","description":"Add a custom perk to a saved credit card. card_id and label are required. This does not enroll in an issuer benefit or move money.","inputSchema":{"type":"object","properties":{"card_id":{"type":"string","description":"Credit card id from list_finance_records."},"label":{"type":"string","description":"Benefit name."},"category":{"type":["string","null"],"description":"Category name."},"est_annual_value":{"type":["number","null"],"description":"Estimated annual value in currency units, or null."},"sort_order":{"type":"number","description":"Whole-number display order."}},"required":["card_id","label"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_card_benefit","title":"Update card benefit","description":"Edit one custom card perk. Read it first and pass record_id plus expected_updated_at. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"card_id":{"type":"string","description":"Credit card id from list_finance_records."},"label":{"type":"string","description":"Benefit name."},"category":{"type":["string","null"],"description":"Category name."},"est_annual_value":{"type":["number","null"],"description":"Estimated annual value in currency units, or null."},"sort_order":{"type":"number","description":"Whole-number display order."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_card_reward","title":"Create card reward","description":"Add an earning rate to a saved credit card. card_id, category, and multiplier are required. unit is x (points) or % (percent back). This does not move money.","inputSchema":{"type":"object","properties":{"card_id":{"type":"string","description":"Credit card id from list_finance_records."},"category":{"type":"string","description":"Category name."},"multiplier":{"type":"number","description":"Reward rate. 3 with unit x means 3x. 2 with unit % means 2 percent back."},"unit":{"type":"string","enum":["x","%"],"description":"x for a points multiplier, or % for a percent back."},"sort_order":{"type":"number","description":"Whole-number display order."}},"required":["card_id","category"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_card_reward","title":"Update card reward","description":"Edit one card earning rate. Read it first and pass record_id plus expected_updated_at. This does not move money.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"card_id":{"type":"string","description":"Credit card id from list_finance_records."},"category":{"type":"string","description":"Category name."},"multiplier":{"type":"number","description":"Reward rate. 3 with unit x means 3x. 2 with unit % means 2 percent back."},"unit":{"type":"string","enum":["x","%"],"description":"x for a points multiplier, or % for a percent back."},"sort_order":{"type":"number","description":"Whole-number display order."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_recurring_override","title":"Create recurring override","description":"Confirm or dismiss a detected recurring merchant. merchant and status (confirmed or dismissed) are required. This does not pay the bill.","inputSchema":{"type":"object","properties":{"merchant":{"type":"string","description":"Merchant name that identifies the tracked bill. It cannot be renamed later."},"status":{"type":"string","enum":["confirmed","dismissed"],"description":"confirmed keeps the bill. dismissed hides it."}},"required":["merchant","status"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_recurring_override","title":"Update recurring override","description":"Change a recurring-merchant override. Read it first and pass record_id plus expected_updated_at. The merchant name identifies the bill and cannot be renamed here.","inputSchema":{"type":"object","properties":{"record_id":{"type":"string","description":"Id from list_finance_records."},"expected_updated_at":{"type":"string","description":"Exact updated_at from list_finance_records."},"merchant":{"type":"string","description":"Merchant name that identifies the tracked bill. It cannot be renamed later."},"status":{"type":"string","enum":["confirmed","dismissed"],"description":"confirmed keeps the bill. dismissed hides it."}},"required":["record_id","expected_updated_at"]},"outputSchema":{"type":"object","properties":{"kind":{"type":"string"},"record":{"type":"object"}},"required":["kind","record"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_tasks","title":"List tasks","description":"List the user's tasks, soonest first. Use this before any update so you have real task ids — every other task tool needs one. Returns lines tagged [task:id] with permanent task_number references shown as #123 in the app. For a specific number, use find_task_by_number; numbers are not UUIDs.","inputSchema":{"type":"object","properties":{"include_done":{"type":"boolean","description":"Include completed tasks. Default false."},"due_within_days":{"type":"number","description":"Only tasks due within this many days (0 = today and overdue). Omit for all."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"tasks":{"type":"array","items":{"type":"object","properties":{"task_number":{"type":["number","null"]},"id":{"type":"string"},"title":{"type":"string"},"due":{"type":["string","null"]},"due_time":{"type":["string","null"]},"priority":{"type":"string"},"done":{"type":"boolean"},"domain":{"type":["string","null"]},"project":{"type":["string","null"]}},"required":["id","title","done"]}},"total":{"type":"number"},"truncated":{"type":"boolean"}},"required":["tasks"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"find_task_by_number","title":"Find task by number","description":"Find a task by the permanent short number shown in the app (for example #123). Searches ordinary tasks, including completed tasks, and project board cards if projects:read is granted. Returns the exact UUID and [task:id] or [ptask:id] tag to use for updates. Use this when the user references a task number missing from your snapshot; never use the short number as a UUID.","inputSchema":{"type":"object","properties":{"task_number":{"type":"integer","minimum":1,"description":"The numeric part of #123: 123."},"include_project_tasks":{"type":"boolean","description":"Also search project board cards when projects:read is granted. Default true."}},"required":["task_number"]},"outputSchema":{"type":"object","properties":{"task":{"type":["object","null"],"properties":{"id":{"type":"string"},"task_number":{"type":"number"},"entity_type":{"type":"string"},"title":{"type":"string"},"project_id":{"type":["string","null"]},"done":{"type":"boolean"}},"required":["id","task_number","entity_type","title"]}},"required":["task"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_projects","title":"List projects","description":"List projects with their status. Use to find the exact project NAME before linking a task to one.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pct":{"type":["number","null"]},"open_count":{"type":["number","null"]},"due":{"type":["string","null"]},"archived":{"type":"boolean"}},"required":["id","name"]}}},"required":["projects"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"search_notes","title":"Search notes","description":"Full-text search across the user's library notes — title, body, and the text inside files attached to them (PDF, Word, spreadsheets). Use when you need something they wrote or filed rather than a task title. A hit inside a file names it as [file:id]; read_attachment returns its text.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Word or phrase, case-insensitive."}},"required":["query"]},"outputSchema":{"type":"object","properties":{"notes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"snippet":{"type":"string"},"file_id":{"type":"string"},"file_name":{"type":"string"}},"required":["id","title"]}}},"required":["notes"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"changes_since","title":"Changes since","description":"What changed in the account since a timestamp. Returns an opaque `cursor` to pass on the next call. This is how you stay current cheaply: poll with the cursor instead of re-listing everything. Call with no cursor to get one for now.","inputSchema":{"type":"object","properties":{"cursor":{"type":"string","description":"The cursor from your previous call. Omit on the first call to just receive a starting cursor without a diff."}}},"outputSchema":{"type":"object","properties":{"cursor":{"type":"string"},"changes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"},"trashed":{"type":"boolean"}},"required":["type","id","title","trashed"]}}},"required":["cursor","changes"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_task","title":"Create task","description":"Create an ordinary task on the task list. This writes immediately to the real account — no approval step — so only create what the user actually asked for. Tasks CANNOT belong to a project: work that belongs to a project is a board card, so use create_project_task for that instead.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"The task title."},"due":{"type":"string","description":"Either one of Today, Tonight, Tomorrow, This wk, Next wk, Mon, Tue, Wed, Thu, Fri, Sat, Sun, Someday, TBD (kept relative and re-read daily), or an ISO date like 2026-08-28, which is converted to the label Axis stores."},"due_time":{"type":"string","description":"Clock time for the task, when the user names one. Either 24h 'HH:MM' (e.g. 14:30) or 'H:MM AM/PM' (e.g. 2:30 PM). Stored in the app's 'H:MM AM/PM' form. Empty string clears the time."},"priority":{"type":"string","enum":["High","Medium","Low"]},"domain":{"type":"string","description":"Domain key from list_domains, for example work."},"notes":{"type":"string","description":"Longer detail for the task body."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}},"required":["title"]},"outputSchema":{"type":"object","properties":{"task":{"type":"object","properties":{"task_number":{"type":["number","null"]},"id":{"type":"string"},"title":{"type":"string"},"due":{"type":["string","null"]},"due_time":{"type":["string","null"]},"priority":{"type":"string"},"done":{"type":"boolean"},"domain":{"type":["string","null"]},"project":{"type":["string","null"]}},"required":["id","title","done"]}},"required":["task"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_task","title":"Update task","description":"Change fields on an existing task. Only send the fields you are changing. Get the id from list_tasks. To MOVE a task to another day, set `due` AND send week_day as \"\" — a pinned weekday outranks the due label, so changing due alone leaves the task exactly where it was.","inputSchema":{"type":"object","properties":{"task_id":{"type":"string","description":"From a [task:id] tag."},"title":{"type":"string","description":"Title."},"due":{"type":"string","description":"Either one of Today, Tonight, Tomorrow, This wk, Next wk, Mon, Tue, Wed, Thu, Fri, Sat, Sun, Someday, TBD (kept relative and re-read daily), or an ISO date like 2026-08-28, which is converted to the label Axis stores."},"due_time":{"type":"string","description":"Clock time on the task. Either 24h 'HH:MM' (e.g. 14:30) or 'H:MM AM/PM' (e.g. 2:30 PM). Stored in the app's 'H:MM AM/PM' form. Empty string clears the time."},"week_day":{"type":"string","enum":["Mon","Tue","Wed","Thu","Fri","Sat","Sun",""],"description":"Pin the task to a weekday column, or \"\" to unpin it. Placement reads this FIRST and the due label second."},"priority":{"type":"string","enum":["High","Medium","Low"]},"domain":{"type":"string","description":"Domain key, e.g. 'work'. \"\" clears it."},"notes":{"type":"string","description":"Free-text notes."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}},"required":["task_id"]},"outputSchema":{"type":"object","properties":{"task":{"type":"object","properties":{"task_number":{"type":["number","null"]},"id":{"type":"string"},"title":{"type":"string"},"due":{"type":["string","null"]},"due_time":{"type":["string","null"]},"priority":{"type":"string"},"done":{"type":"boolean"},"domain":{"type":["string","null"]},"project":{"type":["string","null"]}},"required":["id","title","done"]}},"required":["task"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"complete_task","title":"Complete task","description":"Mark a task done, or reopen it with done set to false. Marking it done sets completed_at to the current time. Reopening clears completed_at. The journal reads completed_at.","inputSchema":{"type":"object","properties":{"task_id":{"type":"string","description":"From a [task:id] tag."},"done":{"type":"boolean","description":"Default true."}},"required":["task_id"]},"outputSchema":{"type":"object","properties":{"task":{"type":"object","properties":{"task_number":{"type":["number","null"]},"id":{"type":"string"},"title":{"type":"string"},"due":{"type":["string","null"]},"due_time":{"type":["string","null"]},"priority":{"type":"string"},"done":{"type":"boolean"},"domain":{"type":["string","null"]},"project":{"type":["string","null"]}},"required":["id","title","done"]}},"required":["task"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_note","title":"Create note","description":"Save a page to the user's Library — research, a summary, meeting notes, anything worth keeping. Body is Markdown; link another page with [Title](/library/<id>). A pipe table is drawn as a table, and a fenced ```chart block holding one JSON object is drawn as a chart: {\"chart\": \"bar\", \"title\": \"…\", \"labels\": [\"Jan\", \"Feb\"], \"series\": [{\"name\": \"Revenue\", \"data\": [1200, 1500]}]} — kinds bar, line, area, pie, donut, scatter, radar (options: \"stacked\", \"horizontal\", \"unit\"), or \"stat\" / \"progress\" with \"items\": [{\"label\": \"…\", \"value\": 12}]. add_chart builds one from plain arguments. A fenced ```map block holding one JSON object is drawn as a map of places, joined in visiting order: {\"map\": \"Saturday in Paris\", \"stops\": [{\"name\": \"Musée du Louvre\", \"time\": \"10:00\", \"where\": \"Musée du Louvre, Paris\"}]}. add_map builds one. Put it inside another page with `parent_id`; when that parent is a DATABASE (get_note shows its properties), set the row's values with `properties`, keyed by property name — new select/status/tag values become options.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Title."},"body":{"type":"string","description":"Markdown. Pipe tables and ```chart blocks are drawn."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."},"parent_id":{"type":"string","description":"A page or database to put this page inside (from a [library:id] tag)."},"icon":{"type":"string","description":"One emoji shown beside the title."},"cover":{"type":"string","enum":["dawn","ocean","forest","sunset","indigo","graphite","sand","mint","aurora","paper","none"],"description":"A built-in gradient cover."},"pinned":{"type":"boolean","description":"Hold it at the top of the Notes list."},"properties":{"type":"object","description":"Row values when parent_id is a database, e.g. {\"Status\": \"In progress\", \"Due\": \"2026-10-20\", \"Attendees\": [\"Dana\", \"Omar\"]}.","additionalProperties":true}},"required":["title"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]}},"required":["note"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"delete_task","title":"Delete task","description":"Move a task to Trash (soft delete — the user can restore it).","inputSchema":{"type":"object","properties":{"task_id":{"type":"string","description":"From a [task:id] tag."}},"required":["task_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_project","title":"Create project","description":"Create a project. The name must be unique in the account, because tasks link to a project by that exact name. Board cards are separate and are added with create_project_task. domain is a key from list_domains.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Project name. Must be unique in the account."},"domain":{"type":"string","description":"Domain key from list_domains, for example work."},"description":{"type":"string","description":"Optional longer description."},"due":{"type":"string","description":"Free-form target label shown on the project."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pct":{"type":["number","null"]},"open_count":{"type":["number","null"]},"due":{"type":["string","null"]},"archived":{"type":"boolean"}},"required":["id","name"]}},"required":["project"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_project","title":"Update project","description":"Change fields on a project. Only send what you are changing. `archived` true/false archives or restores it.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"From a [project:id] tag."},"name":{"type":"string","description":"Name."},"description":{"type":"string","description":"Longer description."},"due":{"type":"string","description":"When it is due."},"archived":{"type":"boolean","description":"Whether the record is archived."}},"required":["project_id"]},"outputSchema":{"type":"object","properties":{"project":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pct":{"type":["number","null"]},"open_count":{"type":["number","null"]},"due":{"type":["string","null"]},"archived":{"type":"boolean"}},"required":["id","name"]}},"required":["project"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_project","title":"Delete project","description":"Move a project to Trash (soft delete). Its tasks are NOT deleted — they just lose the link when the project is gone for good.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id from list_projects."}},"required":["project_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"update_note","title":"Update note","description":"Change a Library page. Prefer small edits: `replace` swaps exact passages ({find, replace}) and `append` adds to the end, both leaving the rest of what the user wrote alone; `body` replaces everything. A pipe table is drawn as a table, and a fenced ```chart block holding one JSON object is drawn as a chart: {\"chart\": \"bar\", \"title\": \"…\", \"labels\": [\"Jan\", \"Feb\"], \"series\": [{\"name\": \"Revenue\", \"data\": [1200, 1500]}]} — kinds bar, line, area, pie, donut, scatter, radar (options: \"stacked\", \"horizontal\", \"unit\"), or \"stat\" / \"progress\" with \"items\": [{\"label\": \"…\", \"value\": 12}]. add_chart builds one from plain arguments. A fenced ```map block holding one JSON object is drawn as a map of places, joined in visiting order: {\"map\": \"Saturday in Paris\", \"stops\": [{\"name\": \"Musée du Louvre\", \"time\": \"10:00\", \"where\": \"Musée du Louvre, Paris\"}]}. add_map builds one. Also sets the icon, cover, tags, pin, archive, moves the page (`parent_id`, \"\" for the top level) and sets database row values (`properties`, by name; null clears one). The user may be typing in the same page: `replace` and `append` are applied to the page as it is at that moment, so they never erase what was just typed; with `body`, pass `expected_updated_at` from get_note so a rewrite is refused if the page changed meanwhile. When you are unsure whether a change is wanted, leave a comment with add_comment instead.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"From a [library:id] tag."},"title":{"type":"string","description":"Title."},"body":{"type":"string","description":"Replaces the whole body. Markdown."},"append":{"type":"string","description":"Appended to the body on a blank line. Markdown."},"replace":{"type":"array","description":"Exact-text edits, applied in order. Each `find` must occur once (or pass all: true).","items":{"type":"object","properties":{"find":{"type":"string","description":"find"},"replace":{"type":"string","description":"replace"},"all":{"type":"boolean","description":"all"}},"required":["find","replace"]}},"tags":{"type":"array","items":{"type":"string"},"description":"Replaces the tag list."},"icon":{"type":"string","description":"One emoji; \"\" removes it."},"cover":{"type":"string","enum":["dawn","ocean","forest","sunset","indigo","graphite","sand","mint","aurora","paper","none"]},"pinned":{"type":"boolean","description":"pinned"},"archived":{"type":"boolean","description":"Archived pages leave the Notes list but stay searchable."},"parent_id":{"type":"string","description":"Move inside this page or database; \"\" moves it to the top level."},"properties":{"type":"object","additionalProperties":true,"description":"Database row values by property name; null clears one."},"expected_updated_at":{"type":"string","description":"The page's updated_at as you last read it (get_note). The change is refused if the page has been edited since — use it with `body`."}},"required":["note_id"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]}},"required":["note"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"add_chart","title":"Add chart","description":"Draw a chart inside a Library page — the dependable way to add one: the arguments are checked, and the chart is placed without touching anything else the user wrote. Plotted kinds (bar, line, area, pie, donut, scatter, radar) take `labels` plus `series`, with one value per label in every series; `stat` (headline numbers) and `progress` (bars toward a target) take `items`. It goes at the end of the page, or right after the text you give in `after`. To refresh a chart that is already there, pass its title as `replace_title` and it is redrawn in place instead of added twice. Chart real numbers — ones you read from Axis or were given — never invented ones.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"From a [library:id] tag."},"chart":{"type":"string","enum":["bar","line","area","pie","donut","scatter","radar","stat","progress"],"description":"The kind of chart."},"title":{"type":"string","description":"What the chart shows. Also how replace_title finds it later."},"labels":{"type":"array","items":{"type":"string"},"description":"Plotted kinds: the names along the axis (or the slices of a pie). For scatter, the x values."},"series":{"type":"array","description":"Plotted kinds: up to 8 series, each with one number per label (null leaves a gap). A pie or donut takes exactly one.","items":{"type":"object","properties":{"name":{"type":"string","description":"Name."},"data":{"type":"array","items":{"type":["number","null"]},"description":"data"}},"required":["name","data"]}},"items":{"type":"array","description":"stat / progress: up to 12 figures. stat: {label, value, delta?} where delta is the percent change. progress: {label, value, max?} where max defaults to 100.","items":{"type":"object","properties":{"label":{"type":"string","description":"Display label."},"value":{"type":["number","string"],"description":"Value."},"delta":{"type":"number","description":"delta"},"max":{"type":"number","description":"max"},"note":{"type":"string","description":"note"}},"required":["label","value"]}},"unit":{"type":"string","description":"Shown with every value: \"$\", \"%\", \"lbs\". A currency sign leads the number."},"stacked":{"type":"boolean","description":"bar / area: stack the series instead of setting them side by side."},"horizontal":{"type":"boolean","description":"bar: lay the bars out sideways — better for long labels."},"note":{"type":"string","description":"A caption under the chart: the source, the period, a caveat."},"x_label":{"type":"string","description":"x label"},"y_label":{"type":"string","description":"y label"},"after":{"type":"string","description":"Exact text already on the page (a heading, a sentence); the chart goes right after that block. Omit to add it at the end."},"replace_title":{"type":"string","description":"Title of a chart already on the page to redraw in place."}},"required":["note_id","chart"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]}},"required":["note"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"add_map","title":"Add map","description":"Put a map of places into a Library page — a day of a trip, a run of deliveries, places to try. The stops go on a Google map in the order given, joined by a walking or driving line, with the plan listed under it: time, place, a note, and a link that opens each stop (and directions through all of them) in Google Maps. Give every stop a `name` and a `where` that Google can search for — \"Musée du Louvre, Paris\" finds the place, \"the museum\" does not. It goes at the end of the page, or right after the text in `after`. To change a map that is already there, pass its title as `replace_title` and it is redrawn in place instead of added twice. Only real places: ones the user named, or ones you are sure exist where you say they are.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"From a [library:id] tag."},"title":{"type":"string","description":"What the map is: \"Saturday in Paris\". Also how replace_title finds it later."},"stops":{"type":"array","description":"The places, in the order they are visited — at most 25.","items":{"type":"object","properties":{"name":{"type":"string","description":"What the stop is called on the page: \"Lunch in Le Marais\"."},"where":{"type":"string","description":"What to search Google Maps for: a place name with its city, or an address."},"time":{"type":"string","description":"When: \"10:00\", \"2pm\", \"Evening\". Optional."},"note":{"type":"string","description":"One line: a reservation, what to order, a reminder. Optional."}},"required":["name"]}},"route":{"type":"string","enum":["walk","drive","none"],"description":"How the stops are joined on the map: walk (the default), drive, or none."},"note":{"type":"string","description":"A caption under the map. Optional."},"after":{"type":"string","description":"Exact text already on the page (a heading, a sentence); the map goes right after that block. Omit to add it at the end."},"replace_title":{"type":"string","description":"Title of a map already on the page to redraw in place."}},"required":["note_id","stops"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]}},"required":["note"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"delete_note","title":"Delete note","description":"Move a Library page to Trash (soft delete), together with every page inside it — a database goes with its rows.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"Library page id."}},"required":["note_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"get_note","title":"Get note","description":"Read one Library page in full: its Markdown body (charts appear as ```chart blocks, tables as pipe tables), icon, where it sits (parent and path), the pages inside it, pages that link to it, its property values when it is a database row, and the schema + saved views when it IS a database. Read a page before editing it.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"From a [library:id] tag."}},"required":["note_id"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"cover":{"type":["string","null"]},"body":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"parent":{"type":["object","null"],"properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]},"path":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]}},"is_database":{"type":"boolean"},"properties":{"type":"object"},"database":{"type":["object","null"],"properties":{"properties":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"string"}}},"required":["name","type"]}},"views":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"layout":{"type":"string"},"group_by":{"type":["string","null"]}},"required":["name","layout"]}}},"required":["properties","views"]},"children":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]}},"backlinks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]}},"open_comments":{"type":"number"},"files":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"note_id":{"type":"string"},"name":{"type":"string"},"mime":{"type":"string"},"size":{"type":"number"},"readable":{"type":"boolean"},"text_status":{"type":"string"},"truncated":{"type":"boolean"}},"required":["id","name"]}},"created_at":{"type":["string","null"]},"updated_at":{"type":["string","null"]}},"required":["id","title","body"]}},"required":["note"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"read_attachment","title":"Read attachment","description":"Read the text inside a file attached to a Library page — a PDF, Word document or spreadsheet the user dropped on it. Ids come from the [file:id] tags in get_note (or a search_notes hit). Long documents come back in parts: pass the `next_offset` you were given to read on. Scans and images have no text.","inputSchema":{"type":"object","properties":{"attachment_id":{"type":"string","description":"From a [file:id] tag."},"offset":{"type":"number","description":"Character to start from. Default 0."},"max_chars":{"type":"number","description":"Default 12000, max 40000."}},"required":["attachment_id"]},"outputSchema":{"type":"object","properties":{"file":{"type":"object","properties":{"id":{"type":"string"},"note_id":{"type":"string"},"name":{"type":"string"},"mime":{"type":"string"},"size":{"type":"number"},"readable":{"type":"boolean"},"text_status":{"type":"string"},"truncated":{"type":"boolean"}},"required":["id","name"]},"text":{"type":"string"},"offset":{"type":"number"},"next_offset":{"type":["number","null"]},"total_chars":{"type":"number"}},"required":["file","text"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_notes","title":"List notes","description":"Browse the Library as a tree. With no parent_id: every page and database, newest first (database rows are left out — query_database reads those). parent_id \"root\" lists the top level; a page id lists what is inside it. Narrow by tag, pinned, kind, or a title query.","inputSchema":{"type":"object","properties":{"parent_id":{"type":"string","description":"\"root\" for the top level, or a page id."},"query":{"type":"string","description":"Words in the title."},"tag":{"type":"string","description":"tag"},"pinned":{"type":"boolean","description":"pinned"},"kind":{"type":"string","enum":["Note","Voice","Quote","Journal"]},"databases_only":{"type":"boolean","description":"databases only"},"include_archived":{"type":"boolean","description":"include archived"},"limit":{"type":"number","description":"Default 50, max 200."}}},"outputSchema":{"type":"object","properties":{"notes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]}}},"required":["notes"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"query_database","title":"Query database","description":"Read a database's rows with their property values. Filter ({property, op, value} — ops: is, is_not, contains, not_contains, empty, not_empty, gt, lt, before, after, checked, unchecked), sort ({property, direction}), or run one of its saved views by name. Property names come from get_note; \"Name\", \"Tags\", \"Created\" and \"Last edited\" always work.","inputSchema":{"type":"object","properties":{"database_id":{"type":"string","description":"The database page id."},"view":{"type":"string","description":"A saved view to run, by name."},"filters":{"type":"array","items":{"type":"object","properties":{"property":{"type":"string","description":"property"},"op":{"type":"string","description":"op"},"value":{"description":"Value."}},"required":["property","op"]},"description":"Extra filters, as the database tool describes them."},"sorts":{"type":"array","items":{"type":"object","properties":{"property":{"type":"string","description":"property"},"direction":{"type":"string","enum":["asc","desc"]}},"required":["property"]},"description":"Sorts, as the database tool describes them."},"query":{"type":"string","description":"Words in the row title."},"limit":{"type":"number","description":"Default 50, max 500."}},"required":["database_id"]},"outputSchema":{"type":"object","properties":{"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"icon":{"type":["string","null"]},"properties":{"type":"object"},"tags":{"type":"array","items":{"type":"string"}},"updated_at":{"type":["string","null"]}},"required":["id","title"]}},"total":{"type":"number"},"matched":{"type":"number"},"database":{"type":"object","properties":{"properties":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"string"}}},"required":["name","type"]}},"views":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"layout":{"type":"string"},"group_by":{"type":["string","null"]}},"required":["name","layout"]}}},"required":["properties","views"]}},"required":["rows","total","matched"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_database","title":"Create database","description":"Make a database: a page whose rows are pages with typed properties, shown as table / board / gallery / list / calendar views. Start from a template (tracker, reading, meetings, crm, content, blank) and/or declare properties. Types: text, number, select, multi_select, status, date, checkbox, url. Add rows with create_note and parent_id set to this database.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Title."},"template":{"type":"string","enum":["blank","tracker","reading","meetings","crm","content"]},"properties":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name."},"type":{"type":"string","enum":["text","number","select","multi_select","status","date","checkbox","url"]},"options":{"type":"array","items":{"type":"string"},"description":"Option names for a select property."}},"required":["name","type"]},"description":"Properties to declare."},"parent_id":{"type":"string","description":"Put the database inside this page."},"icon":{"type":"string","description":"Emoji or short icon."},"description":{"type":"string","description":"Markdown shown above the views."}},"required":["title"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]},"database":{"type":"object","properties":{"properties":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"string"}}},"required":["name","type"]}},"views":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"layout":{"type":"string"},"group_by":{"type":["string","null"]}},"required":["name","layout"]}}},"required":["properties","views"]}},"required":["note","database"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_database","title":"Update database","description":"Reshape a database: rename it, add / rename / remove properties, add select options, and add or remove saved views (with their filters, sorts and grouping). Removing a property drops it from every view.","inputSchema":{"type":"object","properties":{"database_id":{"type":"string","description":"database id"},"title":{"type":"string","description":"Title."},"icon":{"type":"string","description":"Emoji or short icon."},"add_properties":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name."},"type":{"type":"string","enum":["text","number","select","multi_select","status","date","checkbox","url"]},"options":{"type":"array","items":{"type":"string"},"description":"Option names for a select property."}},"required":["name","type"]},"description":"add properties"},"rename_properties":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","description":"Window start, YYYY-MM-DD."},"to":{"type":"string","description":"Window end, YYYY-MM-DD."}},"required":["from","to"]},"description":"rename properties"},"remove_properties":{"type":"array","items":{"type":"string"},"description":"remove properties"},"add_options":{"type":"array","items":{"type":"object","properties":{"property":{"type":"string","description":"property"},"options":{"type":"array","items":{"type":"string"},"description":"Option names for a select property."}},"required":["property","options"]},"description":"add options"},"add_view":{"type":"object","properties":{"name":{"type":"string","description":"Name."},"layout":{"type":"string","enum":["table","board","gallery","list","calendar"]},"group_by":{"type":"string","description":"A select/status property (boards)."},"date_property":{"type":"string","description":"A date property (calendars)."},"filters":{"type":"array","items":{"type":"object"},"description":"Extra filters, as the database tool describes them."},"sorts":{"type":"array","items":{"type":"object"},"description":"Sorts, as the database tool describes them."}},"required":["layout"],"description":"add view"},"remove_view":{"type":"string","description":"A view name."}},"required":["database_id"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]},"database":{"type":"object","properties":{"properties":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"string"}}},"required":["name","type"]}},"views":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"layout":{"type":"string"},"group_by":{"type":["string","null"]}},"required":["name","layout"]}}},"required":["properties","views"]}},"required":["note","database"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"duplicate_note","title":"Duplicate note","description":"Copy a page next to the original. By default only the page itself is copied — for a database, its schema and views with no rows. Pass include_contents: true to copy what is inside too: a database's rows with their values, a page's sub-pages (up to 300 pages). Comments and attached files are not copied.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"Library page id."},"title":{"type":"string","description":"Defaults to \"<title> (copy)\"."},"include_contents":{"type":"boolean","description":"Also copy the pages / rows inside. Default false."}},"required":["note_id"]},"outputSchema":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"kind":{"type":"string"},"icon":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"is_database":{"type":"boolean"},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"updated_at":{"type":["string","null"]}},"required":["id","title"]},"copied_inside":{"type":"number"}},"required":["note"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"add_comment","title":"Add comment","description":"Leave a comment on a Library page, signed with your name — for a question, a suggestion, or a change you want the user to confirm before you make it. The user replies in the app; read replies with list_comments or changes_since. Reply to a thread with reply_to.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"Library page id."},"body":{"type":"string","description":"Plain text, up to 8000 characters."},"reply_to":{"type":"string","description":"A comment id, to answer inside its thread."}},"required":["note_id","body"]},"outputSchema":{"type":"object","properties":{"comment":{"type":"object","properties":{"id":{"type":"string"},"note_id":{"type":"string"},"note_title":{"type":["string","null"]},"reply_to":{"type":["string","null"]},"author":{"type":"string"},"author_kind":{"type":"string"},"body":{"type":"string"},"resolved":{"type":"boolean"},"created_at":{"type":"string"}},"required":["id","note_id","body"]}},"required":["comment"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"list_comments","title":"List comments","description":"Comments on Library pages: yours, and comments left through a connection. Pass note_id for one page. Omit note_id to list open threads on every page. Resolved threads are omitted unless include_resolved is true.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"Library page id."},"include_resolved":{"type":"boolean","description":"When true, include comments that are already resolved."},"since":{"type":"string","description":"ISO timestamp; only comments after it."},"limit":{"type":"number","description":"Default 100, max 500."}}},"outputSchema":{"type":"object","properties":{"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"note_id":{"type":"string"},"note_title":{"type":["string","null"]},"reply_to":{"type":["string","null"]},"author":{"type":"string"},"author_kind":{"type":"string"},"body":{"type":"string"},"resolved":{"type":"boolean"},"created_at":{"type":"string"}},"required":["id","note_id","body"]}}},"required":["comments"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"resolve_comment","title":"Resolve comment","description":"Mark a comment thread resolved (or reopen it with resolved: false) — e.g. after making the change it asked for.","inputSchema":{"type":"object","properties":{"comment_id":{"type":"string","description":"comment id"},"resolved":{"type":"boolean","description":"Default true."}},"required":["comment_id"]},"outputSchema":{"type":"object","properties":{"comment":{"type":"object","properties":{"id":{"type":"string"},"note_id":{"type":"string"},"note_title":{"type":["string","null"]},"reply_to":{"type":["string","null"]},"author":{"type":"string"},"author_kind":{"type":"string"},"body":{"type":"string"},"resolved":{"type":"boolean"},"created_at":{"type":"string"}},"required":["id","note_id","body"]}},"required":["comment"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_events","title":"List events","description":"Axis and connected Google Calendar events in a date window. Reads the calendars selected in Axis Settings. Google events are expanded occurrences, marked source=google and read_only=true; use html_link to edit in Google. Axis repeating events return definitions (expand recurrence fields yourself). Check google_status: unavailable/not_connected/partial means this is not a complete agenda. Dates use a UTC window; Google start/end preserve offsets.","inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"YYYY-MM-DD window start. Defaults to the account's local date."},"days":{"type":"number","description":"Window length in days. Default 14, cap 60."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"date":{"type":"string"},"end_date":{"type":["string","null"]},"all_day":{"type":"boolean"},"source":{"type":"string"},"read_only":{"type":"boolean"},"start":{"type":"string"},"end":{"type":["string","null"]},"description":{"type":["string","null"]},"html_link":{"type":["string","null"]},"calendar_id":{"type":"string"},"calendar_name":{"type":["string","null"]},"calendar_domain":{"type":["string","null"]},"series_id":{"type":"string"},"start_time":{"type":["string","null"]},"end_time":{"type":["string","null"]},"location":{"type":["string","null"]},"repeats":{"type":["object","null"]}},"required":["id","title","date"]}},"from":{"type":"string"},"to":{"type":"string"},"google_status":{"type":"string"}},"required":["events","google_status"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_event","title":"Create event","description":"Create a calendar event on a specific date. Repeating events cannot be created here — make the single occurrence and the user can set the repeat in the app.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Title."},"date":{"type":"string","description":"YYYY-MM-DD."},"end_date":{"type":"string","description":"YYYY-MM-DD for multi-day events."},"all_day":{"type":"boolean","description":"Default false."},"start_time":{"type":"string","description":"Either 24h 'HH:MM' (e.g. 14:30) or 'H:MM AM/PM' (e.g. 2:30 PM). Stored in the app's 'H:MM AM/PM' form. Empty string clears the time."},"end_time":{"type":"string","description":"Either 24h 'HH:MM' (e.g. 14:30) or 'H:MM AM/PM' (e.g. 2:30 PM). Stored in the app's 'H:MM AM/PM' form. Empty string clears the time."},"location":{"type":"string","description":"Where it is."},"notes":{"type":"string","description":"Free-text notes."},"domain":{"type":"string","description":"Domain key, e.g. 'work'."}},"required":["title","date"]},"outputSchema":{"type":"object","properties":{"event":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"date":{"type":"string"},"end_date":{"type":["string","null"]},"all_day":{"type":"boolean"},"source":{"type":"string"},"read_only":{"type":"boolean"},"start":{"type":"string"},"end":{"type":["string","null"]},"description":{"type":["string","null"]},"html_link":{"type":["string","null"]},"calendar_id":{"type":"string"},"calendar_name":{"type":["string","null"]},"calendar_domain":{"type":["string","null"]},"series_id":{"type":"string"},"start_time":{"type":["string","null"]},"end_time":{"type":["string","null"]},"location":{"type":["string","null"]},"repeats":{"type":["object","null"]}},"required":["id","title","date"]}},"required":["event"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_event","title":"Update event","description":"Change fields on a calendar event. Only send what you are changing; \"\" clears end_date or a time.","inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"From an [event:id] tag."},"title":{"type":"string","description":"Title."},"date":{"type":"string","description":"YYYY-MM-DD."},"end_date":{"type":"string","description":"YYYY-MM-DD, or \"\" to clear."},"all_day":{"type":"boolean","description":"True for an all-day event."},"start_time":{"type":"string","description":"Either 24h 'HH:MM' (e.g. 14:30) or 'H:MM AM/PM' (e.g. 2:30 PM). Stored in the app's 'H:MM AM/PM' form. Empty string clears the time."},"end_time":{"type":"string","description":"Either 24h 'HH:MM' (e.g. 14:30) or 'H:MM AM/PM' (e.g. 2:30 PM). Stored in the app's 'H:MM AM/PM' form. Empty string clears the time."},"location":{"type":"string","description":"Where it is."},"notes":{"type":"string","description":"Free-text notes."},"domain":{"type":"string","description":"Domain key, e.g. 'work'. \"\" clears it."}},"required":["event_id"]},"outputSchema":{"type":"object","properties":{"event":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"date":{"type":"string"},"end_date":{"type":["string","null"]},"all_day":{"type":"boolean"},"source":{"type":"string"},"read_only":{"type":"boolean"},"start":{"type":"string"},"end":{"type":["string","null"]},"description":{"type":["string","null"]},"html_link":{"type":["string","null"]},"calendar_id":{"type":"string"},"calendar_name":{"type":["string","null"]},"calendar_domain":{"type":["string","null"]},"series_id":{"type":"string"},"start_time":{"type":["string","null"]},"end_time":{"type":["string","null"]},"location":{"type":["string","null"]},"repeats":{"type":["object","null"]}},"required":["id","title","date"]}},"required":["event"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_event","title":"Delete event","description":"Move a calendar event to Trash (soft delete). Deleting a repeating event's definition removes the whole series.","inputSchema":{"type":"object","properties":{"event_id":{"type":"string","description":"Event id from list_events."}},"required":["event_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_routines","title":"List routines","description":"The user's routines (habits) with cadence and streak state. `done` is today's checkbox for daily habits, this period's for weekly/monthly ones.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"routines":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"freq":{"type":"string"},"days":{"type":"array","items":{"type":"string"}},"streak":{"type":"number"},"done":{"type":"boolean"},"last_done":{"type":["string","null"]}},"required":["id","label","freq"]}}},"required":["routines"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"complete_routine","title":"Complete routine","description":"Check off a routine (or uncheck with done=false). Streak and history update exactly as an in-app check would. `day` defaults to the account's local date.","inputSchema":{"type":"object","properties":{"routine_id":{"type":"string","description":"From a [routine:id] tag."},"done":{"type":"boolean","description":"Default true."},"day":{"type":"string","description":"The user's local date, YYYY-MM-DD. Defaults to the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}},"required":["routine_id"]},"outputSchema":{"type":"object","properties":{"routine":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"freq":{"type":"string"},"days":{"type":"array","items":{"type":"string"}},"streak":{"type":"number"},"done":{"type":"boolean"},"last_done":{"type":["string","null"]}},"required":["id","label","freq"]}},"required":["routine"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"create_routine","title":"Create routine","description":"Create a habit on the routines list. label is required. freq is Daily, Days, Weekly, Monthly, or Yearly, and defaults to Daily. freq Days needs a days list of weekdays such as Mon, Wed, and Fri. The streak starts at 0. Check it off later with complete_routine.","inputSchema":{"type":"object","properties":{"label":{"type":"string","description":"What the habit is called."},"freq":{"type":"string","enum":["Daily","Days","Weekly","Monthly","Yearly"],"description":"Default Daily."},"days":{"type":"array","items":{"type":"string","enum":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},"description":"Which weekdays, only for freq 'Days'."}},"required":["label"]},"outputSchema":{"type":"object","properties":{"routine":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"freq":{"type":"string"},"days":{"type":"array","items":{"type":"string"}},"streak":{"type":"number"},"done":{"type":"boolean"},"last_done":{"type":["string","null"]}},"required":["id","label","freq"]}},"required":["routine"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_routine","title":"Update routine","description":"Rename a routine or change its cadence. Streaks and history are managed by complete_routine and cannot be edited directly.","inputSchema":{"type":"object","properties":{"routine_id":{"type":"string","description":"Routine id from list_routines."},"label":{"type":"string","description":"Display label."},"freq":{"type":"string","enum":["Daily","Days","Weekly","Monthly","Yearly"]},"days":{"type":"array","items":{"type":"string","enum":["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},"description":"Day count, or weekdays, depending on the tool."}},"required":["routine_id"]},"outputSchema":{"type":"object","properties":{"routine":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"freq":{"type":"string"},"days":{"type":"array","items":{"type":"string"}},"streak":{"type":"number"},"done":{"type":"boolean"},"last_done":{"type":["string","null"]}},"required":["id","label","freq"]}},"required":["routine"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_routine","title":"Delete routine","description":"Move a routine to Trash (soft delete). Its streak history goes with it.","inputSchema":{"type":"object","properties":{"routine_id":{"type":"string","description":"Routine id from list_routines."}},"required":["routine_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_goals","title":"List goals","description":"The user's goals: status, metric progress, target dates, and sub-goal structure (parent tags).","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"goals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"target_date":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"metric":{"type":["object","null"]}},"required":["id","title","status"]}}},"required":["goals"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_goal","title":"Create goal","description":"Create a goal, optionally nested under a parent goal and with a numeric metric.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Title."},"why":{"type":"string","description":"Why it matters."},"domain":{"type":"string","description":"Domain key, e.g. 'personal'."},"target_date":{"type":"string","description":"YYYY-MM-DD."},"metric_label":{"type":"string","description":"What is measured, e.g. 'Net worth'."},"metric_target":{"type":"number","description":"Target number."},"metric_current":{"type":"number","description":"Current number."},"parent_goal_id":{"type":"string","description":"From a [goal:id] tag, to nest under."}},"required":["title"]},"outputSchema":{"type":"object","properties":{"goal":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"target_date":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"metric":{"type":["object","null"]}},"required":["id","title","status"]}},"required":["goal"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_goal","title":"Update goal","description":"Change a goal. `metric_current` is the usual progress update. Setting status to 'Achieved' stamps the achieved date, the way the app does.","inputSchema":{"type":"object","properties":{"goal_id":{"type":"string","description":"From a [goal:id] tag."},"title":{"type":"string","description":"Title."},"why":{"type":"string","description":"Why this goal matters."},"status":{"type":"string","enum":["Active","Paused","Achieved","Dropped"]},"target_date":{"type":"string","description":"YYYY-MM-DD, or \"\" to clear."},"metric_label":{"type":"string","description":"What the goal number measures, such as miles or dollars."},"metric_target":{"type":"number","description":"Target number."},"metric_current":{"type":"number","description":"Current number."},"domain":{"type":"string","description":"Domain key, e.g. 'personal'. \"\" clears it."}},"required":["goal_id"]},"outputSchema":{"type":"object","properties":{"goal":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"target_date":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"metric":{"type":["object","null"]}},"required":["id","title","status"]}},"required":["goal"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_goal","title":"Delete goal","description":"Move a goal to Trash (soft delete). Sub-goals keep existing, unnested.","inputSchema":{"type":"object","properties":{"goal_id":{"type":"string","description":"Goal id from list_goals."}},"required":["goal_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_people","title":"List people","description":"The user's people list — relationships, contacts, follow-ups. `next` is the next thing to do with them; `fact` is a remembered detail.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":["string","null"]},"domain":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"birthday":{"type":["string","null"]},"next":{"type":["string","null"]},"fact":{"type":["string","null"]}},"required":["id","name"]}}},"required":["people"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_person","title":"Create person","description":"Add someone to the people list: a friend, a colleague, or anyone you follow up with. name is required. role is the relationship, next is the next step, and fact is a detail worth remembering.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Name."},"role":{"type":"string","description":"Relationship, such as friend, mentor, or dentist."},"email":{"type":"string","description":"Email address."},"phone":{"type":"string","description":"Phone number."},"birthday":{"type":"string","description":"Birthday, as a date or a short label."},"next":{"type":"string","description":"Next thing to do with them."},"fact":{"type":"string","description":"A detail worth remembering."},"notes":{"type":"string","description":"Free-text notes."},"domain":{"type":"string","description":"Domain key, e.g. 'work'."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"person":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":["string","null"]},"domain":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"birthday":{"type":["string","null"]},"next":{"type":["string","null"]},"fact":{"type":["string","null"]}},"required":["id","name"]}},"required":["person"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_person","title":"Update person","description":"Change fields on a person. Only send what you are changing.","inputSchema":{"type":"object","properties":{"person_id":{"type":"string","description":"From a [person:id] tag."},"name":{"type":"string","description":"Name."},"role":{"type":"string","description":"Relationship, such as friend or mentor."},"email":{"type":"string","description":"Email address."},"phone":{"type":"string","description":"Phone number."},"birthday":{"type":"string","description":"Birthday, as a date or a short label."},"next":{"type":"string","description":"The next thing to do with this person."},"fact":{"type":"string","description":"A detail worth remembering."},"notes":{"type":"string","description":"Free-text notes."},"domain":{"type":"string","description":"Domain key, e.g. 'work'. \"\" clears it."}},"required":["person_id"]},"outputSchema":{"type":"object","properties":{"person":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":["string","null"]},"domain":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"birthday":{"type":["string","null"]},"next":{"type":["string","null"]},"fact":{"type":["string","null"]}},"required":["id","name"]}},"required":["person"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_person","title":"Delete person","description":"Move a person to Trash. The person can be restored from Settings. This does not erase interactions already logged until the person is removed from Trash.","inputSchema":{"type":"object","properties":{"person_id":{"type":"string","description":"Person id from list_people."}},"required":["person_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"log_interaction","title":"Log interaction","description":"Record an interaction with a person (a call, a meeting, a text thread worth remembering).","inputSchema":{"type":"object","properties":{"person_id":{"type":"string","description":"From a [person:id] tag."},"text":{"type":"string","description":"What happened."},"occurred":{"type":"string","description":"YYYY-MM-DD. Defaults to the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}},"required":["person_id","text"]},"outputSchema":{"type":"object","properties":{"interaction":{"type":"object","properties":{"id":{"type":"string"},"person_id":{"type":"string"},"occurred":{"type":"string"}},"required":["id","person_id"]}},"required":["interaction"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"get_journal","title":"Get journal","description":"Read the user's journal entry for one day.","inputSchema":{"type":"object","properties":{"day":{"type":"string","description":"YYYY-MM-DD. Defaults to the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"day":{"type":"string"},"body":{"type":"string"}},"required":["day","body"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"write_journal","title":"Write journal","description":"Write to the user's journal for one day. Default APPENDS on a blank line; mode \"replace\" overwrites the whole entry — be sure before replacing.","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Text of the entry."},"day":{"type":"string","description":"YYYY-MM-DD. Defaults to the account's local date."},"mode":{"type":"string","enum":["append","replace"],"description":"Default append."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}},"required":["text"]},"outputSchema":{"type":"object","properties":{"day":{"type":"string"},"mode":{"type":"string","enum":["append","replace"]}},"required":["day","mode"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_workouts","title":"List workouts","description":"Recent logged training sessions, newest first.","inputSchema":{"type":"object","properties":{"days":{"type":"number","description":"How far back. Default 30, cap 365. Counted from the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"workouts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"name":{"type":"string"},"duration_min":{"type":["number","null"]},"feeling":{"type":["string","null"]},"exercise_count":{"type":"number"},"set_count":{"type":"number"}},"required":["id","date","name"]}}},"required":["workouts"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"log_workout","title":"Log workout","description":"Log a completed training session. Each exercise carries its performed sets; use weight 0 for bodyweight movements, or distance_km/duration_min for cardio.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Session name, e.g. 'Push day'."},"date":{"type":"string","description":"YYYY-MM-DD. Defaults to the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."},"duration_min":{"type":"number","description":"Duration in minutes."},"feeling":{"type":"string","enum":["Great","Good","Okay","Tired","Sore"]},"notes":{"type":"string","description":"Free-text notes."},"exercises":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Name."},"sets":{"type":"array","items":{"type":"object","properties":{"weight":{"type":"number","description":"lb; 0 for bodyweight."},"reps":{"type":"number","description":"reps"},"rpe":{"type":"number","description":"rpe"},"distance_km":{"type":"number","description":"Distance in kilometers."},"duration_min":{"type":"number","description":"Duration in minutes."}}},"description":"sets"}},"required":["name","sets"]},"description":"Exercises performed in the session."}},"required":["name","exercises"]},"outputSchema":{"type":"object","properties":{"workout":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"name":{"type":"string"},"duration_min":{"type":["number","null"]},"feeling":{"type":["string","null"]},"exercise_count":{"type":"number"},"set_count":{"type":"number"}},"required":["id","date","name"]}},"required":["workout"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"list_metrics","title":"List metrics","description":"Dated body/health measurements ('Weight', 'Calories', 'Steps', 'Sleep', 'Water', 'Body Fat %', 'Resting HR'), newest first.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","description":"Filter to one kind, e.g. 'Weight'. Omit for all."},"days":{"type":"number","description":"How far back. Default 90, cap 365. Counted from the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"metrics":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"kind":{"type":"string"},"value":{"type":"number"},"unit":{"type":["string","null"]}},"required":["id","date","kind","value"]}}},"required":["metrics"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"log_metric","title":"Log metric","description":"Record one dated measurement. kind defaults to 'Weight'; nutrition tracking uses kind 'Calories' (kcal for the day).","inputSchema":{"type":"object","properties":{"value":{"type":"number","description":"Value."},"kind":{"type":"string","description":"e.g. 'Weight', 'Calories', 'Steps', 'Sleep', 'Water', 'Body Fat %', 'Resting HR'. Default 'Weight'."},"unit":{"type":"string","description":"Display unit, e.g. 'lb', 'kcal'."},"date":{"type":"string","description":"YYYY-MM-DD. Defaults to the account's local date."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}},"required":["value"]},"outputSchema":{"type":"object","properties":{"metric":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"kind":{"type":"string"},"value":{"type":"number"},"unit":{"type":["string","null"]}},"required":["id","date","kind","value"]}},"required":["metric"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"list_accounts","title":"List accounts","description":"Financial accounts with current balances (bank-linked and manual), plus the latest net-worth snapshot. A paused account is kept for history and excluded from net worth. Use list_finance_records for editable fields and revisions.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"accounts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"mask":{"type":["string","null"]},"type":{"type":"string"},"balance":{"type":["number","null"]},"available":{"type":["number","null"]},"currency":{"type":"string"},"source":{"type":"string","enum":["bank","manual"]},"paused":{"type":"boolean"}},"required":["id","name","source"]}},"net_worth":{"type":["object","null"]}},"required":["accounts"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_transactions","title":"List transactions","description":"Recent transactions across all accounts, newest first. Positive amounts are money out. Negative amounts are money in.","inputSchema":{"type":"object","properties":{"days":{"type":"number","description":"How far back. Default 30, cap 365. Counted from the account's local date."},"query":{"type":"string","description":"Substring match on merchant or description."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"name":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string"},"category":{"type":["string","null"]},"pending":{"type":"boolean"}},"required":["date","name","amount"]}}},"required":["transactions"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_dates","title":"List dates","description":"Places the user has been on a date, and the wishlist of places they want to go. Use `wishlist: true` for ideas rather than history. Returns lines tagged [date:id].","inputSchema":{"type":"object","properties":{"wishlist":{"type":"boolean","description":"true = only the wishlist; false = only visited."},"category":{"type":"string","description":"Only this category."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"dates":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"place":{"type":"string"},"location":{"type":["string","null"]},"date":{"type":["string","null"]},"category":{"type":["string","null"]},"rating":{"type":"number"},"revisit":{"type":"boolean"},"review":{"type":["string","null"]},"wishlist":{"type":"boolean"}},"required":["id","place"]}},"total":{"type":"number"}},"required":["dates"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_date","title":"Create date","description":"Log a date, or add a place to the wishlist with `wishlist: true`. `place` is the only required field.","inputSchema":{"type":"object","properties":{"place":{"type":"string","description":"The place. Required."},"location":{"type":"string","description":"City or neighbourhood."},"address":{"type":"string","description":"Street address."},"date":{"type":"string","description":"YYYY-MM-DD, when they went."},"category":{"type":"string","description":"e.g. Dinner, Coffee, Outdoors."},"rating":{"type":"number","description":"0-5."},"revisit":{"type":"boolean","description":"Worth going back."},"review":{"type":"string","description":"Notes about the visit."},"wishlist":{"type":"boolean","description":"true = want to go, not yet been."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["place"]},"outputSchema":{"type":"object","properties":{"date":{"type":"object","properties":{"id":{"type":"string"},"place":{"type":"string"},"location":{"type":["string","null"]},"date":{"type":["string","null"]},"category":{"type":["string","null"]},"rating":{"type":"number"},"revisit":{"type":"boolean"},"review":{"type":["string","null"]},"wishlist":{"type":"boolean"}},"required":["id","place"]}},"required":["date"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_date","title":"Update date","description":"Update one date by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The date id."},"place":{"type":"string","description":"The place. Required."},"location":{"type":"string","description":"City or neighbourhood."},"address":{"type":"string","description":"Street address."},"date":{"type":"string","description":"YYYY-MM-DD, when they went."},"category":{"type":"string","description":"e.g. Dinner, Coffee, Outdoors."},"rating":{"type":"number","description":"0-5."},"revisit":{"type":"boolean","description":"Worth going back."},"review":{"type":"string","description":"Notes about the visit."},"wishlist":{"type":"boolean","description":"true = want to go, not yet been."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"date":{"type":"object","properties":{"id":{"type":"string"},"place":{"type":"string"},"location":{"type":["string","null"]},"date":{"type":["string","null"]},"category":{"type":["string","null"]},"rating":{"type":"number"},"revisit":{"type":"boolean"},"review":{"type":["string","null"]},"wishlist":{"type":"boolean"}},"required":["id","place"]}},"required":["date"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_date","title":"Delete date","description":"Move one date to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The date id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_books","title":"List books","description":"The user's books and reading list. Returns lines tagged [book:id].","inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Only this status."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"books":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"author":{"type":["string","null"]},"status":{"type":"string"},"rating":{"type":"number"},"started":{"type":["string","null"]},"finished":{"type":["string","null"]}},"required":["id","title","status"]}},"total":{"type":"number"}},"required":["books"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_book","title":"Create book","description":"Add a book. Defaults to \"Want to Read\" unless you pass a status.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Required."},"author":{"type":"string","description":"Author."},"status":{"type":"string","description":"Want to Read | Reading | Read."},"started":{"type":"string","description":"YYYY-MM-DD."},"finished":{"type":"string","description":"YYYY-MM-DD."},"rating":{"type":"number","description":"0-5."},"notes":{"type":"string","description":"Free-text notes."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["title"]},"outputSchema":{"type":"object","properties":{"book":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"author":{"type":["string","null"]},"status":{"type":"string"},"rating":{"type":"number"},"started":{"type":["string","null"]},"finished":{"type":["string","null"]}},"required":["id","title","status"]}},"required":["book"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_book","title":"Update book","description":"Update one book by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The book id."},"title":{"type":"string","description":"Required."},"author":{"type":"string","description":"Author."},"status":{"type":"string","description":"Want to Read | Reading | Read."},"started":{"type":"string","description":"YYYY-MM-DD."},"finished":{"type":"string","description":"YYYY-MM-DD."},"rating":{"type":"number","description":"0-5."},"notes":{"type":"string","description":"Free-text notes."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"book":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"author":{"type":["string","null"]},"status":{"type":"string"},"rating":{"type":"number"},"started":{"type":["string","null"]},"finished":{"type":["string","null"]}},"required":["id","title","status"]}},"required":["book"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_book","title":"Delete book","description":"Move one book to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The book id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_movies","title":"List movies","description":"The user's films and watchlist. Returns lines tagged [movie:id].","inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Only this status."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"movies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"year":{"type":["string","null"]},"status":{"type":"string"},"rating":{"type":"number"},"watched_on":{"type":["string","null"]}},"required":["id","title","status"]}},"total":{"type":"number"}},"required":["movies"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_movie","title":"Create movie","description":"Add a film. Defaults to \"Want to Watch\" unless you pass a status.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Required."},"year":{"type":"string","description":"Year."},"genre":{"type":"string","description":"Genre."},"status":{"type":"string","description":"Want to Watch | Watched."},"watched_on":{"type":"string","description":"YYYY-MM-DD."},"watch_where":{"type":"string","description":"Where it is streaming."},"rating":{"type":"number","description":"0-5."},"notes":{"type":"string","description":"Free-text notes."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["title"]},"outputSchema":{"type":"object","properties":{"movie":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"year":{"type":["string","null"]},"status":{"type":"string"},"rating":{"type":"number"},"watched_on":{"type":["string","null"]}},"required":["id","title","status"]}},"required":["movie"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_movie","title":"Update movie","description":"Update one movie by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The movie id."},"title":{"type":"string","description":"Required."},"year":{"type":"string","description":"Year."},"genre":{"type":"string","description":"Genre."},"status":{"type":"string","description":"Want to Watch | Watched."},"watched_on":{"type":"string","description":"YYYY-MM-DD."},"watch_where":{"type":"string","description":"Where it is streaming."},"rating":{"type":"number","description":"0-5."},"notes":{"type":"string","description":"Free-text notes."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"movie":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"year":{"type":["string","null"]},"status":{"type":"string"},"rating":{"type":"number"},"watched_on":{"type":["string","null"]}},"required":["id","title","status"]}},"required":["movie"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_movie","title":"Delete movie","description":"Move one movie to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The movie id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_content_items","title":"List content items","description":"The content pipeline — posts, videos and other pieces the user is making, with their status. Returns lines tagged [content_item:id].","inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Only this status."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"content_items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":["string","null"]},"status":{"type":["string","null"]},"date":{"type":["string","null"]}},"required":["id","title"]}},"total":{"type":"number"}},"required":["content_items"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_content_item","title":"Create content item","description":"Add a piece to the content pipeline, such as a post, video, or newsletter. title is required. type and status are free text, for example Post and Drafting, or Video and Published.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Required."},"type":{"type":"string","description":"e.g. Post, Video, Newsletter."},"status":{"type":"string","description":"e.g. Idea, Drafting, Published."},"date":{"type":"string","description":"YYYY-MM-DD target or publish date."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["title"]},"outputSchema":{"type":"object","properties":{"content_item":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":["string","null"]},"status":{"type":["string","null"]},"date":{"type":["string","null"]}},"required":["id","title"]}},"required":["content_item"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_content_item","title":"Update content item","description":"Update one content_item by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The content_item id."},"title":{"type":"string","description":"Required."},"type":{"type":"string","description":"e.g. Post, Video, Newsletter."},"status":{"type":"string","description":"e.g. Idea, Drafting, Published."},"date":{"type":"string","description":"YYYY-MM-DD target or publish date."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"content_item":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":["string","null"]},"status":{"type":["string","null"]},"date":{"type":["string","null"]}},"required":["id","title"]}},"required":["content_item"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_content_item","title":"Delete content item","description":"Move one content_item to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The content_item id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_inventory_items","title":"List inventory items","description":"Things the user owns or wants to buy. `want: true` is the shopping side, false is what they already have. Returns lines tagged [inventory_item:id].","inputSchema":{"type":"object","properties":{"want":{"type":"boolean","description":"true = the want list; false = owned."},"category":{"type":"string","description":"Category label."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"inventory_items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"want":{"type":"boolean"},"qty":{"type":["string","null"]},"location":{"type":["string","null"]},"category":{"type":["string","null"]},"value":{"type":["string","null"]}},"required":["id","name","want"]}},"total":{"type":"number"}},"required":["inventory_items"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_inventory_item","title":"Create inventory item","description":"Add something owned, or something to buy with `want: true`.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Required."},"want":{"type":"boolean","description":"true = want to buy, not yet owned."},"qty":{"type":"string","description":"Quantity, as text."},"location":{"type":"string","description":"Where it is kept."},"category":{"type":"string","description":"Category label."},"value":{"type":"string","description":"Value."},"link":{"type":"string","description":"URL."},"notes":{"type":"string","description":"Free-text notes."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"inventory_item":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"want":{"type":"boolean"},"qty":{"type":["string","null"]},"location":{"type":["string","null"]},"category":{"type":["string","null"]},"value":{"type":["string","null"]}},"required":["id","name","want"]}},"required":["inventory_item"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_inventory_item","title":"Update inventory item","description":"Update one inventory_item by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The inventory_item id."},"name":{"type":"string","description":"Required."},"want":{"type":"boolean","description":"true = want to buy, not yet owned."},"qty":{"type":"string","description":"Quantity, as text."},"location":{"type":"string","description":"Where it is kept."},"category":{"type":"string","description":"Category label."},"value":{"type":"string","description":"Value."},"link":{"type":"string","description":"URL."},"notes":{"type":"string","description":"Free-text notes."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"inventory_item":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"want":{"type":"boolean"},"qty":{"type":["string","null"]},"location":{"type":["string","null"]},"category":{"type":["string","null"]},"value":{"type":["string","null"]}},"required":["id","name","want"]}},"required":["inventory_item"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_inventory_item","title":"Delete inventory item","description":"Move one inventory_item to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The inventory_item id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_areas","title":"List areas","description":"Areas of responsibility — the standing parts of life the user maintains, as opposed to projects that finish. Returns lines tagged [area:id].","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"areas":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":["string","null"]}},"required":["id","name"]}},"total":{"type":"number"}},"required":["areas"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_area","title":"Create area","description":"Add an area of responsibility: a standing part of life, such as Home or Health, rather than a project that finishes. name is required. kind is an optional short label such as personal or shared.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Required."},"kind":{"type":"string","description":"Optional short label, such as personal, work, or shared."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"area":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":["string","null"]}},"required":["id","name"]}},"required":["area"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_area","title":"Update area","description":"Update one area by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The area id."},"name":{"type":"string","description":"Required."},"kind":{"type":"string","description":"Optional short label, such as personal, work, or shared."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"area":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":["string","null"]}},"required":["id","name"]}},"required":["area"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_area","title":"Delete area","description":"Move one area to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The area id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_brainstorms","title":"List brainstorms","description":"The user's mind maps, newest first. This lists titles and phase only — call get_brainstorm for the actual nodes. Returns lines tagged [brainstorm:id].","inputSchema":{"type":"object","properties":{"phase":{"type":"string","description":"Only this phase."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"brainstorms":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"phase":{"type":"string"},"central":{"type":["string","null"]}},"required":["id","title","phase"]}},"total":{"type":"number"}},"required":["brainstorms"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_brainstorm","title":"Create brainstorm","description":"Start a mind map. `title` is required; `central` is the centre idea.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Required."},"phase":{"type":"string","description":"Idea | Brainstorming | Completed."},"central":{"type":"string","description":"The centre idea."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["title"]},"outputSchema":{"type":"object","properties":{"brainstorm":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"phase":{"type":"string"},"central":{"type":["string","null"]}},"required":["id","title","phase"]}},"required":["brainstorm"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_brainstorm","title":"Update brainstorm","description":"Update one brainstorm by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The brainstorm id."},"title":{"type":"string","description":"Required."},"phase":{"type":"string","description":"Idea | Brainstorming | Completed."},"central":{"type":"string","description":"The centre idea."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"brainstorm":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"phase":{"type":"string"},"central":{"type":["string","null"]}},"required":["id","title","phase"]}},"required":["brainstorm"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_brainstorm","title":"Delete brainstorm","description":"Move one brainstorm to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The brainstorm id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"get_brainstorm","title":"Get brainstorm","description":"One mind map in full, including its nodes. Separate from list_brainstorms because a map can be large and a listing of twenty would drown the reply.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The brainstorm id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"phase":{"type":"string"},"central":{"type":["string","null"]},"nodes":{"type":"array","items":{"type":"object"}}},"required":["id","title","nodes"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_classes","title":"List classes","description":"The user's courses, with their term and meeting pattern. A class is not an event: it is the course, and its meetings are generated from meeting_days across the term. Returns lines tagged [class:id].","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"classes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"code":{"type":"string"},"instructor":{"type":"string"},"term_start":{"type":["string","null"]},"term_end":{"type":["string","null"]},"location":{"type":"string"}},"required":["id","name"]}},"total":{"type":"number"}},"required":["classes"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_class","title":"Create class","description":"Add a course. `name` is required. Give term_start, term_end and meeting_days together for the meetings to appear on the calendar.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Required."},"code":{"type":"string","description":"e.g. BUS 401."},"instructor":{"type":"string","description":"Instructor."},"term_start":{"type":"string","description":"YYYY-MM-DD."},"term_end":{"type":"string","description":"YYYY-MM-DD."},"location":{"type":"string","description":"Where it is."},"credits":{"type":"number","description":"Credit hours."},"notes":{"type":"string","description":"Free-text notes."},"meeting_days":{"type":"array","items":{"type":"string"},"description":"Weekday names it meets, e.g. [\"Mon\",\"Wed\"]."},"meeting_start":{"type":"string","description":"Local time, e.g. \"7:00 PM\"."},"meeting_end":{"type":"string","description":"Local time, e.g. \"8:15 PM\"."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"class":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"code":{"type":"string"},"instructor":{"type":"string"},"term_start":{"type":["string","null"]},"term_end":{"type":["string","null"]},"location":{"type":"string"}},"required":["id","name"]}},"required":["class"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_class","title":"Update class","description":"Update one class by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The class id."},"name":{"type":"string","description":"Required."},"code":{"type":"string","description":"e.g. BUS 401."},"instructor":{"type":"string","description":"Instructor."},"term_start":{"type":"string","description":"YYYY-MM-DD."},"term_end":{"type":"string","description":"YYYY-MM-DD."},"location":{"type":"string","description":"Where it is."},"credits":{"type":"number","description":"Credit hours."},"notes":{"type":"string","description":"Free-text notes."},"meeting_days":{"type":"array","items":{"type":"string"},"description":"Weekday names it meets, e.g. [\"Mon\",\"Wed\"]."},"meeting_start":{"type":"string","description":"Local time, e.g. \"7:00 PM\"."},"meeting_end":{"type":"string","description":"Local time, e.g. \"8:15 PM\"."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"class":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"code":{"type":"string"},"instructor":{"type":"string"},"term_start":{"type":["string","null"]},"term_end":{"type":["string","null"]},"location":{"type":"string"}},"required":["id","name"]}},"required":["class"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_class","title":"Delete class","description":"Move one class to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The class id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_retainers","title":"List retainers","description":"Recurring client commitments and the cadence each one runs on. Use list_retainer_tasks for the checklist inside one. Returns lines tagged [retainer:id].","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"retainers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"cadence":{"type":"string"},"carry":{"type":"number"}},"required":["id","name","cadence"]}},"total":{"type":"number"}},"required":["retainers"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_retainer","title":"Create retainer","description":"Add a recurring client commitment and the cadence it runs on. name is required. cadence is Weekly, Monthly, or Quarterly. The checklist inside it is read with list_retainer_tasks.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Required."},"cadence":{"type":"string","description":"Weekly | Monthly | Quarterly."},"anchor_dow":{"type":"string","description":"Weekday it anchors to, for weekly."},"anchor_dom":{"type":"number","description":"Day of month it anchors to, for monthly."},"carry":{"type":"number","description":"Unfinished items carried forward."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["name"]},"outputSchema":{"type":"object","properties":{"retainer":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"cadence":{"type":"string"},"carry":{"type":"number"}},"required":["id","name","cadence"]}},"required":["retainer"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_retainer","title":"Update retainer","description":"Update one retainer by id. List first so the id is real; only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The retainer id."},"name":{"type":"string","description":"Required."},"cadence":{"type":"string","description":"Weekly | Monthly | Quarterly."},"anchor_dow":{"type":"string","description":"Weekday it anchors to, for weekly."},"anchor_dom":{"type":"number","description":"Day of month it anchors to, for monthly."},"carry":{"type":"number","description":"Unfinished items carried forward."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"retainer":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"cadence":{"type":"string"},"carry":{"type":"number"}},"required":["id","name","cadence"]}},"required":["retainer"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"delete_retainer","title":"Delete retainer","description":"Move one retainer to Trash by id. Recoverable in the app — this is a soft delete, not an erase.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The retainer id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"deleted":{"type":"boolean"}},"required":["id","deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_retainer_tasks","title":"List retainer tasks","description":"The checklist inside one retainer. Pass the retainer id from list_retainers. Returns lines tagged [retainer_task:id].","inputSchema":{"type":"object","properties":{"retainer_id":{"type":"string","description":"The retainer id."}},"required":["retainer_id"]},"outputSchema":{"type":"object","properties":{"tasks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"done":{"type":"boolean"}},"required":["id","label","done"]}},"total":{"type":"number"}},"required":["tasks"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"complete_retainer_task","title":"Complete retainer task","description":"Tick or untick one item on a retainer checklist. Pass `done: false` to undo. List first so the id is real.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The retainer task id."},"done":{"type":"boolean","description":"Default true."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"done":{"type":"boolean"}},"required":["id","done"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_domains","title":"List domains","description":"The user's domains of life: the registry every task, event, and project is filed under. Renaming or removing a domain is done in the app, because it rehomes everything attached to that domain. Call this to learn the valid domain keys before filing anything.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"key":{"type":["string","null"]},"name":{"type":"string"},"color":{"type":"string"}},"required":["id","name"]}},"total":{"type":"number"}},"required":["domains"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_checkins","title":"List checkins","description":"Past \"Where I'm At\" check-ins, newest first. Each row is the scorecard stored that day: optional age, finance comparisons, body mass index, and life-admin counts.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows, default 10, cap 50."},"tz":{"type":"string","description":"IANA time zone for this call, e.g. America/New_York. Overrides the timezone saved in Settings. When omitted, and none is saved, America/New_York is used."}}},"outputSchema":{"type":"object","properties":{"checkins":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"ran_at":{"type":"string"},"result":{"type":"object","additionalProperties":false,"description":"The scorecard stored for a Where I'm At check-in.","properties":{"age":{"type":"number","description":"Age in years, when it was known."},"finance":{"type":"array","description":"Comparisons included on that snapshot. Empty when age or the figures were not set.","items":{"type":"object","additionalProperties":false,"properties":{"key":{"type":"string","enum":["netWorth","annualIncome","liquidSavings"],"description":"Which figure this row compares."},"label":{"type":"string","description":"Display label, such as Net worth."},"value":{"type":"number","description":"The figure, in currency units."},"median":{"type":"number","description":"Median for that age band."},"percentile":{"type":"number","description":"Rough percentile, 0 to 100."}},"required":["key","label","value","median","percentile"]}},"bmi":{"description":"Body mass index, or null when height or weight was missing.","anyOf":[{"type":"null"},{"type":"object","additionalProperties":false,"properties":{"bmi":{"type":"number","description":"Body mass index, rounded to one decimal."},"band":{"type":"string","enum":["Underweight","Healthy","Overweight","Obese"],"description":"Underweight, Healthy, Overweight, or Obese."}},"required":["bmi","band"]}]},"lifeAdmin":{"type":"object","additionalProperties":false,"description":"Task and habit counts on the day of the check-in.","properties":{"totalTasks":{"type":"number","description":"Tasks counted that day."},"completedTasks":{"type":"number","description":"Tasks already done."},"completionRate":{"type":"number","description":"Completed share, 0 to 100. Zero when there are no tasks."},"openOverdue":{"type":"number","description":"Open tasks past their due date."},"streak":{"type":"number","description":"Current routine streak, in days."}},"required":["totalTasks","completedTasks","completionRate","openOverdue","streak"]}},"required":["finance","bmi","lifeAdmin"]}},"required":["id","ran_at"]}},"total":{"type":"number"}},"required":["checkins"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"log_checkin","title":"Log checkin","description":"Record a \"Where I'm At\" snapshot. result is the scorecard the app stores: optional age, a finance array (net worth, annual income, or liquid savings, each with value, median, and percentile), bmi (a number plus Underweight, Healthy, Overweight, or Obese, or null), and lifeAdmin (total tasks, completed tasks, completion rate, open overdue count, and routine streak). Appends history and does not overwrite a past check-in.","inputSchema":{"type":"object","properties":{"result":{"type":"object","additionalProperties":false,"description":"The scorecard stored for a Where I'm At check-in.","properties":{"age":{"type":"number","description":"Age in years, when it was known."},"finance":{"type":"array","description":"Comparisons included on that snapshot. Empty when age or the figures were not set.","items":{"type":"object","additionalProperties":false,"properties":{"key":{"type":"string","enum":["netWorth","annualIncome","liquidSavings"],"description":"Which figure this row compares."},"label":{"type":"string","description":"Display label, such as Net worth."},"value":{"type":"number","description":"The figure, in currency units."},"median":{"type":"number","description":"Median for that age band."},"percentile":{"type":"number","description":"Rough percentile, 0 to 100."}},"required":["key","label","value","median","percentile"]}},"bmi":{"description":"Body mass index, or null when height or weight was missing.","anyOf":[{"type":"null"},{"type":"object","additionalProperties":false,"properties":{"bmi":{"type":"number","description":"Body mass index, rounded to one decimal."},"band":{"type":"string","enum":["Underweight","Healthy","Overweight","Obese"],"description":"Underweight, Healthy, Overweight, or Obese."}},"required":["bmi","band"]}]},"lifeAdmin":{"type":"object","additionalProperties":false,"description":"Task and habit counts on the day of the check-in.","properties":{"totalTasks":{"type":"number","description":"Tasks counted that day."},"completedTasks":{"type":"number","description":"Tasks already done."},"completionRate":{"type":"number","description":"Completed share, 0 to 100. Zero when there are no tasks."},"openOverdue":{"type":"number","description":"Open tasks past their due date."},"streak":{"type":"number","description":"Current routine streak, in days."}},"required":["totalTasks","completedTasks","completionRate","openOverdue","streak"]}},"required":["finance","bmi","lifeAdmin"]}},"required":["result"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"ran_at":{"type":"string"}},"required":["id","ran_at"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"list_project_tasks","title":"List project tasks","description":"A project's board cards, grouped by column. Project work lives on this board — To Do, In Progress, Done — not on the ordinary task list. Pass the project id from list_projects. Returns lines tagged [ptask:id].","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"The project id, from list_projects."},"status":{"type":"string","enum":["To Do","In Progress","Done"],"description":"Only this column. Omit for all three."}},"required":["project_id"]},"outputSchema":{"type":"object","properties":{"cards":{"type":"array","items":{"type":"object","properties":{"task_number":{"type":["number","null"]},"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"due":{"type":["string","null"]},"start_date":{"type":["string","null"]},"priority":{"type":["string","null"]},"assignee":{"type":["string","null"]}},"required":["id","title","status"]}},"total":{"type":"number"}},"required":["cards"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_project_task","title":"Create project task","description":"Add a card to a project board, in a named column. THIS is how work that belongs to a project gets created — create_task makes an ordinary standalone task and cannot file anything into a project. Writes immediately to the real account.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"The project id, from list_projects."},"title":{"type":"string","description":"The card title."},"status":{"type":"string","enum":["To Do","In Progress","Done"],"description":"Which column the card starts in. Defaults to 'To Do'."},"due":{"type":"string","description":"Free-text due label shown on the card."},"start_date":{"type":"string","description":"YYYY-MM-DD the work begins. With `due`, the card is a bar on the project Timeline; alone, a dot."},"priority":{"type":"string","enum":["High","Medium","Low"]},"description":{"type":"string","description":"Short detail shown on the card."},"notes":{"type":"string","description":"Longer body for the card."},"assignee":{"type":"string","description":"Who owns it."}},"required":["project_id","title"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"}},"required":["id","title","status"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_project_task","title":"Update project task","description":"Change a board card — most often to move it between columns with `status`. Only the fields you pass change. Get the id from list_project_tasks.","inputSchema":{"type":"object","properties":{"ptask_id":{"type":"string","description":"From a [ptask:id] tag."},"status":{"type":"string","enum":["To Do","In Progress","Done"],"description":"Move it to this column."},"title":{"type":"string","description":"Title."},"due":{"type":"string","description":"Free-text due label; \"\" clears it."},"start_date":{"type":"string","description":"YYYY-MM-DD the work begins, or \"\" to clear."},"priority":{"type":"string","enum":["High","Medium","Low"]},"description":{"type":"string","description":"Longer description."},"notes":{"type":"string","description":"Free-text notes."},"assignee":{"type":"string","description":"Who it is assigned to."}},"required":["ptask_id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"}},"required":["id"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_milestones","title":"List milestones","description":"Milestones on one project, in order. Pass the project id from list_projects. Returns lines tagged [milestone:id].","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"The project id."}},"required":["project_id"]},"outputSchema":{"type":"object","properties":{"milestones":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"done":{"type":"boolean"},"due":{"type":["string","null"]}},"required":["id","title","done"]}},"total":{"type":"number"}},"required":["milestones"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_milestone","title":"Create milestone","description":"Add a milestone to a project. `project_id` and `title` are required.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id from list_projects."},"title":{"type":"string","description":"Title."},"due":{"type":"string","description":"Free-text or YYYY-MM-DD, as the project uses."},"ord":{"type":"number","description":"Sort position."}},"required":["project_id","title"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_milestone","title":"Update milestone","description":"Update a milestone — most often to tick it off with `done: true`. Only the fields you pass change.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Record id from a list or search result."},"title":{"type":"string","description":"Title."},"done":{"type":"boolean","description":"Whether it is complete."},"due":{"type":"string","description":"When it is due."},"ord":{"type":"number","description":"Sort position."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"done":{"type":"boolean"}},"required":["id","done"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_run_routes","title":"List run routes","description":"Saved running and cycling routes with their distance. Geometry is omitted because a route can be very large. Returns lines tagged [route:id].","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"routes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"sport":{"type":"string"},"distance_km":{"type":"number"}},"required":["id","name"]}},"total":{"type":"number"}},"required":["routes"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"update_run_route","title":"Update run route","description":"Rename a route or edit its notes and tags. Deliberately cannot change the geometry: a route's shape comes from GPS or the map editor.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The route id."},"name":{"type":"string","description":"Name."},"notes":{"type":"string","description":"Free-text notes."},"tags":{"type":"array","items":{"type":"string"},"description":"Short labels."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_activities","title":"List activities","description":"Recorded activities — runs, rides and other sessions, tracked in Axis or logged by hand. Distinct from list_workouts, which is the gym log. Returns lines tagged [activity:id].","inputSchema":{"type":"object","properties":{"sport":{"type":"string","description":"Only this sport."},"limit":{"type":"number","description":"Max rows, default 30, cap 200."}}},"outputSchema":{"type":"object","properties":{"activities":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"sport":{"type":"string"},"name":{"type":"string"},"distance_km":{"type":["number","null"]},"duration_min":{"type":["number","null"]}},"required":["id","date","sport"]}},"total":{"type":"number"}},"required":["activities"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"log_activity","title":"Log activity","description":"Record an activity by hand — a run or ride Axis did not track. `date` and `sport` are required. Runs tracked in Axis arrive on their own; this is for everything else.","inputSchema":{"type":"object","properties":{"date":{"type":"string","description":"YYYY-MM-DD."},"sport":{"type":"string","description":"e.g. Run, Ride, Swim."},"name":{"type":"string","description":"Name."},"duration_min":{"type":"number","description":"Duration in minutes."},"distance_km":{"type":"number","description":"Distance in kilometers."},"calories":{"type":"number","description":"Calories."},"avg_hr":{"type":"number","description":"Average heart rate."},"elevation_m":{"type":"number","description":"Elevation gain in meters."}},"required":["date","sport"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"sport":{"type":"string"}},"required":["id","date","sport"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"list_reminders","title":"List reminders","description":"Scheduled reminders, soonest first. These are the push and email nudges the app sends, not tasks. Returns lines tagged [reminder:id].","inputSchema":{"type":"object","properties":{"include_sent":{"type":"boolean","description":"Include already-sent reminders. Default false."},"limit":{"type":"number","description":"Max rows, default 50, cap 200."}}},"outputSchema":{"type":"object","properties":{"reminders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"scheduled_at":{"type":["string","null"]},"sent":{"type":"boolean"}},"required":["id","text"]}},"total":{"type":"number"}},"required":["reminders"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_reminder","title":"Create reminder","description":"Schedule a reminder. `text` and `scheduled_at` (an ISO timestamp) are required. Link it to a task with `task_id` if it is about one.","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Text of the entry."},"scheduled_at":{"type":"string","description":"ISO 8601 timestamp."},"task_id":{"type":"string","description":"Optional task this is about."},"meta":{"type":"string","description":"Extra reminder data."}},"required":["text","scheduled_at"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"scheduled_at":{"type":"string"}},"required":["id","scheduled_at"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"cancel_reminder","title":"Cancel reminder","description":"Cancel a scheduled reminder. Unlike the app's content, a reminder is removed outright rather than moved to Trash — it is a pending notification, and there is no Trash for those to sit in.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The reminder id."}},"required":["id"]},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"cancelled":{"type":"boolean"}},"required":["id","cancelled"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_saved_filters","title":"List saved filters","description":"The saved views the user has pinned — named filter configurations across the app. Returns lines tagged [saved_filter:id].","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"filters":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"config":{"type":"object"}},"required":["id","name"]}},"total":{"type":"number"}},"required":["filters"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_note_revisions","title":"List note revisions","description":"The version history of one note, newest first. Bodies are not returned — a history listing of full note bodies would be enormous; this gives you the titles, summaries and timestamps to choose from.","inputSchema":{"type":"object","properties":{"note_id":{"type":"string","description":"The note id, from search_notes."},"limit":{"type":"number","description":"Max rows, default 20, cap 100."}},"required":["note_id"]},"outputSchema":{"type":"object","properties":{"revisions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":["string","null"]},"summary":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","created_at"]}},"total":{"type":"number"}},"required":["revisions"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"search","title":"Search","description":"One query across everything this token can read: tasks, projects, notes (title and body), events, routines, goals, and people. For example, \"kitchen remodel\" finds the project, its tasks, and notes that mention it.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Word or phrase, case-insensitive."}},"required":["query"]},"outputSchema":{"type":"object","properties":{"tasks":{"type":"array","items":{"type":"object","properties":{"task_number":{"type":["number","null"]},"id":{"type":"string"},"title":{"type":"string"},"due":{"type":["string","null"]},"due_time":{"type":["string","null"]},"priority":{"type":"string"},"done":{"type":"boolean"},"domain":{"type":["string","null"]},"project":{"type":["string","null"]}},"required":["id","title","done"]}},"projects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"pct":{"type":["number","null"]},"open_count":{"type":["number","null"]},"due":{"type":["string","null"]},"archived":{"type":"boolean"}},"required":["id","name"]}},"notes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"snippet":{"type":"string"},"file_id":{"type":"string"},"file_name":{"type":"string"}},"required":["id","title"]}},"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"date":{"type":"string"},"end_date":{"type":["string","null"]},"all_day":{"type":"boolean"},"source":{"type":"string"},"read_only":{"type":"boolean"},"start":{"type":"string"},"end":{"type":["string","null"]},"description":{"type":["string","null"]},"html_link":{"type":["string","null"]},"calendar_id":{"type":"string"},"calendar_name":{"type":["string","null"]},"calendar_domain":{"type":["string","null"]},"series_id":{"type":"string"},"start_time":{"type":["string","null"]},"end_time":{"type":["string","null"]},"location":{"type":["string","null"]},"repeats":{"type":["object","null"]}},"required":["id","title","date"]}},"routines":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"freq":{"type":"string"},"days":{"type":"array","items":{"type":"string"}},"streak":{"type":"number"},"done":{"type":"boolean"},"last_done":{"type":["string","null"]}},"required":["id","label","freq"]}},"goals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"target_date":{"type":["string","null"]},"parent_id":{"type":["string","null"]},"metric":{"type":["object","null"]}},"required":["id","title","status"]}},"people":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"role":{"type":["string","null"]},"domain":{"type":["string","null"]},"email":{"type":["string","null"]},"phone":{"type":["string","null"]},"birthday":{"type":["string","null"]},"next":{"type":["string","null"]},"fact":{"type":["string","null"]}},"required":["id","name"]}}}},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"register_webhook","title":"Register webhook","description":"Register an HTTPS URL to be POSTed the changes_since diff whenever this account changes (checked every ~2 minutes, plus immediately after agent writes). The response includes a signing secret, shown ONCE: verify the X-Axis-Signature header (sha256=<hex HMAC-SHA256 of the raw body>) with it.","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"HTTPS endpoint to receive deliveries."}},"required":["url"]},"outputSchema":{"type":"object","properties":{"webhook":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"active":{"type":"boolean"},"failure_count":{"type":"number"},"last_delivery_at":{"type":["string","null"]},"created_at":{"type":["string","null"]}},"required":["id","url","active"]},"secret":{"type":"string"}},"required":["webhook","secret"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":true}},{"name":"list_webhooks","title":"List webhooks","description":"List the webhooks registered by this token and their delivery health. Requires webhooks:read. A token that already has webhooks:write can still list.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"webhooks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"active":{"type":"boolean"},"failure_count":{"type":"number"},"last_delivery_at":{"type":["string","null"]},"created_at":{"type":["string","null"]}},"required":["id","url","active"]}}},"required":["webhooks"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"delete_webhook","title":"Delete webhook","description":"Remove one of this token's webhooks. Deliveries stop immediately.","inputSchema":{"type":"object","properties":{"webhook_id":{"type":"string","description":"From a [webhook:id] tag."}},"required":["webhook_id"]},"outputSchema":{"type":"object","properties":{"deleted":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"}},"required":["type","id"]}},"required":["deleted"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}},{"name":"list_workspace_pages","title":"List workspace pages","description":"List the owner's freeform Workspace pages. Their bodies are Library notes. Live views and saved assistant output live in separate workspace blocks.","inputSchema":{"type":"object","properties":{}},"outputSchema":{"type":"object","properties":{"pages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]}}},"required":["pages"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"list_workspace_blocks","title":"List workspace blocks","description":"Read the saved blocks on one owned Workspace page. Returns block content and live-view configuration, not the records inside the views. Those still require their own read scopes.","inputSchema":{"type":"object","properties":{"page_id":{"type":"string","description":"page id"}},"required":["page_id"]},"outputSchema":{"type":"object","properties":{"blocks":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"page_id":{"type":"string"},"kind":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"revision":{"type":"number"}},"required":["id","page_id","kind","title","body","revision"]}}},"required":["blocks"]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":false}},{"name":"create_workspace_block","title":"Create workspace block","description":"Add a block to an owned page: text, a live view (tasks, calendar, goals, projects, habits, files, or database), or saved assistant output. A live block stores a view, not copied records. config may contain domain, status (open, done, or all), pageId (a linked database), and width (half or full).","inputSchema":{"type":"object","properties":{"page_id":{"type":"string","description":"Workspace page id from list_workspace_pages."},"kind":{"type":"string","enum":["text","tasks","calendar","goals","projects","habits","files","database","agent"],"description":"Block type. text is written content. tasks, calendar, goals, projects, habits, files, and database are live views. The remaining enum value stores saved assistant output."},"title":{"type":"string","description":"Block title. Defaults to the kind."},"body":{"type":"string","description":"Block body. Empty for a new live view."},"config":{"type":"object","description":"View settings: domain, status (open, done, or all), pageId, and width (half or full)."}},"required":["page_id","kind"]},"outputSchema":{"type":"object","properties":{"block":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"page_id":{"type":"string"},"kind":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"revision":{"type":"number"}},"required":["id","page_id","kind","title","body","revision"]}},"required":["block"]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}},{"name":"update_workspace_block","title":"Update workspace block","description":"Update the title, body or config of an owned workspace block. Read it first and pass its revision. A concurrent edit is refused; read again and merge deliberately. This tool does not run an AI workflow.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Record id from a list or search result."},"revision":{"type":"integer","description":"Revision from the last read of this block."},"title":{"type":"string","description":"Title."},"body":{"type":"string","description":"Body text."},"config":{"type":"object","description":"Block settings object."}},"required":["id","revision"]},"outputSchema":{"type":"object","properties":{"block":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"page_id":{"type":"string"},"kind":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"revision":{"type":"number"}},"required":["id","page_id","kind","title","body","revision"]}},"required":["block"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"openWorldHint":false}}],"scopes":["brainstorm:read","brainstorm:write","calendar:read","calendar:write","checkin:read","checkin:write","dates:read","dates:write","domains:read","finance:read","finance:write","goals:read","goals:write","health:read","health:write","journal:read","journal:write","library:read","library:write","notes:read","notes:write","ops:read","ops:write","people:read","people:write","projects:read","projects:write","routines:read","routines:write","tasks:read","tasks:write","webhooks:read","webhooks:write"],"limits":{"daily_calls":1000,"daily_writes":200,"window":"resets at midnight UTC, counted per token"},"auth":{"bearer":"Authorization: Bearer axis_ct_… (issued by the OAuth flow for this connector)","oauth":"https://axisproductivityapp.com/.well-known/oauth-protected-resource/mcp"},"idempotency":"Every write tool accepts an optional idempotency_key argument (≤64 chars; REST callers may send an Idempotency-Key header). Repeating a call with the same key within 24h returns the original result instead of acting twice.","structured":"Every tool declares an outputSchema and returns structuredContent (MCP) or `data` (REST) conforming to it — parse that instead of the prose.","connector":"This URL is the public Axis connector. It offers the same per-user tools as /api/agent, except habit-partner tools. You choose scopes on the consent screen. Tokens issued here are refused at /api/agent. The password vault is not available.","authenticated":false,"hint":"Send a connector access token: Authorization: Bearer axis_ct_… Refresh tokens use the axis_rt_ prefix."}