# Cashew MCP (remote · www.cashew.sg)

Live Singapore mortgage rates, package recommendations and home-loan calculators.

- Trust score: 72/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `www.cashew.sg`: 72/100 (this document), [markdown](https://verifymcp.io/servers/sg-cashew-mcp/www.md), [page](https://verifymcp.io/servers/sg-cashew-mcp/www)

## Channel facts

- Endpoint: `https://www.cashew.sg/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.1.0`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 74/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 23 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### 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.

### Claude

```bash
claude mcp add --transport http sg-cashew-mcp 'https://www.cashew.sg/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "sg-cashew-mcp": {
      "url": "https://www.cashew.sg/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "sg-cashew-mcp": {
      "type": "http",
      "url": "https://www.cashew.sg/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.sg-cashew-mcp]
url = "https://www.cashew.sg/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sg-cashew-mcp": {
      "type": "remote",
      "url": "https://www.cashew.sg/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sg-cashew-mcp --url 'https://www.cashew.sg/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  sg-cashew-mcp:
    url: "https://www.cashew.sg/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "sg-cashew-mcp": {
      "Transport": "http",
      "Url": "https://www.cashew.sg/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add sg-cashew-mcp -t streamable-http -u 'https://www.cashew.sg/mcp'
```

### Other

```json
{
  "mcpServers": {
    "sg-cashew-mcp": {
      "type": "http",
      "url": "https://www.cashew.sg/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 72, +1)

- [security] 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
- [functional] Server version: 1.1.0 → 1.2.0

### 2026-11-02 (score 71, +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.

### 2026-10-31 (score 70, +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.

### 2026-10-29 (score 69, +1)

- [security] 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
- [functional regression] Schema quality: 306 → 353
- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.0.0 → 1.1.0
- [cosmetic] “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

### 2026-10-28 (score 68)

First indexed and scored.

## MCP tools (23)

### `recommend_packages` (~757 tokens)

Recommend mortgage packages

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`).

Input parameters:

- `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, required): 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, required): 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, required): 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, required): 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…

Output parameters:

- `documents` (object): Comparison document for the recommended set; only present when `formats` was requested.
- `isPersonalised` (boolean): True when `userContext` was supplied and the ranking reflects it.
- `lowestRateIds` (array): 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): Lookup of full package details keyed by package id. Every id referenced in `recommended` and `lowestRateIds` has an entry here.
- `recommended` (array): 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.

### `compare_packages` (~523 tokens)

Compare mortgage packages

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.

Input parameters:

- `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, required): 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, required): 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.

Output parameters:

- `data` (object): The assembled side-by-side comparison.
- `documents` (object)

### `list_banks` (~54 tokens)

List banks

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.

Output parameters:

- `banks` (array): Active banks, sorted by name.

### `get_property_valuation` (~254 tokens)

Get indicative property valuation

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.

Input parameters:

- `areaSqft` (number): Optional built-in/strata area in sqft; can rescue a "$0" valuation.
- `postalCode` (string, required): 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, required): Floor and stack of the unit, e.g. "04-02" for floor 4, stack 02.

Output parameters:

- `capitalGain` (number|null): Estimated capital gain since last transaction (SGD), or null.
- `pricePerSqft` (number|null): Indicative price per square foot (SGD), or null.
- `pricePerSqm` (number|null): Indicative price per square metre (SGD), or null.
- `propertyTypeUsed`: The property type that produced the valuation, or null if unvalued.
- `raw` (object): Raw SPML response strings, for display/debugging.
- `requestedPropertyType`: The property type the caller requested, or null if auto-detection was used.
- `valuation` (number|null): Indicative market value in SGD, or null if unvalued.
- `valued` (boolean): True if SPML returned a valuation; false means the unit could not be valued.

### `calculate_package_schedule` (~350 tokens)

Calculate package payment schedule

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.

Input parameters:

