# mtgmon Mortgage Analytics

> Read-only U.S. mortgage market, lender, GSE performance, and servicing analytics.

- name: io.github.lorenzopi/mtgmon
- version: 0.1.0
- connection class: R0 (autonomous)
- trust: 89/100
- quality: 88/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.lorenzopi%2Fmtgmon
- tools: https://api.protogrid.dev/v1/servers/io.github.lorenzopi%2Fmtgmon/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "mtgmon": {
      "type": "http",
      "url": "https://mtgmon.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 98
- freshness: 65
- provenance: 90
- drivers: +repository +namespace-matches-repo +website +reachable +uptime-96% ~updated-95d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 88/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 10 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 10 of 10 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 7,167 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 2 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 10, about 7,167 tokens to load them all
- tool set hash: 822038a9db1be038a45e0c21ecb208aa
- tools last changed: 2026-09-29T20:55:59.398Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.lorenzopi/mtgmon.svg)](https://protogrid.dev/servers/io.github.lorenzopi/mtgmon)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-09-29 `get_sec_filing` changed (description)
  - before: 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, 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.
  - after: 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.
- 2026-09-29 `search_sec_filings` changed (inputSchema)

Full history: https://api.protogrid.dev/v1/servers/io.github.lorenzopi%2Fmtgmon/changes

## Remotes

- https://mtgmon.com/mcp (streamable-http, auth none, reachable true, uptime30d 0.95652175)

## Packages

_none_

## Tools (10)

- `compare_lenders`: 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.
- `get_dataset_status`: 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.
- `get_hmda_product_analytics`: 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.
- `get_lender_profile`: 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.
- `get_loan_performance`: 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.
- `get_market_snapshot`: 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.
- `get_sec_filing`: 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.
- `get_servicer_analytics`: 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.
- `search_lenders`: 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.
- `search_sec_filings`: 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.
