Skip to main content
Glama

Senaro Personal Finance

Mortgage Terms Comparison

compare_mortgage_terms
Read-onlyIdempotent

Calculation, not advice. Verify with a professional before acting. Compare two fixed-rate mortgage options side-by-side:

  • 15 vs 30 year,

  • different rates,

  • points vs no points, or

  • any two terms.

Shows total interest, monthly payment breakdown (with tax, insurance, PMI, HOA), equity buildup, and, critically, what happens if you take the cheaper mortgage and invest the monthly savings. Finds the break-even investment return rate.

Includes tax deduction analysis (itemizing vs standard deduction), PMI auto-removal tracking per the Homeowners Protection Act, and after-tax net worth comparison.

Pick this to compare two mortgage structures on a purchase, such as 15 versus 30 year or points versus no points; pick calculate_refi_breakeven when the comparison is against your existing loan and a refinance offer, and pick compare_payoff_strategies when the question is payoff strategy on revolving debt, not a mortgage term.

Note: ARM (adjustable-rate) mortgages are not yet supported.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
option_aYesThe first fixed-rate mortgage option to compare. Required.
option_bYesThe 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_yearNoTax year, 2025 or 2026, selecting the IRS standard-deduction table for the itemize-vs-standard analysis. Optional; defaults to 2026 when omitted.
home_priceYesHome purchase price in dollars. Required. Must be positive and no more than $1,000,000,000.
hoa_monthlyNoMonthly 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_monthlyNoMonthly 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_statusNoTax filing status: 'single', 'married', or 'head_of_household'. Optional; matched case-insensitively.
full_scheduleNoWhether to return the full month-by-month amortization schedule instead of the compact default. Optional; defaults to false when omitted.
tax_bracket_pctNoMarginal 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_pctNoClosing 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_pctNoDown 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_deductionNoStandard 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_yearsNoNumber 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_amountNoDown 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_pctNoLoan-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_annualNoAnnual property tax in dollars, for true monthly cost. Optional; defaults to 0 when omitted. Must be zero or more.
extra_monthly_paymentNoExtra 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_annualNoAnnual home insurance in dollars. Optional; defaults to 0 when omitted. Must be zero or more.
invest_the_differenceNoWhether 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_pctNoAssumed 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • addedInput schema / properties / filing_status / enum
      Added value: +[
      +  "single",
      +  "married",
      +  "head_of_household",
      +  null
      +]
    • addedInput schema / properties / option_a / properties / label / maxLength
      Added value: +120
    • addedInput schema / properties / option_b / properties / label / maxLength
      Added value: +120
    • addedInput schema / properties / tax_bracket_pct / maximum
      Added value: +50
    • addedInput schema / properties / tax_bracket_pct / minimum
      Added value: +0
    • addedInput schema / properties / tax_year / maximum
      Added value: +2026
    • addedInput schema / properties / tax_year / minimum
      Added value: +2025
  2. Changed1 schema field changed
    • changedInput schema / properties / pmi_removal_ltv_pct / description
      Previous value: -"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. When the loan's own initial loan-to-value is above 80 percent, the range where PMI applies, 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. At or below 80 percent, no such check runs. 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."New value: +"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."
  3. Changed22 schema fields changed
    • addedInput schema / properties / closing_cost_pct
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / down_payment_amount
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / down_payment_pct
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / extra_monthly_payment
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / filing_status
      Added value: +{
      +  "default": null,
      +  "description": "Tax filing status: 'single', 'married', or 'head_of_household'. Optional; matched case-insensitively.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / full_schedule
      Added value: +{
      +  "default": null,
      +  "description": "Whether to return the full month-by-month amortization schedule instead of the compact default. Optional; defaults to false when omitted.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / hoa_monthly
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / home_insurance_annual
      Added value: +{
      +  "default": null,
      +  "description": "Annual home insurance in dollars. Optional; defaults to 0 when omitted. Must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / home_price
      Added value: +{
      +  "description": "Home purchase price in dollars. Required. Must be positive and no more than $1,000,000,000.",
      +  "type": "number"
      +}
    • addedInput schema / properties / invest_the_difference
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / investment_return_pct
      Added value: +{
      +  "default": null,
      +  "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": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / option_a
      Added value: +{
      +  "description": "The first fixed-rate mortgage option to compare. Required.",
      +  "properties": {
      +    "annual_rate_pct": {
      +      "description": "Annual interest rate for this option, as a percentage, 0-20, e.g. 6.25. Required.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "is_arm": {
      +      "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.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "label": {
      +      "description": "Display label for this option, e.g. '30-year fixed'. Optional; auto-generated when omitted. At most 120 characters.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "points": {
      +      "description": "Discount points bought, each equal to 1% of the loan amount, 0-4. Optional; defaults to 0 when omitted.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "points_rate_reduction_pct": {
      +      "description": "Interest-rate reduction per discount point, in percentage points, 0-1.0. Optional; defaults to 0.25 when omitted.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "term_years": {
      +      "description": "Mortgage term in years, 1-40. Required.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / option_b
      Added value: +{
      +  "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.",
      +  "properties": {
      +    "annual_rate_pct": {
      +      "description": "Annual interest rate for this option, as a percentage, 0-20, e.g. 6.25. Required.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "is_arm": {
      +      "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.",
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "label": {
      +      "description": "Display label for this option, e.g. '30-year fixed'. Optional; auto-generated when omitted. At most 120 characters.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "points": {
      +      "description": "Discount points bought, each equal to 1% of the loan amount, 0-4. Optional; defaults to 0 when omitted.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "points_rate_reduction_pct": {
      +      "description": "Interest-rate reduction per discount point, in percentage points, 0-1.0. Optional; defaults to 0.25 when omitted.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "term_years": {
      +      "description": "Mortgage term in years, 1-40. Required.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / pmi_monthly
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / pmi_removal_ltv_pct
      Added value: +{
      +  "default": null,
      +  "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. When the loan's own initial loan-to-value is above 80 percent, the range where PMI applies, 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. At or below 80 percent, no such check runs. 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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / property_tax_annual
      Added value: +{
      +  "default": null,
      +  "description": "Annual property tax in dollars, for true monthly cost. Optional; defaults to 0 when omitted. Must be zero or more.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / standard_deduction
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / tax_bracket_pct
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / tax_year
      Added value: +{
      +  "default": null,
      +  "description": "Tax year, 2025 or 2026, selecting the IRS standard-deduction table for the itemize-vs-standard analysis. Optional; defaults to 2026 when omitted.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / time_horizon_years
      Added value: +{
      +  "default": null,
      +  "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.",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • removedInput schema / properties / toolArguments
      Removed value: -{
      -  "description": "JSON object with these parameters:\n\nhome_price: decimal > 0, <= 1,000,000,000 (REQUIRED)\ndown_payment_pct: decimal 0-100 as percentage (optional, default 20)\ndown_payment_amount: decimal >= 0 (optional; overrides down_payment_pct if provided)\n\noption_a (REQUIRED object):\n  - label: string (optional; auto-generated if omitted)\n  - annual_rate_pct: decimal 0-20 as percentage, e.g. 6.25 (REQUIRED)\n  - term_years: int 1-40 (REQUIRED)\n  - is_arm: bool (optional, default false; ARM not yet supported)\n  - points: decimal 0-4 (optional, default 0; discount points bought, each = 1% of loan)\n  - points_rate_reduction_pct: decimal 0-1.0, PERCENTAGE POINTS reduction per point (optional, default 0.25)\n\noption_b (REQUIRED object):\n  - same shape as option_a\n  - Must differ from option_a on at least one of: term_years, annual_rate_pct, or points\n\nproperty_tax_annual: decimal >= 0 (optional, default 0; for true monthly cost)\nhome_insurance_annual: decimal >= 0 (optional, default 0)\npmi_monthly: decimal >= 0, <= 1,000,000,000 (optional, default 0; PMI if < 20% down)\npmi_removal_ltv_pct: decimal 50-100 (optional). When omitted, PMI is modeled as removed at the 78% HPA automatic-termination threshold. Provide a value (e.g. 80) to model borrower-requested removal at that LTV (whichever of 78% or your value is reached first). 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.\nhoa_monthly: decimal >= 0 (optional, default 0)\n\ninvest_the_difference: bool (optional, default true). When true, 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.\ninvestment_return_pct: decimal 0-30 as 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%)\ntax_bracket_pct: decimal 0-50 as percentage (optional; enables after-tax investment return and mortgage interest deduction analysis; the after-tax comparison credits each option's annual deduction savings to its investments at year end)\nstandard_deduction: decimal (optional. Defaults to the IRS basic standard deduction for tax_year + filing_status. TY2026: 16100 single, 32200 married, 24150 head_of_household. TY2025: 15750 single, 31500 married, 23625 head_of_household. Source: Rev. Proc. 2025-32)\nfiling_status: 'single' | 'married' | 'head_of_household' (optional)\ntax_year: int, 2025 or 2026 (optional, default 2026; selects the IRS standard-deduction table for the itemize-vs-standard analysis)\n\nextra_monthly_payment: decimal >= 0, <= 1,000,000,000 (optional, default 0; extra principal applied equally to BOTH options)\ntime_horizon_years: int 1-40 (optional; default: max of both term_years)\nfull_schedule: bool (optional, default false; compact amortization by default)\nclosing_cost_pct: decimal 0-20 as percentage of loan amount (optional, default: Urban Institute loan-size regressive schedule (~4.6% at $97K loan down to ~1.4% at $679K), points excluded. Pass 0 to model zero closing costs)"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "toolArguments"
      -]New value: +[
      +  "home_price",
      +  "option_a",
      +  "option_b"
      +]
  4. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the baseline bar is lower, but the description still adds meaningful behavioral context: it warns 'Calculation, not advice,' states the outputs produced, notes the invest-the-difference and break-even analysis, and explicitly calls out that ARMs are unsupported. No annotation contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: caveat, scenarios, outputs, routing to alternatives, and unsupported case. Bullet formatting and the front-loaded 'Calculation, not advice' warning make it scannable and effective for a tool with 20 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, nested parameters, and absence of an output schema, the description is complete: it summarizes what results are returned, which analyses are included, how to choose among sibling tools, and what is not supported. An agent has enough context to invoke it correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all 20 parameters. The description adds value by explaining the purpose of key concepts such as invest-the-difference, break-even investment return, PMI auto-removal per the Homeowners Protection Act, and itemize-vs-standard deduction analysis, which are not obvious from parameter names alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Compare two fixed-rate mortgage options side-by-side,' and enumerates exact scenarios (15 vs 30 year, different rates, points vs no points, any two terms). It also names sibling tools it is not, making the distinction explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing instructions: use this tool for comparing two mortgage structures, use calculate_refi_breakeven for refinance comparisons against an existing loan, and use compare_payoff_strategies for revolving-debt payoff strategy. It also excludes ARM mortgages, which is a clear when-not-to-use signal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources