ncua-data-analysis

MCP serverDev tools

NCUA call report data for US credit unions, 2018-2026: profiles, peer comparison, time series.

Use ncua-data-analysis in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add ncua-data-analysis and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use ncua-data-analysis to list fields

Details

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

ncua-data-analysisStart free

Install ncua-data-analysis

The server’s own address, for the clients that take one directly. Or connect ahel once and every client you use reads it from one address, with the account kept on ahel rather than in each client’s config.

  • Claude Code

    claude mcp add --transport http --scope user ncua-data-analysis 'https://ncua-data-analysis.fly.dev/mcp'

    Run it once in your project, then open /mcp to approve any sign-in the server asks for.

  • Claude Desktop

    https://ncua-data-analysis.fly.dev/mcp

    Add a custom connector in Settings, paste this address, and approve the sign-in.

  • Cursor

    cursor://anysphere.cursor-deeplink/mcp/install?name=ncua-data-analysis&config=eyJ1cmwiOiJodHRwczovL25jdWEtZGF0YS1hbmFseXNpcy5mbHkuZGV2L21jcCJ9

    Open the link and Cursor adds the server at that address.

  • ChatGPT

    https://ncua-data-analysis.fly.dev/mcp

    In Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.

  • Codex

    codex mcp add ncua-data-analysis --url 'https://ncua-data-analysis.fly.dev/mcp'

    Run it once, then sign in with codex mcp login ncua-data-analysis if the server asks for an account.

From the project's README

As published by bnovarini/ncua-data-analysis in README.md.

Clean, documented, quarterly credit union data from NCUA call reports, 2018 to today: lending, deposit mix, earnings, staffing and efficiency.

NCUA publishes every federally insured credit union's quarterly 5300 call report as free bulk files. They are hard to use: 3,300+ account columns split across 17 wide tables, form changes that move accounts around, year-to-date income, and a data dictionary written as form instructions. This project turns that into four tidy tables you can query with DuckDB, pandas or anything that reads Parquet.

Status: v0. 115 curated fields and 52 computed metrics, 34 quarters (2018 Q1 to 2026 Q2), checked against NCUA's own published totals. See what is not done yet.

Tables

TableGrainWhat it is
dim_credit_unioncredit union x quarterName, location, charter type, peer group, low-income and MDI flags, and is_federally_insured.
fact_call_report_curatedcredit union x quarter115 curated account values with plain names: balance sheet, shares and capital, deposit composition (share drafts, regular, money market, certificates, IRA, non-member), loan balances by type, originations, delinquency, charge-offs, income statement, employees and branches.
metricscredit union x quarter52 computed metrics: delinquency, loan-to-share, ROA, NIM, loan and deposit mix, growth, efficiency ratio, members and assets per employee, per-branch figures, de-cumulated quarterly income.
dictionarycolumnDescription, unit, NCUA account codes, and first and last quarter each field has data.

Join on quarter + cu_number. Dollar fields are dollars. Fields ending in _ytd are year to date and reset each January (the Q4 value is the full year); metrics annualizes them.

-- Which large credit unions grew auto lending fastest last year?
SELECT d.name, d.state, m.auto_loan_growth_yoy, f.loans_new_vehicle + f.loans_used_vehicle AS auto_loans
FROM fact_call_report_curated f
JOIN dim_credit_union d USING (quarter, cu_number)
JOIN metrics m USING (quarter, cu_number)
WHERE f.quarter = '2026-06' AND d.is_federally_insured AND d.peer_group = 6
ORDER BY m.auto_loan_growth_yoy DESC LIMIT 10;

Run it

pip install -e .
ncua-data all          # download 34 quarters (~270 MB), build tables, reconcile
python -m unittest discover -s tests

Output lands in data/out/ as Parquet. Raw ZIPs are never committed. Links are scraped from NCUA's quarterly data page.

Numbers you can trust

For June 2026 and December 2025 the totals reconcile to the figures in NCUA's Quarterly Credit Union Data Summary: credit union count, members, loans by type, shares, net worth ratio, delinquency, income and expense. 60 of 67 checks match across six year-ends (2021 to June 2026). The 7 that do not are historical deposit lines that differ by under $0.5B (under 0.1%), for example Dec 2025 money market $367.5B versus $368.0B published. All June 2026 lines match. The likely cause is restated history in NCUA's table, which has not been confirmed. Full table: docs/RECONCILIATION.md.