- `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, required): 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, required): Package id, as returned by `recommend_packages`.
- `tenureYears` (integer, required): Repayment period of the loan, in years; the schedule amortises over it.

Output parameters:

- `annual` (array): Per-year rollup across the full tenure.
- `context` (object): Loan facts and presentation labels.
- `documents` (object): Generated PDF/XLSX download URLs.
- `monthly` (array): Full month-by-month schedule; empty unless `includeMonthly`/`formats` requested.
- `monthlyPayments` (array): Monthly instalment per tier.
- `periods` (array): Compact per-rate-tier breakdown (monthly payment, principal/interest, balance).
- `rateStructure` (array): Rate per tier, for display.
- `referenceIndex`: Benchmark the first floating tier is priced off, or null for fully fixed packages.
- `totals` (object): Totals over the full tenure.

### `list_market_indices` (~52 tokens)

List market indices

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`.

Output parameters:

- `indices` (array): Benchmark indices, sorted by slug.

### `get_index_quotes` (~203 tokens)

Get market index quotes

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.

Input parameters:

- `endDate` (string): Latest quote date to include. Omit for no upper bound.
- `limit` (integer): Number of quotes per page.
- `marketIndexId` (string, required): 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.

Output parameters:

- `items` (array): Quotes for the page, newest first.
- `page` (integer): 1-based page number returned.
- `pageSize` (integer): Page size used.
- `total` (integer): Total matching quotes across all pages.
- `totalPages` (integer): Total number of pages.

### `calculate_affordability` (~401 tokens)

Affordability calculator

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`.

Input parameters:

- `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, required): 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.

Output parameters:

- `absd` (number): Additional Buyer’s Stamp Duty, in SGD.
- `absdRate` (number): ABSD rate applied, as a decimal fraction (0.2 = 20%).
- `bsd` (number): Buyer's Stamp Duty, in SGD.
- `cpfUsageAllowed` (number): CPF allowed toward downpayment, in SGD.
- `downpaymentTotal` (number): Total downpayment (cash + CPF), in SGD.
- `limitingFactor`: Which limit bound the loan: "msr" or "tdsr" (null if neither binds).
- `ltv` (number): Loan-to-value ratio applied, as a decimal fraction (0.75 = 75%).
- `maxLoan` (number): Maximum loan the borrower qualifies for, in SGD.
- `maxPropertyPrice` (number): Maximum affordable property price, in SGD.
- `minCashDownpayment` (number): Minimum cash downpayment required, in SGD.
- `minCashPercent` (number): Minimum cash portion of price, as a decimal fraction.
- `monthlyInstalment` (number): Estimated monthly instalment at that loan, in SGD.
- `msrLimit` (number|null): Monthly MSR cap (HDB/EC only), in SGD; null otherwise.
- `tdsrLimit` (number): Monthly TDSR cap, in SGD.
- `totalCashRequired` (number): Total upfront cash needed (downpayment + duties + fees), in SGD.

### `calculate_required_income` (~344 tokens)

Required-income calculator

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`.

Input parameters:

- `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, required): 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.

Output parameters:

- `absd` (number): Additional Buyer’s Stamp Duty, in SGD.
- `absdRate` (number): ABSD rate applied, as a decimal fraction (0.2 = 20%).
- `bsd` (number): Buyer's Stamp Duty, in SGD.
- `cashShortfall` (number): Cash shortfall vs available savings, in SGD (0 if none).
- `cpfDownpayment` (number): CPF applied to downpayment, in SGD.
- `cpfShortfall` (number): CPF shortfall vs available OA, in SGD (0 if none).
- `downpaymentTotal` (number): Total downpayment (cash + CPF), in SGD.
- `isAffordable` (boolean): True if the borrower can fund the purchase with stated means.
- `ltv` (number): Loan-to-value ratio, as a decimal fraction (0.75 = 75%).
- `maxLoan` (number): Loan needed to buy at the target price, in SGD.
- `minCashDownpayment` (number): Minimum cash downpayment, in SGD.
- `minCashPercent` (number): Minimum cash portion of price, as a decimal fraction.
- `monthlyPayment` (number): Monthly instalment at that loan, in SGD.
- `msrRequired` (number|null): Monthly MSR needed (HDB/EC), in SGD; null otherwise.
- `requiredIncome` (number): Gross monthly income required to support it, in SGD.
- `tdsrRequired` (number): Monthly TDSR needed, in SGD.

### `calculate_mortgage_repayment` (~138 tokens)

