{"id":"0243f9f4-9fc9-44f1-961c-d2cc35983cf8","slug":"mcp-fed-nic","kind":"mcp","name":"mcp-fed-nic","summary":"Federal Reserve National Information Center (NIC, ffiec.gov/npw)","owner":"pipeworx-io","repoUrl":"https://github.com/pipeworx-io/mcp-fed-nic","license":"MIT","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-09-25T02:59:31.000Z","addedAt":"2026-10-14T05:54:02.377Z","logoUrl":"https://avatars.githubusercontent.com/u/270792911?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra","memory-knowledge"],"tags":["pipeworx","fed-nic"],"runtime":"remote","local":false,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-17T18:01:48.065Z","sample":false,"url":"https://conduits.dev/tools/mcp-fed-nic","language":"TypeScript","transports":["http"],"install":{"remoteUrl":"https://gateway.pipeworx.io/fed-nic/mcp"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# @pipeworx/fed-nic\n\nInstitution search, corporate ownership hierarchy, and merger/acquisition history\nfor US banks and bank/financial holding companies, sourced from the Federal\nReserve System's National Information Center (NIC, ffiec.gov/npw).\n\nPart of [Pipeworx](https://pipeworx.io) — an MCP gateway connecting AI agents to 1683+ live data sources.\n\n## Tools\n\n- `nic_search_institutions(query, status?, state?, limit?)` — find institutions\n  by name. Returns RSSD ID, FDIC certificate, LEI, institution type, location,\n  active/closed status. RANKED via `nic_search_ranked` (migration 212): exact\n  match, then prefix match on an active FDIC-cert institution, then any\n  prefix match, then other active FDIC-cert institutions, then the rest —\n  not alphabetical (see \"Coverage / accuracy notes\").\n- `nic_get_institution(rssd_id? | fdic_cert? | lei?)` — full NIC record for\n  one institution, looked up by exactly one of RSSD ID, FDIC certificate\n  number (chains to the `fdic` pack), or LEI (chains to the `gleif` pack).\n- `nic_get_hierarchy(rssd_id, direction?, limit?, offset?)` — `direction=\"up\"`\n  (default) walks the ownership chain to its top holder (\"which holding\n  company owns this bank?\"); `direction=\"down\"` lists entities owned by the\n  given RSSD ID, paged via `limit`/`offset`, with `total_subsidiary_count`\n  computed as a DISTINCT count in SQL (migration 212's `nic_descendant_count`)\n  — see \"Coverage / accuracy notes\" for why the previous count was wrong.\n- `nic_get_history(rssd_id)` — mergers, acquisitions, failures and\n  transformations the institution was party to (\"what predecessor\n  institutions merged into this bank?\").\n\n## Auth\n\nKeyless — no caller-facing credential. The gateway supplies the store\ncredential automatically.\n\n## Data sources\n\n- <https://www.ffiec.gov/npw/FinancialReport/DataDownload> — NIC's public\n  bulk CSV files: Attributes-Active, Attributes-Closed, Relationships,\n  Transformations. US federal government data; no reuse restriction found on\n  the download page or the NPW site (public-domain by default for federal\n  data — see \"Reuse terms\" below).\n\n## Why this pack reads from a mirror, not a live proxy\n\n`www.ffiec.gov` sits behind a Cloudflare Managed Challenge\n(`cf-mitigated: challenge`) that returns a 403 \"CAPTCHA Error\" page to every\nnon-browser HTTP client — confirmed on both:\n\n- the interactive NPW pages the live site itself uses per-query\n  (`Institution/Profile/{rssd_id}`, POST `Institution/BuildTier`, POST\n  `Institution/LoadHistory`), and\n- the bulk CSV download endpoints (`FinancialReport/Return*ZipFileCSV`)\n  themselves,\n\nwith a full Chrome header set (User-Agent, Accept, Accept-Language,\n`sec-ch-ua*`). A Cloudflare Worker's `fetch()` hits the identical wall — there\nis no header or cookie fix, it is a JS/TLS-fingerprint challenge, not a UA\ncheck — so there is no live per-query route this gateway can reach. Per\nBruce's 2026-09-23 ruling (\"build a copy when live doesn't serve\"), this pack\nis instead backed by a periodically-refreshed copy of NIC's own public bulk\nfiles (migration `supabase/migrations/209_fed_nic.sql`), refreshed by\n`scripts/ingest-fed-nic.mjs` — see that script's header for exactly why the\nrefresh cannot be a Worker cron and what running it manually requires. It is\nregistered in `workers/data-pipeline/src/datasets/fed-nic.ts` for freshness\nvisibility only (no scheduled run), the same pattern\n`workers/data-pipeline/src/datasets/ffiec.ts` uses for `cdr.ffiec.gov`.\n\n## Reuse terms\n\nNIC's Data Download page (`/npw/FinancialReport/DataDownload`, \"About the\nFiles\") documents the file contents and how to use them but states no\ncopyright, license, or reuse restriction. The NIC Data Dictionary PDF (linked\nfrom that page) sits behind the same Cloudflare wall as the rest of\n`ffiec.gov`, so it could not be checked directly. This is data produced by a\nUS federal agency (the Federal Reserve System) about a supervisory/regulatory\nfunction; US federal government works are public domain by default (17 U.S.C.\n§ 105) absent a specific notice to the contrary, and none was found.\n\n## Coverage / accuracy notes\n\n- **Branches are not ingested.** NIC's Attributes-Branches file (~174k rows,\n  95MB) is out of scope for the hierarchy/history use case this pack ships;\n  the NIC UI's own \"Branches\" tab covers it and this could be added later.\n- **`nic_get_hierarchy` is our own computed closure**, not a copy of NIC's own\n  tiering algorithm. It recursively walks currently-active\n  (`dt_end IS NULL`) edges in NIC's public Relationships file. Spot-checked\n  live on 2026-09-23 against JPMorgan Chase Bank, N.A. (RSSD 852218):\n  `direction=\"up\"` matched the live UI exactly (top holder JPMorgan Chase &\n  Co., RSSD 1039502); `direction=\"down\"` from the top tier returned 877\n  subsidiaries by our closure versus 1,025 on the live UI. The discrepancy is\n  not reconstructable from the public bulk file alone (the live UI's tiering\n  algorithm likely applies rules — e.g. non-equity control bases, branch/agent\n  relationships — that the public Relationships export does not fully carry).\n  Treat the down-direction count as a lower bound computed from NIC's own\n  published data, not NIC's official figure.\n  **Migration 212 fixes a separate bug in how that 877 reached the tool.**\n  The Relationships closure emits one row per ownership PATH, not one per\n  distinct subsidiary — a subsidiary reachable through more than one parent\n  chain appears more than once (1,672 raw rows for JPMorgan vs. 877 distinct\n  RSSD ids). The tool originally called the raw closure RPC directly and used\n  the returned row count as `total_subsidiary_count`; PostgREST caps a single\n  RPC response at 1,000 rows, so the count silently landed on 1,000 instead of\n  877 whenever the raw closure exceeded that cap. `nic_descendant_count` (a\n  single-row scalar, immune to the row cap) and `nic_descendants_page`\n  (deduped + paged in SQL) fix this — see `src/index.ts`'s top-of-file\n  comment and `supabase/migrations/212_fed_nic_hierarchy_and_search_fix.sql`.\n- **`nic_search_institutions` ranking (migration 212, `nic_search_ranked`).**\n  Plain alphabetical order put same-family entities ahead of the institution\n  most callers mean — e.g. query \"Wells Fargo Bank\" returned \"WELLS FARGO\n  BANK INTERNATIONAL UNLIMITED COMPANY\" (an Ireland entity, no FDIC cert)\n  ahead of \"WELLS FARGO BANK, NATIONAL ASSOCIATION\" (RSSD 451965) purely\n  because `' '` sorts before `','` in ASCII. Ranking now tiers by exact\n  match, then prefix-match-with-FDIC-cert, then any prefix match, then\n  other cert-holding active institutions, then the rest; ties within a tier\n  break on shortest `legal_name` (closest in length to the query), then\n  trigram similarity.\n- **`entity_type_code` labels are partial.** `ENTITY_TYPE_LABELS` in\n  `src/index.ts` only carries codes verified live against the NIC UI (NAT,\n  FHD, EDI, IBK, INB, DEO). Any other code is returned raw rather than\n  guessed — the NIC Data Dictionary that would confirm the rest is itself\n  behind the Cloudflare wall.\n- **`trnsfm_cd` (transformation type) is a raw NIC code**, not a label, for\n  the same reason. Code 50 is corroborated against a live example (First\n  Republic Bank, RSSD 4114567 → JPMorgan Chase Bank N.A., RSSD 852218,\n  2023-05-01, \"failed and ceased to exist\" on the live NIC History tab).\n\n## Quick Start\n\nAdd to your MCP client (Claude Desktop, Cursor, Windsurf, etc.):\n\n```json\n{\n  \"mcpServers\": {\n    \"fed-nic\": {\n      \"url\": \"https://gateway.pipeworx.io/fed-nic/mcp\"\n    }\n  }\n}\n```\n\n### What this endpoint actually serves\n\n`tools/list` at `https://gateway.pipeworx.io/fed-nic/mcp` returns the tools in the table\nabove **plus the shared Pipeworx meta-tools** — `ask_pipeworx`,\n`discover_tools`, `search_within`, `remember`/`recall` and the rest of the\ngateway-wide set. So the tool count you see is larger than this table: a\nsingle-pack endpoint currently lists roughly 30 shared tools alongside the\npack's own. The connection's `initialize` response states its exact scope, and\nis the authoritative answer for a given day.\n\nThis is deliberate, not multiplexing by accident. The meta-tools are what let a\nscoped connection answer a question this pack does not cover — via\n`ask_pipeworx`, which routes across the whole catalog — without you adding a\nsecond MCP server. There is currently no way to mount a pack endpoint without\nthem; if the extra schemas cost you more context than the routing is worth,\nconnect to the full gateway once rather than to several pack endpoints.\n\nOr connect to the full Pipeworx gateway to get every pack's tools listed\ndirectly, instead of just this one's:\n\n```json\n{\n  \"mcpServers\": {\n    \"pipeworx\": {\n      \"url\": \"https://gateway.pipeworx.io/mcp\"\n    }\n  }\n}\n```\n\nBoth URLs reach the same gateway and the same 1683+ data sources. The\nonly difference is which pack's tools are listed **directly**; `ask_pipeworx`\nreaches all of them from either one.\n\n## No MCP client? Call it over HTTP\n\n```bash\ncurl -X POST https://gateway.pipeworx.io/v1/tools/nic_search_institutions \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"query\":\"JPMorgan Chase Bank\"}'\n```\n\nNo account needed for the first calls. Inspect any tool: `GET https://gateway.pipeworx.io/v1/tools/nic_search_institutions`. Find one: `POST https://gateway.pipeworx.io/v1/tools/search_packs` with `{\"query\":\"...\"}`.\n\n## Standalone (no gateway account)\n\nThis package also runs as a local stdio MCP server — no Pipeworx account, no\ngateway round-trip:\n\n```json\n{\n  \"mcpServers\": {\n    \"fed-nic\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@pipeworx/mcp-fed-nic\"]\n    }\n  }\n}\n```\n\nOr run it directly to confirm it starts:\n\n```bash\nnpx -y @pipeworx/mcp-fed-nic\n```\n\nIt speaks MCP over stdin/stdout and answers `initialize`/`tools/list`/`tools/call`\nfor **only** this pack's tools — none of the shared meta-tools the gateway\nconnection above adds. Same source, same tools, no ask_pipeworx routing.\n\n## Using with ask_pipeworx\n\nInstead of calling tools directly, you can ask questions in plain English —\nthis works on the pack endpoint above as well as on the full gateway:\n\n```\nask_pipeworx({ question: \"your question about Fed Nic data\" })\n```\n\nThe gateway picks the right tool and fills the arguments automatically.\n\n## More\n\n- [Docs and guides](https://pipeworx.io/docs)\n- [pipeworx.io](https://pipeworx.io)\n\n## License\n\nMIT\n"}