RateAPI — live US mortgage, auto, HELOC, personal & deposit rates
REMOTE · MCP.RATEAPI.DEV · SCANNED SEP 21
Live US mortgage, auto, HELOC, personal & deposit rates with evidence, plus who can join each lender
Available components
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 Security78
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS enforcement could not be verified: the plaintext port answered with HTTP 405, which proves neither a plaintext path nor enforcement. View diagnostics → Unverified
- 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
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 21726 tokens (~188/item across 115 items; 89 tools + 26 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 Management80
- Stability observed for 24 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage98
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 95% of tool parameters carry a description.Partial
- 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
- All 10 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 91 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities60
- Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28. See how to fix → Fail
- Supports UI / widget rendering.Pass
How do I install the RateAPI — live US mortgage, auto, HELOC, personal… MCP server?
RateAPI — live US mortgage, auto, HELOC, personal… is a hosted endpoint at https://mcp.rateapi.dev/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 · mcp.rateapi.dev
claude mcp add --transport http dev-rateapi-mcp 'https://mcp.rateapi.dev/mcp'
{
"mcpServers": {
"dev-rateapi-mcp": {
"url": "https://mcp.rateapi.dev/mcp"
}
}
} {
"servers": {
"dev-rateapi-mcp": {
"type": "http",
"url": "https://mcp.rateapi.dev/mcp"
}
}
} [mcp_servers.dev-rateapi-mcp] url = "https://mcp.rateapi.dev/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"dev-rateapi-mcp": {
"type": "remote",
"url": "https://mcp.rateapi.dev/mcp",
"enabled": true
}
}
} openclaw mcp add dev-rateapi-mcp --url 'https://mcp.rateapi.dev/mcp' --transport streamable-http
mcp_servers:
dev-rateapi-mcp:
url: "https://mcp.rateapi.dev/mcp" {
"McpServers": {
"dev-rateapi-mcp": {
"Transport": "http",
"Url": "https://mcp.rateapi.dev/mcp"
}
}
} assistant mcp add dev-rateapi-mcp -t streamable-http -u 'https://mcp.rateapi.dev/mcp'
{
"mcpServers": {
"dev-rateapi-mcp": {
"type": "http",
"url": "https://mcp.rateapi.dev/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
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.
- 21 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Sept 26 +1
- Resource “Quickstart: your first RateAPI call” was removed ▼ functional
- New resource “Quickstart: choose the CLI, MCP, or REST” functional
- 17 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 10 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 8 Sept 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “get_eligibility_coverage” rewrote its description, which is the text the model reads security
- Tool “search_eligibility_entities” rewrote its description, which is the text the model reads security
- “search_eligibility_entities” reworded the description of “query” cosmetic
- “search_eligibility_entities” made “query” optional cosmetic
- 7 Sept 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “find_reachable_offers” rewrote its description, which is the text the model reads security
- New tool “compare_personal_access_catalogs” functional
- New tool “compare_reachable_offers” functional
- New tool “evaluate_eligibility_cohort” functional
- New tool “get_eligibility_changes” functional
- New tool “get_personal_access_catalog” functional
- New tool “get_product_access_envelopes” functional
- New tool “resolve_eligibility_entities” functional
- New tool “search_eligibility_entities” functional
- “check_membership_eligibility” added an optional parameter “association_org_ids” cosmetic
- “check_membership_eligibility” added an optional parameter “employer_org_ids” cosmetic
- “check_membership_eligibility” added an optional parameter “relative_association_org_ids” cosmetic
- “check_membership_eligibility” added an optional parameter “relative_employer_org_ids” cosmetic
- “check_membership_eligibility” added an optional parameter “relative_school_org_ids” cosmetic
- “check_membership_eligibility” added an optional parameter “school_org_ids” cosmetic
- “check_membership_eligibility” added an optional parameter “worship_org_ids” cosmetic
- “find_eligible_credit_unions” added an optional parameter “association_org_ids” cosmetic
- “find_eligible_credit_unions” added an optional parameter “employer_org_ids” cosmetic
- “find_eligible_credit_unions” added an optional parameter “relative_association_org_ids” cosmetic
- “find_eligible_credit_unions” added an optional parameter “relative_employer_org_ids” cosmetic
- “find_eligible_credit_unions” added an optional parameter “relative_school_org_ids” cosmetic
- “find_eligible_credit_unions” added an optional parameter “school_org_ids” cosmetic
- “find_eligible_credit_unions” added an optional parameter “worship_org_ids” cosmetic
- “find_reachable_offers” reworded the description of “person” cosmetic
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 21 Sept 2026 · Probed https://mcp.rateapi.dev/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=rateapi.dev | CN=WE1,O=Google Trust Services,C=US | 5 Sept 2026 | 4 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | a3bbdbbdf7ccbfc9131d75153aa5997b |
| SANs: rateapi.dev, *.rateapi.dev | ||||||
| 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 mcp.rateapi.dev. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| dev. | present | 60074 | 8 | Verified |
| rateapi.dev. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer resource_metadata="https://mcp.rateapi.dev/.well-known/oauth-protected-resource"
Bearer resource_metadata="https://mcp.rateapi.dev/.well-known/oauth-protected-resource" Protected resource metadata
| Document | https://mcp.rateapi.dev/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://mcp.rateapi.dev |
| Authorisation server | https://mcp.rateapi.dev |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.rateapi.dev/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.rateapi.dev/mcp | Inconclusive | 405 |
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 →
add_campaign_recipients ~62
Add recipients (email + optional name) to a campaign. Up to 50 per request, 200 per campaign. Duplicate addresses are ignored.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Campaign id. Required. |
| recipients | array | yes | Recipients to add. |
| Name | Type | Req | Description |
|---|---|---|---|
| added | number | – | Recipients newly inserted by this call. |
| total | number | – | Total recipients on the campaign afterwards (capped at 200). |
No examples provided.
analyze_rent_vs_buy ~512
Compare projected cost of renting vs buying a home over a holding period, anchored to LIVE market mortgage rates. Given home price, down payment, monthly rent, and a holding period, returns year-by-year cumulative cost of each path (rent vs PITI), equity built, net cost of owning after sale, and the breakeven year where buying becomes cheaper than renting. If no rate is supplied, the current best market rate for the state is used. Use for 'should I rent or buy?' questions.
| Name | Type | Req | Description |
|---|---|---|---|
| annual_insurance | number | – | Homeowners insurance in dollars/year. Default max(800, 0.35% of home price). |
| closing_cost_pct | number | – | Buying closing costs as % of home price. Default 3.0. |
| down_payment | number | – | Cash down payment in dollars. Default 20% of home_price. |
| holding_period_years | number | – | How many years you plan to own. Default 7. |
| home_appreciation_rate | number | – | Annual home appreciation as %. Default 3.0. |
| home_price | number | yes | Purchase price in dollars. Required. |
| investment_return_rate | number | – | Opportunity cost return on invested savings as %. Default 5.0. |
| maintenance_rate | number | – | Annual maintenance as % of home value. Default 1.0. |
| marginal_tax_rate | number | – | Marginal tax rate as %, used to model mortgage-interest/property-tax deduction. Default 0 (no deduction). |
| monthly_hoa | number | – | HOA dues in dollars/month. Default 0. |
| monthly_rent | number | yes | Current monthly rent in dollars. Required. |
| pmi_rate | number | – | Annual PMI as % of loan balance. Default 0.5, applied only when LTV > 80%. |
| property_tax_rate | number | – | Annual property tax as % of home value. Default 1.1. |
| rate | number | – | Annual interest rate, e.g. 6.5. If omitted, best market rate for the state is used. |
| rent_growth_rate | number | – | Annual rent growth as %. Default 3.0. |
| selling_cost_pct | number | – | Selling costs as % of sale price. Default 6.0. |
| state | string | – | 2-letter US state code for the market-rate lookup. Default CA. |
| term_months | number | – | Loan term in months. Default 360. |
| Name | Type | Req | Description |
|---|---|---|---|
| assumed_defaults | array | – | Every input that was defaulted rather than supplied. Rent-vs-buy swings hard on these, so surface them. |
| breakeven | object | – | When buying overtakes renting on the assumptions used. |
| buy | object | – | The full economics of buying over the holding period. |
| confidence | string|null | – | Qualitative confidence in the recommendation — 'high' when the margin is wide relative to the assumptions. |
| disclosures | array | – | Caveats and assumptions that must accompany any answer built from this result; surface them rather than dropping them. |
| next_actions | array | – | Suggested follow-up tools that would deepen this answer; offer them as next steps, not as results. |
| rate_source | string|null | – | Where rate_used came from: 'provided' means the caller supplied it, 'market' means it was resolved from the best live published rate for this state and product. |
| rate_used | number|null | – | Mortgage rate in percent used for the buy path (6 = 6.00%). Check rate_source to see whether it was supplied or resolved from live market data. |
| recommendation | string|null | – | Which path the model favors on these assumptions: 'buy' or 'rent'. |
| rent | object | – | The full economics of renting over the same holding period. |
| summary_note | string|null | – | One-sentence bottom line with the dollar gap between the two paths, safe to quote. |
No examples provided.
assess_buy_timing ~256
Frame a buy/refi-now vs wait recommendation. Combines recent rate movement (direction + magnitude over 1w/2w/4w) with break-even sensitivity on the borrower's loan to return a forward 'lock now' vs 'wait' lean, the bps swing that would change the call, and the cost of waiting. Use for 'should I lock now or wait for rates to drop?' questions. Distinct from get_rate_delta (raw historical deltas only) — this adds a forward recommendation. Not a rate forecast.
| Name | Type | Req | Description |
|---|---|---|---|
| closing_costs | number | – | Closing/refi costs in dollars (default 0) |
| current_rate | number | – | Borrower's existing or quoted rate %, enables refi-now framing |
| loan_amount | number | yes | Loan amount in dollars — drives break-even sensitivity |
| product_type | string | yes | Loan product |
| rate_shift_bps | number | – | Hypothetical bps move if waiting; default derived from observed movement |
| since | string | – | Movement window (default 4w) |
| state | string | yes | 2-letter US state code |
| term_months | number | – | Loan term in months (default 360 for mortgage) |
| Name | Type | Req | Description |
|---|---|---|---|
| assumed_defaults | object | – | Inputs the caller did not supply that were filled in with defaults. State these explicitly to the user, since they drive the numbers. |
| break_even | object | – | How the cost of waiting nets out against the hoped-for saving. |
| confidence | string|null | – | Qualitative confidence in the recommendation — 'high', 'medium', or 'low' — driven by how much data and how large the margin is. |
| disclosures | array | – | Caveats and assumptions that must accompany any answer built from this result; surface them rather than dropping them. |
| movement | object | – | How the market has moved over the comparison window, from the earlier snapshot to now. |
| next_actions | array | – | Suggested follow-up tools that would deepen this answer; offer them as next steps, not as results. |
| note | string|null | – | A caveat about the DATA behind this call, not an error — e.g. limited rate history for that product and state, so the answer is a snapshot rather than a timing judgement. Present only when such a cav… |
| now | object | – | The best deal available today, for comparison against waiting. |
| product_type | string|null | – | Loan or deposit category this result covers, e.g. 'mortgage', 'auto_loan', 'heloc', 'savings'. |
| rationale | string|null | – | Plain-English explanation of why this recommendation was reached; safe to quote to the user as the reasoning. |
| recommendation | string|null | – | The suggested move, e.g. 'buy_now' or 'wait'. |
| state | string|null | – | Two-letter US state code the result is scoped to (e.g. 'CA'). Null means the result was not filtered by state. |
| wait_scenario | object | – | A what-if for waiting, built from the caller's assumed rate shift. It is a sensitivity test, not a forecast. |
| window | string|null | – | Lookback period used for the comparison, expressed as a short duration string such as '4w', '90d', or '180d'. |
No examples provided.
assess_rate_lock ~246
Lock-window-aware lock-vs-float-down recommendation for a deal already in the pipeline. Given a known lock-expiration date, the currently locked rate, and the float-down cost, returns a defensible hold-lock vs exercise-float-down call a loan officer can document — combining recent market movement (1w/2w/4w) with payment and break-even math on this loan. Builds on the same recent-movement signal as assess_buy_timing but framed around the lock window/expiration. Not a rate forecast.
| Name | Type | Req | Description |
|---|---|---|---|
| float_down_bps | number | – | optional improvement in bps if float_down_rate omitted |
| float_down_cost | number | – | $ to exercise float-down; default 0 |
| float_down_rate | number | – | optional explicit floated rate % |
| loan_amount | number | yes | – |
| lock_expiration_date | string | yes | ISO date YYYY-MM-DD |
| locked_rate | number | yes | % already locked |
| product_type | string | yes | – |
| since | string | – | movement window; default 4w |
| state | string | yes | 2-letter state code |
| term_months | number | – | default 360 |
| Name | Type | Req | Description |
|---|---|---|---|
| assumed_defaults | object | – | Inputs the caller did not supply that were filled in with defaults. State these explicitly to the user, since they drive the numbers. |
| confidence | string|null | – | Qualitative confidence in the recommendation — 'high', 'medium', or 'low' — driven by how much data and how large the margin is. |
| disclosures | array | – | Caveats and assumptions that must accompany any answer built from this result; surface them rather than dropping them. |
| float_down | object | – | Economics of exercising a float-down to today's market rate. |
| lock | object | – | The borrower's existing rate lock and how much time is left on it. |
| market_now | object | – | Best deal currently available in the market, for comparison against the locked rate. |
| movement | object | – | How the market has moved over the comparison window, from the earlier snapshot to now. |
| next_actions | array | – | Suggested follow-up tools that would deepen this answer; offer them as next steps, not as results. |
| note | string|null | – | A caveat about the inputs or data behind this call, not an error — e.g. the supplied lock-expiration date is already in the past, so the economics assume a fresh re-lock at current market. Present on… |
| product_type | string|null | – | Loan or deposit category this result covers, e.g. 'mortgage', 'auto_loan', 'heloc', 'savings'. |
| rationale | string|null | – | Plain-English explanation of why this recommendation was reached; safe to quote to the user as the reasoning. |
| recommendation | string|null | – | The suggested move, e.g. 'exercise_float_down', 'hold_lock', or 'relock'. |
| state | string|null | – | Two-letter US state code the result is scoped to (e.g. 'CA'). Null means the result was not filtered by state. |
| window | string|null | – | Lookback period used for the comparison, expressed as a short duration string such as '4w', '90d', or '180d'. |
No examples provided.
batch_decisions ~117
Score an array of inline financing scenarios in one stateless call; returns ranked decisions and top offers per item — no persisted cohorts, no per-borrower HTTP loops.
| Name | Type | Req | Description |
|---|---|---|---|
| credit_score | number | – | Optional default credit score applied to scenarios lacking one |
| max_providers | number | – | Top-N offers returned per scenario (default 3) |
| scenarios | array | yes | Inline scenarios to score in one stateless call (no persisted cohorts). |
| state | string | – | Optional 2-letter default state applied to scenarios lacking one |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number|null | – | Number of scenarios evaluated in this batch. |
| results | array | – | One result per scenario, ordered by rank rather than by the order submitted — match them back with `id`. |
| totals | object | – | Batch-level tallies across all scenarios. |
No examples provided.
build_amortization_schedule ~275
Build a year-by-year amortization / payoff schedule for a loan: total lifetime interest, principal/interest split per period, and a what-if extra-payment accelerator showing months saved and interest saved. Resolves the market rate from real credit-union offers when no rate is provided.
| Name | Type | Req | Description |
|---|---|---|---|
| credit_score | number | – | Optional borrower credit score used to qualify the market offer. |
| extra_monthly_payment | number | – | Optional extra principal paid each month. Drives the payoff-acceleration analysis (months saved, interest saved). |
| extra_one_time_payment | number | – | Optional one-time extra principal payment. |
| loan_amount | number | yes | Loan principal in dollars (required, > 0). |
| product_type | string | – | Loan product; required only when rate is omitted. Default mortgage. |
| rate | number | – | Annual interest rate as a percent (e.g. 6.5). If omitted, the market rate is resolved from real credit-union offers via the decision engine. |
| schedule_granularity | string | – | Schedule row granularity. Default year. |
| state | string | – | 2-letter US state code; required only when rate is omitted (for market-rate lookup). |
| term_months | number | yes | Loan term in months, e.g. 360 or 180 (required). |
| Name | Type | Req | Description |
|---|---|---|---|
| assumed_defaults | object | – | Inputs the caller did not supply that were filled in with defaults. State these explicitly to the user, since they drive the numbers. |
| baseline | object | – | The loan as scheduled, with no extra payments. |
| disclosures | array | – | Caveats and assumptions that must accompany any answer built from this result; surface them rather than dropping them. |
| loan_amount | number|null | – | Principal in dollars the schedule amortizes. |
| market_lender | – | – | Credit union whose published rate was used when the rate came from market data. Null when the caller supplied the rate. |
| monthly_payment | number|null | – | Scheduled principal-and-interest payment in dollars, excluding any extra payment. |
| next_actions | array | – | Suggested follow-up tools that would deepen this answer; offer them as next steps, not as results. |
| rate | number|null | – | Annual note rate in percent used for the schedule. |
| rate_source | string|null | – | Where rate_used came from: 'provided' means the caller supplied it, 'market' means it was resolved from the best live published rate for this state and product. |
| reason | string|null | – | Why no schedule could be built, present only in that case — e.g. no qualifying market offer for that product and state, in which case supply an explicit rate and retry. |
| schedule | array | – | The amortization rows at the requested granularity (per month or per year). |
| term_months | number|null | – | Loan term in months (360 = 30 years, 180 = 15 years, 60 = 5 years). |
| with_extra | object | – | The same loan with the caller's extra monthly principal payment applied. |
No examples provided.
check_advice_guardrails ~111
Run compliance/suitability guardrails over a financing scenario and an optional recommendation. Returns flags (red/yellow with code + message) for things like DTI strain, long auto terms with negative-equity risk, possible balloon payments, and stale market data, plus generic disclaimers and an overall verdict (ok/caution/stop). Use this before presenting a rate recommendation to a borrower.
| Name | Type | Req | Description |
|---|---|---|---|
| recommendation | object | – | Optional recommended offer to evaluate. |
| scenario | object | yes | The borrower scenario. |
| Name | Type | Req | Description |
|---|---|---|---|
| disclaimers | array | – | Statements that must be attached to any advice built on this scenario, such as that this is not financial advice and not an offer of credit. |
| flags | array | – | Guardrail violations found in the proposed recommendation. An empty array means nothing was tripped. |
| overall | string|null | – | Aggregate verdict on the proposed recommendation: 'stop' when a red flag blocks it, otherwise a pass or caution outcome. |
No examples provided.
check_competitive_position ~191
LENDER-side 'is my offer competitive' check — input your OWN published rate for a state+product, get the market percentile, bps vs the state median, and a leading/competitive/overpriced verdict. This is for a loan officer or credit union benchmarking their published pricing against the live market distribution. Do NOT use this for a consumer's quote: if the user is a BORROWER asking whether a rate they were offered is fair, use rate_sanity_check instead.
| Name | Type | Req | Description |
|---|---|---|---|
| apr | number | – | The lender's published APR. Optional — falls back to rate. |
| product | string | yes | Mortgage product the lender publishes. Required. |
| rate | number | yes | The lender's OWN published note rate as a percentage (e.g. 6.49). Required. |
| state | string | yes | US state code (2-letter, e.g. CA, TX). Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| bps_vs_median | number|null | – | Distance from the market median in basis points (-4 = 4 basis points below, i.e. better than median). |
| market | object | – | Distribution of live offers this position was measured against. |
| note | string|null | – | Ready-to-quote sentence stating how this offer ranks against live offers and by how many basis points. |
| percentile | number|null | – | Where this offer sits in the market distribution, 0-100, lower being cheaper. 43 means about 43% of live offers are cheaper than it. |
| product | string|null | – | Product key the offer was compared against, e.g. '30yr_fixed'. |
| state | string|null | – | Two-letter US state code the result is scoped to (e.g. 'CA'). Null means the result was not filtered by state. |
| verdict | string|null | – | Qualitative placement of the offer against the market, e.g. 'competitive', 'above_market', 'market_leading'. |
| your_offer | object | – | The rate and APR the caller supplied for comparison. |
No examples provided.
check_membership_eligibility ~2,215
`relative_memberships` carries confirmed current/deceased relative membership scoped to one exact target credit union; one institution is never reused for another. Check whether a user can JOIN specific credit unions (field-of-membership eligibility). Batch-friendly: pass 1-50 credit_union_ids (from get_financing_decision offers, list_credit_unions, or get_credit_union) plus whatever is known about the user (home, worksite, and payroll geography are independent facts; employer, occupation, military_status, school plus school_relationship, and worship are also supported). City facts require their same-role state or a recognized same-role ZIP that uniquely identifies one state, and are accepted only when the closed Census gazetteer resolves them. Returns one row for every requested credit union. Positive outcomes include open_to_anyone, likely_eligible, eligible_via_employer, and eligible_via_military. A school name alone is not a positive signal: school_relationship is required to affirm a typed student, alumni, or school-employee path. Only a graph carrying exact active-publication lineage governs the top compatibility verdict; a publication-less shadow graph remains diagnostic and cannot replace the flat result. A non-match is returned as unknown, with `unknown_reason: fom_completeness_unaffirmed` when the published field-of-membership corpus is not attested complete. The legacy `geo_mismatch` enum value is reserved for wire compatibility and is not emitted by this MCP boundary without a future typed closed-world attestation. Verdicts are guidance based on each credit union's published membership criteria; the final membership determination is always the institution's. Non-matches carry `missing_facts` for the named institutions: the exact question to ask next, the `fact_field` an answer populates, and the institution's own words. A check that returns unknown for all of them and a question for each is a SUCCESSFUL call, not a failure — ask the questions, merge the…
| Name | Type | Req | Description |
|---|---|---|---|
| applicant_kind | string | – | What the applicant IS. Some charters admit entities as well as people. Absent means a natural person; a person is never rejected by an entity-only door, only left unknown. |
| asserted_org_qualifiers | array | – | Narrowings the user asserts about themselves, quoted back from a missing_facts question (e.g. "assigned as Recruiters or ROTC Instructors within the State of Arkansas"). Absence caps a narrowed door… |
| association_org_ids | array | – | Canonical association ids selected through resolve_eligibility_entities; each is type- and publication-revalidated. |
| county | string | – | User's home county for residence matching. Original name; home_county is an equivalent merge-and-retry alias. |
| credit_union_ids | array | yes | Credit union ids to check (1-50), e.g. from get_financing_decision offers or list_credit_unions. Required. |
| employer | string | – | User's employer, matched against credit union employer/SEG membership lists. |
| employer_org_ids | array | – | Canonical employer ids selected through resolve_eligibility_entities. The API revalidates entity type and active-publication authority before use. |
| facility_city | string | – | Census-recognized city where the user's business maintains a location. Requires facility_state or a recognized facility_zip that uniquely identifies one state. |
| facility_county | string | – | County where the user's business maintains a location. |
| facility_state | string | – | State where the user's business maintains a location. |
| facility_zip | string | – | ZIP where the user's business maintains a location. Distinct from the worksite ZIP. |
| family_relation | string | – | How the user relates to a RELATIVE whose own affiliations may qualify them (e.g. 'spouse', 'child', 'immediate family'). Required alongside relative_employers/relative_schools/relative_associations —… |
| home_city | string | – | User's Census-recognized home city. Requires state or a recognized zip that uniquely identifies one state; unresolved labels are rejected rather than guessed. |
| home_county | string | – | Alias for county, accepted so missing_facts can be merged into this same tool request. Conflicting duplicate forms are rejected. |
| home_state | string | – | Alias for state, accepted so missing_facts can be merged into this same tool request. Conflicting duplicate forms are rejected. |
| home_zip | string | – | Alias for zip, accepted so missing_facts can be merged into this same tool request. It must agree with state/home_state when either is supplied; conflicting duplicate forms are rejected. |
| military_service_state | string | – | The state the user serves, or served, in. State National Guard doors ("Oklahoma National Guard") need this; without it such a door reads unknown. |
| military_status | string | – | User's military affiliation, matched against military field-of-membership (yields eligible_via_military). |
| occupation | string | – | User's occupation, matched against trade/industry/profession (TIP) charters. |
| payroll_city | string | – | Census-recognized payroll city. Requires payroll_state or a recognized payroll_zip that uniquely identifies one state. |
| payroll_county | string | – | County from which the user's employer issues payroll. This is distinct from work_county. |
| payroll_state | string | – | Valid state code from which the user's employer issues payroll. This is distinct from work_state. |
| payroll_zip | string | – | ZIP from which the user's employer issues payroll. This is distinct from the worksite ZIP. |
| property_city | string | – | Census-recognized city where the user owns real property. Requires property_state or a recognized property_zip that uniquely identifies one state. |
| property_county | string | – | County where the user owns real property. Distinct from home_county. |
| property_state | string | – | State where the user owns real property. Distinct from home_state. |
| property_zip | string | – | ZIP where the user OWNS REAL PROPERTY. A door of its own — never inferred from where they live, and an absentee owner qualifies. |
| relative_association_org_ids | array | – | Canonical association ids for the relative named by family_relation, never for the applicant. |
| relative_associations | array | – | Associations the RELATIVE named by family_relation belongs to. Optional; same unknown-by-default contract as relative_employers. |
| relative_employer_org_ids | array | – | Canonical employer ids for the relative named by family_relation, never for the applicant. |
| relative_employers | array | – | Employers of the RELATIVE named by family_relation (not the user's own employer). Optional; omitting it leaves compound family doors undecided (unknown), never negative. |
| relative_memberships | array | – | Confirmed relative memberships scoped to one exact credit union. A membership at one institution is never reused for another; omit unconfirmed memberships and the corresponding family door remains un… |
| relative_school_org_ids | array | – | Canonical school ids for the relative named by family_relation, never for the applicant. |
| relative_schools | array | – | Schools the RELATIVE named by family_relation attends. Optional; same unknown-by-default contract as relative_employers. |
| school | string | – | User's school/college/university. Supply school_relationship too; the school name alone does not affirm eligibility. |
| school_org_ids | array | – | Canonical school ids selected through resolve_eligibility_entities; never populate these from prose extraction. |
| school_relationship | string | – | How the user relates to the named school. Required with school to affirm a typed student, alumni, or school-employee path. |
| state | string | – | User's valid 50-state/DC code for geographic field-of-membership matching. Lowercase is accepted and normalized. |
| work_city | string | – | Census-recognized city where the user works. Requires work_state or a recognized work_zip that uniquely identifies one state. |
| work_county | string | – | County where the user works, for work-area membership matching. |
| work_state | string | – | Valid 50-state/DC code where the user works, for work-area membership matching. Lowercase is accepted and normalized. |
| work_zip | string | – | User's US 5-digit work ZIP or ZIP+4. Resolves to a work county server-side; when work_state is supplied, the crosswalk must agree with it. |
| worship | string | – | User's place of worship, matched against worship-org affinity lists (yields likely_eligible). |
| worship_org_ids | array | – | Canonical worship-organization ids selected through resolve_eligibility_entities. |
| zip | string | – | User's US 5-digit ZIP or ZIP+4. Resolves to a county server-side; when state is supplied, the ZIP crosswalk must agree with it. |
| Name | Type | Req | Description |
|---|---|---|---|
| checked | number|null | – | Number of credit unions evaluated in this call, matching the length of `verdicts`. |
| engine | string|null | – | `eligibility_publication_v1` when at least one verdict was decided from an exact active publication; `legacy+graph_shadow` for compatibility output. |
| note | string|null | – | Required caveat that eligibility is guidance from published criteria and the credit union makes the final decision. |
| summary | string|null | – | One-sentence plain-English summary of this result, safe to quote directly to the user. |
| verdicts | array | – | One eligibility assessment per credit union requested, in the order supplied. |
No examples provided.
compare_personal_access_catalogs ~190
Compare baseline and candidate confirmed person facts across the same 1-19 explicit products. Both catalogs use one pinned immutable eligibility graph snapshot; rate rows retain independent evidence and as_of. Returns access, membership-path, and like-for-like published-price basis-point deltas: APY for deposits, APR for lending when both sides publish APR, otherwise nominal rate only when both sides publish nominal rate. It never mixes APR and nominal rate. Never describe missing access as denial or infer savings, underwriting, approval, or final terms.
| Name | Type | Req | Description |
|---|---|---|---|
| baseline_person | object | yes | Explicit caller-supplied person facts. Unknown facts stay absent; do not infer them. |
| candidate_person | object | yes | Explicit caller-supplied person facts. Unknown facts stay absent; do not infer them. |
| limit_per_product | integer | – | – |
| products | array | yes | – |
| total_limit | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| baseline | object | – | Full baseline access catalog. |
| candidate | object | – | Full candidate access catalog. |
| comparison_version | string|null | – | Stable comparison response contract version. |
| deltas | object | – | Per-product and portfolio reachability, membership-path, and published-price deltas. Per-product and portfolio reachable_now_counts contain exact baseline, candidate, and net product-offer-row counts… |
| disclosure | string|null | – | No savings, underwriting, approval, denial, or final-terms claim. |
| semantics | string|null | – | Positive-evidence-only interpretation; absence is not denial. |
| snapshot | object | – | Pinned eligibility rules time and immutable graph generation; rates retain independent row as_of. |
No examples provided.
compare_products ~268
Compare the best real rates across MULTIPLE lending products in a single call — e.g. show a buyer mortgage vs HELOC, or new vs used auto. Runs the decision engine for each product and returns a ranked, true-cost (APR + fees) table. Use this instead of calling get_financing_decision repeatedly. Each product returns its top offer with rate, APR, and monthly payment.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | Loan/credit amount in dollars |
| credit_score | number | – | Optional borrower credit score |
| intent | string | – | purchase | refinance | cash_out | balance_transfer | new_credit |
| product_types | array | yes | Products to compare, e.g. ["mortgage","heloc"]. Any of: mortgage, mortgage_arm, auto, rv, boat, motorcycle, powersports, heloc, personal_loan, credit_card, student_loan. "mortgage" is fixed-rate and… |
| state | string | yes | US state code, e.g. "CA" |
| term_months | number | – | Optional loan term in months |
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number|null | – | Loan amount in dollars every product was priced at, so the rows are comparable. |
| best_overall | string|null | – | Product type with the lowest true cost across the compared rows, e.g. 'heloc'. |
| intent | string|null | – | Borrowing purpose the pricing assumes, e.g. 'purchase' or 'refinance'. |
| note | string|null | – | Plain-English interpretation of the numbers above, already phrased for the user; quote it rather than re-deriving the comparison. |
| products | array | – | One row per requested product type, each showing that product's single best lender. |
| state | string|null | – | Two-letter US state code the result is scoped to (e.g. 'CA'). Null means the result was not filtered by state. |
No examples provided.
compare_reachable_offers ~169
Compare one baseline person-fact panel with one candidate panel against the same active eligibility snapshot and exact product request. Use this for explicit what-if questions such as adding a confirmed employer or association. Newly reachable means current positive evidence now proves a path; no_longer_reachable or absence never proves ineligibility. Supply only facts the person confirmed, preferably canonical *_org_ids from resolve_eligibility_entities. Person facts are forwarded transiently and are not stored by this tool.
| Name | Type | Req | Description |
|---|---|---|---|
| baseline_person | object | yes | Confirmed facts before the proposed change. |
| candidate_person | object | yes | Confirmed facts after the proposed change. |
| limit | integer | – | Visible items per bucket and delta list. |
| product | object | yes | Exact product request used for both eligibility-backed rate evaluation and ranking. |
| Name | Type | Req | Description |
|---|---|---|---|
| baseline | object | – | Eligibility-backed offer buckets for the baseline facts. |
| candidate | object | – | Eligibility-backed offer buckets for the candidate facts. |
| deltas | object | – | Newly reachable, no-longer-reachable-or-unknown, changed-path, and best-offer comparisons with truncation flags. |
| disclosure | string|null | – | Required limits on interpreting missing or changed results. |
| product | object | – | Exact product request shared by both evaluations. |
| semantics | string|null | – | Positive-evidence-only and unknown-is-never-ineligible contract. |
| snapshot | object | – | Shared rules clock, serving-generation context, publication identities, and stated database consistency boundary. |
No examples provided.
compare_total_cost ~181
Apples-to-apples multi-lender ranking by TOTAL cost of a loan (upfront origination/lender fees + lifetime interest over the holding period), not just the headline rate. Re-ranks real credit union offers and flags when the lowest-rate lender is not the cheapest overall.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | Loan principal |
| credit_score | number | – | – |
| down_payment_percent | number | – | – |
| fees | object | – | – |
| holding_period_months | number | – | Horizon for total-cost; defaults to term_months |
| intent | string | – | default purchase |
| max_lenders | number | – | cap on ranked rows (default 10, max 25) |
| product_type | string | yes | Loan product to rank |
| state | string | yes | 2-letter US state |
| term_months | number | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number|null | – | Loan amount in dollars used for every lender in the comparison. |
| cheapest | object | – | The lender with the lowest total cost over the holding period. |
| disclosures | array | – | Caveats and assumptions that must accompany any answer built from this result; surface them rather than dropping them. |
| holding_period_months | number|null | – | How long the borrower is assumed to keep the loan. Total cost is measured over this period, not the full term, so a shorter hold favors low-fee lenders. |
| intent | string|null | – | Borrowing purpose the pricing assumes, e.g. 'purchase' or 'refinance'. |
| next_actions | array | – | Suggested follow-up tools, as bare tool names. |
| note | string|null | – | Plain-English interpretation of the numbers above, already phrased for the user; quote it rather than re-deriving the comparison. |
| product_type | string|null | – | Loan or deposit category this result covers, e.g. 'mortgage', 'auto_loan', 'heloc', 'savings'. |
| ranked | array | – | Lenders ordered cheapest-first by total cost over the holding period. |
| ranked_by | string|null | – | The metric the list is sorted by — 'total_cost' means cheapest over the holding period, which can differ from the lowest rate. |
| rate_leader | object | – | The lender with the lowest headline APR, which is not always the cheapest overall. |
| reranked | boolean|null | – | True when accounting for fees changed the winner from the headline rate leader — the key finding to surface when it is true. |
| state | string|null | – | Two-letter US state code the result is scoped to (e.g. 'CA'). Null means the result was not filtered by state. |
| term_months | number|null | – | Loan term in months (360 = 30 years, 180 = 15 years, 60 = 5 years). |
No examples provided.
create_competitor_monitor ~279
Subscribe a monitor to a SPECIFIC named credit union's published rate and alert via webhook when that CU changes its rate (vs the aggregate market-best decision). Returns the monitor with a webhook_signing_secret (shown once) and a baseline snapshot of the CU's current rate.
| Name | Type | Req | Description |
|---|---|---|---|
| audience | string | – | Scope offers by WHO they are for: 'business' returns business-audience products (DSCR mortgages, commercial vehicle loans, SBA); 'consumer' excludes them. Omit for both. |
| conditions | object | – | Alert conditions on the named CU rate. Default: any change. |
| cooldown_hours | number | – | 1-168, default 24. |
| loan_program | string | – | e.g. '30-year-fixed'. |
| name | string | yes | Descriptive monitor name. Required. |
| occupancy | string | – | MORTGAGE/HELOC: property occupancy. 'investment' returns investor / non-owner-occupied / DSCR pricing; 'secondary' second-home pricing. Omit for standard primary-residence offers. |
| product_type | string | – | Default mortgage. |
| state | string | – | 2-letter state for the CU published rate. |
| target_credit_union | object | yes | The specific credit union whose published rate to watch. Required. |
| webhook_url | string | yes | HTTPS webhook. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| disclosures | array | – | Scope caveats about what this monitor does and does not alert on. |
| important | string | – | Warning that the signing secret is shown only once. |
| monitor | object | – | The created competitor monitor. |
| next_actions | array | – | Suggested follow-up tool names. |
| summary | string | – | One-line confirmation naming the monitor and the credit union it watches. |
| webhook_signing_secret | string|null | – | Full HMAC signing secret. Shown once, at creation. |
No examples provided.
create_email_campaign ~419
Create a branded rate-email campaign: on a cadence, email the campaign's recipient list the latest rates for one or more states (or a named region preset) under the org's branding, with ONE OR MORE products (1-5, no duplicates). Each product is one of: {category:'mortgage', subtype:'30-year-fixed'|'15-year-fixed'}, {category:'auto', condition:'new'|'used'|'any', term_months?:36|48|60|72|84} (auto = cars only), or {category:'rv'|'boat'|'motorcycle', condition:'new'|'used'|'any'}. Defaults to a single 30-year-fixed mortgage if products is omitted. Created 'paused'; add recipients, then activate via update_email_campaign (activation requires branding display_name + business_address). Requires a Pro plan. Provide exactly one of state_code, state_codes, or region.
| Name | Type | Req | Description |
|---|---|---|---|
| cadence | string | – | Send cadence (default weekly). |
| intro_text_override | string | – | Per-campaign intro; falls back to branding intro_text. |
| name | string | yes | Campaign label. Required. |
| products | array | – | 1-5 products to feature (no duplicates). Each is {category:'mortgage', subtype:'30-year-fixed'|'15-year-fixed'}, {category:'auto', condition:'new'|'used'|'any', term_months?:36|48|60|72|84}, or {cate… |
| region | string | – | Named region preset (e.g. east_coast); expands server-side to its member states. |
| state_code | string | – | Legacy single 2-letter US state code (e.g. CA). Prefer state_codes or region for multi-state coverage. |
| state_codes | array | – | 2-letter US state codes (up to 25) — best rates are ranked ACROSS all of them, not per state. |
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number|null | – | Loan amount used when pricing the featured rates. |
| cadence | string|null | – | 'daily', 'weekly', or 'monthly'. |
| created_at | number|null | – | Epoch-ms creation time. |
| credit_score | number|null | – | Assumed borrower credit score. |
| id | string | – | Campaign id (camp_...) — pass to the other campaign tools. |
| intro_text_override | string|null | – | Per-campaign intro, overriding the org default. |
| last_run_at | number|null | – | Epoch-ms of the last send, null if never. |
| name | string | – | Campaign label. |
| organization_id | string | – | Owning organization. |
| product_category | string|null | – | 'mortgage', 'auto', 'heloc', or 'personal'. |
| product_subtype | string|null | – | Product subtype, when set. |
| product_type | string|null | – | Primary product type, e.g. '30-year-fixed'. |
| products | array|null | – | Parsed list of products the email covers. |
| region_preset | string|null | – | Region preset key when the campaign was scoped by region, else null. |
| state_code | string|null | – | Legacy scalar state — always the first entry of state_codes. |
| state_codes | array|null | – | Full list of two-letter state codes the campaign covers. |
| status | string|null | – | 'draft', 'active', or 'paused'. New campaigns start as 'draft'. |
| term_months | number|null | – | Term in months. |
| updated_at | number|null | – | Epoch-ms last-modified time. |
No examples provided.
create_monitor ~185
Create a new decision monitor that watches for rate changes and sends webhook notifications when conditions are met. Returns the monitor with a webhook_signing_secret for verifying webhook payloads.
| Name | Type | Req | Description |
|---|---|---|---|
| conditions | array | yes | Array of conditions that must be met to trigger the monitor. Required. |
| cooldown_hours | number | – | Minimum hours between webhook triggers (1-168). Defaults to 24. |
| decision_context | object | yes | The context for evaluating rate changes. Required. |
| name | string | yes | A descriptive name for the monitor. Required. |
| subscribed_product_types | array | – | Optional array of product types to monitor (e.g., ["30yr_fixed", "15yr_fixed"]). |
| subscribed_states | array | – | Optional array of state codes to monitor. If not provided, monitors all states. |
| webhook_url | string | yes | The URL to send webhook notifications to. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| important | string | – | Warning that the signing secret will not be shown again. |
| monitor | object | – | The created monitor. |
| summary | string | – | One-line confirmation naming the monitor that was created. |
No examples provided.
delete_cohort ~36
Permanently delete a saved cohort by id. This action cannot be undone.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Cohort id. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | – | True when the cohort was deleted. |
No examples provided.
delete_digest ~32
Delete a scheduled digest by id. Stops the recurring email.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The digest id to delete. |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | – | True when the digest was deleted. |
No examples provided.
delete_email_campaign ~35
Delete a branded rate-email campaign and its recipients. This cannot be undone.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Campaign id. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | – | True when the campaign was deleted. |
No examples provided.
delete_monitor ~38
Permanently delete a monitor. This action cannot be undone.
| Name | Type | Req | Description |
|---|---|---|---|
| monitor_id | string | yes | The unique identifier of the monitor to delete. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| deleted | boolean | – | True when the monitor was deleted. Absent on not-found. |
| error | string|null | – | Present and set to 'not_found' when the monitor id does not exist. |
| monitor_id | string | – | The id that was deleted. |
| summary | string | – | Confirmation of deletion, or a not-found message. |
No examples provided.
delete_scenario ~25
Delete a saved scenario by id.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Scenario id |
| Name | Type | Req | Description |
|---|---|---|---|
| success | boolean | – | True when the scenario was deleted. |
No examples provided.
deliver_test_webhook ~129
Send a test webhook for a monitor using a simulated rate change. This actually delivers an HTTP request to the monitor's configured webhook URL. IMPORTANT: a test delivery is NOT signed with the monitor's signing secret — only a hash of that secret is stored, so test deliveries use a placeholder and will FAIL signature verification. Use this to test payload handling, not signature verification. Only use when the user explicitly requests a test webhook delivery.
| Name | Type | Req | Description |
|---|---|---|---|
| monitor_id | string | yes | The unique identifier of the monitor to test. Required. |
| rate_change | object | yes | The simulated rate change event. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string|null | – | Present and set to 'not_found' when the monitor id does not exist. |
| evaluation | object | – | Why the monitor did or did not fire. |
| rate_change | object | – | The simulated change, with rates pre-formatted as percent strings. |
| summary | string | – | Whether the test webhook was delivered and whether the monitor would have triggered, or a not-found message. |
| webhook_delivery | object|null | – | Outcome of the HTTP POST to the monitor's webhook URL. Omitted when the backend reported no delivery attempt. |
| would_trigger | boolean | – | Whether the monitor's conditions were satisfied by the supplied change. |
No examples provided.
estimate_affordability ~258
Borrower-facing home affordability estimate: given gross income, existing monthly debts, down payment, and front-end/back-end DTI caps, compute the max monthly payment, max loan amount, and max home price. Surfaces the max_loan annuity engine. If no rate is supplied, the current best market rate for the state is used.
| Name | Type | Req | Description |
|---|---|---|---|
| back_end_dti | number | – | Total-debt DTI cap as a decimal. Default 0.36. |
| down_payment | number | – | Cash down payment in dollars. Default 0. |
| front_end_dti | number | – | Housing-payment DTI cap as a decimal. Default 0.28. |
| income_annual | number | yes | Gross annual income in dollars |
| monthly_debts | number | – | Existing recurring monthly debt payments. Default 0. |
| product_type | string | – | Product for the market-rate lookup. Default mortgage. |
| rate | number | – | Optional annual interest rate, e.g. 6.5. If omitted, best market rate is used. |
| state | string | – | US state code for the market-rate lookup. Default CA. |
| term_months | number | – | Loan term in months. Default 360. |
| Name | Type | Req | Description |
|---|---|---|---|
| affordable | boolean|null | – | True when the income supports a meaningful loan after debts; false means the DTI budget is exhausted, not that nothing is purchasable. |
| assumed_defaults | object | – | Inputs the caller did not supply that were filled in with defaults. State these explicitly to the user, since they drive the numbers. |
| back_end_budget_value | number|null | – | Total monthly debt budget in dollars under the back-end DTI cap, including existing debts. Compare with max_payment_value to see the headroom. |
| binding_constraint | string|null | – | Which limit caps the budget: 'front_end_dti' (housing payment alone) or 'back_end_dti' (all debts). This tells the user what to fix to buy more. |
| disclosures | array | – | Caveats and assumptions that must accompany any answer built from this result; surface them rather than dropping them. |
| down_payment | string|null | – | Down payment in dollars assumed, as a formatted string. |
| max_home_price | string|null | – | Largest purchase price in dollars, being the max loan amount plus the down payment. |
| max_loan_amount | string|null | – | Largest loan principal in dollars that payment supports at the rate and term used. |
| max_monthly_payment | string|null | – | Largest housing payment in dollars supported by the binding DTI constraint, as a formatted string. |
| max_payment_value | number|null | – | The same maximum housing payment as a raw number in dollars, for further math. |
| next_actions | array | – | Suggested follow-up tools that would deepen this answer; offer them as next steps, not as results. |
| note | string|null | – | Explanation of how the front-end and back-end DTI caps interact and which one binds. |
| rate_source | string|null | – | Where rate_used came from: 'provided' means the caller supplied it, 'market' means it was resolved from the best live published rate for this state and product. |
| rate_used | string|null | – | Interest rate, in percent, used for every calculation in this result. Check rate_source to see whether it came from the caller or from live market data. |
| reason | string|null | – | Why the affordable amount is constrained or zero, present only in that case — e.g. 'Existing debts exceed the back-end DTI budget.' |
No examples provided.
estimate_monthly_cost ~310
Total monthly housing cost (PITI): principal+interest plus property tax, homeowners insurance, PMI, and HOA, so affordability reflects real monthly outlay. If no rate is supplied, the current best market rate for the state is used.
| Name | Type | Req | Description |
|---|---|---|---|
| annual_insurance | number | – | Homeowners insurance in dollars/year. Default max(800, 0.35% of home price). |
| credit_score | number | – | Optional borrower credit score, used for the market-rate lookup. |
| down_payment | number | – | Cash down payment in dollars. Default 0. loan_amount = home_price - down_payment. |
| home_price | number | – | Purchase price in dollars. Required unless loan_amount is given. |
| loan_amount | number | – | Optional explicit loan amount; overrides home_price - down_payment. |
| monthly_hoa | number | – | HOA dues in dollars/month. Default 0. |
| pmi_rate | number | – | Annual PMI as % of loan balance. Default 0.5, applied only when LTV > 80%. |
| property_tax_rate | number | – | Annual property tax as % of home value. Default 1.1. |
| rate | number | – | Annual interest rate, e.g. 6.5. If omitted, best market rate for the state is used. |
| state | string | – | 2-letter US state code for the market-rate lookup. Default CA. |
| term_months | number | – | Loan term in months. Default 360. |
| Name | Type | Req | Description |
|---|---|---|---|
| annual_total | string|null | – | Twelve months of the total monthly payment, in dollars. |
| assumed_defaults | object | – | Inputs the caller did not supply that were filled in with defaults. State these explicitly to the user, since they drive the numbers. |
| breakdown | object | – | Share of the total monthly payment taken by each component, as percent strings. |
| disclosures | array | – | Caveats and assumptions that must accompany any answer built from this result; surface them rather than dropping them. |
| down_payment | string|null | – | Cash in dollars put down at closing. |
| home_price | string|null | – | Purchase price in dollars, as a formatted string. |
| loan_amount | string|null | – | Amount borrowed in dollars, being the home price less the down payment. |
| ltv | string|null | – | Loan-to-value ratio as a percent string. PMI generally applies above 80%. |
| monthly_hoa | string|null | – | Monthly HOA dues in dollars, as supplied or defaulted. |
| monthly_insurance | string|null | – | Monthly homeowners insurance in dollars, one twelfth of the annual premium used. |
| monthly_pmi | string|null | – | Monthly private mortgage insurance in dollars. $0 when LTV is at or below 80%. |
| monthly_property_tax | string|null | – | Estimated monthly property tax in dollars, derived from the assumed tax rate rather than an actual county assessment. |
| next_actions | array | – | Suggested follow-up tools that would deepen this answer; offer them as next steps, not as results. |
| pmi_applies | boolean|null | – | True when the LTV requires private mortgage insurance. |
| principal_and_interest | string|null | – | Monthly principal-and-interest payment in dollars — only part of the total housing cost. |
| rate_source | string|null | – | Where rate_used came from: 'provided' means the caller supplied it, 'market' means it was resolved from the best live published rate for this state and product. |
| rate_used | string|null | – | Interest rate, in percent, used for every calculation in this result. Check rate_source to see whether it came from the caller or from live market data. |
| total_monthly_payment | string|null | – | Full monthly housing cost in dollars: principal, interest, taxes, insurance, plus PMI and HOA where they apply. |
No examples provided.
evaluate_eligibility_cohort ~163
Evaluate a caller-supplied panel of 1-10 named fact profiles for one exact product against one serving snapshot, deduplicating reachable institutions and exact offers. This is descriptive only for the supplied panel: never call it a population estimate, conversion rate, approval forecast, or negative eligibility result. Use neutral profile labels instead of names, emails, account numbers, or other direct identifiers. Profiles are forwarded transiently and are not stored by this tool; unknown remains unknown.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum aggregate institutions and deduplicated offers returned. |
| product | object | yes | Exact product request used for both eligibility-backed rate evaluation and ranking. |
| profiles | array | yes | Caller-supplied named panel. Names must be unique within this request. |
| Name | Type | Req | Description |
|---|---|---|---|
| aggregate | object | – | Deduplicated reachable institutions and exact offers, profile reach, counts, and truncation flags. |
| disclosure | string|null | – | Required warning that the panel is not a population estimate, conversion rate, approval forecast, or rejection. |
| methodology | object | – | Panel size/source, deduplication identities, and explicit no-extrapolation/no-conversion semantics. |
| product | object | – | Exact product request evaluated for the panel. |
| profiles | array | – | Per-profile counts, best evidenced offer, and observation timestamp. |
| semantics | string|null | – | Positive-evidence-only and unknown-is-never-ineligible contract. |
| snapshot | object | – | Shared rules clock and database observation boundaries. |
No examples provided.
explain_ranking ~194
Explain WHY each top lender ranked where it did for a financing decision. Takes a full decision scenario (same shape as get_financing_decision) and returns a structured per-offer cost breakdown (rate, points, fees, lifetime interest), scoring signals, how much each offer beats the next by, and a plain-language summary of the ranking weights. Use this when a user asks why one lender beat another.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | number | yes | Loan amount in dollars. Required. |
| credit_score | number | – | Borrower's credit score (300-850). |
| intent | string | yes | The loan intent. |
| max_providers | number | – | Maximum number of lenders to explain (1-5). Defaults to 5. |
| product_type | string | – | Type of financing product. |
| state | string | yes | US state code (2-letter). Required. |
| term_months | number | – | Loan term in months. |
| Name | Type | Req | Description |
|---|---|---|---|
| offers | array | – | Ranked offers with the scoring inputs that produced each position. |
| product_type | string|null | – | Loan or deposit category this result covers, e.g. 'mortgage', 'auto_loan', 'heloc', 'savings'. |
| request_id | string|null | – | Opaque identifier for this call, useful only for support or debugging; never show it to the user. |
| summary | string|null | – | Plain-English statement of the weighting scheme used and what separated the top offers; quote this when explaining the ranking. |
No examples provided.
extract_eligibility_facts ~319
Turn a person's own words about themselves into the structured facts the eligibility tools accept. Pass their sentence verbatim ("I'm a nurse at a Tulsa hospital, I live in Broken Arrow, my late father was a TTCU member") and this returns each fact it could read, with the exact words it read it from, a confidence, and a needs_confirmation flag. THIS DOES NOT DECIDE ELIGIBILITY and never returns a credit union: it only fills in fields. Show the extracted facts to the user and get confirmation on every fact with needs_confirmation=true (family relationships, relatives' employers and associations, applicant kind, and asserted qualifiers are always flagged, because a wrong reading of those changes the answer). Then pass `person_search_body` — plus whatever the user confirmed — to find_eligible_credit_unions, which is what actually decides. If extraction is unavailable you get facts: [] and no eligibility signal at all; ask the user for fields directly instead. `confidence` is the extraction model's own uncalibrated self-report and gates only autofill — quote `evidence.quote` to the user, not the number. This call costs 3 API units.
| Name | Type | Req | Description |
|---|---|---|---|
| known_facts | object | – | Optional. Fields you already know, in PersonSearch shape. These are echoed as source="supplied" and never overwritten. |
| text | string | yes | The person's own words, up to 2000 characters. Do not paraphrase or pre-structure it — the extractor needs the original sentence to anchor evidence spans. |
| Name | Type | Req | Description |
|---|---|---|---|
| billed_units | number|null | – | API units billed for this call: 3 for a live extraction, 0 for a sandbox fixture. |
| confidence_is_model_self_reported | boolean|null | – | Always true when present. A standing warning that 'confidence' is the model's own number, not a measured accuracy. |
| confirmation_required | boolean|null | – | True when anything needs confirming. Show the facts to the user before searching. |
| extraction_available | boolean|null | – | False when extraction was unavailable. That carries no eligibility signal whatsoever - ask the user for fields directly, never read it as a negative answer. |
| extractor_version | string|null | – | Version of the extractor's prompt and post-processing. |
| facts | array | – | Facts read from the person's words, each returned FOR CONFIRMATION. Never a decision, and never a credit union. |
| model | string|null | – | Extraction model identifier. |
| note | string|null | – | Standing disclosure plus the next step: confirm the flagged facts, then call find_eligible_credit_unions. |
| person_search_body | object|null | – | A ready-to-send argument set for find_eligible_credit_unions, containing only confirmed-or-supplied facts. Add the user's confirmations to it before calling. |
| sandbox | boolean|null | – | True when this is the frozen sandbox fixture rather than a real extraction. |
| unparsed_spans | array | – | Phrases recognized as meaningful but not mapped to a field, including anything said in the past tense or hypothetically. Ask about these. |
No examples provided.
find_credit_unions_near_zip ~144
Use when someone asks for "credit unions near me," the closest credit union, local credit-union branches, or nearby alternatives to a bank. Given a 5-digit ZIP, returns credit unions ordered by the estimated straight-line distance to each institution's closest NCUA-reported branch. Includes approximate miles, branch address, and profile identifiers for checking rates, services, and membership. Distances use ZIP centers and are not driving distance.
| Name | Type | Req | Description |
|---|---|---|---|
| max_results | number | – | Maximum credit unions to return (1-25, default 10). |
| zip | string | yes | Five-digit US ZIP code used as the center of the nearest-branch search. |
| Name | Type | Req | Description |
|---|---|---|---|
| credit_unions | array | – | Nearest credit unions, closest first. |
| disclosure | string|null | – | Precision and methodology caveat for the distances and locations above; carry it into any answer that quotes them. |
| match_quality | string|null | – | How precise the proximity ranking is overall, e.g. 'ZIP-centroid straight-line estimate'. Distances are as-the-crow-flies, not driving distance. |
| query | object | – | The lookup that was performed, echoed back. |
| summary | string|null | – | One-sentence plain-English summary of this result, safe to quote directly to the user. |
No examples provided.
find_eligible_credit_unions ~2,434
`relative_memberships` carries confirmed current/deceased relative membership scoped to one exact target credit union; one institution is never reused for another. `next_questions.unlocks_cu_count` counts membership decisions an answer may clarify, never guaranteed products. Discovery tool: find candidate credit unions a person may be able to JOIN, from their own facts rather than from a list of institutions. Pass any combination of home, worksite, or payroll geography (these are independent), occupation, employer, school (+school_relationship), associations, military_status, and worship; at least one discriminating fact is required, or pass willing_to_join_association=true as the sole discriminator to search documented joinable-association paths. City facts require their same-role state or a recognized same-role ZIP that uniquely identifies one state, and are accepted only when the closed Census gazetteer resolves them. This evaluates a bounded, prioritized candidate set, not the entire credit-union fleet: read `candidate_limit`, `candidate_set_truncated`, and `candidate_sources`, and never interpret an absent institution as unavailable or ineligible. Returns four buckets within that candidate set — eligible (a verified path already applies), conditionally_eligible (one more step, e.g. joining an association, with the cost and join URL when known), possibly_eligible (a path may apply but a requirement could not be confirmed), and unknown (we could not decide — either we hold no rules for the institution or the supplied facts cannot decide the rules we hold). Every non-positive entry carries a machine-readable `unknown_reason`: `geo_inputs_missing` / `org_inputs_missing` / `inputs_missing` mean ONE MORE FACT FROM THE USER would resolve it, so ask for it and call again; `no_rules` means we hold nothing for that institution and asking will not help; `incomplete_fom`, `fom_completeness_unaffirmed`, `low_confidence_rules` and `unmodeled_condition` mean we hold rules bu…
| Name | Type | Req | Description |
|---|---|---|---|
| applicant_kind | string | – | What the applicant IS. Some charters admit entities as well as people. Absent means a natural person; a person is never rejected by an entity-only door, only left unknown. |
| asserted_org_qualifiers | array | – | Narrowings the user asserts about themselves, quoted back from a missing_facts question (e.g. "assigned as Recruiters or ROTC Instructors within the State of Arkansas"). Absence caps a narrowed door… |
| association_org_ids | array | – | Canonical association ids selected through resolve_eligibility_entities; each is type- and publication-revalidated. |
| associations | array | – | Associations, unions, or member organizations the user already belongs to. |
| employer | string | – | User's employer, resolved to a canonical organization for SEG matching. |
| employer_org_ids | array | – | Canonical employer ids selected through resolve_eligibility_entities. The API revalidates entity type and active-publication authority before use. |
| facility_city | string | – | Census-recognized city where the user's business maintains a location. Requires facility_state or a recognized facility_zip that uniquely identifies one state. |
| facility_county | string | – | County where the user's business maintains a location. |
| facility_state | string | – | State where the user's business maintains a location. |
| facility_zip | string | – | ZIP where the user's business maintains a location. Distinct from the worksite ZIP. |
| family_relation | string | – | How the user relates to a RELATIVE whose own affiliations may qualify them (e.g. 'spouse', 'child', 'immediate family'). Required alongside relative_employers/relative_schools/relative_associations —… |
| home_city | string | – | User's Census-recognized home city. Requires home_state or a recognized home_zip that uniquely identifies one state; unresolved labels are rejected rather than guessed. |
| home_county | string | – | User's county. Wins over the ZIP-derived counties when supplied. |
| home_state | string | – | User's valid 50-state/DC code (e.g., CA, TX, NY). Lowercase is accepted and normalized. |
| home_zip | string | – | User's US 5-digit home ZIP or ZIP+4. Resolves to candidate counties; when home_state is supplied, the crosswalk must agree with it. |
| limit | number | – | Maximum entries per bucket (1-200). Default 50. |
| military_service_state | string | – | The state the user serves, or served, in. State National Guard doors ("Oklahoma National Guard") need this; without it such a door reads unknown. |
| military_status | string | – | User's military affiliation, matched against military fields of membership. |
| occupation | string | – | User's occupation, matched against trade, industry, and profession fields of membership. |
| payroll_city | string | – | Census-recognized city from which payroll is issued. Requires payroll_state or a recognized payroll_zip that uniquely identifies one state. |
| payroll_county | string | – | County from which the user's employer issues payroll; distinct from work_county. |
| payroll_state | string | – | State from which the user's employer issues payroll; distinct from work_state. |
| payroll_zip | string | – | ZIP from which the user's employer issues payroll; distinct from the worksite ZIP. When payroll_state is supplied, the ZIP must agree with it. |
| property_city | string | – | Census-recognized city where the user owns real property. Requires property_state or a recognized property_zip that uniquely identifies one state. |
| property_county | string | – | County where the user owns real property. Distinct from home_county. |
| property_state | string | – | State where the user owns real property. Distinct from home_state. |
| property_zip | string | – | ZIP where the user OWNS REAL PROPERTY. A door of its own — never inferred from where they live, and an absentee owner qualifies. |
| relative_association_org_ids | array | – | Canonical association ids for the relative named by family_relation, never for the applicant. |
| relative_associations | array | – | Associations the RELATIVE named by family_relation belongs to. Optional; same unknown-by-default contract as relative_employers. |
| relative_employer_org_ids | array | – | Canonical employer ids for the relative named by family_relation, never for the applicant. |
| relative_employers | array | – | Employers of the RELATIVE named by family_relation (not the user's own employer). Optional; omitting it leaves compound family doors undecided (unknown), never negative. |
| relative_memberships | array | – | Confirmed relative memberships scoped to one exact credit union. A membership at one institution is never reused for another; omit unconfirmed memberships and the corresponding family door remains un… |
| relative_school_org_ids | array | – | Canonical school ids for the relative named by family_relation, never for the applicant. |
| relative_schools | array | – | Schools the RELATIVE named by family_relation attends. Optional; same unknown-by-default contract as relative_employers. |
| school | string | – | User's school/college/university, resolved to a canonical organization. Supply school_relationship too; a name alone is not a positive match. |
| school_org_ids | array | – | Canonical school ids selected through resolve_eligibility_entities; never populate these from prose extraction. |
| school_relationship | string | – | How the user relates to the school. Required with school to affirm a typed student, alumni, or school-employee path. |
| willing_to_join_association | boolean | – | Set true to search documented joinable-association paths (valid as the sole discriminator). Set false only to suppress paths that require joining an association; false alone is not a discriminating s… |
| work_city | string | – | Census-recognized city where the user works. Requires work_state or a recognized work_zip that uniquely identifies one state. |
| work_county | string | – | County where the user works. Wins over work-ZIP-derived counties when supplied. |
| work_state | string | – | Valid 50-state/DC code where the user works (e.g., CA, TX, NY). Lowercase is accepted and normalized. |
| work_zip | string | – | User's US 5-digit work ZIP or ZIP+4. Resolves to candidate work counties; when work_state is supplied, the crosswalk must agree with it. |
| worship | string | – | User's place of worship, resolved to a canonical organization. |
| worship_org_ids | array | – | Canonical worship-organization ids selected through resolve_eligibility_entities. |
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_limit | number|null | – | Maximum unique candidates this search can accept for evaluation (currently 400). |
| candidate_set_truncated | boolean|null | – | True when the overall candidate cap or any source-query cap may have omitted additional institutions; absence from the response is never a negative verdict. |
| candidate_sources | object | – | Unique candidates accepted in deterministic priority order from each narrowing source. |
| candidates_evaluated | number|null | – | How many credit unions in the bounded, prioritized candidate set were evaluated; not the number of institutions in the fleet. |
| conditionally_eligible | array | – | Credit unions joinable after one more step, with its cost when known. |
| counts | object | – | Size of each bucket within the bounded candidate set before the per-bucket `limit` is applied; not fleet-wide totals. |
| disclosure | string|null | – | Required disclosure that eligibility is guidance and the institution decides. |
| eligible | array | – | Credit unions with a verified membership path that already applies to this person. |
| engine | string|null | – | Which engines produced these verdicts. |
| limit | number|null | – | Maximum entries returned per bucket for this call. |
| missing_facts_truncated | boolean|null | – | True when a size cap dropped a question that could otherwise have been asked (3 per institution, 5 in the rollup, 20 unlock ids per rollup entry). The same honesty convention as candidate_set_truncat… |
| next_questions | array|null | – | Questions ranked across every institution evaluated, by how many each unlocks. Ask the top one to three, merge the answers into the same request body, and call again. Stop when this is empty, when th… |
| note | string|null | – | Liability framing to surface alongside any eligibility claim. |
| possibly_eligible | array | – | Credit unions where a path may apply but a requirement could not be confirmed. |
| resolved | object | – | Canonical organizations and geography keys resolved from the supplied facts. |
| unanswerable | array|null | – | What no question can fix, and why. Do not ask the user about these. Absent when everything unresolved is askable. |
| unknown | array | – | Credit unions whose rules could not be decided from the supplied facts. Never an assertion of ineligibility. |
No examples provided.
What is the RateAPI — live US mortgage, auto, HELOC, personal… MCP server?
RateAPI — live US mortgage, auto, HELOC, personal… is an MCP server listed in the public MCP registry as dev.rateapi/mcp. Live US mortgage, auto, HELOC, personal & deposit rates with evidence, plus who can join each lender. This page covers its hosted endpoint (https://mcp.rateapi.dev/mcp).
Is the RateAPI — live US mortgage, auto, HELOC, personal… MCP server safe to use?
RateAPI — live US mortgage, auto, HELOC, personal… scores 83 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 RateAPI — live US mortgage, auto, HELOC, personal… MCP server expose?
RateAPI — live US mortgage, auto, HELOC, personal… exposes 89 tools: get_financing_decision, list_credit_unions, find_credit_unions_near_zip, find_product_rates_near_zip, get_credit_union, and 84 more. Their descriptions and schemas cost roughly 19,967 tokens of context every time the server is loaded.
Does the RateAPI — live US mortgage, auto, HELOC, personal… MCP server require authentication?
Yes. RateAPI — live US mortgage, auto, HELOC, personal… asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the RateAPI — live US mortgage, auto, HELOC, personal… MCP server still maintained?
RateAPI — live US mortgage, auto, HELOC, personal… is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.