Loan and lease schedules: payment, interest, early settlement and the journal, to the minor unit.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <Pro license key or anonymous token from GET https://mcp.zovo.one/mcp/token>
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.
License key from checkout, MCPL1.<payload>.<signature>
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.
| Argument | Type | Description |
|---|---|---|
| key* | string | License key from checkout, MCPL1.<payload>.<signature> |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "License key from checkout, MCPL1.<payload>.<signature>"
}
},
"additionalProperties": false
}Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Record a loan or lease and return its id, level payment and effective annual rate. principal_minor, fees and balloon are whole MINOR units; rate_bps is the nominal annual rate in basis points. Free: 3 agreements.
| Argument | Type | Description |
|---|---|---|
| kind | string | Default "loan" |
| name* | string | What this agreement is, e.g. Van finance or Office lease |
| note | string | |
| lender | string | Who the money is owed to |
| method* | string | annuity for a level payment, straight-principal for equal principal and a falling payment |
| currency* | string | ISO code the agreement is denominated in |
| rate_bps* | integer | Nominal annual interest rate in basis points. 1200 is 12 percent. Zero is allowed |
| fees_minor | integer | Arrangement fees in whole minor units, paid at drawdown. Default 0 |
| start_date* | string |
Remove one loan or lease from the register and give its free-tier slot back. Refused, with the entry named, if a journal has already been taken from it. Free.
| Argument | Type | Description |
|---|---|---|
| loan* | string | The loan id, e.g. LOAN-2026-0001, or its exact name |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"loan"
],
"properties": {
"loan": {
"type": "string",
"maxLength": 200,
"description": "The loan id, e.g. LOAN-2026-0001, or its exact name"
}
},
"additionalProperties": false
}Return the double entry for one payment period or month: debit interest expense and loan liability, credit cash, in the cash book's account names, with an expense_add-ready payload. Give period or month, not both. Pro.
| Argument | Type | Description |
|---|---|---|
| loan* | string | The loan id, e.g. LOAN-2026-0001, or its exact name |
| month | string | Journal every payment falling in this month, YYYY-MM. Give this or period |
| period | integer | The payment period to journal. Give this or month |
| category | string | Expense category for the expense_add payload. Default "interest" |
| cash_account | string | Credit account for the payment. Default "cash" |
| interest_account | string | Debit account for the interest. Default "interest_expense" |
| liability_account | string | Debit account for the principal. Default "loan_liability" |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"loan"
],
"properties": {
"loan": {
"type": "string",
"maxLength": 200,
"description": "The loan id, e.g. LOAN-2026-0001, or its exact name"
},
"month": {
"type": "string",
"maxLength": 7,
"description": "Journal every payment falling in this month, YYYY-MM. Give this or period"
},
"period": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "The payment period to journal. Give this or month"
},
"category": {
"type": "string",
"maxLength": 200,
"description": "Expense category for the expense_add payload. Default \"interest\""
},
"cash_account": {
"type": "string",
"maxLength": 200,
"description": "Credit account for the payment. Default \"cash\""
},
"interest_account": {
"type": "string",
"maxLength": 200,
"description": "Debit account for the interest. Default \"interest_expense\""
},
"liability_account": {
"type": "string",
"maxLength": 200,
"description": "Debit account for the principal. Default \"loan_liability\""
}
},
"additionalProperties": false
}List the register with terms, level payment, effective annual rate and, at as_of, periods paid, balance outstanding, interest to date and the next payment, totalled per currency. Free; loans_report is the Pro roll-up.
| Argument | Type | Description |
|---|---|---|
| kind | string | Only loans, or only leases |
| as_of | string | Value the register at this date, YYYY-MM-DD. Default today |
| limit | integer | Maximum rows, default and ceiling 600 |
| currency | string | Only agreements in this currency |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"kind": {
"enum": [
"loan",
"lease"
],
"type": "string",
"description": "Only loans, or only leases"
},
"as_of": {
"type": "string",
"maxLength": 10,
"description": "Value the register at this date, YYYY-MM-DD. Default today"
},
"limit": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "Maximum rows, default and ceiling 600"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Only agreements in this currency"
}
},
"additionalProperties": false
}Work out what settling or overpaying costs as of a period: the outstanding balance, the penalty if one is given, the recalculated remaining schedule and the interest saved, stated gross and net of the penalty. Pro.
| Argument | Type | Description |
|---|---|---|
| loan* | string | The loan id, e.g. LOAN-2026-0001, or its exact name |
| limit | integer | Maximum remaining rows to return, ceiling 600 |
| extra_minor | integer | A partial overpayment in whole minor units. Omit to settle the loan in full |
| as_of_period* | integer | The period the extra money is paid at the end of. Period 1 is the first payment |
| keep_payment | boolean | On a partial overpayment, keep the same payment and shorten the term. Default false, which keeps the term and lowers the payment |
| penalty_minor | integer | Early repayment charge in whole minor units. Default 0 |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"loan",
"as_of_period"
],
"properties": {
"loan": {
"type": "string",
"maxLength": 200,
"description": "The loan id, e.g. LOAN-2026-0001, or its exact name"
},
"limit": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "Maximum remaining rows to return, ceiling 600"
},
"extra_minor": {
"type": "integer",
"minimum": 1,
"description": "A partial overpayment in whole minor units. Omit to settle the loan in full"
},
"as_of_period": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "The period the extra money is paid at the end of. Period 1 is the first payment"
},
"keep_payment": {
"type": "boolean",
"description": "On a partial overpayment, keep the same payment and shorten the term. Default false, which keeps the term and lowers the payment"
},
"penalty_minor": {
"type": "integer",
"minimum": 0,
"description": "Early repayment charge in whole minor units. Default 0"
}
},
"additionalProperties": false
}Build one loan's schedule: opening balance, payment, interest, principal and closing per period, with total interest. The last period absorbs rounding, landing exactly on the balloon or zero. loans_report totals it.
| Argument | Type | Description |
|---|---|---|
| loan* | string | The loan id, e.g. LOAN-2026-0001, or its exact name |
| year | string | Only the periods falling in this calendar year, YYYY |
| limit | integer | Maximum rows, default and ceiling 600 |
| from_period | integer | First period to return. Default 1 |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"loan"
],
"properties": {
"loan": {
"type": "string",
"maxLength": 200,
"description": "The loan id, e.g. LOAN-2026-0001, or its exact name"
},
"year": {
"type": "string",
"maxLength": 4,
"description": "Only the periods falling in this calendar year, YYYY"
},
"limit": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "Maximum rows, default and ceiling 600"
},
"from_period": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "First period to return. Default 1"
}
},
"additionalProperties": false
}The debt at as_of: per loan what is outstanding, whether it is settled, the next payment, and the interest and principal charged in a year, then totals per currency. Contractual balance, not cash paid. Pro.
| Argument | Type | Description |
|---|---|---|
| year | string | The calendar year to total the interest for, YYYY. Default the year of as_of |
| as_of | string | Value the debt at this date, YYYY-MM-DD. Default today |
| currency | string | Only agreements in this currency |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"year": {
"type": "string",
"maxLength": 4,
"description": "The calendar year to total the interest for, YYYY. Default the year of as_of"
},
"as_of": {
"type": "string",
"maxLength": 10,
"description": "Value the debt at this date, YYYY-MM-DD. Default today"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "Only agreements in this currency"
}
},
"additionalProperties": false
}| Drawdown date, YYYY-MM-DD. The first payment falls one period after it |
| compounding* | string | How often interest compounds |
| term_periods* | integer | Number of payment periods, not years |
| balloon_minor | integer | Final balloon or residual value in whole minor units, due with the last payment and not inside it. Default 0 |
| principal_minor* | integer | Amount borrowed, in whole minor units (integer cents). 1,000,000 is EUR 10,000.00 |
| payment_frequency* | string | How often a payment falls due |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"principal_minor",
"currency",
"rate_bps",
"compounding",
"payment_frequency",
"term_periods",
"method",
"start_date"
],
"properties": {
"kind": {
"enum": [
"loan",
"lease"
],
"type": "string",
"description": "Default \"loan\""
},
"name": {
"type": "string",
"maxLength": 200,
"description": "What this agreement is, e.g. Van finance or Office lease"
},
"note": {
"type": "string",
"maxLength": 2000
},
"lender": {
"type": "string",
"maxLength": 200,
"description": "Who the money is owed to"
},
"method": {
"enum": [
"annuity",
"straight-principal"
],
"type": "string",
"description": "annuity for a level payment, straight-principal for equal principal and a falling payment"
},
"currency": {
"type": "string",
"pattern": "^[A-Za-z]{3}$",
"description": "ISO code the agreement is denominated in"
},
"rate_bps": {
"type": "integer",
"maximum": 1000000,
"minimum": 0,
"description": "Nominal annual interest rate in basis points. 1200 is 12 percent. Zero is allowed"
},
"fees_minor": {
"type": "integer",
"minimum": 0,
"description": "Arrangement fees in whole minor units, paid at drawdown. Default 0"
},
"start_date": {
"type": "string",
"maxLength": 10,
"description": "Drawdown date, YYYY-MM-DD. The first payment falls one period after it"
},
"compounding": {
"enum": [
"weekly",
"fortnightly",
"monthly",
"quarterly",
"semiannual",
"annual"
],
"type": "string",
"description": "How often interest compounds"
},
"term_periods": {
"type": "integer",
"maximum": 600,
"minimum": 1,
"description": "Number of payment periods, not years"
},
"balloon_minor": {
"type": "integer",
"minimum": 0,
"description": "Final balloon or residual value in whole minor units, due with the last payment and not inside it. Default 0"
},
"principal_minor": {
"type": "integer",
"maximum": 100000000000000,
"minimum": 1,
"description": "Amount borrowed, in whole minor units (integer cents). 1,000,000 is EUR 10,000.00"
},
"payment_frequency": {
"enum": [
"weekly",
"fortnightly",
"monthly",
"quarterly",
"semiannual",
"annual"
],
"type": "string",
"description": "How often a payment falls due"
}
},
"additionalProperties": false
}