このMCPでできること
Performs deterministic personal finance calculations with rule-based citations.
ツール
入力スキーマ
{'type': 'object', 'required': ['purchase_balance', 'purchase_apr_pct', 'cash_advance_balance', 'cash_advance_apr_pct', 'total_monthly_payment'], 'properties': {'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'minimum_payment': {'type': ['number', 'null'], 'default': None, 'description': "Issuer-stated minimum payment. Decimal, at least 0, at most 2 decimal places. Optional; defaults to auto-calculate when omitted. When supplied, this DOES bind: the per-month mandatory payment is min(max(the issuer minimum recomputed from the balance, minimum_payment), the remaining balance, total_monthly_payment). This differs from calculate_cc_payoff's default dynamic path, where the identically-named minimum_payment is parsed and validated but never applied unless fixed_payments = true: the two tools do not share behavior for this parameter, only its name."}, 'purchase_apr_pct': {'type': 'number', 'description': 'Purchase APR as a percentage, e.g. 24.99 not 0.2499. Decimal from 0 to 100. REQUIRED, no default.'}, 'purchase_balance': {'type': 'number', 'description': 'Current balance carrying the purchase APR. Decimal, at least 0. REQUIRED, no default.'}, 'cash_advance_apr_pct': {'type': 'number', 'maximum': 100, 'description': 'Cash advance APR as a percentage. Decimal, greater than 0, at most 100. A cash advance always accrues interest immediately, so 0 is not a valid rate. REQUIRED, no default.', 'exclusiveMinimum': 0}, 'cash_advance_balance': {'type': 'number', 'description': 'Current balance carrying the cash advance APR. Decimal, greater than 0. REQUIRED, no default.'}, 'cash_advance_fee_min': {'type': ['number', 'null'], 'default': None, 'description': 'Minimum dollar cash advance fee, e.g. 10 for $10. Decimal, at least 0. Optional; defaults to 0 when omitted.'}, 'cash_advance_fee_pct': {'type': ['number', 'null'], 'default': None, 'maximum': 100, 'minimum': 0, 'description': 'Cash advance fee as a percentage of the advance, e.g. 5 for 5%. Decimal, at least 0 and at most 100. Optional; defaults to 0 when omitted.'}, 'total_monthly_payment': {'type': 'number', 'description': 'Total payment applied across both balances this month. Decimal, greater than 0, at most 2 decimal places. REQUIRED, no default.'}}}
入力スキーマ
{'type': 'object', 'required': ['current_balance', 'original_purchase_price', 'annual_rate_pct', 'monthly_payment'], 'properties': {'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'annual_rate_pct': {'type': 'number', 'description': 'Mortgage APR as a percentage. Decimal from 0 to 20. REQUIRED, no default.'}, 'current_balance': {'type': 'number', 'minimum': 0.01, 'description': "Today's loan balance. Decimal, greater than 0. REQUIRED, no default."}, 'loan_age_months': {'type': ['integer', 'null'], 'default': None, 'description': 'Months elapsed since origination. Integer from 0 to 480. Optional. Cannot exceed original_loan_term_months when both are supplied. Supplying either one without the other is rejected; both are required together. See original_loan_term_months.'}, 'monthly_payment': {'type': 'number', 'minimum': 0.01, 'description': 'Current P&I monthly payment, excluding tax, insurance, and PMI. Decimal, greater than 0. REQUIRED, no default.'}, 'current_home_value': {'type': ['number', 'null'], 'default': None, 'minimum': 0.01, 'description': 'Current market value of the home. Decimal, greater than 0. Optional. When supplied AND greater than the HPA original value (the lesser of purchase price and any closing appraisal), the response also computes the re-appraisal pathway (some lenders allow PMI removal based on current market value with a fresh appraisal).'}, 'annual_pmi_rate_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual PMI as a percentage of the current loan balance. Decimal from 0 to 5. Optional; omitting it uses the cited 0.5 default. Typical conventional-loan PMI ranges from 0.3% to 1.5%.'}, 'extra_monthly_payment': {'type': ['number', 'null'], 'default': None, 'description': 'Extra principal paid each month beyond the regular payment. Decimal, at least 0. Optional; defaults to 0 when omitted.'}, 'original_purchase_price': {'type': 'number', 'minimum': 0.01, 'description': 'What you paid for the home (the purchase-price side of the HPA basis; when a closing appraisal is lower, see original_appraised_value). Decimal, greater than 0. REQUIRED, no default.'}, 'original_appraised_value': {'type': ['number', 'null'], 'default': None, 'minimum': 0.01, 'description': "The home's appraised value at closing. Decimal, greater than 0. Optional. HPA sets the PMI trigger basis to the LESSER of purchase price and this appraisal (12 U.S.C. 4901); supply it when your closing appraisal came in below the purchase price."}, 'original_loan_term_months': {'type': ['integer', 'null'], 'default': None, 'description': "The loan's original term in months. Integer from 1 to 480. Optional. Supplied together with loan_age_months, this computes the 12 U.S.C. 4902(c) statutory final-termination midpoint (12 U.S.C. 4901(7)) and bounds automatic_removal at the earlier of it and the 78% schedule date, where HPA applies and the borrower is current. Supplying either one without the other is rejected; both are required together."}}}
入力スキーマ
{'type': 'object', 'required': ['cards'], 'properties': {'cards': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Card label, e.g. 'Chase Sapphire', 120 characters or fewer. Optional; a card without a name is auto-numbered ('Card 1', 'Card 2', and so on). Echoed into per-card results and warning text. A name over the cap is replaced in error field paths by a key built from its zero-based card index, written as '#0 (name over cap)', '#1 (name over cap)' and so on."}, 'segments': {'type': ['array', 'null'], 'items': {'type': 'object', 'required': ['type', 'balance'], 'properties': {'type': {'type': 'string', 'description': "Segment type. REQUIRED on every segment: omitting it is rejected. Per-type field matrix. Every field below is classified for every segment type: REQUIRED (omitting it is rejected), OPTIONAL (accepted either way and read), IGNORED (accepted and never read for this type, though a value can still fail the field's own range check), or REJECTED (supplying a disallowed value is an error; the field's own rule below says exactly which values are disallowed). Value rules are stated separately from applicability, because a field can be accepted on a type and still be restricted there. The validators are the authority; this matrix describes them.\n- type: REQUIRED on every type. Values: one of purchase, cash_advance, balance_transfer, promotional, installment_plan.\n- balance: REQUIRED on every type. Values: $0 to $1,000,000,000; above $50,000 returns a HIGH_CARD_BALANCE warning, not an error.\n- apr_pct: REQUIRED on purchase, cash_advance, balance_transfer, promotional; OPTIONAL on installment_plan. Values: 0 to 100 as a percentage, e.g. 24.99 not 0.2499. The REQUIRED classification above applies when balance is greater than 0; a zero-balance segment may omit it. Must be greater than 0 on cash_advance carrying a balance. Must equal 0 on installment_plan, where omitting it is the correct shape.\n- revert_apr_pct: REQUIRED on balance_transfer, promotional; IGNORED on purchase, cash_advance; REJECTED on installment_plan. Values: 0 to 100, and at least apr_pct. Rejected on installment_plan with FIELD_NOT_ALLOWED_HERE: an expired plan's residual keeps its existing rate.\n- promo_expires_month: REQUIRED on balance_transfer, promotional; IGNORED on purchase, cash_advance, installment_plan. Values: 1 to 480.\n- monthly_fee: OPTIONAL on installment_plan; REJECTED on purchase, cash_advance, balance_transfer, promotional. Values: $0 or more, and no greater than plan_payment_due, on installment_plan. On every other type a POSITIVE value is rejected with FIELD_NOT_ALLOWED_HERE; 0 and a negative value are accepted and dropped there.\n- plan_payment_due: REQUIRED on installment_plan; REJECTED on purchase, cash_advance, balance_transfer, promotional. Values: greater than $0, at least monthly_fee, and no more than $1,000,000,000, on installment_plan. On every other type a POSITIVE value is rejected with FIELD_NOT_ALLOWED_HERE; 0 and a negative value are accepted and dropped there.\n- remaining_payments: OPTIONAL on installment_plan; IGNORED on purchase, cash_advance, balance_transfer, promotional. Values: 0 or more. 0 means the stated term has ALREADY ended and is valid with any balance. From 1 up, balance must be clearable within the stated term.\n- min_payment_order: OPTIONAL on every type. Values: 1 or more; breaks a tie only between segments sharing both the same current APR and the same installment-plan status.\n- extra_payment_order: OPTIONAL on every type. Values: 0 or more; 0 means skip. Breaks a tie only between segments sharing the exact same current APR.\n- merchant_name: OPTIONAL on installment_plan; IGNORED on purchase, cash_advance, balance_transfer, promotional. Values: 120 characters or fewer.\n- monthly_spend: OPTIONAL on purchase; REJECTED on cash_advance, balance_transfer, promotional, installment_plan. Values: $0 to $50,000 per month. A negative value is rejected as NEGATIVE_BALANCE on every type, purchase included. On every type other than purchase a POSITIVE value is rejected with FIELD_NOT_ALLOWED_HERE; an explicit 0 is accepted.\n- stop_spend_month: OPTIONAL on purchase; IGNORED on cash_advance, balance_transfer, promotional, installment_plan. Values: 0 or more; range checked on every type, read only on purchase."}, 'apr_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual percentage rate for this segment, 0 to 100, e.g. 24.99 not 0.2499. Required when balance is greater than 0 on purchase, cash_advance, balance_transfer and promotional. On cash_advance it must be greater than 0 whenever a balance is carried. Must be 0 on installment_plan, which uses monthly_fee instead, so omitting it there is the correct shape.'}, 'balance': {'type': 'number', 'description': 'Segment balance in dollars, $0 to $1,000,000,000. REQUIRED on every segment type: an omitted balance would silently report a $0, 0-month payoff, so it is rejected instead. An explicit 0 is valid, for example a paid-off balance_transfer segment kept for schedule continuity.'}, 'monthly_fee': {'type': ['number', 'null'], 'default': None, 'description': "Fixed fee charged each month while an installment plan's term is active, $0 or more and no greater than plan_payment_due. Optional on installment_plan. On every other type a positive value is rejected with FIELD_NOT_ALLOWED_HERE, while 0 and a negative value are accepted and dropped."}, 'merchant_name': {'type': ['string', 'null'], 'default': None, 'description': "Label for an installment plan's merchant, 120 characters or fewer. Optional on installment_plan, ignored on every other type."}, 'monthly_spend': {'type': ['number', 'null'], 'default': None, 'description': 'Recurring monthly purchase amount posted to this segment before interest accrues, $0 to $50,000 per month. Optional on purchase. A negative value is rejected as NEGATIVE_BALANCE on every type. On every type other than purchase a positive value is rejected with FIELD_NOT_ALLOWED_HERE, since those balances do not accept new purchases; an explicit 0 is accepted.'}, 'revert_apr_pct': {'type': ['number', 'null'], 'default': None, 'description': "Rate this segment reverts to once its promo expires, 0 to 100, and at least apr_pct. Required on balance_transfer and promotional. Ignored on purchase and cash_advance. Rejected on installment_plan with FIELD_NOT_ALLOWED_HERE: an expired plan's residual keeps its existing rate rather than repricing."}, 'plan_payment_due': {'type': ['number', 'null'], 'default': None, 'description': 'Locked monthly payment for an installment plan, principal plus monthly_fee. Required on installment_plan, greater than $0, at least monthly_fee, and no more than $1,000,000,000. On every other type a positive value is rejected with FIELD_NOT_ALLOWED_HERE, while 0 and a negative value are accepted and dropped.'}, 'stop_spend_month': {'type': ['integer', 'null'], 'default': None, 'description': 'Month index at which recurring spend stops, 0 or more. Read on purchase only, and range checked on every type. Omit to spend for the whole projection.'}, 'min_payment_order': {'type': ['integer', 'null'], 'default': None, 'description': "Minimum-payment tie-break priority, 1 or more. Optional on every type. The minimum first pays any installment_plan's locked plan_payment_due in full, then the lowest-current-APR segment; this value only breaks a tie between segments sharing both the same current APR and the same installment-plan status."}, 'remaining_payments': {'type': ['integer', 'null'], 'default': None, 'description': "Payments left in an installment plan's stated term, 0 or more. Optional on installment_plan, ignored on every other type. 0 means the term has ALREADY ended and is valid with any balance, including a positive residual. From 1 up, the balance must be clearable within the stated term and must not be clearable a month early."}, 'extra_payment_order': {'type': ['integer', 'null'], 'default': None, 'description': 'Extra-payment tie-break priority, 0 or more, where 0 means this segment never receives extra payment. Optional on every type, and the default for installment_plan. Only breaks a tie between segments sharing the exact same current APR, since the Credit CARD Act (TILA §164(b), 15 U.S.C. §1666c(b)) / 12 CFR 1026.53(a) always pays the highest-current-APR segment first regardless of this value.'}, 'promo_expires_month': {'type': ['integer', 'null'], 'default': None, 'description': 'Month at which apr_pct flips to revert_apr_pct, 1 to 480. Required on balance_transfer and promotional. Ignored on purchase, cash_advance and installment_plan.'}}}, 'description': "Per-segment breakdown of this card's balances. Optional; when it carries at least one segment it SUPERSEDES purchase_balance and cash_advance_balance, and a POSITIVE value in either of those is rejected. An empty segments[] is treated as absent, so purchase_balance is then required. At most 100 segments across the whole request. Per card, per type: 1 purchase, 1 cash_advance, 5 balance_transfer, 1 promotional, 10 installment_plan. Each item carries its own type, balance, rate and payment priority; see the type field on the item for the per-type field matrix."}, 'annual_fee': {'type': ['number', 'null'], 'description': 'Annual fee in dollars, $0 to $1,000,000,000. Optional; defaults to 0. Charged at month 1 and every twelfth month after, while the card carries a balance.'}, 'monthly_spend': {'type': ['number', 'null'], 'description': "Recurring monthly purchase amount charged to this card's purchase balance before interest accrues, $0 to $50,000 per month. Optional; defaults to 0. Use the segment-level monthly_spend instead when supplying segments[]."}, 'minimum_payment': {'type': ['number', 'null'], 'description': "Minimum payment in dollars, $0 to $1,000,000,000 (optional, omit or set 0 to auto-calculate). Where it binds, the card is locked at max(minimum_payment, that card's issuer minimum computed at month 1), and that locked amount is paid every month. On calculate_cc_payoff it binds ONLY when fixed_payments = true; on the DEFAULT path (fixed_payments = false) it is NOT used, because the plan recomputes each card's issuer minimum from its current balance every month, and the response discloses that as MINIMUM_PAYMENT_NOT_BINDING. On compare_payoff_strategies there is no fixed_payments parameter and supplying one is rejected: the avalanche and snowball arms ALWAYS run locked, so the value DOES bind and moves both arms, while the minimum-payments-only baseline always recomputes and ignores it, disclosed as MINIMUM_PAYMENT_NOT_BINDING_IN_BASELINE."}, 'purchase_apr_pct': {'type': ['number', 'null'], 'maximum': 100, 'minimum': 0, 'description': 'Purchase APR as a percentage, 0 to 100, e.g. 24.99 not 0.2499. Required when purchase_balance is greater than 0: an omitted APR would silently compute $0 interest.'}, 'purchase_balance': {'type': ['number', 'null'], 'description': 'Purchase balance in dollars, $0 to $1,000,000,000. Required unless segments[] carries at least one segment: an omitted purchase_balance would silently report a $0, 0-month payoff. Supplying a POSITIVE value alongside a non-empty segments[] is rejected, since the two would be competing sources for the same balance. An explicit 0 is accepted.'}, 'stop_spend_month': {'type': ['integer', 'null'], 'description': "Month index at which this card's recurring spend stops, 0 or more. Optional; omit to spend for the whole projection."}, 'plan_fees_monthly': {'type': ['number', 'null'], 'description': 'Recurring monthly card fee in dollars, $0 to $1,000,000,000, e.g. a pay-over-time plan fee. Optional; defaults to 0. Charged every month while the card carries a balance.'}, 'cash_advance_apr_pct': {'type': ['number', 'null'], 'description': 'Cash advance APR as a percentage, greater than 0 and up to 100. Required when cash_advance_balance is greater than 0: cash advances have no promotional 0% product, so a 0% rate on a real advance balance is a data-entry error.'}, 'cash_advance_balance': {'type': ['number', 'null'], 'description': 'Cash advance balance in dollars, $0 to $1,000,000,000. Optional; defaults to 0 when omitted. A POSITIVE value alongside a non-empty segments[] is rejected, the same way purchase_balance is. An explicit 0 is accepted.'}}}, 'maxItems': 20, 'description': 'Credit cards to pay off, 1 to 20. Required: omitting the field answers contract_error MISSING_REQUIRED_FIELD, while an explicit JSON null answers parse_error ("cards is required and must be an array."); the two are not the same rejection. Every card may carry segments[]. Max 100 segments total across all cards in the request. Per-card, per-type caps: 1 purchase, 1 cash_advance, 5 balance_transfer, 1 promotional, 10 installment_plan.'}, 'output': {'enum': ['summary', 'inline', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default), 'inline'. summary returns a compact response with a data_preview block; inline returns the full payload."}, 'strategy': {'enum': ['avalanche', 'snowball', None], 'type': ['string', 'null'], 'default': None, 'description': "Payoff order: 'avalanche' pays the highest APR first, 'snowball' the smallest balance first. Optional; defaults to 'avalanche' when omitted. Matched case-insensitively, and the response echoes the canonical lowercase form actually simulated."}, 'windfalls': {'type': ['array', 'null'], 'items': {'type': ['object', 'null'], 'properties': {'label': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Optional label for this windfall, e.g. 'Tax refund' or 'Year-end bonus'. Max 120 characters."}, 'month': {'type': ['integer', 'null'], 'description': "Month index the windfall is applied, 0 or more. 0 means applied before month 1's interest; N >= 1 applies at the end of calendar month N. Required per entry."}, 'amount': {'type': ['number', 'null'], 'description': 'Dollar amount of the windfall, greater than 0. Required per entry.'}}}, 'default': None, 'maxItems': 12, 'description': 'One-time principal payments, at most 12, e.g. a tax refund or a year-end bonus. Optional; a JSON null is treated as omitted. When non-empty the response gains baseline, with_windfalls, months_saved_vs_baseline, interest_saved_vs_baseline, windfalls_applied[] and windfalls_unused[]; an empty array returns the same shape as omitting it.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Optional; must not contain an em dash or en dash. Max 120 characters.'}, 'per_segment': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether each schedule row carries its per-segment breakdown. Optional; defaults to true when omitted.'}, 'full_schedule': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to return the full per-card month-by-month schedule. Optional; defaults to false when omitted. The per-card monthly_schedule is capped at 1000 rows total across cards and months, so later months are omitted on a long multi-card payoff; the portfolio-level monthly_totals series is always complete and is the one to read for the whole timeline.'}, 'apply_rate_cap': {'type': ['boolean', 'null'], 'default': None, 'description': "Whether to cap each card's APR at the regulatory ceiling before simulating. Optional; defaults to false when omitted."}, 'fixed_payments': {'type': ['boolean', 'null'], 'default': None, 'description': "Whether to hold each card's payment constant for the whole payoff. Optional; defaults to false when omitted. When true, each card's payment is locked at max(cards[].minimum_payment, that card's issuer minimum computed at month 1), and the total monthly budget (those locked amounts plus extra_monthly_payment) is held constant for the whole payoff, so once a card is paid off its freed-up payment rolls forward onto the remaining cards. This is the ONLY mode in which cards[].minimum_payment affects calculate_cc_payoff's result; compare_payoff_strategies has no fixed_payments parameter and binds minimum_payment on both of its strategy arms regardless."}, 'extra_monthly_payment': {'type': ['number', 'null'], 'default': None, 'description': 'Extra monthly payment in dollars, $0 to $1,000,000,000, applied on top of the required minimums. Optional; defaults to 0 when omitted.'}, 'include_card_timeline': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to add the card_timeline block, a per-card view of when each card clears. Optional; defaults to false when omitted.'}}}
入力スキーマ
{'type': 'object', 'required': ['principal', 'annual_rate_pct', 'years'], 'properties': {'years': {'type': 'integer', 'description': 'Time horizon in years. Integer, at least 1. REQUIRED, no default.'}, 'principal': {'type': 'number', 'maximum': 1000000000, 'description': 'Starting balance. Decimal, at least 0. REQUIRED, no default.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'annual_rate_pct': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'Annual interest rate as a percentage, e.g. 7 not 0.07. Decimal from 0 to 100. REQUIRED, no default.'}, 'rate_convention': {'enum': ['nominal', 'real', None], 'type': ['string', 'null'], 'default': None, 'description': "'nominal' or 'real'. 'real' unconditionally suppresses the inflation overlay; use when annual_rate_pct is already inflation-adjusted. Optional; defaults to 'nominal' when omitted."}, 'compounds_per_year': {'type': ['integer', 'null'], 'default': None, 'description': 'Compounding periods per year. Integer, greater than 0. Optional; defaults to 12 when omitted.'}, 'inflation_rate_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Inflation rate as a percentage. Decimal: -1 (deprecated suppress, same as 0), 0 (no real-value overlay), or greater than 0 and less than 100 (explicit percentage, e.g. 3.5). Optional; defaults to 0 when omitted.'}, 'monthly_contribution': {'type': ['number', 'null'], 'default': None, 'description': 'Additional contribution added each month. Decimal, at least 0. Optional; defaults to 0 when omitted.'}, 'apply_default_inflation': {'type': ['boolean', 'null'], 'default': None, 'description': "When true and inflation_rate_pct is 0, auto-selects inflation via MacroeconomicDefaults.ForHorizon. Ignored when inflation_rate_pct is greater than 0 or rate_convention is 'real'. Optional; defaults to false when omitted."}}}
入力スキーマ
{'type': 'object', 'properties': {'family_size': {'type': ['integer', 'null'], 'default': None, 'maximum': 20, 'description': 'Household size for the VA residual income guideline. Supply family_size and property_state together, or neither. Optional; must be between 1 and 20.'}, 'hoa_monthly': {'type': ['number', 'null'], 'default': None, 'description': 'Monthly homeowners association dues in dollars. Optional; defaults to 0 when omitted. Must be zero or more.'}, 'pmi_monthly': {'type': ['number', 'null'], 'default': None, 'description': 'Monthly PMI (private mortgage insurance) in dollars. Optional; if omitted, auto-estimated at 0.5% of the loan annually when loan-to-value exceeds 80%. Feeds the conventional-basis PITI, so it moves with_proposed.front_end_dti, with_proposed.back_end_dti, with_proposed.front_end_breakdown, the conventional qualification row, and what_if.scenarios[].new_front_end_dti and new_back_end_dti. VA carries no PMI, and FHA and USDA always compute their own upfront-plus-annual mortgage insurance instead, at every loan-to-value, never this override. Must be zero or more.'}, 'annual_income': {'type': ['number', 'null'], 'default': None, 'minimum': 0.01, 'description': 'Annual gross income in dollars, divided by 12 to get monthly income. Exactly one of gross_monthly_income or annual_income is required. Must be at least $0.01, one cent, the smallest amount of money.'}, 'proposed_debt': {'type': ['object', 'null'], 'default': None, 'properties': {'name': {'type': ['string', 'null'], 'maxLength': 120, 'description': 'Optional label for this proposed debt. At most 120 characters.'}, 'type': {'enum': ['credit_card', 'auto', 'student', 'personal', 'mortgage', 'heloc', 'child_support', 'other', None], 'type': ['string', 'null'], 'description': "Debt type: 'auto', 'student', 'credit_card', 'personal', 'mortgage', 'heloc', 'child_support', or 'other'. Optional, defaults to 'mortgage' when omitted; an unrecognized value is rejected."}, 'monthly_payment': {'type': ['number', 'null'], 'description': 'Monthly payment in dollars. Required; must be positive.'}, 'includes_tax_insurance': {'type': ['boolean', 'null'], 'description': "Whether monthly_payment already includes tax and insurance. Optional, defaults to true when omitted; if false and type is 'mortgage', warns that lenders use full PITI for DTI."}}, 'description': 'A proposed new debt, as an alternative to proposed_home_price. Provide at most one of proposed_debt or proposed_home_price; providing neither computes the current DTI only. Optional; a JSON null is treated as omitted, the same as leaving the field out.'}, 'existing_debts': {'type': ['array', 'null'], 'items': {'type': ['object', 'null'], 'properties': {'name': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Optional label for this debt, e.g. 'Car Loan'. At most 120 characters."}, 'type': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Debt type: 'auto', 'student', 'credit_card', 'personal', 'mortgage', 'heloc', 'child_support', or 'other'. Optional, defaults to 'other' when omitted. An unrecognized value of at most 120 characters warns rather than rejects; a longer one is rejected."}, 'apr_pct': {'type': ['number', 'null'], 'description': 'Annual percentage rate, as a percentage (0-100), e.g. 18.5 for 18.5%. Optional.'}, 'balance': {'type': ['number', 'null'], 'description': 'Current balance in dollars. Optional; used for payoff cost analysis in what-if scenarios.'}, 'monthly_payment': {'type': ['number', 'null'], 'description': 'Monthly payment in dollars. Required per debt; must be positive.'}, 'months_remaining': {'type': ['integer', 'null'], 'description': 'Months remaining on this debt. Optional; used for the 10-month rule exclusion.'}}}, 'default': None, 'maxItems': 50, 'description': 'Existing debts to include in the DTI calculation. Optional; omit it or send an empty array for no existing debts. A JSON null is rejected; omit the field instead. At most 50 debts are allowed.'}, 'property_state': {'type': ['string', 'null'], 'default': None, 'description': "Two-letter USPS state code, or 'DC'/'PR'/'GU'/'VI'/'AS'/'MP'. Supply family_size and property_state together, or neither. Together these compute the VA residual income guideline (38 CFR 36.4340(e)) in va_residual_income_guideline: the dollar amount VA's tables require for this family size, region, and loan amount (derived from proposed_home_price; not computable without it), plus the 38 CFR 36.4340(c)(3) review-waiver figure. Computed only for family_size 1-7 and a property_state among the 50 states, DC, or PR (not GU, VI, AS, or MP; 38 CFR 36.4340(e) assigns no region to those four); outside those bounds, or without proposed_home_price, va_residual_income_guideline.status reads 'not_computable' with the reason instead. This block alone is a LOOKUP, not a verdict: it never compares against your actual residual income by itself. Optional."}, 'include_what_if': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to generate what-if scenarios showing how paying off a debt, increasing income, or reducing the home price would improve DTI. Optional; defaults to true when omitted.'}, 'additional_income': {'type': ['number', 'null'], 'default': None, 'description': 'Additional monthly income: side income, rental income, or bonuses. Optional; defaults to 0 when omitted. Must be zero or more.'}, 'proposed_rate_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Proposed mortgage interest rate as a percent, e.g. 7.0 for 7.0%. Optional; the 7.0% default applies whenever this field is omitted, whether the proposal is proposed_debt or proposed_home_price. The default-rate warning fires only when proposed_home_price is used. Must be between 0 and 20.'}, 'property_tax_annual': {'type': ['number', 'null'], 'default': None, 'description': 'Annual property tax in dollars. Optional; if omitted, estimated at 0.88% of the proposed home price. Must be zero or more.'}, 'proposed_home_price': {'type': ['number', 'null'], 'default': None, 'minimum': 0.01, 'description': 'Proposed home purchase price in dollars. Provide at most one of proposed_debt or proposed_home_price; providing neither computes the current DTI only. Auto-calculates full PITI (principal, interest, taxes, insurance). Optional; must be at least $0.01, one cent, the smallest amount of money.'}, 'proposed_term_years': {'type': ['integer', 'null'], 'default': None, 'description': 'Proposed mortgage term in years. Optional; defaults to 30 when omitted. Must be between 1 and 40.'}, 'transaction_purpose': {'enum': ['purchase', 'refinance', 'streamlined_assist', None], 'type': ['string', 'null'], 'default': None, 'description': "Mortgage transaction purpose: 'purchase', 'refinance', or 'streamlined_assist'. Optional, defaults to 'purchase' when omitted. Affects USDA only, and only what is disclosed. USDA's 32% PITI and 44% Total Debt figures are purchase-transaction waiver conditions (HB-1-3555 11.3.A.2), disclosed rather than applied as ceilings: Senaro cannot observe how the file is underwritten, so a USDA ratio overage is never 'ineligible' on any transaction purpose. For a refinance, 11.3.B states debt ratios 'are not limited to the maximum purchase debt ratio thresholds', so where the note fires it names both figures and states that neither applies. Streamlined-assist refinances require no debt ratio calculation at all. Conventional, FHA and VA are unaffected."}, 'gross_monthly_income': {'type': ['number', 'null'], 'default': None, 'minimum': 0.01, 'description': 'Gross monthly income in dollars. Exactly one of gross_monthly_income or annual_income is required. Must be at least $0.01, one cent, the smallest amount of money.'}, 'home_insurance_annual': {'type': ['number', 'null'], 'default': None, 'description': 'Annual home insurance in dollars. Optional; if omitted, estimated at 0.65% of the proposed home price. Must be zero or more.'}, 'proposed_down_payment_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Down payment as a percent of the proposed home price, e.g. 20 for 20%. Optional; defaults to 20 when omitted. Must be between 0 and 99.9 (100% cash purchases are not supported).'}, 'va_funding_fee_financed_monthly': {'type': ['number', 'null'], 'default': None, 'description': "The additional monthly payment from financing a VA funding fee into the loan balance, if any. 38 CFR 36.4313(e)'s applicable percentage depends on down payment, prior VA-loan use, and service category, none of which Senaro collects, so there is no default. If omitted while any VA figure that depends on it is produced, meaning qualification.va.your_back_end and its verdict, any what_if VA ratio, what_if.max_affordable_home.va, or qualification.va.residual_income_comparison, a VA_FUNDING_FEE_NOT_MODELED warning discloses that no fee is assumed. The home-price-reduction what_if scenario's hypothetical price is fixed before the fee is considered, so a supplied fee is scaled to that EXACT hypothetical loan size, since 38 CFR 36.4313(e)'s fee is a percentage of loan principal. what_if.max_affordable_home.va is a two-pass approximation instead, so its supplied fee is scaled to an ESTIMATE of the hypothetical loan size, not the exact figure reported; the published price itself passes an exact forward VA check under 38 CFR 36.4340(d) with that reserved fee, and one dollar more fails it, so only this fee-scaling step is approximate. Without proposed_home_price there is no reference loan size to scale from either way, so the raw fee is reserved unscaled instead, and a VA_FUNDING_FEE_NOT_SCALED warning discloses it. This is mutually exclusive with VA_FUNDING_FEE_NOT_MODELED by construction, since one requires the fee omitted and the other requires it supplied. Optional; must be zero or more."}, 'monthly_maintenance_and_utilities': {'type': ['number', 'null'], 'default': None, 'description': "Estimated monthly maintenance and utilities for the proposed property. 38 CFR 36.4340 calls for a realistic estimate of this figure for the property and local utility rates and sets no numeric multiplier itself, but VA underwriting guidance (the Lender's Handbook, Pamphlet 26-7) publishes a per-square-foot multiplier for this same estimate. Applying it needs the property's square footage, which this tool does not currently collect, so Senaro has no default to offer here and you supply the aggregate monthly amount instead. Supplying BOTH this field and monthly_taxes_and_retirement_withholding, together with proposed_home_price and a computable family_size/property_state, computes qualification.va.residual_income_comparison: your ACTUAL monthly residual income, its ratio to the va_residual_income_guideline figure, and whether residual_income_meets_review_waiver_margin (residual income at or above 120% of the guideline) is met. The shelter expense used here excludes any PMI (VA loans carry no monthly PMI; 38 CFR 36.4313(e) sets a funding fee instead, commonly financed into the loan; see va_funding_fee_financed_monthly for the financed-fee field). 38 CFR 36.4340(c)(3)'s review-waiver condition is CONJUNCTIVE: it also requires the back-end debt-to-income ratio, rounded to a whole percent under 38 CFR 36.4340(d) (qualification.va.your_back_end_compared), to exceed 41%, which this field does not by itself confirm. Check both fields together. Even when both hold, (c)(3) only WAIVES a second-level review requirement; it is not itself an approval. Whether this file is actually approved is an underwriting determination Senaro does not make and no input combination here determines. Missing any one of the needed inputs reads qualification.va.residual_income_comparison.status 'not_computable' with every reason named. Optional; must be zero or more."}, 'monthly_taxes_and_retirement_withholding': {'type': ['number', 'null'], 'default': None, 'description': 'Your federal, state, and FICA tax withholding, plus any amount paid or withheld for retirement, monthly. 38 CFR 36.4340(f)(13) treats these as one class of deduction from gross income. Optional; must be zero or more.'}}}
入力スキーマ
{'type': 'object', 'required': ['monthly_essential_expenses'], 'properties': {'dependents': {'type': ['integer', 'null'], 'default': None, 'description': 'Number of dependents. Integer from 0 to 20. +1 target month per dependent, capped at +3. Optional; defaults to 0 when omitted.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'job_stability': {'enum': ['stable_w2', 'variable_income', 'self_employed', 'between_jobs', None], 'type': ['string', 'null'], 'default': None, 'description': "'stable_w2' | 'variable_income' | 'self_employed' | 'between_jobs'. Drives the target-months multiplier: stable_w2 salaried W-2 with consistent paycheck (+0 months); variable_income W-2 with commission/bonus/shift-based pay (+1 month); self_employed 1099 contractor/freelancer/sole proprietor (+3 months); between_jobs actively job hunting, no current paycheck (+5 months). Optional; defaults to 'stable_w2' when omitted."}, 'current_savings': {'type': ['number', 'null'], 'default': None, 'description': 'What you have in liquid emergency-accessible savings today. Decimal from 0 to $1,000,000,000. Optional; defaults to 0 when omitted.'}, 'has_dual_income': {'type': ['boolean', 'null'], 'default': None, 'description': 'When true, partner income reduces the buffer by 1 month. Optional; defaults to false when omitted.'}, 'monthly_savings_capacity': {'type': ['number', 'null'], 'default': None, 'description': 'What you can contribute toward the gap each month. Drives months_to_target. Decimal, either 0 or from $0.01 to $1,000,000,000. Optional; defaults to 0 when omitted.'}, 'monthly_essential_expenses': {'type': 'number', 'minimum': 0.01, 'description': 'Rent/mortgage + utilities + food + insurance + minimum debt payments. NOT discretionary spending. Decimal from $0.01 to $1,000,000,000. REQUIRED, no default.'}}}
入力スキーマ
{'type': 'object', 'required': ['principal', 'annual_rate_pct', 'term_months'], 'properties': {'output': {'enum': ['summary', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default). 'summary' returns the full payload including analysis.buckets[] inline."}, 'loan_type': {'enum': ['personal', 'auto', 'student', 'mortgage', None], 'type': ['string', 'null'], 'default': None, 'description': "'personal', 'auto', 'student', or 'mortgage'. Optional; defaults to 'personal' when omitted."}, 'principal': {'type': 'number', 'description': 'Loan principal to amortize. Decimal, greater than 0. REQUIRED, no default.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'term_months': {'type': 'integer', 'maximum': 480, 'description': 'Loan term. Integer, greater than 0. REQUIRED, no default.'}, 'chart_bucket': {'enum': ['auto', 'monthly', 'quarterly', 'yearly', 'biennial', None], 'type': ['string', 'null'], 'default': None, 'description': "Time-axis granularity of analysis.buckets[]: 'auto', 'monthly', 'quarterly', 'yearly', or 'biennial'. Optional; defaults to 'auto', which selects by term length (<=24 months: monthly; <=60: quarterly; <=360: yearly; else biennial)."}, 'annual_rate_pct': {'type': 'number', 'description': 'Loan annual percentage rate, e.g. 6.5 not 0.065. Decimal from 0 to 100. REQUIRED, no default.'}, 'extra_monthly_payment': {'type': ['number', 'null'], 'default': None, 'description': 'Extra principal paid each month beyond the regular payment. Decimal, at least 0. Optional; defaults to 0 when omitted.'}}}
入力スキーマ
{'type': 'object', 'required': ['monthly_spending', 'annual_return_pct', 'years'], 'properties': {'label': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': "What the spending is, e.g. 'coffee' or 'streaming subscriptions'. Optional. Max 120 characters."}, 'years': {'type': 'integer', 'description': 'Time horizon in years. Integer, greater than 0. REQUIRED, no default.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'tax_bracket_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Tax bracket as a percentage, applied as a flat haircut to the investment gain. Decimal from 0 to 100. Optional.'}, 'monthly_spending': {'type': 'number', 'minimum': 0.01, 'description': 'Monthly spending to price against investing. Decimal, at least $0.01. The opportunity cost of spending $0 is degenerate and is rejected. REQUIRED, no default.'}, 'annual_return_pct': {'type': 'number', 'description': 'Effective annual investment return, e.g. 8 not 0.08; the monthly compounding step is (1+pct/100)^(1/12)-1. Decimal from 0 to 100. REQUIRED, no default.'}}}
入力スキーマ
{'type': 'object', 'required': ['current_balance', 'current_annual_rate_pct', 'remaining_term_months', 'new_annual_rate_pct', 'new_term_months'], 'properties': {'points': {'type': ['number', 'null'], 'default': None, 'description': 'Discount points paid at closing, where 1.0 means 1% of the loan. Decimal from 0 to 4. Optional; defaults to 0 when omitted.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Reserved for the chart pipeline; validated but not yet used. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'closing_costs': {'type': ['number', 'null'], 'default': None, 'description': 'Explicit closing costs in dollars, excluding points; total upfront cost is closing_costs plus the points cost. Decimal from 0 to 1,000,000,000. Optional; omitting it uses the cited default of 0.67% of the loan (LodeStar 2026). An IMMEDIATE break-even requires total upfront cost to be zero (or non-positive) AND monthly_savings to be non-negative, i.e. closing_costs AND points both 0, not closing_costs alone; a zero-total-cost refi into a worse deal (negative monthly_savings) reports NEAR_ZERO_OR_NEGATIVE_SAVINGS instead.'}, 'current_balance': {'type': 'number', 'description': 'Outstanding principal you would refinance. Decimal, greater than 0 and at most 1,000,000,000. REQUIRED, no default.'}, 'new_term_months': {'type': 'integer', 'maximum': 480, 'description': 'The new loan term in months. Integer from 1 to 480. REQUIRED, no default.'}, 'new_annual_rate_pct': {'type': 'number', 'description': 'The offered refinance rate as a percentage. Decimal from 0 to 20. REQUIRED, no default.'}, 'roll_costs_into_loan': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether closing costs and points are added to the new principal instead of paid upfront; cash-flow break-even then reports COSTS_ROLLED_INTO_LOAN. Optional; defaults to false when omitted.'}, 'investment_return_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual return used for the economic (invest-the-savings) break-even, an EFFECTIVE ANNUAL rate; the monthly compounding step is (1+pct/100)^(1/12)-1. Decimal from 0 to 30. Optional; omitting it uses the cited long-run S&P 500 nominal total-return default, about 10%; call list_defaults for the exact current value.'}, 'remaining_term_months': {'type': 'integer', 'description': 'Months left on the current loan. Integer from 1 to 480. REQUIRED, no default.'}, 'current_annual_rate_pct': {'type': 'number', 'description': "Current loan's annual rate as a percentage, e.g. 6.5 not 0.065. Decimal from 0 to 20. REQUIRED, no default."}, 'current_monthly_payment': {'type': ['number', 'null'], 'default': None, 'description': 'Your actual statement P&I payment. Decimal, greater than 0 and at most 1,000,000,000. Optional; when supplied it overrides the formula-derived payment, so match your statement.'}, 'compute_economic_break_even': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to compute the economic (net-worth crossover) break-even. When false, only the cash-flow break-even and interest delta are returned, and economic_break_even reports NOT_REQUESTED. Optional; defaults to true when omitted.'}}}
入力スキーマ
{'type': 'object', 'required': ['current_savings', 'monthly_essential_expenses'], 'properties': {'output': {'enum': ['summary', 'inline', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default), 'inline'. 'summary' returns headline scalars (depletion month or does-not-deplete) and citations with the schedule stripped. 'inline' returns the full payload including the month-by-month schedule[] for chart rendering."}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Reserved for the chart pipeline; validated but not yet used. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'current_savings': {'type': 'number', 'description': 'Liquid fund available to draw down. Decimal from 0 to 1,000,000,000; 0 is valid (an already-empty fund). REQUIRED, no default.'}, 'monthly_inflows': {'type': ['number', 'null'], 'default': None, 'description': 'Ongoing monthly income that continues during the drawdown (partner income, side income, unemployment benefit, severance paid monthly), modeled as a flat monthly stream; a one-time severance lump and time-limited benefits are not modeled in v1. Decimal from 0 to 1,000,000,000. Optional; defaults to 0 when omitted.'}, 'use_essential_expenses': {'type': ['boolean', 'null'], 'default': None, 'description': 'Expense basis: true means essential-only spending (survival runway), false means total spending (current-pace runway). Labels the reported expense_basis. Optional; defaults to true when omitted.'}, 'annual_inflation_rate_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual expense-inflation rate as a percentage. When greater than 0, expenses grow each month by the monthly equivalent of this annual rate; when 0, expenses are constant. Decimal, at least 0 and less than 100. Optional; defaults to 0 when omitted.'}, 'monthly_essential_expenses': {'type': 'number', 'description': 'Monthly outflow at the chosen expense basis. Decimal, greater than 0 and at most 1,000,000,000. REQUIRED, no default.'}}}
入力スキーマ
{'type': 'object', 'required': ['cards', 'consolidation_loan'], 'properties': {'cards': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Card label, e.g. 'Chase Sapphire'. Optional; a card without a name is auto-numbered ('Card 1', 'Card 2', ...). Max 120 characters."}, 'minimum_payment': {'type': ['number', 'null'], 'description': 'Minimum payment in dollars, $0 to $1,000,000,000. Optional; 0 or omitted auto-calculates the bank minimum. Used as the locked floor for the constant keep-cards payment: each card pays max(your minimum, the bank minimum), held constant and rolled forward as cards clear.'}, 'purchase_apr_pct': {'type': ['number', 'null'], 'description': 'Purchase APR as a percentage, 0-100, e.g. 22.99. Required per card.'}, 'purchase_balance': {'type': ['number', 'null'], 'description': 'Purchase balance in dollars, $0 to $1,000,000,000. Required per card.'}, 'cash_advance_apr_pct': {'type': ['number', 'null'], 'description': 'Cash advance APR as a percentage, greater than 0, up to 100. Required when cash_advance_balance is greater than 0.'}, 'cash_advance_balance': {'type': ['number', 'null'], 'description': 'Cash advance balance in dollars, $0 to $1,000,000,000. Optional; defaults to 0 when omitted.'}}}, 'description': 'Credit cards to include, 1 to 20. Required: omitting the field answers contract_error MISSING_REQUIRED_FIELD, while an explicit JSON null answers parse_error ("cards must be a JSON array."); the two are not the same rejection. segments and stop_spend_month are not supported by this tool and are rejected; a non-zero monthly_spend, annual_fee, or plan_fees_monthly is rejected too, but zero (including an explicit 0) is accepted and dropped for all three: this tool always reads the flat purchase_balance / cash_advance_balance fields on each card below, never segments[] balances, and card-level fees and ongoing spend are not modeled here. Those five fields are supported by calculate_cc_payoff and compare_payoff_strategies instead.'}, 'output': {'enum': ['summary', 'inline', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default), 'inline'. summary: compact response with a data_preview block; no heavy array exists on this response today, so summary and inline are currently identical in content. inline: full payload (currently identical to summary; will diverge once a heavy array is added for chart rendering)."}, 'bt_offers': {'type': ['array', 'null'], 'items': {'type': ['object', 'null'], 'properties': {'label': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Label for this offer. Optional; defaults to '<apr_pct>% / <promo_months>mo' when omitted. Max 120 characters."}, 'apr_pct': {'type': ['number', 'null'], 'maximum': 100, 'minimum': 0, 'description': 'Offer APR as a percentage, 0-100, e.g. 0 for a 0% promo. Required per offer.'}, 'fee_pct': {'type': ['number', 'null'], 'description': 'Balance-transfer fee for this offer, as a percentage of the transferred balance, 0-10. Optional; defaults to 3.0 when omitted.'}, 'promo_months': {'type': ['integer', 'null'], 'description': "This offer's promo period in months, 1-60. Optional; defaults to 18 when omitted."}, 'regular_apr_pct': {'type': ['number', 'null'], 'description': "APR that applies after this offer's promo period ends, as a percentage, 0-100. Optional; defaults to 25.20 when omitted."}}}, 'default': None, 'maxItems': 10, 'description': 'Balance-transfer offers to compare head-to-head, 1 to 10, preferred over the four scalar bt_* fields above when comparing two or more offers: when supplied, bt_offers overrides bt_apr_pct, bt_promo_months, bt_regular_apr_pct, and bt_fee_pct, and their range checks are skipped. The response includes a balance_transfer_offers block with per-offer simulation results, selected_offer_index, selected_offer_label, selected_offer_reason, and all_offers_trap. Optional; a JSON null is rejected, unlike bt_manual_transfers and windfalls below, where a JSON null is treated as omitted.'}, 'windfalls': {'type': ['array', 'null'], 'items': {'type': ['object', 'null'], 'properties': {'label': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Optional label for this windfall, e.g. 'Tax refund' or 'Year-end bonus'. Max 120 characters."}, 'month': {'type': ['integer', 'null'], 'description': "Month index the windfall is applied, 0 or more. 0 means applied before month 1's interest; N >= 1 applies at the end of calendar month N. Required per entry."}, 'amount': {'type': ['number', 'null'], 'description': 'Dollar amount of the windfall, greater than 0. Required per entry.'}}}, 'default': None, 'description': 'One-time principal payments, at most 12, same shape as calculate_cc_payoff. Optional; a JSON null is treated as omitted, the same as leaving the field out. When non-empty, the response adds windfalls_applied[] and windfalls_unused[] on keep_cards, on each balance_transfer scenario (and on each offer in balance_transfer_offers.offers[]), on consolidation_loan (single-row per windfall since the loan is a single-balance instrument), and on optimized_consolidation.keep_subset. All scenarios use with-windfalls totals so cross-option ranking stays apples-to-apples, except what_if.same_budget_accelerated, a windfall-free hypothetical about extra-payment behavior, not your actual lump-sum schedule.'}, 'bt_apr_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Balance-transfer APR as a percentage, 0-100, e.g. 0 for a 0% promo. Required when include_balance_transfer is true and bt_offers is omitted. bt_offers, when supplied, overrides this and the other three bt_* scalars below. The 0-100 range applies only when include_balance_transfer is true and bt_offers is omitted; a non-number is rejected in every case.'}, 'bt_fee_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Balance-transfer fee as a percentage of the transferred balance, 0-10. Optional; defaults to 3.0 when omitted. bt_offers, when supplied, overrides this. The 0-10 range applies only when include_balance_transfer is true and bt_offers is omitted; a non-number is rejected in every case.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Optional; must not contain an em dash or en dash. Max 120 characters.'}, 'full_schedule': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to return the full month-by-month amortization schedule instead of the compact default. Optional; defaults to false when omitted.'}, 'bt_promo_months': {'type': ['integer', 'null'], 'default': None, 'description': 'Balance-transfer promo period in months, 1-60. Optional; defaults to 18 when omitted. bt_offers, when supplied, overrides this. The 1-60 range applies only when include_balance_transfer is true and bt_offers is omitted; a non-number is rejected in every case.'}, 'current_strategy': {'enum': ['avalanche', 'snowball', None], 'type': ['string', 'null'], 'default': None, 'description': "Your current payoff strategy, compared against the consolidation loan / balance-transfer alternative: 'avalanche' or 'snowball'. Optional; defaults to 'avalanche' when omitted. Case-sensitive."}, 'bt_transfer_limit': {'type': ['number', 'null'], 'default': None, 'minimum': 0.01, 'description': 'Cap on the total dollar amount transferred to the balance-transfer card, at least $0.01. When set, only this amount moves to the BT card; remaining balances stay on original cards, and a combined simulation runs both halves together, correctly redistributing freed minimum payments. Optional; when omitted, the entire balance is transferred (legacy behavior). Needs include_balance_transfer or bt_offers.'}, 'bt_regular_apr_pct': {'type': ['number', 'null'], 'default': None, 'description': 'APR that applies after the promo period ends, as a percentage, 0-100. Optional; defaults to 25.20 when omitted. bt_offers, when supplied, overrides this. The 0-100 range applies only when include_balance_transfer is true and bt_offers is omitted; a non-number is rejected in every case.'}, 'consolidation_loan': {'type': 'object', 'properties': {'term_months': {'type': ['integer', 'null'], 'description': 'Consolidation loan term in months, 12-84. Required.'}, 'annual_rate_pct': {'type': ['number', 'null'], 'description': "Annual interest rate for the consolidation loan, as a percentage, 0-36, e.g. 10.99. This is the loan's note interest rate, not the disclosed APR. The APR already reflects the origination fee, so entering it here counts the fee twice. Required."}, 'origination_fee_pct': {'type': ['number', 'null'], 'description': 'Origination fee as a percentage of loan principal, 0-10. Optional; defaults to 0 when omitted. A JSON null is rejected, unlike every other optional field on this tool; omit the field instead of sending null.'}, 'origination_fee_flat': {'type': ['number', 'null'], 'description': 'Flat-dollar origination fee, $0 to $10,000. Optional; defaults to 0 when omitted, and takes precedence over origination_fee_pct when it produces a larger fee. A JSON null is rejected; omit the field instead of sending null.'}, 'include_fee_in_principal': {'type': ['boolean', 'null'], 'description': 'Whether the origination fee is rolled into the loan principal rather than paid upfront. Optional; defaults to true when omitted. A JSON null is rejected; omit the field instead of sending null.'}}, 'description': 'Loan terms for the consolidation option. Required: omitting the field answers contract_error MISSING_REQUIRED_FIELD, while an explicit JSON null answers parse_error ("consolidation_loan must be an object."); the two are not the same rejection.'}, 'bt_manual_transfers': {'type': ['array', 'null'], 'items': {'type': ['object', 'null'], 'properties': {'amount': {'type': ['number', 'null'], 'description': 'Dollar amount to transfer from this card, greater than $0, up to $1,000,000,000. Required per entry.'}, 'card_name': {'type': ['string', 'null'], 'maxLength': 120, 'description': 'Card name; must match a name in cards[]. Required per entry. Max 120 characters.'}}}, 'default': None, 'description': "Exact per-card transfer amounts. Required when bt_transfer_strategy is 'manual'; each entry's card_name must match a name in cards[]. Optional otherwise; a JSON null is treated as omitted, the same as leaving the field out."}, 'bt_transfer_strategy': {'type': ['string', 'null'], 'default': None, 'description': "How to choose which balances move when bt_transfer_limit is less than your total debt: 'highest_apr_first' (transfer from highest-APR segments first, maximizes interest savings), 'highest_balance_first' (transfer largest balances first), or 'manual' (use bt_manual_transfers to specify exact amounts per card). Optional; defaults to 'highest_apr_first' when omitted. Needs bt_transfer_limit."}, 'extra_monthly_payment': {'type': ['number', 'null'], 'default': None, 'description': "Extra monthly payment in dollars, $0 to $1,000,000,000, applied on top of the required minimums for keep-cards and any balance transfer, and on top of the loan's own required payment for consolidation. Optional; defaults to 0 when omitted. fixed_payments is not a parameter of this tool, unlike calculate_cc_payoff: the keep-cards baseline is always simulated under the canonical constant rolled-forward payment (see comparison_basis in the response); supplying fixed_payments returns an unknown_parameter error."}, 'include_balance_transfer': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to run a single-offer balance-transfer scenario using the four scalar bt_* fields below. Optional; defaults to false when omitted. Ignored once bt_offers is supplied; use bt_offers when comparing two or more offers.'}}}
入力スキーマ
{'type': 'object', 'required': ['home_price', 'option_a', 'option_b'], 'properties': {'option_a': {'type': 'object', 'properties': {'label': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Display label for this option, e.g. '30-year fixed'. Optional; auto-generated when omitted. At most 120 characters."}, 'is_arm': {'type': ['boolean', 'null'], 'description': 'Whether this option is an adjustable-rate mortgage. Optional; defaults to false when omitted. ARM analysis is not yet supported: true on either option is rejected.'}, 'points': {'type': ['number', 'null'], 'description': 'Discount points bought, each equal to 1% of the loan amount, 0-4. Optional; defaults to 0 when omitted.'}, 'term_years': {'type': ['integer', 'null'], 'description': 'Mortgage term in years, 1-40. Required.'}, 'annual_rate_pct': {'type': ['number', 'null'], 'description': 'Annual interest rate for this option, as a percentage, 0-20, e.g. 6.25. Required.'}, 'points_rate_reduction_pct': {'type': ['number', 'null'], 'description': 'Interest-rate reduction per discount point, in percentage points, 0-1.0. Optional; defaults to 0.25 when omitted.'}}, 'description': 'The first fixed-rate mortgage option to compare. Required.'}, 'option_b': {'type': 'object', 'properties': {'label': {'type': ['string', 'null'], 'maxLength': 120, 'description': "Display label for this option, e.g. '30-year fixed'. Optional; auto-generated when omitted. At most 120 characters."}, 'is_arm': {'type': ['boolean', 'null'], 'description': 'Whether this option is an adjustable-rate mortgage. Optional; defaults to false when omitted. ARM analysis is not yet supported: true on either option is rejected.'}, 'points': {'type': ['number', 'null'], 'description': 'Discount points bought, each equal to 1% of the loan amount, 0-4. Optional; defaults to 0 when omitted.'}, 'term_years': {'type': ['integer', 'null'], 'description': 'Mortgage term in years, 1-40. Required.'}, 'annual_rate_pct': {'type': ['number', 'null'], 'description': 'Annual interest rate for this option, as a percentage, 0-20, e.g. 6.25. Required.'}, 'points_rate_reduction_pct': {'type': ['number', 'null'], 'description': 'Interest-rate reduction per discount point, in percentage points, 0-1.0. Optional; defaults to 0.25 when omitted.'}}, 'description': 'The second fixed-rate mortgage option to compare, same shape as option_a. Required. Must differ from option_a on at least one of term_years, annual_rate_pct, or points.'}, 'tax_year': {'type': ['integer', 'null'], 'default': None, 'maximum': 2026, 'minimum': 2025, 'description': 'Tax year, 2025 or 2026, selecting the IRS standard-deduction table for the itemize-vs-standard analysis. Optional; defaults to 2026 when omitted.'}, 'home_price': {'type': 'number', 'description': 'Home purchase price in dollars. Required. Must be positive and no more than $1,000,000,000.'}, 'hoa_monthly': {'type': ['number', 'null'], 'default': None, 'description': 'Monthly homeowners association dues in dollars. Optional; defaults to 0 when omitted. Must be zero or more and no more than $1,000,000,000.'}, 'pmi_monthly': {'type': ['number', 'null'], 'default': None, 'description': 'Monthly PMI (private mortgage insurance) in dollars, charged when down payment is below 20%. Optional; defaults to 0 when omitted. Must be zero or more and no more than $1,000,000,000.'}, 'filing_status': {'enum': ['single', 'married', 'head_of_household', None], 'type': ['string', 'null'], 'default': None, 'description': "Tax filing status: 'single', 'married', or 'head_of_household'. Optional; matched case-insensitively."}, 'full_schedule': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to return the full month-by-month amortization schedule instead of the compact default. Optional; defaults to false when omitted.'}, 'tax_bracket_pct': {'type': ['number', 'null'], 'default': None, 'maximum': 50, 'minimum': 0, 'description': "Marginal tax bracket as a percentage, 0-50. Optional; enables after-tax investment return and mortgage interest deduction analysis when supplied. The after-tax comparison credits each option's annual deduction savings to its investments at year end."}, 'closing_cost_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Closing costs as a percentage of the loan amount, 0-20, points excluded. Optional; defaults to the Urban Institute loan-size regressive schedule (about 4.6% at a $97K loan down to about 1.4% at a $679K loan) when omitted. Pass 0 to model zero closing costs.'}, 'down_payment_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Down payment as a percent of home_price, e.g. 20 for 20%. Optional; defaults to 20 when omitted. Range 0-100 applies only when down_payment_amount is absent; when down_payment_amount is supplied, down_payment_pct is ignored entirely, including in provenance.'}, 'standard_deduction': {'type': ['number', 'null'], 'default': None, 'description': 'Standard deduction in dollars, compared against itemized mortgage-interest deductions. Optional; defaults to the IRS basic standard deduction for tax_year and filing_status when omitted (TY2026: 16100 single, 32200 married, 24150 head_of_household; TY2025: 15750 single, 31500 married, 23625 head_of_household; source Rev. Proc. 2025-32). Must be zero or more.'}, 'time_horizon_years': {'type': ['integer', 'null'], 'default': None, 'description': "Number of years to project the invest-the-difference comparison, 1-40. Optional; defaults to the maximum of both options' term_years when omitted."}, 'down_payment_amount': {'type': ['number', 'null'], 'default': None, 'description': 'Down payment in dollars. Optional; overrides down_payment_pct entirely, including its provenance row, when supplied. Must be at least $0 and strictly below home_price.'}, 'pmi_removal_ltv_pct': {'type': ['number', 'null'], 'default': None, 'description': "Loan-to-value percentage at which to model borrower-requested PMI removal, 50-100. Optional; when omitted, PMI is modeled as removed at the 78% HPA automatic-termination threshold instead. The rejection guard applies only when pmi_monthly is above 0 and the loan's own initial LTV is above 80 percent, the range where PMI applies: there, a value at or above that initial LTV is rejected, because the requested removal point would already be met at the first payment, so no PMI would be modeled for any month of the loan. When pmi_monthly is omitted or 0, no such check runs, whatever the LTV, and the supplied value is accepted but changes nothing in the response, because no PMI is modeled in that case. Either way PMI also stops at the statutory amortization midpoint of each option's own term (12 U.S.C. §4901(7), §4902(c)), which this value cannot postpone."}, 'property_tax_annual': {'type': ['number', 'null'], 'default': None, 'description': 'Annual property tax in dollars, for true monthly cost. Optional; defaults to 0 when omitted. Must be zero or more.'}, 'extra_monthly_payment': {'type': ['number', 'null'], 'default': None, 'description': 'Extra principal payment in dollars, applied equally to BOTH options every month. Optional; defaults to 0 when omitted. Must be zero or more and no more than $1,000,000,000.'}, 'home_insurance_annual': {'type': ['number', 'null'], 'default': None, 'description': 'Annual home insurance in dollars. Optional; defaults to 0 when omitted. Must be zero or more.'}, 'invest_the_difference': {'type': ['boolean', 'null'], 'default': None, 'description': "Whether both options deploy the same total budget every month: the higher option's P&I plus any extra_monthly_payment plus the month-1 PMI both carry. The cheaper-mortgage holder invests the payment gap each month; an option that stops paying PMI earlier invests the freed cash; the option with the lower upfront points cost invests the difference at month 0; after payoff the full budget goes to investments. See comparison_basis in the response. Optional; defaults to true when omitted."}, 'investment_return_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Assumed investment return on the invested payment gap, as a percentage, an EFFECTIVE ANNUAL rate; the monthly compounding step is (1+pct/100)^(1/12)-1. Optional; defaults to the cited Senaro long-run S&P 500 nominal return, about 10%, when omitted. Range 0-30.'}}}
入力スキーマ
{'type': 'object', 'required': ['cards'], 'properties': {'cards': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': ['string', 'null'], 'description': "Card label, e.g. 'Chase Sapphire', 120 characters or fewer. Optional; a card without a name is auto-numbered ('Card 1', 'Card 2', and so on). Echoed into per-card results and warning text. A name over the cap is replaced in error field paths by a key built from its zero-based card index, written as '#0 (name over cap)', '#1 (name over cap)' and so on."}, 'segments': {'type': ['array', 'null'], 'items': {'type': 'object', 'required': ['type', 'balance'], 'properties': {'type': {'type': 'string', 'description': "Segment type. REQUIRED on every segment: omitting it is rejected. Per-type field matrix. Every field below is classified for every segment type: REQUIRED (omitting it is rejected), OPTIONAL (accepted either way and read), IGNORED (accepted and never read for this type, though a value can still fail the field's own range check), or REJECTED (supplying a disallowed value is an error; the field's own rule below says exactly which values are disallowed). Value rules are stated separately from applicability, because a field can be accepted on a type and still be restricted there. The validators are the authority; this matrix describes them.\n- type: REQUIRED on every type. Values: one of purchase, cash_advance, balance_transfer, promotional, installment_plan.\n- balance: REQUIRED on every type. Values: $0 to $1,000,000,000; above $50,000 returns a HIGH_CARD_BALANCE warning, not an error.\n- apr_pct: REQUIRED on purchase, cash_advance, balance_transfer, promotional; OPTIONAL on installment_plan. Values: 0 to 100 as a percentage, e.g. 24.99 not 0.2499. The REQUIRED classification above applies when balance is greater than 0; a zero-balance segment may omit it. Must be greater than 0 on cash_advance carrying a balance. Must equal 0 on installment_plan, where omitting it is the correct shape.\n- revert_apr_pct: REQUIRED on balance_transfer, promotional; IGNORED on purchase, cash_advance; REJECTED on installment_plan. Values: 0 to 100, and at least apr_pct. Rejected on installment_plan with FIELD_NOT_ALLOWED_HERE: an expired plan's residual keeps its existing rate.\n- promo_expires_month: REQUIRED on balance_transfer, promotional; IGNORED on purchase, cash_advance, installment_plan. Values: 1 to 480.\n- monthly_fee: OPTIONAL on installment_plan; REJECTED on purchase, cash_advance, balance_transfer, promotional. Values: $0 or more, and no greater than plan_payment_due, on installment_plan. On every other type a POSITIVE value is rejected with FIELD_NOT_ALLOWED_HERE; 0 and a negative value are accepted and dropped there.\n- plan_payment_due: REQUIRED on installment_plan; REJECTED on purchase, cash_advance, balance_transfer, promotional. Values: greater than $0, at least monthly_fee, and no more than $1,000,000,000, on installment_plan. On every other type a POSITIVE value is rejected with FIELD_NOT_ALLOWED_HERE; 0 and a negative value are accepted and dropped there.\n- remaining_payments: OPTIONAL on installment_plan; IGNORED on purchase, cash_advance, balance_transfer, promotional. Values: 0 or more. 0 means the stated term has ALREADY ended and is valid with any balance. From 1 up, balance must be clearable within the stated term.\n- min_payment_order: OPTIONAL on every type. Values: 1 or more; breaks a tie only between segments sharing both the same current APR and the same installment-plan status.\n- extra_payment_order: OPTIONAL on every type. Values: 0 or more; 0 means skip. Breaks a tie only between segments sharing the exact same current APR.\n- merchant_name: OPTIONAL on installment_plan; IGNORED on purchase, cash_advance, balance_transfer, promotional. Values: 120 characters or fewer.\n- monthly_spend: OPTIONAL on purchase; REJECTED on cash_advance, balance_transfer, promotional, installment_plan. Values: $0 to $50,000 per month. A negative value is rejected as NEGATIVE_BALANCE on every type, purchase included. On every type other than purchase a POSITIVE value is rejected with FIELD_NOT_ALLOWED_HERE; an explicit 0 is accepted.\n- stop_spend_month: OPTIONAL on purchase; IGNORED on cash_advance, balance_transfer, promotional, installment_plan. Values: 0 or more; range checked on every type, read only on purchase."}, 'apr_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual percentage rate for this segment, 0 to 100, e.g. 24.99 not 0.2499. Required when balance is greater than 0 on purchase, cash_advance, balance_transfer and promotional. On cash_advance it must be greater than 0 whenever a balance is carried. Must be 0 on installment_plan, which uses monthly_fee instead, so omitting it there is the correct shape.'}, 'balance': {'type': 'number', 'description': 'Segment balance in dollars, $0 to $1,000,000,000. REQUIRED on every segment type: an omitted balance would silently report a $0, 0-month payoff, so it is rejected instead. An explicit 0 is valid, for example a paid-off balance_transfer segment kept for schedule continuity.'}, 'monthly_fee': {'type': ['number', 'null'], 'default': None, 'description': "Fixed fee charged each month while an installment plan's term is active, $0 or more and no greater than plan_payment_due. Optional on installment_plan. On every other type a positive value is rejected with FIELD_NOT_ALLOWED_HERE, while 0 and a negative value are accepted and dropped."}, 'merchant_name': {'type': ['string', 'null'], 'default': None, 'description': "Label for an installment plan's merchant, 120 characters or fewer. Optional on installment_plan, ignored on every other type."}, 'monthly_spend': {'type': ['number', 'null'], 'default': None, 'description': 'Recurring monthly purchase amount posted to this segment before interest accrues, $0 to $50,000 per month. Optional on purchase. A negative value is rejected as NEGATIVE_BALANCE on every type. On every type other than purchase a positive value is rejected with FIELD_NOT_ALLOWED_HERE, since those balances do not accept new purchases; an explicit 0 is accepted.'}, 'revert_apr_pct': {'type': ['number', 'null'], 'default': None, 'description': "Rate this segment reverts to once its promo expires, 0 to 100, and at least apr_pct. Required on balance_transfer and promotional. Ignored on purchase and cash_advance. Rejected on installment_plan with FIELD_NOT_ALLOWED_HERE: an expired plan's residual keeps its existing rate rather than repricing."}, 'plan_payment_due': {'type': ['number', 'null'], 'default': None, 'description': 'Locked monthly payment for an installment plan, principal plus monthly_fee. Required on installment_plan, greater than $0, at least monthly_fee, and no more than $1,000,000,000. On every other type a positive value is rejected with FIELD_NOT_ALLOWED_HERE, while 0 and a negative value are accepted and dropped.'}, 'stop_spend_month': {'type': ['integer', 'null'], 'default': None, 'description': 'Month index at which recurring spend stops, 0 or more. Read on purchase only, and range checked on every type. Omit to spend for the whole projection.'}, 'min_payment_order': {'type': ['integer', 'null'], 'default': None, 'description': "Minimum-payment tie-break priority, 1 or more. Optional on every type. The minimum first pays any installment_plan's locked plan_payment_due in full, then the lowest-current-APR segment; this value only breaks a tie between segments sharing both the same current APR and the same installment-plan status."}, 'remaining_payments': {'type': ['integer', 'null'], 'default': None, 'description': "Payments left in an installment plan's stated term, 0 or more. Optional on installment_plan, ignored on every other type. 0 means the term has ALREADY ended and is valid with any balance, including a positive residual. From 1 up, the balance must be clearable within the stated term and must not be clearable a month early."}, 'extra_payment_order': {'type': ['integer', 'null'], 'default': None, 'description': 'Extra-payment tie-break priority, 0 or more, where 0 means this segment never receives extra payment. Optional on every type, and the default for installment_plan. Only breaks a tie between segments sharing the exact same current APR, since the Credit CARD Act (TILA §164(b), 15 U.S.C. §1666c(b)) / 12 CFR 1026.53(a) always pays the highest-current-APR segment first regardless of this value.'}, 'promo_expires_month': {'type': ['integer', 'null'], 'default': None, 'description': 'Month at which apr_pct flips to revert_apr_pct, 1 to 480. Required on balance_transfer and promotional. Ignored on purchase, cash_advance and installment_plan.'}}}, 'description': "Per-segment breakdown of this card's balances. Optional; when it carries at least one segment it SUPERSEDES purchase_balance and cash_advance_balance, and a POSITIVE value in either of those is rejected. An empty segments[] is treated as absent, so purchase_balance is then required. At most 100 segments across the whole request. Per card, per type: 1 purchase, 1 cash_advance, 5 balance_transfer, 1 promotional, 10 installment_plan. Each item carries its own type, balance, rate and payment priority; see the type field on the item for the per-type field matrix."}, 'annual_fee': {'type': ['number', 'null'], 'description': 'Annual fee in dollars, $0 to $1,000,000,000. Optional; defaults to 0. Charged at month 1 and every twelfth month after, while the card carries a balance.'}, 'monthly_spend': {'type': ['number', 'null'], 'description': "Recurring monthly purchase amount charged to this card's purchase balance before interest accrues, $0 to $50,000 per month. Optional; defaults to 0. Use the segment-level monthly_spend instead when supplying segments[]."}, 'minimum_payment': {'type': ['number', 'null'], 'description': "Minimum payment in dollars, $0 to $1,000,000,000 (optional, omit or set 0 to auto-calculate). Where it binds, the card is locked at max(minimum_payment, that card's issuer minimum computed at month 1), and that locked amount is paid every month. On calculate_cc_payoff it binds ONLY when fixed_payments = true; on the DEFAULT path (fixed_payments = false) it is NOT used, because the plan recomputes each card's issuer minimum from its current balance every month, and the response discloses that as MINIMUM_PAYMENT_NOT_BINDING. On compare_payoff_strategies there is no fixed_payments parameter and supplying one is rejected: the avalanche and snowball arms ALWAYS run locked, so the value DOES bind and moves both arms, while the minimum-payments-only baseline always recomputes and ignores it, disclosed as MINIMUM_PAYMENT_NOT_BINDING_IN_BASELINE."}, 'purchase_apr_pct': {'type': ['number', 'null'], 'description': 'Purchase APR as a percentage, 0 to 100, e.g. 24.99 not 0.2499. Required when purchase_balance is greater than 0: an omitted APR would silently compute $0 interest.'}, 'purchase_balance': {'type': ['number', 'null'], 'description': 'Purchase balance in dollars, $0 to $1,000,000,000. Required unless segments[] carries at least one segment: an omitted purchase_balance would silently report a $0, 0-month payoff. Supplying a POSITIVE value alongside a non-empty segments[] is rejected, since the two would be competing sources for the same balance. An explicit 0 is accepted.'}, 'stop_spend_month': {'type': ['integer', 'null'], 'description': "Month index at which this card's recurring spend stops, 0 or more. Optional; omit to spend for the whole projection."}, 'plan_fees_monthly': {'type': ['number', 'null'], 'description': 'Recurring monthly card fee in dollars, $0 to $1,000,000,000, e.g. a pay-over-time plan fee. Optional; defaults to 0. Charged every month while the card carries a balance.'}, 'cash_advance_apr_pct': {'type': ['number', 'null'], 'description': 'Cash advance APR as a percentage, greater than 0 and up to 100. Required when cash_advance_balance is greater than 0: cash advances have no promotional 0% product, so a 0% rate on a real advance balance is a data-entry error.'}, 'cash_advance_balance': {'type': ['number', 'null'], 'description': 'Cash advance balance in dollars, $0 to $1,000,000,000. Optional; defaults to 0 when omitted. A POSITIVE value alongside a non-empty segments[] is rejected, the same way purchase_balance is. An explicit 0 is accepted.'}}}, 'description': 'Credit cards to compare, 1 to 20, the same shape calculate_cc_payoff takes. Required: omitting the field answers contract_error MISSING_REQUIRED_FIELD, while an explicit JSON null answers parse_error ("cards is required and must be an array."); the two are not the same rejection. Every card may carry segments[]. Max 100 segments total across all cards in the request. Per-card, per-type caps: 1 purchase, 1 cash_advance, 5 balance_transfer, 1 promotional, 10 installment_plan.'}, 'output': {'enum': ['summary', 'inline', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default), 'inline'. summary returns the headline comparison with a data_preview block; inline returns the full payload."}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Optional; must not contain an em dash or en dash. Max 120 characters.'}, 'apply_rate_cap': {'type': ['boolean', 'null'], 'default': None, 'description': "Whether to cap each card's APR at the regulatory ceiling before simulating. Optional; defaults to false when omitted."}, 'extra_monthly_payment': {'type': ['number', 'null'], 'default': None, 'description': 'Extra monthly payment in dollars, $0 to $1,000,000,000, applied on top of the required minimums. Optional; defaults to 0 when omitted.'}}}
入力スキーマ
{'type': 'object', 'required': ['debt_type', 'debt_balance', 'debt_apr_pct', 'extra_monthly'], 'properties': {'output': {'enum': ['summary', 'inline', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default), 'inline'. 'summary' returns headline comparison scalars, milestones, and citations with monthly_schedule stripped. 'inline' returns the full payload including the month-by-month monthly_schedule[]."}, 'debt_type': {'enum': ['credit_card', 'auto', 'student', 'personal', 'mortgage'], 'type': 'string', 'description': "Debt type: 'credit_card', 'auto', 'student', 'personal', or 'mortgage'. REQUIRED, no default."}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'debt_apr_pct': {'type': 'number', 'description': 'Debt annual percentage rate, e.g. 6.5 not 0.065. Decimal from 0 to 100. REQUIRED, no default.'}, 'debt_balance': {'type': 'number', 'description': 'Current debt balance. Decimal, greater than 0. REQUIRED, no default.'}, 'extra_monthly': {'type': 'number', 'description': 'Extra monthly amount available for debt payoff or investing, the amount in question. Decimal, greater than 0. REQUIRED, no default.'}, 'full_schedule': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to return the full month-by-month schedule. Optional; defaults to false (compact schedule) when omitted.'}, 'minimum_payment': {'type': ['number', 'null'], 'default': None, 'description': 'Minimum monthly payment. Decimal, at least 0. Optional; auto-calculated for amortizing loans when omitted or 0.'}, 'tax_bracket_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Tax bracket, e.g. 22 not 0.22. Decimal from 0 to 100. Optional; enables an after-tax comparison when supplied.'}, 'time_horizon_years': {'type': ['integer', 'null'], 'default': None, 'description': 'Projection horizon. Integer, greater than 0. Optional; defaults to the greater of the payoff horizon or 10 years when omitted.'}, 'investment_return_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Expected investment return, an EFFECTIVE ANNUAL rate; the monthly compounding step is (1+pct/100)^(1/12)-1. Decimal from 0 to 30. Optional; defaults to the cited long-run S&P 500 nominal return, about 10%, when omitted.'}, 'term_months_remaining': {'type': ['integer', 'null'], 'default': None, 'description': 'Months remaining on the debt. Integer, greater than 0. Required for non-credit-card debt types; optional for credit_card.'}, 'investment_tax_advantaged': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether the investment is tax-advantaged, e.g. 401k or IRA. Optional; defaults to false when omitted.'}, 'investment_volatility_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Investment volatility. Decimal. Optional; adds a volatility risk note when supplied.'}}}
入力スキーマ
{'type': 'object', 'required': ['home_price', 'monthly_rent', 'mortgage_rate_pct'], 'properties': {'output': {'enum': ['summary', 'inline', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default), 'inline'. 'summary' returns headline scalars and per-horizon snapshots with the heavy series stripped. 'inline' returns the full payload including yearly_series[] and monthly_series[] for chart rendering."}, 'pmi_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual PMI rate as a percentage of the loan. Decimal from 0 to 5. Optional; defaults to 0.5% when omitted. The removal threshold is set by pmi_removal_ltv_pct.'}, 'tax_year': {'type': ['integer', 'null'], 'default': None, 'description': "Tax year for year 1 of the horizon: 2025 or 2026. Integer. Required when apply_tax_benefit is true; otherwise not used. Horizon year y uses tax year (tax_year + y - 1) on both the tax benefit and the sale-side capital-gains tax; the SALT cap follows the statute's own schedule for that year, and every other indexed amount holds at its last-loaded table value beyond it."}, 'charitable': {'type': ['number', 'null'], 'default': None, 'description': 'Charitable contributions. Decimal from 0 to 1,000,000,000; TY2026 and later apply a 0.5%-of-AGI floor per OBBBA §70425. Only used when apply_tax_benefit is true. Optional; defaults to 0 when omitted.'}, 'home_price': {'type': 'number', 'description': 'Home purchase price. Decimal, greater than 0 and at most 1,000,000,000. REQUIRED, no default.'}, 'pmi_annual': {'type': ['number', 'null'], 'default': None, 'description': 'Annual PMI premium in dollars while PMI is active. Decimal from 0 to 1,000,000,000. Only used when apply_tax_benefit is true. Optional; when omitted it is derived from pmi_pct and the original loan amount.'}, 'real_terms': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether to deflate the output series to a real-terms view. Optional; defaults to false when omitted.'}, 'blind_count': {'type': ['integer', 'null'], 'default': None, 'description': 'Number of blind filers, each adding the additional standard deduction. Integer from 0 to 2. Only used when apply_tax_benefit is true. Optional; defaults to 0 when omitted.'}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'hoa_monthly': {'type': ['number', 'null'], 'default': None, 'description': 'Monthly HOA dues on the BUY path. Decimal from 0 to 1,000,000,000. Optional; defaults to 0 when omitted.'}, 'monthly_rent': {'type': 'number', 'description': 'Monthly rent on the RENT path. Decimal from 0 to 1,000,000,000; 0 is valid (a free-housing baseline). REQUIRED, no default.'}, 'filing_status': {'type': ['string', 'null'], 'default': None, 'description': "Tax filing status: 'Single', 'MFJ', 'MFS' or 'HoH'. Required when apply_tax_benefit is true; otherwise not used."}, 'horizon_years': {'type': ['integer', 'null'], 'default': None, 'description': 'Projection horizon in years. Integer from 1 to 40. Optional; when omitted, the response returns snapshots at years 5, 10 and 30.'}, 'inflation_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Inflation as a percentage, for the real_terms toggle. Decimal, at least 0 and less than 100. Optional; when omitted, a nominal run uses 2.5%, and a real_terms run uses the horizon-based default: 2.0% for a horizon of 7 years or less, 2.6% for 8 to 19 years, 2.5% for 20 years or more.'}, 'sell_side_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Sell-side transaction cost as a percentage of the sale price. Decimal from 0 to 25. Optional; defaults to the cited 7.5% (Redfin post-NAR) when omitted; override for your market.'}, 'maintenance_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual maintenance as a percentage of home value. Decimal from 0 to 20. Optional; defaults to the cited 1.5% (Harvard JCHS) when omitted; override for your market.'}, 'rent_growth_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual rent escalation as a percentage. Decimal from -50 to 50. Optional; defaults to the cited 3.4% (BLS CPI ROPR) when omitted; override for your market.'}, 'state_local_tax': {'type': ['number', 'null'], 'default': None, 'description': 'State and local tax paid (state income or sales tax), for the SALT cap. Decimal from 0 to 1,000,000,000. Only used when apply_tax_benefit is true. Optional; defaults to 0 when omitted.'}, 'down_payment_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Down payment as a percentage of the home price. Decimal from 0 to 100; 0 is valid (zero-down programs). Optional; defaults to 20% when omitted.'}, 'loan_term_months': {'type': ['integer', 'null'], 'default': None, 'description': 'Mortgage term in months. Integer from 1 to 480. Optional; defaults to 360 (a 30-year fixed) when omitted.'}, 'other_itemizable': {'type': ['number', 'null'], 'default': None, 'description': 'Other itemizable deductions, such as medical expenses above 7.5% of AGI or casualty losses. Decimal from 0 to 1,000,000,000. Only used when apply_tax_benefit is true. Optional; defaults to 0 when omitted.'}, 'property_tax_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual property tax as a percentage of home value. Decimal from 0 to 10. Optional; defaults to 0.88% when omitted; override for your market.'}, 'age_65_plus_count': {'type': ['integer', 'null'], 'default': None, 'description': 'Number of filers aged 65 or older, each adding the additional standard deduction. Integer from 0 to 2. Only used when apply_tax_benefit is true. Optional; defaults to 0 when omitted.'}, 'apply_tax_benefit': {'type': ['boolean', 'null'], 'default': None, 'description': "Whether to apply the federal tax benefit model (SALT cap following the statute's year-by-year schedule, mortgage interest deduction, PMI deductibility). When true, filing_status, tax_year and annual_gross_income are required. Optional; defaults to false when omitted. The §121 home-sale gain exclusion applies only at sale points 24 months or more after purchase (IRC §121(a) 2-of-5-year test); year 1 of yearly_series, months 1-23 in monthly_series, and any horizon under 24 months use no exclusion. Separately, IRC §1222(3) makes a holding period of 12 months or less short-term, taxed at ordinary rates instead of the long-term rates otherwise applied, on the home-sale gain and the renter's portfolio gain alike (24 months vs. 12 months are two different thresholds); this tool applies that split exactly to the home-sale gain, and to the renter's portfolio at annual grain: prior years' contributions are compounded together as one long-term lot rather than aged individually, so months inside a year understate short-term gain."}, 'mortgage_rate_pct': {'type': 'number', 'description': 'Mortgage annual rate as a percentage, e.g. 6.75 for 6.75%. Decimal, greater than 0 and at most 100. Never cached; provide the current rate. REQUIRED, no default.'}, 'home_insurance_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual home insurance as a percentage of home value. Decimal from 0 to 15. Optional; defaults to 0.65% when omitted; override for your market.'}, 'annual_gross_income': {'type': ['number', 'null'], 'default': None, 'description': 'Annual gross income, the MAGI proxy for the bracket and the SALT cap. Decimal from 0 to 1,000,000,000. Required when apply_tax_benefit is true; otherwise not used.'}, 'pmi_removal_ltv_pct': {'type': ['number', 'null'], 'default': None, 'description': "Loan-balance trigger for PMI removal, as a percentage loan-to-value. Decimal from 50 to 100. Optional; omitted, it is the 78% HPA automatic-termination threshold; provided (e.g. 80), it is whichever of 78% or your value is reached first. The rejection guard applies only when down_payment_pct is below 20 and the resolved pmi_pct is above 0, the range where PMI applies: there, a value at or above the loan's own initial LTV is rejected, because the requested removal point would already be met at the first payment, so no PMI would be modeled for any month of the loan. When the resolved pmi_pct is 0, or down_payment_pct is 20 or more, no such check runs, whatever the LTV. Either way PMI also stops at the statutory amortization midpoint of the original term (12 U.S.C. §4901(7), §4902(c)), which this value cannot postpone."}, 'purchase_year_points': {'type': ['number', 'null'], 'default': None, 'description': 'Discount points paid at origination, as a percentage of the loan. Decimal from 0 to 4. Counted as cash paid at closing on every call; when apply_tax_benefit is true they are also deducted in year 1. Optional; defaults to 0 when omitted.'}, 'home_appreciation_pct': {'type': ['number', 'null'], 'default': None, 'description': 'Annual home price appreciation as a percentage. Decimal from -50 to 50. Optional; defaults to the cited 4.25% (FHFA HPI) when omitted; override for your market.'}, 'investment_return_pct': {'type': ['number', 'null'], 'default': None, 'description': 'RENT path annual return as a percentage, an EFFECTIVE ANNUAL rate; the monthly compounding step is (1+pct/100)^(1/12)-1. Decimal from -50 to 30. Optional; defaults to 10.0% when omitted.'}, 'loan_origination_date': {'type': ['string', 'null'], 'default': None, 'description': 'Mortgage origination date, YYYY-MM-DD. Selects the mortgage interest deduction cap: on or before 2017-12-15 the $1M cap, after it the $750k cap (Single and MFJ; MFS caps are half). Only used when apply_tax_benefit is true. Optional; omitting it uses the post-2017 cap.'}, 'basis_capitalizable_pct_override': {'type': ['number', 'null'], 'default': None, 'description': "Percentage of the buy-side closing cost that is capitalizable into the §121 adjusted basis (IRS Pub 523 split: abstract fees, title search, recording fees, survey fees, transfer taxes, owner's title insurance). Decimal from 0 to 100; 0 means a HomePrice-only basis, 100 means the full closing cost is in basis. Optional; defaults to 50% (Senaro deterministic midpoint) when omitted. Supply your actual HUD-1 split when available."}}}
入力スキーマ
{'type': 'object', 'properties': {'name': {'type': ['string', 'null'], 'default': None, 'description': 'Optional: return one full entry. Requires category. Returns validation_error if not found.'}, 'verbose': {'type': 'boolean', 'default': False, 'description': 'Optional: return all 10 citation fields per entry instead of just category+name.'}, 'category': {'type': ['string', 'null'], 'default': None, 'description': 'Optional: filter entries by category, the canonical MCP tool name (e.g. "compare_rent_vs_buy") or "shared". Case-insensitive.'}}}
入力スキーマ
{'type': 'object', 'required': ['annual_salary', 'pay_periods_per_year', 'contribution_pct'], 'properties': {'output': {'enum': ['summary', 'inline', None], 'type': ['string', 'null'], 'description': "Valid values: 'summary' (default), 'inline'. Response envelope. 'summary': headline scalars, period_schedule stripped. 'inline': full payload including period_schedule[]."}, 'chart_title': {'type': ['string', 'null'], 'default': None, 'maxLength': 120, 'description': 'Override for the chart title. Reserved for the chart pipeline. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.'}, 'has_true_up': {'type': ['boolean', 'null'], 'default': None, 'description': 'Whether the plan provides an annual true-up. false is the conservative assumption: surfaces front-loading forfeiture risk. Optional; defaults to false when omitted.'}, 'match_tiers': {'type': ['array', 'null'], 'items': {'type': ['object', 'null'], 'properties': {'match_frac': {'type': ['number', 'null'], 'description': 'Employer match fraction for this tier (0.5 = 50%). Must be in (0, 1].'}, 'up_to_deferral_pct': {'type': ['number', 'null'], 'description': 'Width of this tier as a percent of pay (e.g. 3 = the first 3% of pay). Must be > 0.'}}}, 'default': None, 'maxItems': 10, 'description': 'Custom match-formula tier list. Example: [{"match_frac": 1.0, "up_to_deferral_pct": 3}, {"match_frac": 0.5, "up_to_deferral_pct": 2}] = safe_harbor_basic. Exactly one of match_preset or match_tiers is required. Optional; omit when supplying match_preset.'}, 'match_preset': {'enum': ['safe_harbor_basic', 'safe_harbor_enhanced_simple', 'qaca', 'fifty_pct_of_first_six_pct', None], 'type': ['string', 'null'], 'default': None, 'description': "Named match-formula preset: 'safe_harbor_basic' (100% of first 3% + 50% of next 2%), 'safe_harbor_enhanced_simple' (100% of first 4%), 'qaca' (100% of first 1% + 50% of next 5%), 'fifty_pct_of_first_six_pct' (50% of first 6%). Exactly one of match_preset or match_tiers is required. Optional; omit when supplying match_tiers."}, 'annual_salary': {'type': 'number', 'description': 'Annual gross salary. Decimal > 0. REQUIRED, no default.'}, 'participant_age': {'type': ['integer', 'null'], 'default': None, 'description': 'Determines which catch-up limit applies (age 50+, or age 60-63 SECURE 2.0 super catch-up). Integer >= 0. Optional; omit when age is unknown or participant is under 50.'}, 'contribution_pct': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'Current employee contribution as a percent of gross pay. Decimal in [0, 100]. REQUIRED, no default.'}, 'pay_periods_per_year': {'type': 'integer', 'maximum': 365, 'minimum': 1, 'description': 'Pay periods per year (12=monthly, 24=semi-monthly, 26=biweekly, 52=weekly). Integer in [1, 365]. REQUIRED, no default.'}}}
入力スキーマ
{'type': 'object', 'properties': {}}
最近のツール変更
類似のMCPサーバー
MaCalculatriceEnLigne
Provides calculators for French and Belgian taxes, salaries, pensions, VAT, loans, health metrics, education scores, fitness, and…
Lovie Company Formation
Supports company formation and business administration with bank accounts, cards, invoicing, bookkeeping, accounting periods, and…
AlpineDataWorks Intelligence Server
Provides economic, market, supply-chain, real-estate, energy, consumer, labor, and other scored intelligence indices with histori…
The Stall
Provides pay-per-call tools for YouTube keyword research and research on stocks, crypto, DeFi, options, and macroeconomic data.
Stratalize Finance
Provides financial, macroeconomic, banking, credit, commodities, M&A, ESG, labor, and regulatory benchmarks for analysis and plan…
Crank Protocol
Provides non-custodial Solana and EVM tools for swaps, derivatives, lending, staking, tokenized equities, bridging, and strategy …
Red by Big Red Cloud
Connects to Big Red Cloud accounting for customers, suppliers, products, invoices, purchases, payments, receipts, journals, quote…
x402-services
Provides on-chain, trading, and AI tools for Robinhood Chain.