Things to know before using it:

  • Filter to is_federally_insured. NCUA's raw files include about 85 state-chartered credit unions it does not insure. Its published totals leave them out.
  • The form changed in 2022 and 2023. NCUA redesigned the call report and adopted CECL, so some accounts disappear and new ones appear. Fields that span the change map both account codes (for example the allowance is Acct_719 before CECL and Acct_AS0048 after). Fields that only exist after the change say so in the dictionary.
  • Net worth ratio. NCUA's published ratio excludes the CECL transition provision from 2023 on. This dataset carries that provision (cecl_transition_provision) and metrics.net_worth_ratio_ex_cecl matches NCUA.
  • Employees are estimated. employees_fte_estimate is full-time plus half of part-time. It is not an NCUA definition and is not reconciled to a published figure.
  • Net charge-off ratio, ROA and NIM use NCUA's own average balances, which are not public. Metrics here use a four-quarter average and land within a few basis points of NCUA's published values, not on them.
  • Mergers. Credit union counts fell from 5,375 to 4,214 since 2018. A merged credit union's history stays under its old charter number, so per-institution growth across a merger is not meaningful.
  • Reports are self-reported and occasionally reposted as "Revised". The ZIPs are used as NCUA publishes them today.

Not done yet

  • Commercial-loan delinquency by type (NCUA moved these to new account codes in 2022).
  • More fields. The target is 150 to 200; 115 are in and verified.
  • Years before 2018 (the download links use two other naming patterns).
  • A static analytics site and natural-language querying. The dictionary is built to be the semantic layer for that.

MCP server (v1)

A local MCP server lets an AI assistant query this dataset in plain language. It runs over stdio, reads the release Parquet files with DuckDB (downloaded once to ~/.cache/ncua-data-analysis), and builds its tool descriptions from the dictionary table.

{
  "mcpServers": {
    "ncua-data": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/bnovarini/ncua-data-analysis", "ncua-data-mcp"]
    }
  }
}

Hosted, nothing to install: https://ncua-data-analysis.fly.dev/mcp (streamable HTTP, read-only, rate limited to 60 requests a minute per client). Add it as a remote MCP server in any client that supports one, for example {"mcpServers": {"ncua-data": {"url": "https://ncua-data-analysis.fly.dev/mcp"}}}.

Tools: list_fields, find_credit_union, credit_union_profile, metric_series (one credit union or an aggregate across all), peer_compare (by asset group, state or charter), and query_metrics (filters, ordering and limits; no raw SQL). Set NCUA_DATA_DIR to use a folder of already-downloaded files. Status: first working version, tested over stdio with a real MCP client; not yet listed in the MCP registry.

Download

Ready-made Parquet files are attached to the v0.1 release. GitHub caps release files at 25 MB, so fact_call_report_curated and metrics come in three parts by year (2018-2020, 2021-2023, 2024-2026) with identical columns:

import duckdb
base = "https://github.com/bnovarini/ncua-data-analysis/releases/download/v0.1/"
parts = [base + f"metrics_{y}.parquet" for y in ("2018_2020", "2021_2023", "2024_2026")]
duckdb.sql(f"SELECT quarter, count(*) FROM read_parquet({parts}) GROUP BY 1 ORDER BY 1").show()

Data source and license

Data: National Credit Union Administration, 5300 Call Report Quarterly Data. NCUA does not state a license on the download page. As a US federal agency's work it is assumed to be public domain, but that assumption has not been confirmed. Credit NCUA when you use it.

Code: MIT, see LICENSE.

Tools it offers (6)

What this server listed when ahel dialed its public endpoint in Oct 2026, with no key and no account of yours. The names are the server’s own.

  • list_fields
  • find_credit_union
  • credit_union_profile
  • metric_series
  • peer_compare
  • query_metrics

Signals

Last commit
Oct 2026
Advanced
Delivery
ncua-data-analysis MCP server → your ahel connector (mcp.ahel.ai) → your AI.
Item type
mcp-server
Key
io-github-bnovarini-ncua-data-analysis
Source
github.com/bnovarini/ncua-data-analysis
Hosted endpoint
https://ncua-data-analysis.fly.dev/mcp