Mortgage repayment calculator

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.

Input parameters:

- `interestRate` (number, required): Hypothetical annual interest rate held for the whole tenure, as a percentage (e.g. 3.5 = 3.5%, not 0.035).
- `loanAmount` (number, required): Amount borrowed, in SGD.
- `tenureYears` (integer, required): Loan tenure in years.

Output parameters:

- `firstYearInterest` (number): Interest paid in year 1, in SGD.
- `firstYearPrincipal` (number): Principal repaid in year 1, in SGD.
- `halfPaidOffMonth` (integer): Month at which half the principal is repaid.
- `interestPercentage` (number): Interest as a fraction of total paid (0.3 = 30%).
- `monthlyPayment` (number): Monthly instalment, in SGD.
- `principalPercentage` (number): Principal as a fraction of total paid (0.7 = 70%).
- `totalInterest` (number): Total interest over the tenure, in SGD.
- `totalPaid` (number): Total of all payments (principal + interest), in SGD.

### `calculate_refinance_savings` (~430 tokens)

Refinance savings calculator

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.

Input parameters:

- `currentRate` (number, required): 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, required): Use 'original' when supplying the loan's original terms and start date, 'remaining' when supplying the current outstanding balance and tenure left.
- `newRate` (number, required): 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.

Output parameters:

- `breakEvenMonths` (number|null): Months to recoup switching costs, or null if it never breaks even.
- `currentMonthly` (number): Current monthly instalment, in SGD.
- `isBeneficial` (boolean): True if refinancing saves money overall.
- `monthlySavings` (number): Monthly saving (current − new), in SGD.
- `newMonthly` (number): Monthly instalment after refinancing, in SGD.
- `remainingBalance` (number): Outstanding balance being refinanced, in SGD.
- `remainingTenureMonths` (integer): Remaining tenure, in months.
- `totalCurrentCost` (number): Total remaining cost on the current loan, in SGD.
- `totalNewCost` (number): Total cost on the new loan incl. switching costs, in SGD.
- `totalSavings` (number): Net saving over the remaining tenure, in SGD.
- `warning` (string): Set when the loan start/tenure was clamped (e.g. loan already fully repaid).

### `calculate_residential_stamp_duty` (~243 tokens)

Residential stamp duty (BSD + ABSD)

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`.

Input parameters:

- `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, required): 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`.

Output parameters:

- `absd` (number): Additional Buyer’s Stamp Duty, in SGD.
- `absdRate` (number): ABSD rate applied, as a decimal fraction (0.2 = 20%).
- `bsd` (number): Buyer's Stamp Duty, in SGD.
- `bsdBreakdown` (array): BSD amount per price bracket.
- `totalBuyerStampDuty` (number): Total stamp duty (BSD + ABSD), in SGD.

### `calculate_rental_stamp_duty` (~131 tokens)

Rental stamp duty

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.

Input parameters:

- `hasPremium` (boolean): True if the lease carries a lump-sum premium.
- `leasePeriodMonths` (integer): Lease term in months.
- `monthlyRent` (number, required): 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.

Output parameters:

- `stampDuty` (number): Lease stamp duty payable, in SGD.
- `totalRental` (number): Total rent over the lease (incl. premium), in SGD.

### `calculate_mortgage_stamp_duty` (~69 tokens)

Mortgage stamp duty

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.

Input parameters:

- `loanAmount` (number, required): Mortgage/loan facility amount, in SGD.

Output parameters:

- `stampDuty` (number): Mortgage stamp duty payable, in SGD (capped at $500).

### `calculate_seller_stamp_duty` (~115 tokens)

Seller's Stamp Duty (SSD)

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`.

Input parameters:

- `price` (number, required): Sale price or market value (whichever higher), in SGD.
- `purchaseDate` (string, required): Date the property was acquired (ISO date, YYYY-MM-DD).
- `saleDate` (string, required): Date the property is/was sold (ISO date, YYYY-MM-DD).

Output parameters:

- `holdingPeriodYears` (number): Years the property was held (fractional).
- `ssd` (number): Seller's Stamp Duty payable, in SGD (0 past the holding period).
- `ssdRate` (number): Seller's Stamp Duty rate applied, as a decimal fraction (0.12 = 12%).

