Cashew MCP
REMOTE · WWW.CASHEW.SG
Live Singapore mortgage rates, package recommendations and home-loan calculators.
Available components
Last scanned (2 hours ago)
Scores higher than 58% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security74
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability60
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8087 tokens (~351/item across 23 items; 23 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 23 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “analyze_decoupling” rewrote its description, which is the text the model reads security
- Tool “calculate_affordability” rewrote its description, which is the text the model reads security
- Tool “calculate_mortgage_repayment” rewrote its description, which is the text the model reads security
- Tool “calculate_mortgage_stamp_duty” rewrote its description, which is the text the model reads security
- Tool “calculate_package_schedule” rewrote its description, which is the text the model reads security
- Tool “calculate_refinance_savings” rewrote its description, which is the text the model reads security
- Tool “calculate_rental_stamp_duty” rewrote its description, which is the text the model reads security
- Tool “calculate_required_income” rewrote its description, which is the text the model reads security
- Tool “calculate_residential_stamp_duty” rewrote its description, which is the text the model reads security
- Tool “calculate_seller_stamp_duty” rewrote its description, which is the text the model reads security
- Tool “compare_packages” rewrote its description, which is the text the model reads security
- Tool “get_index_quotes” rewrote its description, which is the text the model reads security
- Tool “get_property_valuation” rewrote its description, which is the text the model reads security
- Tool “list_banks” rewrote its description, which is the text the model reads security
- Tool “recommend_packages” rewrote its description, which is the text the model reads security
- Server version: 1.1.0 → 1.2.0 functional
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Oct 26 +1
- The server changed its declared name: cashew-rate-engine → sg.cashew/mcp security
- Tool “analyze_sell_one_buy_two” rewrote its description, which is the text the model reads security
- Tool “calculate_hdb_resale_timeline” rewrote its description, which is the text the model reads security
- Tool “calculate_required_income” rewrote its description, which is the text the model reads security
- Tool “check_eligibility” rewrote its description, which is the text the model reads security
- Tool “get_index_quotes” rewrote its description, which is the text the model reads security
- Tool “recommend_packages” rewrote its description, which is the text the model reads security
- Schema quality: 306 → 353 ▼ functional
- Stability: unverified → 0.03 ▲ functional
- Server version: 1.0.0 → 1.1.0 functional
- “analyze_decoupling” reworded the description of “outstandingLoan” cosmetic
- “analyze_decoupling” reworded the description of “valuation” cosmetic
- “analyze_sell_one_buy_two” reworded the description of “buyer1Shares” cosmetic
- “analyze_sell_one_buy_two” reworded the description of “buyer2Shares” cosmetic
- “analyze_sell_one_buy_two” reworded the description of “outstandingLoan” cosmetic
- “analyze_sell_one_buy_two” reworded the description of “sellingLegalFees” cosmetic
- “analyze_sell_one_buy_two” reworded the description of “valuation” cosmetic
- “calculate_affordability” reworded the description of “loanTenureYears” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “buyerType” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “cpfUsage” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “exerciseFee” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “existingPropertiesOwned” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “interestRate” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “legalFee” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “loanAmount” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “optionDate” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “optionFee” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “purchasePrice” cosmetic
- “calculate_hdb_resale_timeline” reworded the description of “tenureYears” cosmetic
- “calculate_mortgage_repayment” reworded the description of “interestRate” cosmetic
- “calculate_mortgage_repayment” reworded the description of “loanAmount” cosmetic
- “calculate_package_schedule” reworded the description of “loanAmount” cosmetic
- “calculate_package_schedule” reworded the description of “tenureYears” cosmetic
- “calculate_private_resale_timeline” reworded the description of “buyerType” cosmetic
- “calculate_private_resale_timeline” reworded the description of “cpfUsage” cosmetic
- “calculate_private_resale_timeline” reworded the description of “existingPropertiesOwned” cosmetic
- “calculate_private_resale_timeline” reworded the description of “interestRate” cosmetic
- “calculate_private_resale_timeline” reworded the description of “legalFee” cosmetic
- “calculate_private_resale_timeline” reworded the description of “loanAmount” cosmetic
- “calculate_private_resale_timeline” reworded the description of “purchasePrice” cosmetic
- “calculate_private_resale_timeline” reworded the description of “tenureYears” cosmetic
- “calculate_progressive_payment” reworded the description of “loanAmount” cosmetic
- “calculate_progressive_payment” reworded the description of “loanQuantum” cosmetic
- “calculate_progressive_payment” reworded the description of “minimumCashPercent” cosmetic
- “calculate_progressive_payment” reworded the description of “purchasePrice” cosmetic
- “calculate_progressive_payment” reworded the description of “rateMode” cosmetic
- “calculate_progressive_payment” reworded the description of “referenceRate” cosmetic
- “calculate_progressive_payment” reworded the description of “tenureYears” cosmetic
- “calculate_purchase_cost” reworded the description of “availableCash” cosmetic
- “calculate_purchase_cost” reworded the description of “availableCpfOA” cosmetic
- “calculate_purchase_cost” reworded the description of “buyerType” cosmetic
- “calculate_purchase_cost” reworded the description of “existingPropertiesOwned” cosmetic
- “calculate_purchase_cost” reworded the description of “legalFeeFunding” cosmetic
- “calculate_purchase_cost” reworded the description of “legalFeeOverride” cosmetic
- “calculate_purchase_cost” reworded the description of “loanAmount” cosmetic
- “calculate_purchase_cost” reworded the description of “ltv” cosmetic
- “calculate_purchase_cost” reworded the description of “propertyType” cosmetic
- “calculate_purchase_cost” reworded the description of “purchasePrice” cosmetic
- “calculate_purchase_cost” reworded the description of “stampDutyFunding” cosmetic
- “calculate_refinance_savings” reworded the description of “currentRate” cosmetic
- “calculate_refinance_savings” reworded the description of “earlyRedemptionPenalty” cosmetic
- “calculate_refinance_savings” reworded the description of “loanStartMonth” cosmetic
- “calculate_refinance_savings” reworded the description of “loanStartYear” cosmetic
- “calculate_refinance_savings” reworded the description of “newRate” cosmetic
- “calculate_refinance_savings” reworded the description of “newTenureYears” cosmetic
- “calculate_refinance_savings” reworded the description of “originalLoanAmount” cosmetic
- “calculate_refinance_savings” reworded the description of “originalTenureYears” cosmetic
- “calculate_refinance_savings” reworded the description of “refinancingCosts” cosmetic
- “calculate_refinance_savings” reworded the description of “remainingAmount” cosmetic
- “calculate_refinance_savings” reworded the description of “remainingTenureYears” cosmetic
- “calculate_rental_stamp_duty” reworded the description of “premiumAmount” cosmetic
- “calculate_required_income” reworded the description of “citizenship” cosmetic
- “calculate_required_income” reworded the description of “propertyType” cosmetic
- “calculate_residential_stamp_duty” reworded the description of “buyerType” cosmetic
- “calculate_residential_stamp_duty” reworded the description of “propertyType” cosmetic
- “calculate_residential_stamp_duty” reworded the description of “purchaseType” cosmetic
- “calculate_sales_proceeds” reworded the description of “agentFeePercent” cosmetic
- “calculate_sales_proceeds” reworded the description of “legalFees” cosmetic
- “calculate_sales_proceeds” reworded the description of “outstandingLoanAmount” cosmetic
- “calculate_sales_proceeds” reworded the description of “sellingPrice” cosmetic
- “check_eligibility” reworded the description of “borrowers” cosmetic
- “check_eligibility” reworded the description of “loanTenureYears” cosmetic
- “compare_packages” reworded the description of “dealKind” cosmetic
- “compare_packages” reworded the description of “propertyStatus” cosmetic
- “compare_packages” reworded the description of “propertyType” cosmetic
- “compare_packages” reworded the description of “recommendedId” cosmetic
- “compare_packages” reworded the description of “tenureYears” cosmetic
- “compare_packages” reworded the description of “verdicts” cosmetic
- “get_index_quotes” reworded the description of “endDate” cosmetic
- “get_index_quotes” reworded the description of “limit” cosmetic
- “get_index_quotes” reworded the description of “page” cosmetic
- “get_index_quotes” reworded the description of “startDate” cosmetic
- “get_property_valuation” reworded the description of “postalCode” cosmetic
- “get_property_valuation” reworded the description of “propertyType” cosmetic
- “get_property_valuation” reworded the description of “unitNumber” cosmetic
- “recommend_packages” reworded the description of “candidateLimit” cosmetic
- “recommend_packages” reworded the description of “currentBankId” cosmetic
- “recommend_packages” reworded the description of “fixedDurationYrs” cosmetic
- “recommend_packages” reworded the description of “loanAmount” cosmetic
- “recommend_packages” reworded the description of “lockInPeriodYrs” cosmetic
- “recommend_packages” reworded the description of “propertyStatus” cosmetic
- “recommend_packages” reworded the description of “propertyType” cosmetic
- “recommend_packages” reworded the description of “tenureYears” cosmetic
- “calculate_sales_proceeds” dropped the optional parameter “bridgingRatePercent” cosmetic
- Tool “calculate_required_income” changed its title: Required-income calculator (reverse affordability) → Required-income calculator cosmetic
- 28 Oct 26 68
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://www.cashew.sg/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=cashew.sg | CN=WE1,O=Google Trust Services,C=US | 2 Oct 2026 | 1 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | ac6e8e06ff497716138f9832491eaa3e |
| SANs: cashew.sg, *.cashew.sg | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of www.cashew.sg. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| sg. | present | 26329 | 8 | Verified |
| cashew.sg. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://www.cashew.sg/mcp | Verified | 200 | |
| http (plaintext) | http://www.cashew.sg/mcp | HTTPS enforced | 301 | https://www.cashew.sg/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
analyze_decoupling Decoupling analysis ~181
Analyse decoupling, where one co-owner of a Singapore property transfers their share to the other: the seller's cash proceeds (after loan, CPF refund, SSD and legal fees), the buyer's financing of the share, BSD and ABSD, and the cost of each option for a planned next purchase. All amounts in SGD.
| Name | Type | Req | Description |
|---|---|---|---|
| buyer | object | yes | The co-owner buying out the share and refinancing. |
| newPropertyPrice | number | – | Price of a subsequent property purchase the freed-up buyer plans, in SGD. |
| outstandingLoan | number | – | Loan still owed on the whole property, in SGD; split between the parties by share. |
| seller | object | yes | The co-owner transferring out their share. |
| valuation | number | yes | Current market value of the whole property, in SGD; each party's share is valued pro rata. |
| Name | Type | Req | Description |
|---|---|---|---|
| buyer | object | yes | The buyer's financing of the share. |
| initialPayment | object | yes | Upfront payments by the buyer. |
| options | array | yes | Stamp-duty comparison for the next purchase when newPropertyPrice is given, else empty. Options 1-3 buy without decoupling (jointly, seller alone, buyer alone); options 4-5 decouple first, either way… |
| seller | object | yes | The seller's side of the transfer. |
| stages | object | yes | How the transfer is paid out. |
| summary | object | yes | Headline figures. |
No examples provided.
analyze_sell_one_buy_two Sell-one-buy-two analysis ~436
Analyse a 'sell one, buy two' plan where two co-owners sell their joint home. Returns the sale proceeds (cash after loan, CPF refunds, SSD and legal fees) and each buyer's resulting cash and CPF. With `buy1`, it compares buying one replacement jointly or under either buyer alone; with `buy2Property1` and `buy2Property2`, each buyer buying one property (both pairings). Every option is given at 30- and 35-year tenures with max loan, LTV, instalment, downpayment, stamp duties, cash/CPF shortfalls, TDSR used and an affordability verdict.
| Name | Type | Req | Description |
|---|---|---|---|
| buy1 | object | – | The single property in the "buy one" scenario. |
| buy2Property1 | object | – | First property in the "buy two" scenario. |
| buy2Property2 | object | – | Second property in the "buy two" scenario. |
| buyer1 | object | yes | Income/CPF profile of buyer 1. |
| buyer1CpfUsage | number | – | CPF (with accrued interest) buyer 1 must refund on sale, in SGD. |
| buyer1Shares | number | – | Buyer 1's ownership share of the sold property, in percent; splits the cash proceeds. |
| buyer2 | object | yes | Income/CPF profile of buyer 2. |
| buyer2CpfUsage | number | – | CPF (with accrued interest) buyer 2 must refund on sale, in SGD. |
| buyer2Shares | number | – | Buyer 2's ownership share of the sold property, in percent; splits the cash proceeds. Omit to use 100 minus buyer1Shares. |
| outstandingLoan | number | – | Loan still owed on the property being sold, repaid from the sale, in SGD. |
| sellerStampDuty | number | – | Seller's Stamp Duty payable on the sale, in SGD. |
| sellingLegalFees | number | – | Conveyancing fees for the sale, deducted from the proceeds, in SGD. |
| valuation | number | yes | Expected sale price of the jointly owned property being sold, in SGD. |
| Name | Type | Req | Description |
|---|---|---|---|
| buy1Options | array | – | Present when `buy1` was given: buying it jointly, under buyer 1 alone, or under buyer 2 alone. |
| buy2Options | array | – | Present when both `buy2Property1` and `buy2Property2` were given: each buyer buys one property, in both pairings. |
| buyer1Funds | object | yes | Buyer 1's cash and CPF after the sale. |
| buyer2Funds | object | yes | Buyer 2's cash and CPF after the sale. |
| sale | object | yes | Proceeds from selling the current property. |
No examples provided.
calculate_affordability Affordability calculator ~401
Estimate the maximum loan and property price (SGD) a borrower can afford from monthly income, existing debt commitments and tenure, applying Singapore TDSR/MSR limits. Use this when you know the income and want the budget; for the income a target price needs, use `calculate_required_income`. For joint borrowers with assets and liabilities in detail, use `check_eligibility`.
| Name | Type | Req | Description |
|---|---|---|---|
| age | integer | – | Age of the (oldest) borrower. |
| cashSavings | number | – | Cash available for downpayment, in SGD. |
| citizenship | string | – | Buyer citizenship: singaporean, pr or foreigner. Drives ABSD rate. |
| cpfOA | number | – | CPF Ordinary Account balance usable, in SGD. |
| existingPropertiesOwned | integer | – | Count of residential properties already owned; sets the ABSD tier (0, 1 or 2+). Takes precedence over existingProperty when provided. |
| existingProperty | boolean | – | True if the borrower already owns ≥1 property (affects ABSD and LTV). |
| interestRate | number | – | Assumed annual interest rate, as a percentage (e.g. 4.0 = 4%, not 0.04). |
| loanTenureYears | integer | – | Repayment period, in years, over which the maximum loan is sized. |
| monthlyDebt | number | – | Total existing monthly debt commitments (other loans, cards), in SGD. |
| monthlyFixedIncome | number | yes | Gross fixed monthly income (salary), in SGD. |
| monthlyVariableIncome | number | – | Gross variable monthly income (bonus/commission), in SGD; haircut 30% under TDSR. |
| propertyType | string | – | Property type: hdb, ec (Executive Condominium) or private. Sets MSR/LTV rules. |
| stressTestRate | number | – | Override the TDSR/MSR stress-test rate (percentage); defaults to the MAS floor. |
| Name | Type | Req | Description |
|---|---|---|---|
| absd | number | yes | Additional Buyer’s Stamp Duty, in SGD. |
| absdRate | number | yes | ABSD rate applied, as a decimal fraction (0.2 = 20%). |
| bsd | number | yes | Buyer's Stamp Duty, in SGD. |
| cpfUsageAllowed | number | yes | CPF allowed toward downpayment, in SGD. |
| downpaymentTotal | number | yes | Total downpayment (cash + CPF), in SGD. |
| limitingFactor | – | yes | Which limit bound the loan: "msr" or "tdsr" (null if neither binds). |
| ltv | number | yes | Loan-to-value ratio applied, as a decimal fraction (0.75 = 75%). |
| maxLoan | number | yes | Maximum loan the borrower qualifies for, in SGD. |
| maxPropertyPrice | number | yes | Maximum affordable property price, in SGD. |
| minCashDownpayment | number | yes | Minimum cash downpayment required, in SGD. |
| minCashPercent | number | yes | Minimum cash portion of price, as a decimal fraction. |
| monthlyInstalment | number | yes | Estimated monthly instalment at that loan, in SGD. |
| msrLimit | number|null | yes | Monthly MSR cap (HDB/EC only), in SGD; null otherwise. |
| tdsrLimit | number | yes | Monthly TDSR cap, in SGD. |
| totalCashRequired | number | yes | Total upfront cash needed (downpayment + duties + fees), in SGD. |
No examples provided.
calculate_hdb_resale_timeline HDB resale purchase timeline ~574
Generate a step-by-step dated timeline for an HDB resale purchase, from securing the Option to Purchase through to completion and key collection. Returns the ordered steps (what happens, the date, any payment due and its CPF/cash split), a summary (total payments, CPF and cash totals, completion date, duration in days), BSD and ABSD, the funding split (LTV, downpayment, minimum cash, cash-or-CPF remainder, monthly instalment when a rate and tenure are given), the completion date used, and self-checks.
| Name | Type | Req | Description |
|---|---|---|---|
| buyerType | string | – | Residency or legal status of the buyer; sets the ABSD rate. |
| completionDate | string | – | Completion date (ISO 8601). Defaults to exerciseDate + 70 calendar days if not provided. |
| cpfUsage | number | – | CPF OA savings the buyer will put towards the purchase, in SGD. Drawn down in step order against the legal fee, stamp duty and completion payment, the only payments CPF may make here; each payment re… |
| exerciseDate | string | yes | Date the option is exercised (ISO 8601). |
| exerciseFee | number | – | Fee paid to the seller when the option is exercised, in SGD. |
| existingPropertiesOwned | integer | – | Residential properties the buyer already owns; sets the ABSD tier. |
| interestRate | number | – | Annual loan interest rate, as a percentage (e.g. 3.5 = 3.5%). Supply with tenureYears to get `funding.monthlyInstalment`; otherwise it is null. |
| legalFee | number | – | Conveyancing fee for the purchase, in SGD; part of the total outlay. |
| loanAmount | number | – | Housing loan amount, in SGD; 0 for a cash purchase. Sets the LTV band, the minimum cash and the completion payment. |
| optionDate | string | yes | Date the Option to Purchase is granted, e.g. 2026-08-01; the timeline starts here. |
| optionExpiryDate | string | yes | Last day to exercise the option (ISO 8601). |
| optionFee | number | – | Fee paid to the seller when the Option to Purchase is granted, in SGD; HDB caps it at $1,000. |
| otherFees | number | – | Other costs (valuation, repairs, admin), in SGD. Reported alongside legal fees and stamp duty as part of the total outlay. |
| purchasePrice | number | yes | Agreed resale price of the HDB flat, in SGD; sets the stamp duties and downpayment. |
| tenureYears | integer | – | Loan tenure in years. Supply with interestRate to get `funding.monthlyInstalment`. |
| Name | Type | Req | Description |
|---|---|---|---|
| completionDateIsDefault | boolean | yes | True if the completion date was defaulted (not entered). |
| completionDateUsed | string | yes | The completion date used (entered or defaulted). |
| funding | object | yes | Loan, downpayment split and instalment. |
| otherFees | number | yes | Other costs supplied by the caller, in SGD. |
| stampDuty | object | yes | – |
| steps | array | yes | Ordered list of timeline steps. |
| summary | object | yes | Timeline summary. |
| validation | array | yes | Self-check results. |
No examples provided.
calculate_mortgage_repayment Mortgage repayment calculator ~138
Compute the monthly repayment, total interest and total cost (SGD) for a hypothetical loan from a loan amount, tenure and an interest rate you supply (standard amortisation). Use this for what-if rates; for the real rates of a specific package, use `calculate_package_schedule` instead.
| Name | Type | Req | Description |
|---|---|---|---|
| interestRate | number | yes | Hypothetical annual interest rate held for the whole tenure, as a percentage (e.g. 3.5 = 3.5%, not 0.035). |
| loanAmount | number | yes | Amount borrowed, in SGD. |
| tenureYears | integer | yes | Loan tenure in years. |
| Name | Type | Req | Description |
|---|---|---|---|
| firstYearInterest | number | yes | Interest paid in year 1, in SGD. |
| firstYearPrincipal | number | yes | Principal repaid in year 1, in SGD. |
| halfPaidOffMonth | integer | yes | Month at which half the principal is repaid. |
| interestPercentage | number | yes | Interest as a fraction of total paid (0.3 = 30%). |
| monthlyPayment | number | yes | Monthly instalment, in SGD. |
| principalPercentage | number | yes | Principal as a fraction of total paid (0.7 = 70%). |
| totalInterest | number | yes | Total interest over the tenure, in SGD. |
| totalPaid | number | yes | Total of all payments (principal + interest), in SGD. |
No examples provided.
calculate_mortgage_stamp_duty Mortgage stamp duty ~69
Compute the Singapore stamp duty (SGD) payable on a mortgage or loan facility from the loan amount. Not for purchases: use `calculate_residential_stamp_duty` for BSD and ABSD.
| Name | Type | Req | Description |
|---|---|---|---|
| loanAmount | number | yes | Mortgage/loan facility amount, in SGD. |
| Name | Type | Req | Description |
|---|---|---|---|
| stampDuty | number | yes | Mortgage stamp duty payable, in SGD (capped at $500). |
No examples provided.
calculate_package_schedule Calculate package payment schedule ~350
Compute the amortisation schedule for a specific mortgage package using that package's real effective rates. Returns loan facts (`context`), the per-tier breakdown (`periods`), rate structure, totals and the per-year schedule (`annual`). Required: `packageId` from `recommend_packages`, `loanAmount` (SGD) and `tenureYears`. Optional: `includeMonthly: true` fills `monthly`; `formats` (`["pdf"]`, `["xlsx"]` or both) adds download URLs under `documents`; `firstPaymentDate` (YYYY-MM-DD, defaults to next month). Not for hypothetical rates: use `calculate_mortgage_repayment` for a what-if rate the borrower holds no package for.
| Name | Type | Req | Description |
|---|---|---|---|
| firstPaymentDate | string | – | First repayment month as an ISO date (YYYY-MM-DD). Defaults to next month. |
| formats | array | – | Document formats to generate and upload (pdf, xlsx); the resulting download URLs are returned under `documents`. Omit/empty for data only. |
| includeMonthly | boolean | – | Include the full month-by-month schedule (`monthly[]`) in the response. Omitted/false returns an empty `monthly[]` to keep the payload small. |
| loanAmount | integer | yes | Amount borrowed under this package, in SGD. |
| maskBankIdentity | boolean | – | When true and the bank has maskIdentity set, replace the bank name with "Confidential Rate" and hide the logo in generated documents. |
| packageId | string | yes | Package id, as returned by `recommend_packages`. |
| tenureYears | integer | yes | Repayment period of the loan, in years; the schedule amortises over it. |
| Name | Type | Req | Description |
|---|---|---|---|
| annual | array | yes | Per-year rollup across the full tenure. |
| context | object | yes | Loan facts and presentation labels. |
| documents | object | yes | Generated PDF/XLSX download URLs. |
| monthly | array | yes | Full month-by-month schedule; empty unless `includeMonthly`/`formats` requested. |
| monthlyPayments | array | yes | Monthly instalment per tier. |
| periods | array | yes | Compact per-rate-tier breakdown (monthly payment, principal/interest, balance). |
| rateStructure | array | yes | Rate per tier, for display. |
| referenceIndex | – | yes | Benchmark the first floating tier is priced off, or null for fully fixed packages. |
| totals | object | yes | Totals over the full tenure. |
No examples provided.
calculate_private_resale_timeline Private resale purchase timeline ~464
Generate a step-by-step dated timeline for a private (non-HDB) resale purchase, with the 1% option fee, 4% exercise payment, stamp duties and completion payment at the right steps. Exercise date defaults to 14 calendar days inclusive of the option date if not entered.
| Name | Type | Req | Description |
|---|---|---|---|
| buyerType | string | – | Residency or legal status of the buyer; sets the ABSD rate. |
| completionDate | string | – | Completion date (ISO 8601). Defaults to exerciseDate + 70 calendar days if not provided. |
| cpfUsage | number | – | CPF OA savings the buyer will put towards the purchase, in SGD. Drawn down in step order against the legal fee and completion payment, the only payments CPF may make; each payment reports its `cpf` a… |
| exerciseDate | string | – | Exercise date (ISO 8601). Defaults to optionDate + 13 calendar days if not provided. |
| existingPropertiesOwned | integer | – | Residential properties the buyer already owns; sets the ABSD tier. |
| interestRate | number | – | Annual loan interest rate, as a percentage (e.g. 3.5 = 3.5%). Supply with tenureYears to get `funding.monthlyInstalment`; otherwise it is null. |
| legalFee | number | – | Conveyancing fee for the purchase, in SGD; part of the total outlay. |
| loanAmount | number | – | Housing loan amount, in SGD; 0 for a cash purchase. Sets the LTV band, the minimum cash and the completion payment. |
| optionDate | string | yes | Option to Purchase date (ISO 8601). |
| optionExpiryDate | string | yes | Last day to exercise the option (ISO 8601). |
| otherFees | number | – | Other costs (valuation, repairs, admin), in SGD. Reported alongside legal fees and stamp duty as part of the total outlay. |
| purchasePrice | number | yes | Agreed purchase price of the private property, in SGD; sets the option fee, exercise payment, stamp duties and downpayment. |
| tenureYears | integer | – | Loan tenure in years. Supply with interestRate to get `funding.monthlyInstalment`. |
| Name | Type | Req | Description |
|---|---|---|---|
| completionDateIsDefault | boolean | yes | True if the completion date was defaulted (not entered). |
| completionDateUsed | string | yes | The completion date used (entered or defaulted). |
| exerciseDateIsDefault | boolean | yes | True if the exercise date was defaulted (not entered). |
| exerciseDateUsed | string | yes | The exercise date used (entered or defaulted). |
| funding | object | yes | Loan, downpayment split and instalment. |
| otherFees | number | yes | Other costs supplied by the caller, in SGD. |
| stampDuty | object | yes | – |
| steps | array | yes | Ordered list of timeline steps. |
| summary | object | yes | Timeline summary. |
| validation | array | yes | Self-check results. |
No examples provided.
calculate_progressive_payment Progressive payment (BUC) calculator ~674
Model the monthly instalment profile of a Singapore Building Under Construction (BUC) property loan across progressive payment stages. Handles fixed and floating rate packages, per-stage cash/CPF/loan funding split, drawdown timing, rate stepping by year, and optional prepayments. Set includeSchedule to true for the full month-by-month amortisation schedule (summary is always included).
| Name | Type | Req | Description |
|---|---|---|---|
| availableCpfOA | number | – | Available CPF Ordinary Account balance, in SGD. When set, each stage’s equity CPF portion is capped at the remaining OA balance and the rest is funded by cash. When omitted, CPF covers all equity abo… |
| cscOffsetMonths | integer | – | Months from TOP to CSC (default 12). |
| includeSchedule | boolean | – | If true, include the full month-by-month amortisation schedule in output. |
| loanAmount | number | – | Loan amount in SGD. Takes precedence over loanQuantum. |
| loanQuantum | number | – | Loan as a fraction of the price (e.g. 0.75 = 75%). Used only when loanAmount is omitted; with neither, 75% is assumed. |
| lockInMonths | integer | – | Lock-in period in months from first drawdown. |
| minimumCashPercent | number | – | Minimum cash downpayment as a percentage of the purchase price (e.g. 5 = 5%); CPF or cash covers the rest of the equity. |
| otpDate | string | yes | Option to Purchase date (ISO 8601). |
| prepaymentOutcome | string | – | What happens after a prepayment: lower instalment or shorter tenure. |
| prepaymentPenaltyPercent | number | – | Penalty as a percentage of prepaid amount if within lock-in period. |
| prepayments | array | – | Optional list of prepayments. |
| purchasePrice | number | yes | Purchase price of the BUC property, in SGD; each stage's payment is a share of it. |
| rateMode | string | – | How each year's rate is set: 'fixed' takes it from ratePerYear; 'floating' uses referenceRate plus that year's spreadPerYear and ignores ratePerYear. |
| ratePerYear | array | yes | Annual interest rates by year as percentages (e.g. [2.5, 2.5, 3.0, 3.5, 3.5, 3.5] for years 1-5 and thereafter). Last value applies to all subsequent years. |
| referenceRate | number | – | Floating mode only: the benchmark rate such as 3M SORA, as a percentage (e.g. 3.5 = 3.5%), to which each year's spread is added. Omitted, it is taken as 0, so the rate is the spread alone. Ignored in… |
| spreadPerYear | array | – | Spread per year for floating mode, as percentages. Last value applies to all subsequent years. |
| stages | array | – | Custom stage schedule. Defaults to the standard 10-stage BUC schedule. Percentages must sum to 100. |
| tenureYears | integer | yes | Loan tenure in years, counted from the first drawdown. |
| topDate | string | yes | Expected Temporary Occupation Permit date (ISO 8601). |
| Name | Type | Req | Description |
|---|---|---|---|
| cumulativeInterestByYear | array | yes | Cumulative interest at the end of each year, in SGD. |
| derived | object | yes | – |
| prepaymentSummary | – | yes | Prepayment impact summary, or null if no prepayments. |
| schedule | array | – | Full month-by-month schedule (only when includeSchedule is true). |
| stages | array | yes | Per-stage funding breakdown. |
| summary | object | yes | – |
| validation | array | yes | Self-check results. |
No examples provided.
calculate_purchase_cost Purchase cost & funding breakdown ~522
Calculate the full upfront cost of purchasing a Singapore residential property (HDB or private resale), with each cost line attributed to its funding source (cash, CPF or bank loan). Returns option fee, exercise fee, stamp duties (BSD and ABSD), downpayment breakdown, and a sufficiency check against available funds.
| Name | Type | Req | Description |
|---|---|---|---|
| availableCash | number | – | Cash the buyer can put towards the purchase, in SGD; checked in `cashSufficiency`. |
| availableCpfOA | number | – | CPF Ordinary Account balance the buyer can put towards the purchase, in SGD; checked in `cpfSufficiency`. |
| buyerType | string | – | Residency or legal status of the buyer; sets the ABSD rate. |
| cpfFirst | boolean | – | When true, fund CPF-eligible costs from a single CPF pool capped at availableCpfOA (CPF first, remainder cash), overriding the per-item cash/cpf funding sources. ABSD stays cash. |
| existingPropertiesOwned | integer | – | Residential properties the buyer already owns; sets the ABSD tier. |
| legalFeeFunding | string | – | Pay the legal/conveyancing fee from cash or from CPF. |
| legalFeeOverride | number | – | Legal/conveyancing fee to use instead of the standard estimate ($2,000 HDB, $3,000 private), in SGD. |
| loanAmount | number | – | Bank loan amount, in SGD. Takes precedence over `ltv`; with neither, a 75% loan is assumed. |
| ltv | number | – | Loan as a fraction of the purchase price (e.g. 0.75 = 75%). Used only when loanAmount is omitted. |
| minimumCashPercent | number | – | Minimum cash component as a percentage of price: 5 or 10 on a first housing loan, 25 with one already outstanding. |
| propertyType | string | yes | Whether this is an HDB resale flat or a private property; sets the option and exercise fees, default legal and valuation fees, and stamp-duty funding. |
| purchasePrice | number | yes | Agreed purchase price, in SGD; fees, stamp duties and downpayment follow from it. |
| stampDutyFunding | string | – | Pay the stamp duties (BSD and ABSD) from cash or from CPF. Omit for the usual convention: HDB pays BSD from CPF, private from cash, and ABSD is paid in cash. |
| valuationFeeOverride | number | – | Override for valuation fee, in SGD. Defaults to $120 (HDB) or $350 (private). |
| Name | Type | Req | Description |
|---|---|---|---|
| absd | number | yes | Additional Buyer's Stamp Duty, in SGD. |
| absdRate | number | yes | ABSD rate applied as a decimal (e.g. 0.2 = 20%). |
| bsd | number | yes | Buyer's Stamp Duty, in SGD. |
| bsdBreakdown | array | yes | BSD per bracket. |
| cashRequired | number | yes | Total cash required across all cash-funded items, in SGD. |
| cashSufficiency | object | yes | Cash surplus or shortfall. |
| costLines | array | yes | Line-by-line breakdown of all costs. |
| cpfRequired | number | yes | Total CPF required across all CPF-funded items, in SGD. |
| cpfSufficiency | object | yes | CPF surplus or shortfall. |
| downpayment | object | yes | Downpayment split. |
| exerciseFee | number | yes | Exercise fee, in SGD. |
| legalFee | number | yes | Legal/conveyancing fee, in SGD. |
| loanAmount | number | yes | Bank loan amount, in SGD. |
| ltv | number | yes | Loan-to-value ratio as a decimal. |
| optionFee | number | yes | Option fee, in SGD. |
| totalCost | number | yes | Total cost: price + all fees + stamp duties, in SGD. |
| validation | array | yes | Self-check results. |
| valuationFee | number | yes | Valuation fee, in SGD. |
No examples provided.
calculate_refinance_savings Refinance savings calculator ~430
Compare a borrower's existing mortgage against a new rate and report monthly savings, total savings (SGD) and break-even months. Set `mode` to 'original' (supply the original loan amount, tenure and start date) or 'remaining' (supply the current outstanding balance and remaining tenure). Not for finding the new package: use `recommend_packages` for that.
| Name | Type | Req | Description |
|---|---|---|---|
| currentRate | number | yes | Annual rate on the existing loan, as a percentage (e.g. 4.0 = 4%). |
| earlyRedemptionPenalty | number | – | Penalty the current bank charges for repaying within its lock-in, in SGD; treated as a switching cost like refinancingCosts. |
| loanStartMonth | integer | – | Mode 'original': month the loan started, as a number (1 = January). |
| loanStartYear | integer | – | Mode 'original': calendar year the loan started, e.g. 2021. |
| mode | string | yes | Use 'original' when supplying the loan's original terms and start date, 'remaining' when supplying the current outstanding balance and tenure left. |
| newRate | number | yes | Annual rate offered on the new loan, as a percentage (e.g. 3.2 = 3.2%). |
| newTenureYears | integer | – | Tenure of the new loan, in years. Omit to keep the current loan’s remaining tenure. |
| originalLoanAmount | number | – | Mode 'original': the amount first borrowed, in SGD. Today's balance is worked out from it. |
| originalTenureYears | integer | – | Mode 'original': the tenure the loan was first taken over, in years. |
| refinancingCosts | number | – | One-off cost of switching (legal and valuation fees), in SGD; deducted from the savings and recouped in the break-even. |
| remainingAmount | number | – | Mode 'remaining': the balance still owed today, in SGD. |
| remainingTenureYears | integer | – | Mode 'remaining': years left to repay on the current loan. |
| Name | Type | Req | Description |
|---|---|---|---|
| breakEvenMonths | number|null | yes | Months to recoup switching costs, or null if it never breaks even. |
| currentMonthly | number | yes | Current monthly instalment, in SGD. |
| isBeneficial | boolean | yes | True if refinancing saves money overall. |
| monthlySavings | number | yes | Monthly saving (current − new), in SGD. |
| newMonthly | number | yes | Monthly instalment after refinancing, in SGD. |
| remainingBalance | number | yes | Outstanding balance being refinanced, in SGD. |
| remainingTenureMonths | integer | yes | Remaining tenure, in months. |
| totalCurrentCost | number | yes | Total remaining cost on the current loan, in SGD. |
| totalNewCost | number | yes | Total cost on the new loan incl. switching costs, in SGD. |
| totalSavings | number | yes | Net saving over the remaining tenure, in SGD. |
| warning | string | – | Set when the loan start/tenure was clamped (e.g. loan already fully repaid). |
No examples provided.
calculate_rental_stamp_duty Rental stamp duty ~131
Compute the Singapore stamp duty (SGD) payable on a property lease or tenancy from the rent and lease term. Not for purchases: use `calculate_residential_stamp_duty` for BSD and ABSD.
| Name | Type | Req | Description |
|---|---|---|---|
| hasPremium | boolean | – | True if the lease carries a lump-sum premium. |
| leasePeriodMonths | integer | – | Lease term in months. |
| monthlyRent | number | yes | Monthly rent under the lease, in SGD. |
| premiumAmount | number | – | One-off premium paid on top of the rent, in SGD; only counted when `hasPremium` is true. |
| Name | Type | Req | Description |
|---|---|---|---|
| stampDuty | number | yes | Lease stamp duty payable, in SGD. |
| totalRental | number | yes | Total rent over the lease (incl. premium), in SGD. |
No examples provided.
calculate_required_income Required-income calculator ~344
Reverse affordability: work out the gross monthly income (SGD) needed to support a target property price under Singapore TDSR/MSR limits. Use this when you know the target price; for the budget a known income supports, use `calculate_affordability`.
| Name | Type | Req | Description |
|---|---|---|---|
| age | integer | – | Age of the (oldest) borrower. |
| cashSavings | number | – | Cash available for downpayment, in SGD. |
| citizenship | string | – | Buyer's residency status (Singapore citizen, permanent resident or foreigner); sets the ABSD rate. |
| cpfOA | number | – | CPF Ordinary Account balance usable, in SGD. |
| existingPropertiesOwned | integer | – | Count of residential properties already owned; sets the ABSD tier (0, 1 or 2+). Takes precedence over existingProperty when provided. |
| existingProperty | boolean | – | True if the borrower already owns ≥1 property (affects ABSD and LTV). |
| interestRate | number | – | Assumed annual interest rate, as a percentage (e.g. 4.0 = 4%, not 0.04). |
| loanTenureYears | integer | – | Loan tenure in years. |
| monthlyDebt | number | – | Total existing monthly debt commitments, in SGD. |
| propertyPrice | number | yes | Target property purchase price, in SGD. |
| propertyType | string | – | Type of property: an HDB flat, an Executive Condominium (ec) or private. HDB and EC purchases are also held to the MSR limit. |
| stressTestRate | number | – | Override the TDSR/MSR stress-test rate (percentage); defaults to the MAS floor. |
| Name | Type | Req | Description |
|---|---|---|---|
| absd | number | yes | Additional Buyer’s Stamp Duty, in SGD. |
| absdRate | number | yes | ABSD rate applied, as a decimal fraction (0.2 = 20%). |
| bsd | number | yes | Buyer's Stamp Duty, in SGD. |
| cashShortfall | number | yes | Cash shortfall vs available savings, in SGD (0 if none). |
| cpfDownpayment | number | yes | CPF applied to downpayment, in SGD. |
| cpfShortfall | number | yes | CPF shortfall vs available OA, in SGD (0 if none). |
| downpaymentTotal | number | yes | Total downpayment (cash + CPF), in SGD. |
| isAffordable | boolean | yes | True if the borrower can fund the purchase with stated means. |
| ltv | number | yes | Loan-to-value ratio, as a decimal fraction (0.75 = 75%). |
| maxLoan | number | yes | Loan needed to buy at the target price, in SGD. |
| minCashDownpayment | number | yes | Minimum cash downpayment, in SGD. |
| minCashPercent | number | yes | Minimum cash portion of price, as a decimal fraction. |
| monthlyPayment | number | yes | Monthly instalment at that loan, in SGD. |
| msrRequired | number|null | yes | Monthly MSR needed (HDB/EC), in SGD; null otherwise. |
| requiredIncome | number | yes | Gross monthly income required to support it, in SGD. |
| tdsrRequired | number | yes | Monthly TDSR needed, in SGD. |
No examples provided.
calculate_residential_stamp_duty Residential stamp duty (BSD + ABSD) ~243
Compute Buyer's Stamp Duty (BSD) and Additional Buyer's Stamp Duty (ABSD) in SGD for a Singapore residential purchase, given the price or value, buyer type (singaporean | pr | foreigner | entity | trust) and the number of residential properties already owned. For the full upfront cost of a purchase, use `calculate_purchase_cost`.
| Name | Type | Req | Description |
|---|---|---|---|
| buyerType | string | – | Residency or legal status of the buyer (citizen, permanent resident, foreigner, company or trust); sets the ABSD rate. |
| existingPropertiesOwned | integer | – | Count of residential properties the buyer already owns (sets the ABSD tier). |
| price | number | yes | Purchase price or market value (whichever higher), in SGD. |
| propertyType | string | – | Type of residential property being bought. It does not change the result: BSD and ABSD depend on price, buyer and properties already owned. |
| purchaseType | string | – | How the property will be held. `entity` (a company) or `trust` applies that ABSD rate whatever `buyerType` says; for the individual options the rate follows `buyerType`. |
| Name | Type | Req | Description |
|---|---|---|---|
| absd | number | yes | Additional Buyer’s Stamp Duty, in SGD. |
| absdRate | number | yes | ABSD rate applied, as a decimal fraction (0.2 = 20%). |
| bsd | number | yes | Buyer's Stamp Duty, in SGD. |
| bsdBreakdown | array | yes | BSD amount per price bracket. |
| totalBuyerStampDuty | number | yes | Total stamp duty (BSD + ABSD), in SGD. |
No examples provided.
calculate_sales_proceeds Sales proceeds calculator ~251
Work out what a seller walks away with when selling a property: cash proceeds after redeeming the outstanding loan, refunding each owner’s CPF (principal plus accrued interest, 1 to 4 owners), and paying agent commission (with 9% GST), legal and miscellaneous fees. Flags a negative sale when the deductions exceed the selling price.
| Name | Type | Req | Description |
|---|---|---|---|
| agentFeePercent | number | – | Agent commission as a share of the selling price, as a percentage (e.g. 1.5 = 1.5%, not 0.015), before the 9% GST added on top. |
| legalFees | number | – | Conveyancing fees for the sale, deducted from the proceeds, in SGD. |
| miscellaneousFees | number | – | Other selling costs (repairs, valuation, admin), in SGD. |
| outstandingLoanAmount | number | – | Home loan still owed, repaid from the sale on completion, in SGD. |
| owners | array | yes | CPF usage per owner (1 to 4 owners). Include every owner; use zeros for an owner who used no CPF. |
| sellingPrice | number | yes | Price the property sells for, in SGD; every deduction comes out of it. |
| Name | Type | Req | Description |
|---|---|---|---|
| agentFees | number | yes | Agent commission including 9% GST, in SGD. |
| cashProceeds | number | yes | Cash left for the sellers after all deductions, in SGD. Negative means a negative sale: the sellers must top up cash to complete. |
| isNegativeSale | boolean | yes | True when cash proceeds are negative. |
| owners | array | yes | Per-owner CPF refunds, in input order. |
| perBankProceeds | array | – | Per-bank bridging headroom from the sale, when bank rules are supplied. Omitted otherwise. |
| totalCpfRefund | number | yes | Total refunded to all owners' CPF accounts (not cash in hand), in SGD. |
| totalDeductions | number | yes | Everything deducted from the selling price: loan redemption, CPF refunds, agent fees, legal fees and miscellaneous costs, in SGD. |
No examples provided.
calculate_seller_stamp_duty Seller's Stamp Duty (SSD) ~115
Compute Singapore Seller's Stamp Duty (SSD, in SGD) from the sale price or value and how long the residential property has been held. For net cash from a sale, use `calculate_sales_proceeds`.
| Name | Type | Req | Description |
|---|---|---|---|
| price | number | yes | Sale price or market value (whichever higher), in SGD. |
| purchaseDate | string | yes | Date the property was acquired (ISO date, YYYY-MM-DD). |
| saleDate | string | yes | Date the property is/was sold (ISO date, YYYY-MM-DD). |
| Name | Type | Req | Description |
|---|---|---|---|
| holdingPeriodYears | number | yes | Years the property was held (fractional). |
| ssd | number | yes | Seller's Stamp Duty payable, in SGD (0 past the holding period). |
| ssdRate | number | yes | Seller's Stamp Duty rate applied, as a decimal fraction (0.12 = 12%). |
No examples provided.
check_eligibility Eligibility checker (TDSR / MSR) ~588
Run the regulatory affordability gate for one main borrower and up to three joint borrowers. Given each borrower's income, rental, pledged/unpledged assets and liabilities plus a proposed loan, returns the qualifying income (after MAS haircuts), the TDSR and MSR for the proposed loan, the income-weighted average age (IWAA), and the maximum loan under both HDB/EC and private property rules. Use this upstream of `recommend_packages` to confirm what a borrower can qualify for.
| Name | Type | Req | Description |
|---|---|---|---|
| ageConvention | string | – | How borrower age is computed; defaults to birth-date. The tRPC router resolves it per bank from the bank slug. |
| asOfDate | string | – | Reference date (ISO YYYY-MM-DD) for age and IWAA; defaults to today. |
| benchmarkRate | number | – | MAS medium-term stress rate, as a percentage (e.g. 4.0 = 4%, not 0.04). |
| borrowers | array | yes | The main borrower followed by any joint borrowers; their qualifying incomes and liabilities are pooled. |
| combinationSplit | number | – | For the pledge/show combination: fraction of the income gap covered by pledged funds; the remainder is covered by show funds. Defaults to 0.5. |
| existingHousingLoans | integer | – | Number of outstanding housing loans held. Selects the LTV tier (0 -> full, 1 -> second, 2+ -> third). Defaults to 0 when omitted. |
| loanTenureYears | integer | – | Loan tenure being tested, in years; checked against the longest tenure these borrowers can get. |
| propertyType | string | – | Property type: hdb, ec or private. Sets the maximum loan tenure (35y private and EC, 30y HDB) and the lower-LTV-tier triggers. EC also carries MSR, like HDB. |
| proposedLoanAmount | number | yes | The loan amount being tested, in SGD. |
| targetLoanAmount | number | – | Optional target loan amount, in SGD. With targetPurchasePrice it sets the LTV (loan / price, capped at the applicable LTV) and takes precedence over targetLtvCap. Without a price, the price is derive… |
| targetLtvCap | number | – | Optional manual LTV cap for the target loan, as a decimal (e.g. 0.6 = 60%). When set and below the applicable LTV, toReachTarget is sized at this lower LTV so the loan and unlock figures reflect a sm… |
| targetPurchasePrice | number | – | Optional target purchase price, in SGD. When set, the result includes toReachTarget: the loan needed at the first-loan LTV and the eligible funds to reach it. |
| Name | Type | Req | Description |
|---|---|---|---|
| applicableLtv | number | yes | The LTV that applies for the entered number of existing housing loans, as a decimal (0.75 = 75%). |
| applicableMinCashPercent | number | yes | Mandatory cash downpayment for the applicable LTV tier, as a decimal (0.05 = 5%): 5% at the full tier, 10% at the reduced tier, 25% with an outstanding housing loan. |
| benchmarkRate | number | yes | The benchmark stress rate applied, as a percentage. |
| bindingConstraint | string | yes | Which rule produces the lower maximum loan. |
| borrowers | array | yes | Per-borrower breakdown. |
| fundsToQualify | object | yes | When the loan does not qualify, the extra eligible funds that would make it qualify. |
| household | object | yes | – |
| insufficientIncome | boolean | yes | True if total household income is zero, so ratios cannot be assessed. |
| ltv | object | yes | Lower-LTV-tier flags, informational only; LTV is out of scope for this checker. |
| maxLoanHdbEc | number | yes | Maximum loan under HDB/EC rules: the lower of the MSR and TDSR caps, in SGD. |
| maxLoanPrivate | number | yes | Maximum loan under private property rules (TDSR-bound), in SGD. |
| maxPrice | number | yes | Max property price at the applicable LTV for the entered housing-loan count, using the max loan for the property type (MSR-bound for HDB/EC), in SGD. |
| monthlyInstalment | number | yes | Monthly instalment on the proposed loan at the benchmark stress rate, in SGD. |
| msr | object | yes | Mortgage Servicing Ratio (HDB/EC), capped at 30%. |
| priceIf | array | yes | Max purchase price by number of existing housing loans; the LTV tier (full / reduced / none) follows whether the loan extends past age 65 / 75. |
| propertyType | string | yes | Property type the tenure and LTV-tier rules were applied for. |
| proposedLoanAmount | number | yes | The proposed loan amount that was tested, in SGD. |
| qualifiesHdbEc | boolean | yes | True if the proposed loan passes both MSR and TDSR (HDB/EC). |
| qualifiesPrivate | boolean | yes | True if the proposed loan passes TDSR (private property). |
| tdsr | object | yes | Total Debt Servicing Ratio (all property), capped at 55%. |
| tenure | object | yes | – |
| toReachTarget | – | yes | Present only when targetPurchasePrice is supplied: the funds needed to reach that price. |
| warnings | array | yes | Warning messages (insufficient income, tenure over the maximum). |
No examples provided.
compare_packages Compare mortgage packages ~523
Compare 2–3 specific mortgage packages side by side: average rate over the lock-in, benchmark index, effective rate and monthly instalment per year, interest paid per year, and flexibility terms (prepayment, free conversion, sale waiver, penalties, minimum loan). Required: `packageIds` from `recommend_packages` and `loanAmount` (SGD). Optional: `tenureYears` (default 25); `dealKind`/`propertyType`/`propertyStatus` only label the report header; `formats: ["pdf"]` adds a one-page document (URL under `documents.pdfUrl`). Not for finding packages: it has no borrower context, so use `recommend_packages` for a personalised ranking. `verdicts`/`recommendedId` only carry over reasoning from a prior `recommend_packages` call; never author them.
| Name | Type | Req | Description |
|---|---|---|---|
| dealKind | string | – | Whether the loan is a new PURCHASE or a REFINANCE from another lender. Only labels the report header; the comparison is unchanged. |
| formats | array | – | Document formats to generate and upload (currently only "pdf"); the download URL is returned under `documents`. Omit/empty for data only. |
| loanAmount | integer | yes | Loan principal in SGD (whole dollars). |
| maskBankIdentity | boolean | – | When true and a bank has maskIdentity set, replace the bank name with "Confidential Rate" and hide the logo in the comparison report. |
| packageIds | array | yes | 2–3 package ids to compare, e.g. from `recommend_packages`. |
| propertyStatus | string | – | Stage or use of the property, e.g. COMPLETED (resale or ready-built), BTO or BUC (new, under construction). Only labels the report header; the comparison is unchanged. |
| propertyType | string | – | The kind of property securing the loan (HDB flat, private home or commercial). Only labels the report header; the comparison is unchanged. |
| recommendedId | string | – | The rank-1 package from the prior `recommend_packages` call; its column is highlighted as "Recommended". Only meaningful together with `verdicts`. |
| tenureYears | integer | – | Repayment period, in years, used for each package’s instalment and interest. |
| verdicts | array | – | Per-package verdict texts carried over from a prior `recommend_packages` call (the LLM reasoning). Adds the verdict row to the comparison; omit for a verdict-free report. Do not author these by hand. |
| Name | Type | Req | Description |
|---|---|---|---|
| data | object | yes | The assembled side-by-side comparison. |
| documents | object | yes | – |
No examples provided.
get_index_quotes Get market index quotes ~203
Return historical quotes (rate by date) for a market benchmark index such as SORA. Requires `marketIndexId` from `list_market_indices`. Optional `startDate`/`endDate` (YYYY-MM-DD) narrow the range; results are paginated, newest first. Quote `rate` values are decimal fractions (0.0356 = 3.56% p.a.). Not a package rate: use `recommend_packages` for those.
| Name | Type | Req | Description |
|---|---|---|---|
| endDate | string | – | Latest quote date to include. Omit for no upper bound. |
| limit | integer | – | Number of quotes per page. |
| marketIndexId | string | yes | Market index UUID. Resolve a benchmark name/slug via `list_market_indices`. |
| page | integer | – | Page of results to return, counting from 1; `totalPages` gives the last. |
| startDate | string | – | Earliest quote date to include. Omit for no lower bound. |
| Name | Type | Req | Description |
|---|---|---|---|
| items | array | yes | Quotes for the page, newest first. |
| page | integer | yes | 1-based page number returned. |
| pageSize | integer | yes | Page size used. |
| total | integer | yes | Total matching quotes across all pages. |
| totalPages | integer | yes | Total number of pages. |
No examples provided.
get_property_valuation Get indicative property valuation ~254
Indicative valuation (SGD) for a Singapore residential unit from an external valuation source. Requires `postalCode` and `unitNumber` in FF-SS format (e.g. "04-02"). `propertyType` ("Condo" or "HDB") and `areaSqft` are optional; without `propertyType` both are tried and `propertyTypeUsed` says which valued the unit. `valued: false` means the unit could not be valued: a valid answer, not an error. An estimate, not a formal bank valuation.
| Name | Type | Req | Description |
|---|---|---|---|
| areaSqft | number | – | Optional built-in/strata area in sqft; can rescue a "$0" valuation. |
| postalCode | string | yes | Postal code of the building the unit is in, e.g. "248973". |
| propertyType | string | – | Whether the unit is a private condominium or an HDB flat. Omit to auto-detect: both are probed and the one that values the unit is used (`propertyTypeUsed` reports which). |
| unitNumber | string | yes | Floor and stack of the unit, e.g. "04-02" for floor 4, stack 02. |
| Name | Type | Req | Description |
|---|---|---|---|
| capitalGain | number|null | yes | Estimated capital gain since last transaction (SGD), or null. |
| pricePerSqft | number|null | yes | Indicative price per square foot (SGD), or null. |
| pricePerSqm | number|null | yes | Indicative price per square metre (SGD), or null. |
| propertyTypeUsed | – | yes | The property type that produced the valuation, or null if unvalued. |
| raw | object | yes | Raw SPML response strings, for display/debugging. |
| requestedPropertyType | – | yes | The property type the caller requested, or null if auto-detection was used. |
| valuation | number|null | yes | Indicative market value in SGD, or null if unvalued. |
| valued | boolean | yes | True if SPML returned a valuation; false means the unit could not be valued. |
No examples provided.
list_banks List banks ~54
List active banks and lenders (id and name), sorted by name. Use it to resolve a borrower's current lender to the `currentBankId` that `recommend_packages` requires for refinance deals. Not a rate source.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| banks | array | yes | Active banks, sorted by name. |
No examples provided.
list_market_indices List market indices ~52
List market benchmark indices (id, slug, name, currency), sorted by slug. Use this to resolve a benchmark name like 'SORA' into the `marketIndexId` required by `get_index_quotes`.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| indices | array | yes | Benchmark indices, sorted by slug. |
No examples provided.
recommend_packages Recommend mortgage packages ~757
Rank live Singapore mortgage packages for one borrower and loan. Returns `recommended` (up to 3 picks with `reasoning`), `lowestRateIds` (cheapest eligible first), `isPersonalised` and `packages` (full details by id). Required: `dealKind` (PURCHASE | REFINANCE), `propertyType` (HDB | PRIVATE | COMMERCIAL), `propertyStatus`, `loanAmount` (SGD); for REFINANCE also `currentBankId` from `list_banks`. Ask for missing facts; do not guess. Valid statuses: HDB: COMPLETED or BTO; PRIVATE: COMPLETED or BUC; COMMERCIAL: OWNEROCCUPIED, INVESTMENT or PERSONAL. Optional: `ratesType` (FIXED | FLOATING), `userContext` (free-text priorities), `formats: ["pdf"]` for a comparison document (URL under `documents`), `tenureYears` (default 25). Call again with the full input set whenever anything changes. Not for what-if rates (use `calculate_mortgage_repayment`).
| Name | Type | Req | Description |
|---|---|---|---|
| candidateLimit | integer | – | How many candidate packages the ranker weighs for each of its slots (floating, 2-year fixed, longest fixed); values above 8 have no further effect. Leave unset unless deliberately narrowing the choic… |
| currentBankId | string | – | The borrower's current lender, as the bank `id` returned by `list_banks`. Needed for REFINANCE deals, where that bank's packages are left out; ignored for PURCHASE. |
| dealKind | string | yes | PURCHASE (new loan) or REFINANCE (switching lender). |
| fixedDurationYrs | – | – | Optional filter: keep only packages whose fixed-rate period lasts this many years. Pass an array to accept any of several. Only applied when `ratesType` is FIXED. |
| formats | array | – | Document formats to generate for the recommended set (currently only "pdf"); the download URL is returned under `documents`. Omit/empty for data only. |
| loanAmount | integer | yes | Amount the borrower wants to borrow, in SGD. Packages whose loan-size range does not cover it are excluded. |
| lockInPeriodYrs | integer | – | Optional filter: the longest lock-in, in years, the borrower will accept. Packages with a longer lock-in are excluded; packages without one always qualify. |
| propertyStatus | string | yes | Stage or use of the property, which must suit `propertyType`. For HDB: COMPLETED for a resale flat, BTO for a new Build-To-Order flat. For PRIVATE: COMPLETED for a ready-built home, BUC for one still… |
| propertyType | string | yes | The kind of property securing the loan: an HDB flat, a private home or a commercial property. Only packages offered for it are considered, and it decides which `propertyStatus` values are valid. |
| ratesType | string | – | Optional rate type: FIXED or FLOATING. This is a hard filter on the candidate pool, not a ranking hint. Omit it when the borrower stated no preference, so a mix of rate types stays eligible. |
| tenureYears | integer | – | Repayment period, in years, for the instalments shown in the comparison document; only used with `formats`. 25 when omitted. |
| userContext | – | – | Optional free-text summary of the borrower's priorities, timeline, bank relationships, citizenship, employment, family changes, etc. Only refines the LLM ranking; omit if there are no stated prioriti… |
| Name | Type | Req | Description |
|---|---|---|---|
| documents | object | – | Comparison document for the recommended set; only present when `formats` was requested. |
| isPersonalised | boolean | yes | True when `userContext` was supplied and the ranking reflects it. |
| lowestRateIds | array | yes | Up to 3 package ids, cheapest first by effective average rate. A fixed package whose lock-in outlives its fixed period is ranked behind eligible ones and only included to fill the list. |
| packages | object | yes | Lookup of full package details keyed by package id. Every id referenced in `recommended` and `lowestRateIds` has an entry here. |
| recommended | array | yes | Up to 3 picks. Ranked by the LLM when `userContext` is given and ranking succeeds, otherwise the cheapest package of each structure; fewer when fewer candidates exist after filtering. |
No examples provided.
How do I install the Cashew MCP server?
Cashew MCP is a hosted endpoint at https://www.cashew.sg/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · www.cashew.sg
claude mcp add --transport http sg-cashew-mcp 'https://www.cashew.sg/mcp'
What is the Cashew MCP server?
Cashew MCP is listed in the public MCP registry as sg.cashew/mcp. Live Singapore mortgage rates, package recommendations and home-loan calculators. This page covers its hosted endpoint (https://www.cashew.sg/mcp).
Is the Cashew MCP server safe to use?
Cashew MCP scores 72 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Cashew MCP server expose?
Cashew MCP exposes 23 tools: recommend_packages, compare_packages, list_banks, get_property_valuation, calculate_package_schedule, and 18 more. Their descriptions and schemas cost roughly 7,754 tokens of context every time the server is loaded.
Does the Cashew MCP server require authentication?
No. We connected to Cashew MCP without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Cashew MCP server still maintained?
Cashew MCP is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.