Skip to main content
Glama

Senaro Personal Finance

Loan Payoff Calculator

calculate_loan_payoff
Read-onlyIdempotent

Calculation, not advice. Verify with a professional before acting. Standard amortizing loan calculator. Pick this for a single fixed-rate installment loan (mortgage, auto, student, personal) with one amortization schedule; pick calculate_cc_payoff for a credit card, which carries revolving balances, multiple APR segments, and a snowball or avalanche strategy this tool does not model.

Returns:

  • monthly payment, total interest, and a payoff date (null when the loan does not clear within its term)

  • a bucketed Analysis suitable for chart rendering. The Analysis includes KPIs, annotations (e.g. crossover month), and summary strings

When extra_monthly_payment is supplied, every computed figure in the response outside with_extra describes this loan without the extra payment, including monthly_payment, payoff_months, total_paid, total_interest, remaining_balance_at_term, payoff_date, months_to_halfway_principal, months_to_interest_flip, and every value under analysis; a warnings[] entry names this.

The response includes chart_hints with rendering directives any client can use. This tool does not support output: 'inline' on any transport.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
outputNoValid values: 'summary' (default). 'summary' returns the full payload including analysis.buckets[] inline.
loan_typeNo'personal', 'auto', 'student', or 'mortgage'. Optional; defaults to 'personal' when omitted.
principalYesLoan principal to amortize. Decimal, greater than 0. REQUIRED, no default.
chart_titleNoOverride for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.
term_monthsYesLoan term. Integer, greater than 0. REQUIRED, no default.
chart_bucketNoTime-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_pctYesLoan annual percentage rate, e.g. 6.5 not 0.065. Decimal from 0 to 100. REQUIRED, no default.
extra_monthly_paymentNoExtra principal paid each month beyond the regular payment. Decimal, at least 0. Optional; defaults to 0 when omitted.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • addedInput schema / properties / chart_bucket / enum
      Added value: +[
      +  "auto",
      +  "monthly",
      +  "quarterly",
      +  "yearly",
      +  "biennial",
      +  null
      +]
    • addedInput schema / properties / chart_title / maxLength
      Added value: +120
    • addedInput schema / properties / loan_type / enum
      Added value: +[
      +  "personal",
      +  "auto",
      +  "student",
      +  "mortgage",
      +  null
      +]
    • changedInput schema / properties / output / enum
      Previous value: -[
      -  "summary"
      -]New value: +[
      +  "summary",
      +  null
      +]
    • changedInput schema / properties / output / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedInput schema / properties / term_months / maximum
      Added value: +480
  2. Changed4 schema fields changed
    • removedInput schema / properties / output / default
      Removed value: -null
    • changedInput schema / properties / output / description
      Previous value: -"'summary' (default) or 'capture'. 'inline' is not a valid value for this tool on any transport. 'summary' returns the full payload including analysis.buckets[] inline. 'capture' writes the full payload to ~/.senaro/captures/ and returns capture_ref, stripping analysis from the wire response; available on the local stdio transport only, since the hosted HTTP transport rejects 'capture' and names 'summary' as the only alternative."New value: +"Valid values: 'summary' (default). 'summary' returns the full payload including analysis.buckets[] inline."
    • addedInput schema / properties / output / enum
      Added value: +[
      +  "summary"
      +]
    • changedInput schema / properties / output / type
      Previous value: -[
      -  "string",
      -  "null"
      -]New value: +"string"
  3. Changed10 schema fields changed
    • addedInput schema / properties / annual_rate_pct
      Added value: +{
      +  "description": "Loan annual percentage rate, e.g. 6.5 not 0.065. Decimal from 0 to 100. REQUIRED, no default.",
      +  "type": "number"
      +}
    • addedInput schema / properties / chart_bucket
      Added value: +{
      +  "default": null,
      +  "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).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / chart_title
      Added value: +{
      +  "default": null,
      +  "description": "Override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters. Optional.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / extra_monthly_payment
      Added value: +{
      +  "default": null,
      +  "description": "Extra principal paid each month beyond the regular payment. Decimal, at least 0. Optional; defaults to 0 when omitted.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / loan_type
      Added value: +{
      +  "default": null,
      +  "description": "'personal', 'auto', 'student', or 'mortgage'. Optional; defaults to 'personal' when omitted.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / output
      Added value: +{
      +  "default": null,
      +  "description": "'summary' (default) or 'capture'. 'inline' is not a valid value for this tool on any transport. 'summary' returns the full payload including analysis.buckets[] inline. 'capture' writes the full payload to ~/.senaro/captures/ and returns capture_ref, stripping analysis from the wire response; available on the local stdio transport only, since the hosted HTTP transport rejects 'capture' and names 'summary' as the only alternative.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / principal
      Added value: +{
      +  "description": "Loan principal to amortize. Decimal, greater than 0. REQUIRED, no default.",
      +  "type": "number"
      +}
    • addedInput schema / properties / term_months
      Added value: +{
      +  "description": "Loan term. Integer, greater than 0. REQUIRED, no default.",
      +  "type": "integer"
      +}
    • removedInput schema / properties / toolArguments
      Removed value: -{
      -  "description": "JSON object with these parameters:\n\nprincipal: decimal > 0 (REQUIRED)\nannual_rate_pct: decimal 0-100 as percentage, e.g. 6.5 not 0.065 (REQUIRED)\nterm_months: int > 0 (REQUIRED)\nloan_type: 'personal' | 'auto' | 'student' | 'mortgage' (optional, default 'personal')\nextra_monthly_payment: decimal >= 0 (optional, default 0)\nchart_bucket: 'auto' | 'monthly' | 'quarterly' | 'yearly' | 'biennial' (optional, default 'auto')\n  Controls the time-axis granularity of analysis.buckets[]. 'auto' selects based on term length:\n    term <= 24 months -> monthly; <= 60 -> quarterly; <= 360 -> yearly; > 360 -> biennial.\noutput: 'summary' | 'capture' (optional, default 'summary'). 'inline' is not a valid value for this tool on any transport.\n  'summary': full payload including analysis.buckets[] returned inline.\n  'capture': full payload written to ~/.senaro/captures/; capture_ref URI returned;\n             analysis field stripped from wire response. Use when passing to a chart tool.\n             Available on the local stdio transport only; the hosted HTTP transport rejects\n             'capture' with a structured error naming 'summary' as the only valid alternative.\nchart_title: string (optional) override for the chart title. Must not contain em-dashes or en-dashes. Max 120 characters."
      -}
    • changedInput schema / required
      Previous value: -[
      -  "toolArguments"
      -]New value: +[
      +  "principal",
      +  "annual_rate_pct",
      +  "term_months"
      +]
  4. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Even though annotations already declare readOnly, idempotent, and non-destructive, the description adds meaningful response behavior: payoff date can be null, the analysis is bucketed and chart-ready, chart_hints are included, and extra_monthly_payment causes all non-with_extra figures to describe the loan without the extra payment. No 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.

Conciseness4/5

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

The description is organized with a lead statement, a uses paragraph, and bullet-like return details. It is somewhat lengthy, but each section covers a distinct need, and the extra-payment behavior paragraph is justified because it prevents misinterpretation of the response.

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?

For a read-only calculation tool with fully described parameters and rich annotations, the description covers returns, edge cases, sibling differentiation, and a critical response-semantics caveat. The lack of an output schema is compensated by the explicit return list and chart_hints note.

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 description coverage is 100%, so the baseline is 3UTE and most parameters are fully documented in the schema. The description adds extra semantic value by explaining how extra_monthly_payment changes the entire response shape and by flagging the unsupported output mode 'inline', which is not evident from the enum 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 names a specific operation and resource: 'Standard amortizing loan calculator' for a single fixed-rate installment loan. It also explicitly differentiates from calculate_cc_payoff by contrasting amortization schedules with revolving credit card balances, so an agent can identify this tool among siblings.

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?

It gives a clear selection rule: use this for mortgage, auto, student, or personal loans with a single amortization schedule, and use calculate_cc_payoff for credit cards. This is an explicit when-to-use/when-not-to-use contrast with a named alternative.

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