mtgmon Mortgage Analytics
by lorenzopi · remote · no sign-in to list tools · v0.1.0 · published by GitHub user lorenzopi
Read-only U.S. mortgage market, lender, GSE performance, and servicing analytics.
10 tools: 10 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads10Claude Code: allow: see these tools
3 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http mtgmon https://mtgmon.com/mcpFindings
Matches of fixed checks, with the text they matched.
The description contains a 43-character base64 string.
What this check looks forMatched text
description: "...nthly flows between Current/DQ30/DQ60/DQ90+/Modified/Liquidated (data.flows, top_n..."
The description is 2,340 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...the cache is still warming (retry after a few seconds); never report it as zero."
The description is 2,093 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...the cache is still warming (retry after a few seconds); never report it as zero."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
10 tools
Only reads 10Claude Code: allow
compare_lendersSide-by-side HMDA comparison of two lender groups: yearly volume, loans, rank, and market share for both; loan type / purpose / occupancy mix; and the top states with each lender's…No findings
Why it is in this group
- The name "compare_lenders" says "compare": a word for reading.
Description, as the server wrote it Side-by-side HMDA comparison of two lender groups: yearly volume, loans, rank, and market share for both; loan type / purpose / occupancy mix; and the top states with each lender's volume and the volume multiple between them. Requires canonical keys for both lenders: call search_lenders and pass each result's exact `name`. For a single lender use get_lender_profile. Returns data.lenders, data.current_year, data.previous_year, data.yearly (both lenders per HMDA year), data.loan_type_mix, data.loan_purpose_mix, data.occupancy_mix, and data.top_state_comparison (top_n rows with lender_1_volume, lender_2_volume, multiple). Volumes are USD; shares are percent. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_dataset_statusCoverage, freshness, and build metadata for every mtgmon dataset.No findings
Why it is in this group
- The name "get_dataset_status" says "get": a word for reading.
Description, as the server wrote it Coverage, freshness, and build metadata for every mtgmon dataset. No arguments. Use for: "how current is the data", finding the latest available month or HMDA year before quoting figures, or diagnosing another tool's meta.available=false. Returns data.datasets, a list of {name, description, category, provider, coverage, last_updated, last_updated_label, stats, refresh} covering GSE loan performance, HMDA, market rates, SEC filings, and derived marts; and data.build {app, lake, cache_backend, cache}. Refresh cadences differ by dataset; read each row's coverage and last_updated. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_hmda_product_analyticsHMDA origination counts, reported dollar amounts, averages, and year-over-year growth for one product family, optionally for one property state or one lender, with an annual histor…No findings
Why it is in this group
- The name "get_hmda_product_analytics" says "get": a word for reading.
Description, as the server wrote it HMDA origination counts, reported dollar amounts, averages, and year-over-year growth for one product family, optionally for one property state or one lender, with an annual history back to 2018. Use for: HELOC, reverse-mortgage, or closed-end mortgage origination volume and growth; product mix by loan program (conventional/FHA/VA/USDA), purpose, lien, occupancy, construction method, or business purpose; state-level or lender-level product questions. Do not use for: lender rankings or market share (search_lenders / get_lender_profile) or GSE loan performance (get_loan_performance). Important: product_family defaults to 'heloc'. Use 'closed_end_mortgage' for ordinary mortgages or 'all' for every HMDA origination. Source is the frozen annual FFIEC/CFPB HMDA Snapshot LAR (one release per year, 2018 onward); state filters use the property state, not the lender's headquarters. Returns data.selected_year, data.current and data.previous (each {year, origination_count, reported_amount_count, reported_amount_sum, average_reported_amount, reported_amount_max, origination_count_yoy_pct, reported_amount_sum_yoy_pct, average_reported_amount_yoy_pct}), data.history (one such row per year), data.filters (applied filters), data.definition, and data.source_releases. Amounts are USD; YoY fields are percent; for HELOCs the amount is credit available, not the drawn balance. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_lender_profileHMDA profile for one lender group: annual origination volume, loan counts, denial rate, national rank and market share, top states with market-share multiples, and loan type / purp…No findings
Why it is in this group
- The name "get_lender_profile" says "get": a word for reading.
Description, as the server wrote it HMDA profile for one lender group: annual origination volume, loan counts, denial rate, national rank and market share, top states with market-share multiples, and loan type / purpose / occupancy / loan-size mix. Requires a canonical key: call search_lenders and pass the exact `name` (e.g. 'Rocket/Quicken'). Any other spelling returns meta.available=false with empty lists. Use compare_lenders for two lenders side by side. Returns data.lender_key, data.name, data.leis, data.current_year, data.previous_year, data.yearly (one row per HMDA year: originated_volume, originated_loans, purchased_volume, purchased_loans, denied_loans, applications_loans, total_funded_volume, avg_loan_size, denial_rate_pct, denial_rate_count_pct, rank, national_volume, market_share_pct), data.top_states {state, volume, loans, previous_volume, previous_loans} and data.state_market_multiples {state, lender_share_pct, market_share_pct, multiple, ...} (top_n rows each), data.loan_type_mix, data.loan_purpose_mix, data.occupancy_mix ({code, label, loans, volume}), and data.loan_size_histogram. Volumes are USD; shares and rates are percent. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_loan_performanceFannie Mae and Freddie Mac single-family loan-performance analytics for exactly one topic.2 findings
Why it is in this group
- The name "get_loan_performance" says "get": a word for reading.
Findings
- Warn
The description contains a 43-character base64 string.
What this check looks forMatched text
description: "...nthly flows between Current/DQ30/DQ60/DQ90+/Modified/Liquidated (data.flows, top_n..."
- Info
The description is 2,340 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...the cache is still warming (retry after a few seconds); never report it as zero."
Description, as the server wrote it Fannie Mae and Freddie Mac single-family loan-performance analytics for exactly one topic. Topics: - credit: monthly origination FICO and LTV (origination-UPB weighted). data.series {fico, ltv} and data.latest. - prepayment: monthly CPR and SMM (UPB weighted). - delinquency: monthly 30/60/90+ day delinquency rates (UPB-weighted stock rates). - loss: monthly loss severity (percent) and net loss (USD billions), plus data.latest_waterfall. - vintage: cumulative default-rate curves by vintage year over loan age (data.series = [{vintage, points}]). - transitions: loan-level monthly flows between Current/DQ30/DQ60/DQ90+/Modified/Liquidated (data.flows, top_n rows of {from, to, loans, upb, prob}) and data.history {cure_history, roll_30_60_history, roll_60_90_history}. - modification: outcomes at 6/12/18/24/36 months after a first 90+ DPD event, Modified vs NotModified arms (data.horizons, data.outcome_states, data.cohort_size, data.pooled, data.recent_vintages). - rate_sensitivity: modelled CPR under rate shocks (data.scenario = [{rate_shock_bps, predicted_cpr}], data.model {current_rate, current_cpr, slope}). - lock_in: active book by WAC vs today's mortgage rate: data.summary {total_upb, loan_count, wac_weighted, pct_below_mtg, pct_200bps_otm, pct_100bps_otm, pct_in_money} and data.largest_wac_age_cells {wac, age_band, upb}. Use for: agency credit quality, prepayment speeds, delinquency, roll and cure rates, modification outcomes, losses, the lock-in effect. Do not use for: originator volume or market share (search_lenders / get_lender_profile), today's rates (get_market_snapshot), per-servicer performance (get_servicer_analytics). Time-series topics return data.series {metric: [{date, value}, ...]} downsampled to max_points, plus data.latest. Scope is public GSE loan-level disclosures, not the whole U.S. market; meta.as_of is the latest reporting month. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_market_snapshotLatest U.S.No findings
Why it is in this group
- The name "get_market_snapshot" says "get": a word for reading.
Description, as the server wrote it Latest U.S. mortgage rates, TBA par coupons, Treasury and SOFR benchmarks, and mtgmon's fitted MBS basis in one call. No arguments. Use for: "what are mortgage rates today", 30y vs 15y, current coupon, 2y/10y Treasury, SOFR swap levels, whether MBS spreads are rich or cheap versus the model. Do not use for: rate history (not exposed here) or GSE loan performance (get_loan_performance). Returns data.rates, a list of up to 9 points {series, date, value, previous_value, change} for series MORTGAGE30US and MORTGAGE15US (Freddie Mac PMMS, weekly), tba_par_coupon_30y and tba_par_coupon_15y, 2Y and 10Y Treasury, and SOFR O/N, SOFR 2Y, SOFR 10Y; plus data.mbs_basis {model_version, latest_date, latest_basis_bps, latest_fair_bps, latest_gap_bps, latest_gap_zscore, r2_level_full_sample, ec_half_life_days, ...}. Rates are percent, basis is basis points. Series have different observation dates; quote each point's own date. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_sec_filingFull detail for one SEC filing: metadata and EDGAR link, mtgmon's machine-generated summary, which tracked mortgage entities the filing concerns and in what role, named people with…No findings
Why it is in this group
- The name "get_sec_filing" says "get": a word for reading.
Description, as the server wrote it Full detail for one SEC filing: metadata and EDGAR link, mtgmon's machine-generated summary, which tracked mortgage entities the filing concerns and in what role, named people with titles and compensation, extracted financial facts, and ownership rows. Get the filing_id from search_sec_filings first. Returns data.filing {filing_id, accession_number, filer_cik, form, filing_date, company_name, description, canonical_summary, summary_status, summary_model, edgar_url, ...}, data.associations [{display_name, ticker (current symbol), retired_tickers, cik, relationship_role, summary, link_status, ...}], data.people [{name, title, compensation, note}], data.financials [{metric, value, unit, period}], and data.ownership. Each list is capped. Verify summaries against the linked filing before relying on them. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
get_servicer_analyticsAgency (Fannie Mae / Freddie Mac) servicer analytics in one of three modes.1 finding
Why it is in this group
- The name "get_servicer_analytics" says "get": a word for reading.
Findings
- Info
The description is 2,093 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...the cache is still warming (retry after a few seconds); never report it as zero."
Description, as the server wrote it Agency (Fannie Mae / Freddie Mac) servicer analytics in one of three modes. - mode='scorecard': largest servicers ranked by disclosed origination UPB for the current and previous year with average FICO and LTV. Returns data.servicers (top_n rows of {rank, name, volume, previous_volume, avg_fico, avg_ltv}), data.current_year, data.previous_year. - mode='performance': monthly CPR and 90+ day delinquency per top servicer for one origination vintage against the whole-book benchmark. Returns data.servicers {name: {cpr: [{date, value}], dq90: [...]}} downsampled to max_points, data.book {cpr, dq90}, data.vintage, data.latest_date. - mode='transfers': where one originator's Fannie Mae loans are serviced today and how servicing moved from the seller. Requires `lender` (canonical key from search_lenders). Returns data.seller_name, data.summary {loan_count, origination_upb, loans_with_transfer, pct_loans_with_transfer, total_transfer_events, ...}, data.latest_active_servicers {servicer, loans, upb, upb_share_pct}, data.top_routes and data.top_named_routes {from_servicer, to_servicer, events, event_share_pct}, data.first_to_latest {first_servicer, latest_servicer, loans, original_upb} (top_n rows each). Use for: "largest servicers", "which servicer prepays fastest or has the worst DQ for the 2021 vintage", "who services Rocket's loans now". Do not use for: HMDA origination volume (get_lender_profile) or book-wide delinquency (get_loan_performance topic='delinquency'). Coverage is disclosed agency loans matched by seller/servicer name, not any servicer's full portfolio. UPB and volume are USD; CPR and DQ90 are percent. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
search_lendersFind HMDA lenders and resolve names to canonical lender keys.No findings
Why it is in this group
- The name "search_lenders" says "search": a word for reading.
Description, as the server wrote it Find HMDA lenders and resolve names to canonical lender keys. Call this before any other lender tool. Use for: turning a company name ('Rocket', 'UWM', 'Wells Fargo', 'PennyMac') into its canonical key, ranking lenders by origination volume, or listing lenders by charter type or headquarters state. Then pass a result's exact `name` (e.g. 'Rocket/Quicken') as `lender` to get_lender_profile, get_hmda_product_analytics, or get_servicer_analytics mode='transfers', or as lender_a / lender_b to compare_lenders. Legal names such as 'Rocket Mortgage, LLC' are not keys and return meta.available=false downstream. Returns data.results (at most `limit` rows of {name, leis, charter_type, hq_state, recent_year, recent_volume, total_loans, volume_rank, subsidiary_count}), data.matched_count, and data.total_count. recent_volume is USD originations in recent_year (the latest HMDA year). Keys are holding-company or originator groups, so subsidiaries and LEIs roll up into one key. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
search_sec_filingsSearch SEC EDGAR filings of mortgage-related public companies (lenders, servicers, mortgage REITs, insurers, GSEs) that mtgmon has summarized.No findings
Why it is in this group
- The name "search_sec_filings" says "search": a word for reading.
Description, as the server wrote it Search SEC EDGAR filings of mortgage-related public companies (lenders, servicers, mortgage REITs, insurers, GSEs) that mtgmon has summarized. Newest filing date first. Use for: finding a company's 10-K, 10-Q, 8-K, or other filings by ticker, CIK, form type, keyword, or date window, and getting the filing_id to pass to get_sec_filing. Do not use for: full filing text (only summaries are stored) or companies outside the mortgage sector. Returns data.filings (at most `limit` rows of {filing_id, accession_number, filer_cik, form, filing_date, company_name, description, summary_status, summary_excerpt, summary_created_at, edgar_url}) and data.next_cursor (pass back as `cursor` for the next page; null when exhausted; meta.truncated is true when more pages exist). Only filings whose summary processing finished are listed; summaries are machine-generated and should be checked against edgar_url. Behavior: read-only, no auth or API key, no PII, idempotent and safe to retry. The public endpoint https://mtgmon.com/mcp allows about 60 requests/min and 250 tool calls/day per client IP. Result shape is {data, meta}; meta carries available, as_of, source_scope, weighting, units, cache_status, caveats, and truncated. If meta.available is false the data is unavailable or the cache is still warming (retry after a few seconds); never report it as zero.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.1.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http mtgmon https://mtgmon.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__mtgmon__get_market_snapshot",
"mcp__mtgmon__get_loan_performance",
"mcp__mtgmon__search_lenders",
"mcp__mtgmon__get_hmda_product_analytics",
"mcp__mtgmon__get_lender_profile",
"mcp__mtgmon__compare_lenders",
"mcp__mtgmon__get_servicer_analytics",
"mcp__mtgmon__get_dataset_status",
"mcp__mtgmon__search_sec_filings",
"mcp__mtgmon__get_sec_filing"
],
"ask": [],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as mtgmon. Review it before you use it.
