ncua-data-analysis
MCP serverDev toolsNCUA 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
No other account needed.
Details
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
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/mcpAdd 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=eyJ1cmwiOiJodHRwczovL25jdWEtZGF0YS1hbmFseXNpcy5mbHkuZGV2L21jcCJ9Open the link and Cursor adds the server at that address.
ChatGPT
https://ncua-data-analysis.fly.dev/mcpIn 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
| Table | Grain | What it is |
|---|---|---|
dim_credit_union | credit union x quarter | Name, location, charter type, peer group, low-income and MDI flags, and is_federally_insured. |
fact_call_report_curated | credit union x quarter | 115 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. |
metrics | credit union x quarter | 52 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. |
dictionary | column | Description, 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) andmetrics.net_worth_ratio_ex_ceclmatches NCUA. - Employees are estimated.
employees_fte_estimateis 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_fieldsfind_credit_unioncredit_union_profilemetric_seriespeer_comparequery_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
github.com/bnovarini/ncua-data-analysis