### `analyze_sell_one_buy_two` (~436 tokens)

Sell-one-buy-two analysis

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.

Input parameters:

- `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, required): 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, required): 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, required): Expected sale price of the jointly owned property being sold, in SGD.

Output parameters:

- `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): Buyer 1's cash and CPF after the sale.
- `buyer2Funds` (object): Buyer 2's cash and CPF after the sale.
- `sale` (object): Proceeds from selling the current property.

### `check_eligibility` (~588 tokens)

Eligibility checker (TDSR / MSR)

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.

Input parameters:

- `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, required): 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, required): 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.

Output parameters:

- `applicableLtv` (number): The LTV that applies for the entered number of existing housing loans, as a decimal (0.75 = 75%).
- `applicableMinCashPercent` (number): 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): The benchmark stress rate applied, as a percentage.
- `bindingConstraint` (string): Which rule produces the lower maximum loan.
- `borrowers` (array): Per-borrower breakdown.
- `fundsToQualify` (object): When the loan does not qualify, the extra eligible funds that would make it qualify.
- `household` (object)
- `insufficientIncome` (boolean): True if total household income is zero, so ratios cannot be assessed.
- `ltv` (object): Lower-LTV-tier flags, informational only; LTV is out of scope for this checker.
- `maxLoanHdbEc` (number): Maximum loan under HDB/EC rules: the lower of the MSR and TDSR caps, in SGD.
- `maxLoanPrivate` (number): Maximum loan under private property rules (TDSR-bound), in SGD.
- `maxPrice` (number): 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): Monthly instalment on the proposed loan at the benchmark stress rate, in SGD.
- `msr` (object): Mortgage Servicing Ratio (HDB/EC), capped at 30%.
- `priceIf` (array): 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): Property type the tenure and LTV-tier rules were applied for.
- `proposedLoanAmount` (number): The proposed loan amount that was tested, in SGD.
- `qualifiesHdbEc` (boolean): True if the proposed loan passes both MSR and TDSR (HDB/EC).
- `qualifiesPrivate` (boolean): True if the proposed loan passes TDSR (private property).
- `tdsr` (object): Total Debt Servicing Ratio (all property), capped at 55%.
- `tenure` (object)
- `toReachTarget`: Present only when targetPurchasePrice is supplied: the funds needed to reach that price.
- `warnings` (array): Warning messages (insufficient income, tenure over the maximum).

### `analyze_decoupling` (~181 tokens)

Decoupling analysis

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.

Input parameters:

- `buyer` (object, required): 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, required): The co-owner transferring out their share.
- `valuation` (number, required): Current market value of the whole property, in SGD; each party's share is valued pro rata.

Output parameters:

- `buyer` (object): The buyer's financing of the share.
- `initialPayment` (object): Upfront payments by the buyer.
- `options` (array): 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): The seller's side of the transfer.
- `stages` (object): How the transfer is paid out.
- `summary` (object): Headline figures.

### `calculate_sales_proceeds` (~251 tokens)

Sales proceeds calculator

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.

Input parameters:

- `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, required): CPF usage per owner (1 to 4 owners). Include every owner; use zeros for an owner who used no CPF.
- `sellingPrice` (number, required): Price the property sells for, in SGD; every deduction comes out of it.

Output parameters:

- `agentFees` (number): Agent commission including 9% GST, in SGD.
- `cashProceeds` (number): 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): True when cash proceeds are negative.
- `owners` (array): 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): Total refunded to all owners' CPF accounts (not cash in hand), in SGD.
- `totalDeductions` (number): Everything deducted from the selling price: loan redemption, CPF refunds, agent fees, legal fees and miscellaneous costs, in SGD.

### `calculate_purchase_cost` (~522 tokens)

Purchase cost & funding breakdown

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.

Input parameters:

- `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, required): 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, required): 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).

Output parameters:

- `absd` (number): Additional Buyer's Stamp Duty, in SGD.
- `absdRate` (number): ABSD rate applied as a decimal (e.g. 0.2 = 20%).
- `bsd` (number): Buyer's Stamp Duty, in SGD.
- `bsdBreakdown` (array): BSD per bracket.
- `cashRequired` (number): Total cash required across all cash-funded items, in SGD.
- `cashSufficiency` (object): Cash surplus or shortfall.
- `costLines` (array): Line-by-line breakdown of all costs.
- `cpfRequired` (number): Total CPF required across all CPF-funded items, in SGD.
- `cpfSufficiency` (object): CPF surplus or shortfall.
- `downpayment` (object): Downpayment split.
- `exerciseFee` (number): Exercise fee, in SGD.
- `legalFee` (number): Legal/conveyancing fee, in SGD.
- `loanAmount` (number): Bank loan amount, in SGD.
- `ltv` (number): Loan-to-value ratio as a decimal.
- `optionFee` (number): Option fee, in SGD.
- `totalCost` (number): Total cost: price + all fees + stamp duties, in SGD.
- `validation` (array): Self-check results.
- `valuationFee` (number): Valuation fee, in SGD.

### `calculate_hdb_resale_timeline` (~574 tokens)

HDB resale purchase timeline

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.

Input parameters:

- `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, required): 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, required): Date the Option to Purchase is granted, e.g. 2026-08-01; the timeline starts here.
- `optionExpiryDate` (string, required): 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, required): 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`.

Output parameters:

- `completionDateIsDefault` (boolean): True if the completion date was defaulted (not entered).
- `completionDateUsed` (string): The completion date used (entered or defaulted).
- `funding` (object): Loan, downpayment split and instalment.
- `otherFees` (number): Other costs supplied by the caller, in SGD.
- `stampDuty` (object)
- `steps` (array): Ordered list of timeline steps.
- `summary` (object): Timeline summary.
- `validation` (array): Self-check results.

### `calculate_private_resale_timeline` (~464 tokens)

Private resale purchase timeline

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.

Input parameters:

- `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, required): Option to Purchase date (ISO 8601).
- `optionExpiryDate` (string, required): 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, required): 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`.

Output parameters:

- `completionDateIsDefault` (boolean): True if the completion date was defaulted (not entered).
- `completionDateUsed` (string): The completion date used (entered or defaulted).
- `exerciseDateIsDefault` (boolean): True if the exercise date was defaulted (not entered).
- `exerciseDateUsed` (string): The exercise date used (entered or defaulted).
- `funding` (object): Loan, downpayment split and instalment.
- `otherFees` (number): Other costs supplied by the caller, in SGD.
- `stampDuty` (object)
- `steps` (array): Ordered list of timeline steps.
- `summary` (object): Timeline summary.
- `validation` (array): Self-check results.

### `calculate_progressive_payment` (~674 tokens)

Progressive payment (BUC) calculator

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).

Input parameters:

- `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, required): 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, required): 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, required): 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, required): Loan tenure in years, counted from the first drawdown.
- `topDate` (string, required): Expected Temporary Occupation Permit date (ISO 8601).

Output parameters:

- `cumulativeInterestByYear` (array): Cumulative interest at the end of each year, in SGD.
- `derived` (object)
- `prepaymentSummary`: Prepayment impact summary, or null if no prepayments.
- `schedule` (array): Full month-by-month schedule (only when includeSchedule is true).
- `stages` (array): Per-stage funding breakdown.
- `summary` (object)
- `validation` (array): Self-check results.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/sg-cashew-mcp/www#diagnostics

## Score history

- 2026-11-05: 72
- 2026-11-04: 71
- 2026-11-03: 71
- 2026-11-02: 71
- 2026-11-01: 70
- 2026-10-31: 70
- 2026-10-30: 69
- 2026-10-29: 69
- 2026-10-28: 68

## Common questions

### 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.

## Links

- Remote endpoint: https://www.cashew.sg/mcp
- Repository: https://github.com/cashew-sg/cashew-mcp
- Website: https://www.cashew.sg/intro-to-mcp
- Changelog RSS feed: https://verifymcp.io/servers/sg-cashew-mcp/www.xml
- Changelog JSON feed: https://verifymcp.io/servers/sg-cashew-mcp/www.json
- HTML version of this page: https://verifymcp.io/servers/sg-cashew-mcp/www
