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

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 interest rate (the note rate in the loan contract, not the disclosed APR, which can differ when fees are financed), 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. Changed1 schema field changed
    • changedInput schema / properties / annual_rate_pct / description
      Previous value: -"Loan annual percentage rate, e.g. 6.5 not 0.065. Decimal from 0 to 100. REQUIRED, no default."New value: +"Loan annual interest rate (the note rate in the loan contract, not the disclosed APR, which can differ when fees are financed), e.g. 6.5 not 0.065. Decimal from 0 to 100. REQUIRED, no default."
  2. 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
  3. 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"
  4. 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"
      +]
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly, idempotent, non-destructive); the description adds non-obvious behavior the agent could not infer: when `extra_monthly_payment` is supplied, every top-level figure and every value under `analysis` describes the loan WITHOUT the extra payment, with a `warnings[]` entry naming this, and `payoff_date` is null when the loan does not clear within term. It also discloses that `output: 'inline'` is unsupported and that `chart_hints` provides rendering directives.

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?

Front-loads a disclaimer ('Calculation, not advice. Verify with a professional before acting.') before the purpose, which costs a sentence, but the rest is tightly organized into purpose, routing, and a returns block. The long field enumeration in the extra-payment paragraph is verbose yet necessary to the disclosure and is not padded.

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?

There is no output schema, so the description carries the return-value burden and does so: it names monthly payment, total interest, payoff date (with the null edge case), the bucketed Analysis with KPIs/annotations/summary strings, `chart_hints`, and `warnings[]`. For an 8-parameter calculation tool with edge cases, nothing needed to invoke or interpret it is missing.

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 3 is the baseline, but the description adds real semantics beyond the schema by explaining the counterintuitive effect of `extra_monthly_payment` on the other reported parameters and by listing the affected fields. It also flags the unsupported `output: 'inline'` value that the enum alone does not call out.

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?

States a specific verb and resource ('Standard amortizing loan calculator') and pins the scope to a single fixed-rate installment loan with one amortization schedule. It explicitly names the sibling it is not — `calculate_cc_payoff` for revolving credit-card balances — so an agent can route without opening either schema.

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?

Gives an explicit selection rule ('pick this for a single fixed-rate installment loan (mortgage, auto, student, personal)') paired with the when-not condition ('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'). The contrast is concrete and operational.

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