fdic-banks-mcp-server
Server Details
Search FDIC-insured banks, Call Report financials, peer rankings, failures, mergers, deposit share.
- Status
- Healthy
- Uptime
- 99.8% over 25 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/fdic-banks-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/fdic-banks-mcp-server
TDQS
Scored across 10 tools
Each tool targets a distinct FDIC data operation: institution search, financials, deposits, failures, history, peer comparison, reference vocabulary, and dataframe staging/querying. The apparent similarity between fdic_get_institution_financials and fdic_query_financials is clarified by their descriptions: one returns a single institution's quarterly Call Report, the other builds a multi-institution panel.
All tools use the fdic_ prefix and snake_case, with most following a verb_noun pattern such as fdic_get_deposits, fdic_search_failures, and fdic_compare_peers. The two dataframe tools use object_action naming (fdic_dataframe_describe, fdic_dataframe_query), which is a minor deviation but still readable and internally grouped.
Ten tools are well scoped for an FDIC banking-data server, covering search, financials, deposits, failures, history, peers, reference data, and dataframe analysis without obvious filler. Each tool has a clear role in supporting real banking-data workflows.
The surface covers the core FDIC research lifecycle: find institutions, inspect financials and deposits, review structure history, search failures, compare peers, and query staged panels with SQL. Minor gaps remain, such as dedicated institution-profile retrieval or richer branch/geographic detail beyond deposit summaries, but agents can work around these through existing tools.
Available Tools
10 toolsfdic_compare_peersCompare an institution with its peersARead-onlyIdempotentInspect
Compare one institution with a peer group for one quarter: for each metric, the institution's value next to the peer median, quartiles, minimum and maximum, and its percentile and rank. The default peer group is every institution in the same asset-size band that reported that quarter; narrow it to one state, widen it to all sizes, or name the peers by CERT. Dollar amounts are in thousands; ratios are percentages.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | Yes | FDIC certificate number of the institution to compare, from fdic_search_institutions. | |
| metrics | No | At most 1000 raw metric names. Deduplicated before querying the first 20; deferred_metrics holds the rest. Omit or pass [] for the default health set. | |
| peer_certs | No | Nonempty peer selection, at most 1000 raw CERTs, replacing band/state filters. Deduplicated before querying the first 200; deferred_certs holds the rest and marks the cohort incomplete. Fewer than five peers still computes, with a notice. | |
| peer_state | No | Limit peers to one headquarters state: a two-letter code, a full state name, or same for the institution's own state. Omit for nationwide. Not combinable with peer_certs. | |
| report_date | No | Quarter to compare: a quarter-end date (2026-06-30), the same without dashes (20260630), or a quarter label (2026Q2). Omit for the latest quarter FDIC has published. | |
| peer_asset_band | No | Peer size band by total assets: same (the band holding the institution's own assets, default), any (all sizes), under_100m, 100m_1b, 1b_10b, 10b_250b, or over_250b; fdic_list_reference topic peer_asset_bands gives each band's bounds. Not combinable with peer_certs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when the peer group is empty or a metric has fewer than five peer values. |
| data_as_of | No | When FDIC last rebuilt the financials index (ISO timestamp). |
| peer_group | No | How the peer group was built. |
| comparisons | No | Per-metric comparison, in metric order. |
| institution | No | The institution being compared. |
| report_date | No | Quarter-end date compared (YYYY-MM-DD). |
| deferred_certs | No | CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call. |
| processed_certs | No | Deduplicated CERT selection actually queried; missing CERTs are a subset of these. |
| deferred_metrics | No | Metrics not queried; pass these as metrics in a new call. |
| selection_notice | No | Execution caps and how to retrieve deferred selections. |
| processed_metrics | No | Metrics actually queried, including automatic panel sort/filter metrics. |
| peer_certs_missing | No | Explicit peer CERTs that filed no Call Report for the quarter. |
| report_date_defaulted | No | True when report_date was omitted and the latest published quarter was used. |
| peer_cohort_incomplete | No | True when deferred peer CERTs were excluded from every statistic; rerun with deferred_certs as peer_certs or use a smaller cohort. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, open-world operation, so the safety profile is covered. The description adds genuinely non-structured context: the default cohort is every institution in the same asset-size band that reported that quarter, and the output units (dollar amounts in thousands, ratios as percentages), which an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what is computed, how the peer group is configured, and the units of the returned numbers. Front-loaded with the core action and free of restatement of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter tool with an output schema, full schema descriptions, and read-only annotations, the description supplies the remaining decision-relevant context: what gets returned, how the default cohort is chosen, and the units. Deferred-metric and small-cohort behaviors are handled in the schema, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it explains the default and the narrowing/widening/naming semantics of peer_asset_band, peer_state and peer_certs as a family of mutually exclusive alternatives, which the schema states only piecewise. It does not add syntax or value-level detail for metrics or report_date beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Compare one institution with a peer group for one quarter') and enumerates exactly what the comparison yields: the institution's value alongside peer median, quartiles, min/max, percentile and rank. This is clearly distinguishable from siblings like fdic_get_institution_financials (single institution) or fdic_query_financials without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context on how the peer group resolves by default and the three ways to change it (narrow to a state, widen to all sizes, name by CERT), which tells the agent when each peer-selection parameter applies. It stops short of explicitly naming a sibling alternative for the single-institution case, so it is context-rich but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_dataframe_describeDescribe staged dataframesARead-onlyIdempotentInspect
Describe the df_ dataframes that fdic_query_financials and fdic_get_deposits staged when a result at offset 0 was larger than one page, plus any that fdic_dataframe_query saved with register_as. Pass name (from a dataset field) for one dataframe in full: source tool, the parameters it was called with, row count, creation and expiry time, column schema, and the unit and basis of each amount, ratio, or count column (thousands of dollars, percent, or count). Read a table's columns this way before writing SQL for fdic_dataframe_query. Omit name to list the live dataframes, newest first, 50 per page, as name, source tool, row count, and expiry only. A deployment that serves HTTP without authentication, where every caller shares one canvas, does not list; there, pass the name a dataset field returned.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A dataframe name (df_XXXXX_XXXXX, from a dataset field) for its provenance, columns, and units; omit to list the live dataframes where this deployment allows it. | |
| offset | No | Listed dataframes to skip; pass next_offset from the previous page. Ignored when name is set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Dataframes per page of the listing. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Dataframes listed on this page. |
| total | No | Live dataframes across all pages of the listing; with name, 1 or 0. |
| notice | No | Guidance when nothing matched, the page is past the end, the page starts past the first dataframe, or more pages remain. |
| truncated | No | True when more dataframes remain beyond this page. |
| dataframes | No | The named dataframe in full, or one page of the live dataframes as summary rows, newest first; empty when none matched. |
| next_offset | No | Offset of the next page of the listing; present when more dataframes remain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a read-only, idempotent, closed-world read, so this description clears the lower bar easily by adding substantial context: exactly what the detailed response contains (source tool, call parameters, row count, creation and expiry times, column schema, and unit/basis for amount/ratio/count columns), what the list-mode response contains, ordering (newest first), and page size (50). It also discloses the expiry behavior and the unauthenticated-canvas listing limitation, none of which is in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded: the source and identity of the dataframes come first, then the two modes, then the SQL-prep guidance, then the deployment caveat. The prose is dense and runs as one long paragraph, which slightly hurts scanability, but nearly every clause carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still tells the agent what each mode returns and when to prefer which, and covers the unusual deployment case. For a two-mode read tool with defined lifecycle semantics (expiry), nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters, but the description adds operational meaning: the name comes from a dataset field and unlocks the full detail view, while offset is passed as next_offset from the prior page and is ignored when name is set. That cross-parameter interaction is a genuine addition beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (describe df_<id> dataframes) and precisely names where they come from: staged by fdic_query_financials/fdic_get_deposits on oversized offset-0 results, or saved via fdic_dataframe_query's register_as. It also distinguishes the two modes (named describe vs. unnamed list), so an agent can tell it apart from the sibling query tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (read a table's columns this way before writing SQL for fdic_dataframe_query), how to choose between the two modes (pass name vs. omit name), and a concrete deployment exclusion: on unauthenticated HTTP where all callers share one canvas, listing is unavailable, so pass the name from a dataset field. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_dataframe_queryQuery staged dataframes with SQLARead-onlyIdempotentInspect
Run one read-only SELECT (DuckDB SQL) across the df_ dataframes that fdic_query_financials and fdic_get_deposits staged or an earlier register_as saved; joins, aggregates, window functions, and CTEs work. Before writing SQL, pass each table name to fdic_dataframe_describe to read its columns. DOUBLE columns come back as JSON numbers and dollar columns are thousands of US dollars; BIGINT results such as COUNT(*) come back as strings, so CAST them to INTEGER or DOUBLE for arithmetic. Writes, DDL, file-reading functions, and system catalogs are rejected. register_as materializes the result as a new dataframe with a fresh TTL.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | One SELECT against df_<id> tables named in a dataset field or by fdic_dataframe_describe, up to 20,000 characters. | |
| preview | No | Rows to return inline; defaults to the effective row_limit and is clamped to it. Set it low when register_as keeps the full result. | |
| row_limit | No | Requested materialization cap (default 1,000; hard input ceiling 1,000,000), clamped to the execution cap of 10,000. Without register_as, row_count_capped reports more matches; continue with ordered LIMIT/OFFSET pages. register_as keeps the whole result within the staging budget. | |
| register_as | No | Materialize the full result as a new dataframe under this unused name (df_XXXXX_XXXXX: uppercase letters and digits). A name already staged fails as register_as_clash — including on a repeat of a call that already saved it. The live dataframes share a 1,000,000-row budget: the oldest are dropped to make room, and a result over the budget on its own fails as register_as_too_large. Omit to return rows only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The cap that bound: preview when lower, else row_limit. |
| rows | No | Result rows, bounded by preview and row_limit. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Rows returned inline. |
| notice | No | Guidance when the query returned no rows or a cap withheld some. |
| columns | No | Columns in projection order. |
| row_count | No | Rows the query produced, up to effective_row_limit; with register_as, the exact count of the new dataframe. |
| truncated | No | True when rows were withheld by preview or row_limit. |
| expires_at | No | When the register_as dataframe is dropped (ISO 8601). |
| registered_as | No | Name of the dataframe register_as created. |
| row_count_capped | No | True when the query matched more rows than effective_row_limit, so row_count is that cap. |
| effective_preview | No | Inline row cap after clamping preview to the effective row_limit. |
| requested_preview | No | Explicit preview before clamping; absent when omitted. |
| effective_row_limit | No | Effective row_limit, at most 10,000. |
| requested_row_limit | No | Requested row_limit before the execution cap. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses type coercion quirks (DOUBLE as JSON numbers, dollar columns in thousands of USD, BIGINT returned as strings requiring CAST), rejected statement classes, the 1,000,000-row staging budget with oldest-dataframe eviction, and the register_as_clash and register_as_too_large failure modes. The clash-on-repeat behavior even qualifies the idempotent annotation, which is honest disclosure rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then the prerequisite, then the gotchas, in a tight six-sentence block. Some material (row budget, name-clash repeat behavior) partly duplicates the rich schema, but almost every sentence gives the agent something actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter SQL tool with an output schema, the description covers everything an agent needs: where tables come from, the describe-first step, type-mapping pitfalls, rejected SQL, and register_as lifecycle/limits. Return-value shape is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already carries the parameter documentation and a 3 would be the floor. The description adds genuine semantics on top: register_as produces a materialized dataframe with a fresh TTL and unique-name requirement, and the CAST guidance shapes how the sql parameter must be written.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — running one read-only SELECT (DuckDB SQL) across df_<id> dataframes — and names the exact sibling tools that stage those dataframes (fdic_query_financials, fdic_get_deposits) plus fdic_dataframe_describe. An agent can distinguish this from the sibling query tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite workflow ('Before writing SQL, pass each table name to fdic_dataframe_describe') and states the exclusion boundary (writes, DDL, file-reading functions and system catalogs rejected). It is clear about context and sequence but never explicitly contrasts when to query a staged dataframe versus calling fdic_query_financials directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_get_depositsGet Summary of Deposits branches and market shareARead-onlyIdempotentInspect
Get Summary of Deposits data (branch-level domestic deposits, annual as of June 30, 1994 onward). With cert only: the institution's branches and its deposit market share in each state where it has offices. With a geography (state, county, city, ZIP, or MSA code): every institution in that market ranked by deposits, with market share and the Herfindahl-Hirschman index. With both: the institution's branches in that market and its rank and share there. Branches and rankings come a page at a time, continued with offset; at offset 0 a set larger than the page is also staged as a dataframe for fdic_dataframe_query. Defaults to the latest survey year. Dollar amounts are in thousands.
| Name | Required | Description | Default |
|---|---|---|---|
| zip | No | Five-digit branch ZIP code; leading zeros kept (02110). | |
| cert | No | FDIC certificate number, from fdic_search_institutions. Alone: its branches and per-state share. With a geography: its position in that market. | |
| city | No | Branch city as FDIC spells it (Seattle, St. Louis), up to 50 characters; matched exactly as given or in title case, with a hyphen, apostrophe, or space between words also tried the other ways FDIC records it (Winston-Salem finds Winston Salem); requires state. | |
| year | No | Survey year (deposits as of June 30), 1994 on. Omit for the latest survey. | |
| limit | No | Positive count of rows per page, sliced from the already-fetched branches or ranking at offset. At offset 0 a larger set is also staged whole as a dataframe when this deployment stages dataframes. | |
| state | No | Branch state: two-letter code in any case or full name. | |
| county | No | County as FDIC spells it (King, not King County — a trailing " County" is stripped), up to 50 characters; matched exactly as given or in title case, with a hyphen, apostrophe, or space between words also tried the other ways FDIC records it; requires state. | |
| offset | No | Branches or ranked institutions to skip; pass next_offset from the previous page. Only offset 0 stages a dataframe. | |
| msa_code | No | Five-digit CBSA (metropolitan area) code, 10180–49740; branch rows (returned when cert is given) carry msa_code values to reuse. Non-metropolitan branches have no code. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit applied to this page. |
| mode | No | institution (cert only), market (geography only), or institution_in_market (both). |
| year | No | Survey year (deposits as of June 30). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Rows on this page. |
| market | No | Market modes: the whole market in the geography. |
| notice | No | Guidance when nothing matched, more pages remain, the page is past the end, or where the full collection is staged. |
| dataset | No | The staged full collection; present only at offset 0 when it exceeded limit and this deployment staged it as a dataframe. |
| branches | No | Institution modes: one page of the branches in scope by branch number (main office first), starting at offset. |
| position | No | institution_in_market: present when the institution has branches in the market. |
| footprint | No | Institution mode: its deposits and share per state, largest first. |
| geography | No | The geography as applied; absent in institution mode. |
| truncated | No | True when rows remain past this page (next_offset is set). |
| data_as_of | No | When FDIC last rebuilt the Summary of Deposits index (ISO timestamp). |
| total_rows | No | Full count of the branches (institution modes) or ranked institutions (market). |
| institution | No | The institution; present when it reported branches in scope. |
| next_offset | No | Offset of the next page; present while rows remain past this page. |
| institutions | No | Market mode: one page of the institutions ranked by deposits (ties by CERT), starting at offset. |
| year_defaulted | No | True when year was omitted and the latest survey was used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/open-world, so the description's real contribution is pagination mechanics (page-at-a-time, continue with offset, only offset 0 stages a dataframe), the June 30 annual cadence, and units in thousands. It stops short of describing empty-market behavior or error conditions, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the dataset and scope, then the mode matrix, then pagination and defaults. Dense but nearly waste-free; the long 'With both' sentence is slightly overpacked but still parseable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, no-required-parameter tool with an output schema and full schema coverage, this covers what remains: mode selection, defaulting, pagination protocol, unit conventions, and a pointer to the dataframe handoff. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns a bump by explaining the interaction semantics the schema only states per-field — which geography types are accepted and what cert adds when combined. It does not restate syntax details already in the schema, which is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific dataset (FDIC Summary of Deposits, branch-level domestic deposits, annual as of June 30 from 1994) and then enumerates the three result shapes by parameter combination. An agent can tell exactly what comes back for cert-only, geography-only, and combined calls without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps each parameter combination to its output mode, states the default (latest survey year) and that branches/rankings are paged via offset. It names fdic_dataframe_query as the consumer of staged dataframes, but does not point to a sibling for nearby questions (e.g. drill-down on an institution identified here).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_get_institution_financialsGet institution quarterly financialsARead-onlyIdempotentInspect
Get one institution's quarterly Call Report financials by CERT — balance sheet, income, returns, credit quality, and capital ratios — most recent quarter first, with its name, status, and holding company. Unsuffixed income and return metrics are single-quarter figures; _ytd metrics accumulate from January 1. Dollar amounts are in thousands. Quarterly data lands about seven weeks after quarter end; history reaches back to 1984.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | Yes | FDIC certificate number, from fdic_search_institutions. | |
| metrics | No | At most 1000 raw metric names (fdic_list_reference topic metrics). Deduplicated before querying the first 25; deferred_metrics holds the rest. Omit or pass [] for the default health set. | |
| to_date | No | Latest quarter to include, in the same forms as from_date. Omit for the latest published quarter. | |
| quarters | No | Most recent quarters to return; accepts 1–10000, executes at most 200 within from_date/to_date. effective_quarters reports the applied count. Continue with to_date before the oldest returned quarter. | |
| from_date | No | Earliest quarter to include: a quarter-end date (2025-03-31), the same without dashes (20250331), or a quarter label (2025Q1). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The quarters cap applied. |
| rows | No | Quarterly rows, most recent first. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Quarters returned. |
| notice | No | Guidance for an empty window, an inactive institution, or quarters left out by the cap. |
| truncated | No | True when more quarters were available than the quarters cap returned. |
| data_as_of | No | When FDIC last rebuilt the financials index (ISO timestamp). |
| institution | No | Institution identity, status, holding company, and succession; fdic_search_institutions with certs returns the full record (charter class, regulator, county, dates, latest assets). |
| deferred_metrics | No | Metrics not queried; pass these as metrics in a new call. |
| selection_notice | No | Execution caps and how to retrieve deferred selections. |
| processed_metrics | No | Metrics actually queried, including automatic panel sort/filter metrics. |
| effective_quarters | No | Quarters execution cap applied, at most 200. |
| metric_definitions | No | Field, unit, and basis of each metric in rows. |
| quarters_available | No | Reported quarters in the requested window, before the quarters cap. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), yet the description adds genuinely new behavioral context: a ~7-week publication lag after quarter end, history back to 1984, most-recent-quarter-first ordering, dollar amounts in thousands, and the unsuffixed vs _ytd accumulation rule. That is strong value-add; only paging/continuation mechanics are absent from the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads the core purpose (what is returned, keyed by CERT) before units, timing, and history caveats. Every clause carries information, though the packing of four distinct facts into one block is slightly heavy for parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (5 params, 49-value metric enum, large history), but the description supplies the non-obvious facts an agent needs — units, YTD vs quarterly semantics, sort order, data latency, and history depth — while an output schema exists to cover return values and annotations cover safety. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the baseline is 3, but the description adds real meaning beyond the schema: it explains that unsuffixed income/return metrics are single-quarter while _ytd metrics accumulate from January 1, and that dollar figures are in thousands. These semantics are not conveyed by the bare enum list, which only names metrics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one institution's quarterly Call Report financials by CERT') and enumerates the content domains (balance sheet, income, returns, credit quality, capital ratios). The 'one institution' scope distinguishes it from multi-institution siblings like fdic_query_financials and fdic_compare_peers without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'one institution's ... by CERT' implies the single-institution use case, and the schema points at fdic_search_institutions for obtaining the CERT. However, the description never explicitly says when to prefer this over fdic_query_financials or fdic_compare_peers, nor states prerequisites or exclusions, so usage is inferred rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_get_institution_historyGet institution structure-change historyARead-onlyIdempotentInspect
Get one institution's structure-change history by CERT, newest first: the mergers it absorbed or was absorbed in, failures and assisted takeovers, branch purchases and sales, renames, relocations, charter and regulator changes, openings, and closings, each with its effective date, FDIC change code, the institution's role, and the other institution's CERT and name. A merger or failure appears once, from whichever side the CERT was on. Branch-level openings, closings, sales, and relocations are left out unless event_types includes branch. Merger records start in 1969 and failure records in 1970.
| Name | Required | Description | Default |
|---|---|---|---|
| cert | Yes | FDIC certificate number, from fdic_search_institutions. | |
| limit | No | Events per page, at least 1. The whole matching history is read, so any limit is served; use next_offset to continue. | |
| offset | No | Events to skip; pass next_offset from the previous page. | |
| to_date | No | Latest effective date to include (YYYY-MM-DD). | |
| from_date | No | Earliest effective date to include (YYYY-MM-DD, e.g. 2008-01-01). | |
| event_types | No | Nonempty selection of at most 1000 event types, deduplicated: merger, failure_or_assistance, branch_purchase, name_change, relocation, charter_change, opening, closing, other (a change code this server has not classified), branch (branch-level openings, closings, sales, and relocations). Omit for every type but branch; echoed as event_types_filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit applied to this page. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Events returned on this page. |
| total | No | Events matching the filters across all pages. |
| events | No | Events on this page, newest first. |
| notice | No | Guidance when nothing matched, the page is past the end, or more pages remain. |
| truncated | No | True when more events remain beyond this page. |
| data_as_of | No | When FDIC last rebuilt the history index (ISO timestamp). |
| institution | No | The institution record for the CERT. |
| next_offset | No | Offset of the next page; present when more events remain. |
| event_types_filter | No | The event types searched, after the default and deduplication. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe/read-only, idempotent, open-world profile, and the description adds substantive behavior on top: newest-first ordering, the de-duplication rule that a merger or failure appears once from whichever side the CERT was on, branch-level suppression, and historical coverage start dates. These are exactly the semantics an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with verb, key, and ordering, and every subsequent clause carries non-redundant information (dedup rule, branch exclusion, historical limits). The first sentence is dense and long, but no sentence is disposable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return shape need not be described; the description instead covers ordering, de-duplication, event-type filtering effects, and temporal coverage. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining that event_types controls the otherwise-hidden branch-level records and by clarifying the from/to scope as coverage windows rather than mere filters. It doesn't add format detail, but here the schema already fully documents the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause names a specific verb (get), a scoped resource (one institution's structure-change history, keyed by CERT) and an ordering (newest first). It then enumerates the event families covered, so the agent can tell this apart from fdic_search_failures or fdic_search_institutions without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: branch-level events are excluded unless event_types includes branch, and merger/failure coverage windows (1969/1970) are stated. It never explicitly routes to a sibling (e.g., when to use fdic_search_failures instead), so it stops short of the exclusion-and-alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_list_referenceList FDIC reference vocabularyARead-onlyIdempotentInspect
List the vocabulary the other fdic_ tools accept and return: every financial metric name with its FDIC field, unit, and basis (single quarter, year-to-date, or point in time), bank charter classes, failure resolution methods, the structure-change codes fdic_get_institution_history reports and the event type each maps to, insurance funds, the asset bands fdic_compare_peers uses, and the years each dataset covers. Served from built-in tables; no request to FDIC.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which table to list: metrics (names, FDIC fields, units, basis, default set), bank_classes, failure_methods, change_codes (FDIC structure-change codes with their event type and level), insurance_funds, peer_asset_bands, or coverage (years and cadence of each dataset). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| topic | No | The topic listed. |
| entries | No | Every entry of the topic, in table order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and closed-world, so the safety profile is covered. The description adds real context beyond them: 'Served from built-in tables; no request to FDIC' tells the agent the call is offline, instant, and cannot fail on network or auth. Return content is covered by the output schema, so nothing further is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One long but well-structured sentence that front-loads the purpose, then walks the topics in the same order as the enum, ending with the operational reassurance. Dense and informative rather than padded, though the section of the sentence duplicated by the enum description could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single enum parameter, full schema coverage, an output schema, and complete annotations, the description supplies everything an agent still needs: what each topic yields, which sibling tools the tables feed, and that no FDIC request is made. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum is fully described, so baseline is 3; the description goes further by spelling out the payload of each topic (e.g., change_codes carry the FDIC code, its event type, and level; coverage gives years and cadence). It is slightly redundant with the schema's enum description, which limits it to a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb plus resource ('list the vocabulary') and enumerates exactly what is returned: metric names with FDIC field/unit/basis, bank charter classes, failure methods, structure-change codes, insurance funds, peer asset bands, and dataset coverage. This clearly distinguishes it from every sibling, which are data-query tools that consume this vocabulary rather than expose it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames the tool as the reference for 'the other fdic_ tools' and names the siblings that depend on specific tables (fdic_get_institution_history for change codes, fdic_compare_peers for asset bands), which implies calling it when you need valid field names or enum values. It stops short of an explicit 'use this before querying / do not use for financial data' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_query_financialsQuery a multi-bank financial panelARead-onlyIdempotentInspect
Pull a multi-institution, multi-quarter Call Report panel — one row per institution per quarter — filtered by CERTs, headquarters state, asset range, and thresholds on any catalog metric. Use it to screen (every bank in a state with a noncurrent-loan rate above 3%) or to build a trend panel for SQL. Returns one page of the panel sorted as requested, continued with offset; at offset 0 a panel larger than the page is also staged as a dataframe for fdic_dataframe_query. With no dates it covers the latest published quarter only.
| Name | Required | Description | Default |
|---|---|---|---|
| certs | No | Nonempty selection, at most 1000 raw CERTs. Deduplicated before querying the first 100; deferred_certs holds the rest for another call. Omit to screen every filer. | |
| limit | No | Positive count of rows per page, sliced from the already-fetched panel at offset. At offset 0 a larger panel is also staged whole as a dataframe when this deployment stages dataframes. | |
| state | No | Headquarters state: two-letter code in any case or full name. Branch locations are in fdic_get_deposits. | |
| offset | No | Fetched panel rows to skip; pass next_offset from the previous page. Only offset 0 stages a dataframe. | |
| metrics | No | At most 1000 raw metric names. Deduplicated before querying the first 30; deferred_metrics holds the rest. Sort/filter metrics are always added. Omit or pass [] for the default health set. | |
| sort_by | No | Metric to order the pages (and the staged table) by; added to metrics when absent. Omit to order by newest quarter, then CERT. | |
| to_date | No | Latest quarter, in the same forms as from_date. Omit for the latest published quarter; beside from_date, a later quarter is cut back to it. | |
| from_date | No | Earliest quarter: a quarter-end date (2024-03-31), the same without dashes, or a quarter label (2024Q1). Omit for to_date alone. | |
| max_assets | No | Maximum total assets in that quarter, thousands of US dollars; applied to each quarter's report. | |
| min_assets | No | Minimum total assets in that quarter, thousands of US dollars (1000000 = $1 billion); applied to each quarter's report. | |
| sort_order | No | desc (default, largest first) or asc; applies to sort_by. Rows without a value sort last. | desc |
| metric_filters | No | Up to 5 metric thresholds, all of which a row must meet. A threshold on a capital ratio or insured_deposit_share skips filers that did not report it. Each filtered metric is added to metrics. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit applied to this page. |
| rows | No | One page of the fetched panel in the requested order, starting at offset. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Rows on this page. |
| notice | No | Guidance for zero matches, more pages remaining, a page past the end, a capped panel, or where the full panel is staged. |
| dataset | No | The staged full panel; present only at offset 0 when the panel exceeded limit and this deployment staged it as a dataframe. |
| truncated | No | True when fetched rows remain past this page (next_offset is set). |
| data_as_of | No | When FDIC last rebuilt the financials index (ISO timestamp). |
| next_offset | No | Offset of the next page; present while fetched rows remain past this page. |
| report_dates | No | Quarter range as applied. |
| rows_fetched | No | Rows fetched into the panel. |
| panel_row_cap | No | This server's row cap for one panel. |
| deferred_certs | No | CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call. |
| total_matching | No | Institution-quarter rows at FDIC matching the filters. |
| panel_truncated | No | True when total_matching exceeded the panel row cap. Whole quarters are kept newest first, so a truncated panel is missing its oldest quarters — or, when the newest quarter alone exceeds the cap, the higher-numbered CERTs of that quarter. |
| processed_certs | No | Deduplicated CERT selection actually queried; missing CERTs are a subset of these. |
| deferred_metrics | No | Metrics not queried; pass these as metrics in a new call. |
| selection_notice | No | Execution caps and how to retrieve deferred selections. |
| processed_metrics | No | Metrics actually queried, including automatic panel sort/filter metrics. |
| metric_definitions | No | Field, unit, and basis of each metric in rows. |
| report_dates_defaulted | No | True when neither from_date nor to_date was given, so only the latest published quarter was covered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only/idempotent/open-world, but the description adds non-obvious behavior: default date scope is latest quarter only, offset 0 stages a full dataframe, and results are paged. It doesn't detail truncation/deduplication of certs/metrics (that lives in the schema) or error behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences front-loaded with the core action, then use cases, then pagination/defaults. Every clause carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 params, an output schema, and rich annotations, the description covers scope, defaults, pagination, and the dataframe-staging side effect. It leaves some detail (deferred_certs/metrics truncation, sort tie-breaking) to the schema, which is acceptable given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds value by recasting params in terms of intent — CERTs, HQ state, asset range, metric thresholds — and explaining the date default. The schema still carries the unit and format detail, so a 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pull a multi-institution, multi-quarter Call Report panel'), defines the row grain (one row per institution per quarter), and enumerates the filters. This clearly distinguishes it from fdic_get_institution_financials (single bank) and fdic_compare_peers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete use cases ('screen every bank in a state with a noncurrent-loan rate above 3%' vs 'build a trend panel for SQL') and describes pagination continuation. It also names fdic_dataframe_query as the downstream consumer of the staged dataframe, which routes the agent beyond this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_search_failuresSearch FDIC bank failuresARead-onlyIdempotentInspect
Search FDIC-insured bank failures and assistance transactions since 1934 by name, CERT, headquarters state, failure date range, resolution method, or size. Returns each event with failure date, acquirer, total assets and deposits, and the FDIC's estimated loss to the insurance fund, plus totals over every matching event; group_by adds counts and losses per year, state, method, or fund. Searches failures only unless resolution is set to assistance or all. Dollar amounts are in thousands.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Failed institution name, up to 100 characters; every word of two or more letters or digits must appear in the name FDIC recorded (e.g. "silicon valley"). Case-insensitive. A standalone NA is ignored beside other words, so it also finds names recorded with N.A. | |
| sort | No | date_desc (newest first, default), date_asc, loss_desc (largest estimated loss first), or assets_desc. | date_desc |
| certs | No | Nonempty selection of at most 1000 raw CERTs; deduplicated before querying the first 50. deferred_certs holds the rest for another call. Most events before 1977, and every one before 1970, carry no CERT. | |
| limit | No | Events per page; accepts 1–10000, executes at most 200. effective_limit reports the applied count; use next_offset to continue. | |
| state | No | Failed institution's headquarters state: two-letter code in any case or full name. | |
| offset | No | Events to skip (0–100,000); pass next_offset from the previous page. | |
| methods | No | How each event was resolved: PA purchase and assumption of all deposits, PI P&A of insured deposits only, P&A P&A with deposit scope undetermined, IDT insured deposit transfer, ABT asset-backed transfer, PO payout, DINB payout through a Deposit Insurance National Bank, A/A assistance transaction, REP reprivatization, MGR FSLIC management takeover, OBAM undocumented assistance code. | |
| to_date | No | Latest failure date to include (YYYY-MM-DD). | |
| group_by | No | Add counts, assets, deposits, and estimated losses per year, state, method, or insurance_fund over every matching event. | |
| from_date | No | Earliest failure date to include (YYYY-MM-DD, e.g. 2023-03-10). | |
| min_assets | No | Minimum total assets at the last report before failure, in thousands of US dollars. | |
| resolution | No | failure (default), assistance (open-bank assistance and similar transactions), or all. Echoed as resolution_filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit applied to this page. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Events returned on this page. |
| total | No | Matching events across all pages. |
| groups | No | Present with group_by. Years run ascending with empty years filled in; other keys by count, largest first. |
| notice | No | Guidance when nothing matched, the page is past the end, or more pages remain. |
| summary | No | Totals over every matching event, not just this page. |
| failures | No | Matching events for this page. |
| truncated | No | True when more events remain beyond this page. |
| data_as_of | No | When FDIC last rebuilt the failures index (ISO timestamp). |
| next_offset | No | Offset of the next page; present when more events remain. |
| deferred_certs | No | CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call. |
| effective_limit | No | Page size applied, at most 200. |
| processed_certs | No | Deduplicated CERT selection actually queried; missing CERTs are a subset of these. |
| selection_notice | No | Execution caps and how to retrieve deferred selections. |
| resolution_filter | No | The resolution filter applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, so the safety profile is covered. The description adds real value beyond that: what is returned (failure date, acquirer, assets, deposits, estimated loss), that totals are included over every match, what group_by aggregates, and that dollar amounts are in thousands. It omits pagination/limit behavior and the CERT-less pre-1977 caveat, which live only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with scope and filters before return shape and the resolution caveat. It is dense but not padded; the long opening sentence could be split for readability, and "plus totals over every matching event" is slightly redundant with the group_by sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering return shape and annotations covering safety, the description supplies the remaining essentials: time scope, default resolution behavior, aggregation semantics, and unit convention. The only material gap is paging behavior and the pre-1977 CERT limitation, both of which are documented in the schema instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters thoroughly, including units, enums, and defaults. The description restates the filter dimensions and the thousands unit but adds no syntax or edge-case detail beyond the schema, which is the expected baseline for fully documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search FDIC-insured bank failures and assistance transactions") and names the exact filter dimensions available. The scope phrase "since 1934" and the failures-vs-assistance distinction separate it cleanly from siblings like fdic_search_institutions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit behavioral routing: "Searches failures only unless resolution is set to assistance or all," which tells the agent how to widen scope. It does not name an alternative sibling tool for the institution-search case, so the when-to-use-this-vs-that guidance is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fdic_search_institutionsSearch FDIC-insured institutionsARead-onlyIdempotentInspect
Find FDIC-insured banks and savings institutions by name, CERT, location, size, charter class, or holding company — including closed, merged, and failed institutions. Name matching is fuzzy, case-insensitive, and also matches former and trade names (a result says which it matched); every word must match. Returns institution records keyed by CERT, the FDIC certificate number every other fdic_ tool takes, with active status, successor CERT for merged or failed institutions, holding company, and latest reported assets and deposits. Credit unions are insured by the NCUA and are not in this data.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Headquarters city as FDIC spells it (e.g. Seattle, St. Louis), up to 50 characters; matched exactly, as given or in title case, with a hyphen, apostrophe, or space between words also tried the other ways FDIC records it (Winston-Salem finds Winston Salem, Coeur d'Alene finds Coeur D Alene). | |
| name | No | Institution name to match, up to 100 characters — current, former, or trade name, case-insensitive, every word required (e.g. "silicon valley"). Punctuation other than & ' . , - is ignored, and so is a standalone N.A. or NA, which then also matches "National Association". | |
| sort | No | relevance (active institutions whose current name holds every word of name first, then every other match, each by match score; default when name is given — without name it falls back to assets_desc), assets_desc (largest first; the default otherwise), or name (A–Z). | |
| certs | No | Nonempty CERT selection, at most 1000 raw items. Deduplicated first; the first 50 are queried and the rest returned as deferred_certs. missing_certs covers only processed_certs. | |
| limit | No | Institutions per page; accepts 1–10000, executes at most 100. effective_limit reports the applied count; use next_offset to continue. | |
| state | No | Headquarters state: two-letter code in any case (wa) or full name (Washington); DC and territories accepted. | |
| offset | No | Matches to skip (0–100,000); pass next_offset from the previous page. | |
| status | No | active, inactive (merged, failed, or closed), or any. Default: any when name or certs is given, otherwise active. The applied value is echoed as status_filter. | |
| max_assets | No | Maximum latest reported total assets, in thousands of US dollars. | |
| min_assets | No | Minimum latest reported total assets, in thousands of US dollars (1000000 = $1 billion). | |
| bank_classes | No | Charter classes to include: N national bank, NM state nonmember bank, SM state member bank, SB federal savings bank, SI state savings bank, SL state savings and loan, OI insured branch of a foreign bank, NC noninsured non-deposit trust company. | |
| holding_company_rssd | No | Holding company RSSD ID from any result's holding_company.rssd; lists the institutions under that top holder. With status any, former subsidiaries are included under the holder they had at closing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit applied to this page. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Institutions returned on this page. |
| total | No | Institutions matching the filters across all pages. |
| notice | No | Guidance when nothing matched, the page is past the end, or more pages remain. |
| truncated | No | True when more matches remain beyond this page. |
| data_as_of | No | When FDIC last rebuilt the institutions index (ISO timestamp). |
| next_offset | No | Offset of the next page; present when more matches remain. |
| institutions | No | Matching institutions for this page. |
| missing_certs | No | Requested CERTs that match no institution record. |
| status_filter | No | The status filter applied. |
| deferred_certs | No | CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call. |
| effective_limit | No | Page size applied, at most 100. |
| processed_certs | No | Deduplicated CERT selection actually queried; missing CERTs are a subset of these. |
| selection_notice | No | Execution caps and how to retrieve deferred selections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/idempotent/open-world; the description adds substantial behavior the agent could not infer: fuzzy, case-insensitive, word-required name matching, matching against former and trade names with the result indicating which matched, and successor CERT for merged/failed institutions. That is exactly the kind of disclosure that prevents wrong calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, then matching semantics, then return shape, then the exclusion caveat. No filler, and each sentence carries distinct information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not enumerate return fields, yet it briefly orients the agent (CERT key, status, successor CERT, assets/deposits). Combined with annotations covering the safety profile and a fully documented schema, nothing required to select or invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds cross-tool semantics — that records are keyed by CERT and that this CERT is the identifier every other fdic_ tool accepts — plus reinforces the name-matching semantics that govern the name parameter. The remaining parameters (sort, limit, offset, asset bounds) are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (FDIC-insured banks and savings institutions) plus the searchable facets — name, CERT, location, size, charter class, holding company. It also explicitly scopes what is excluded (credit unions under NCUA), which cleanly separates it from siblings like fdic_search_failures and fdic_get_institution_financials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this is the right tool — broad institution lookup across active and closed/merged/failed entities — and notes that CERT is the join key every other fdic_ tool consumes, which helps chaining. It stops short of naming an explicit alternative (e.g., use fdic_search_failures for failure-event data), so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Changed
fdic_dataframe_query1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: DataCanvas is not configured in this deployment. `missing_table`: A table the SQL names is not staged — a df_ name that expired, was dropped to make room for newer dataframes, or is mistyped, or any other table name. `invalid_sql`: A SELECT fails to parse or prepare (syntax error, unknown column or function, bad expression). `sql_execution_error`: SELECT prepared but failed on the data. `non_select_statement`: The statement is not a SELECT, or cannot be parsed as one. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading, external-data, engine-setting, or dynamic SQL function the read-only gate refuses. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist (scans of staged tables, filters, joins, aggregates, set operations, sorts, window functions, CTEs, unnest). `system_catalog_access`: The SQL references a system catalog: information_schema, pg_catalog, sqlite_master, or a duckdb_*() function. `register_as_clash`: register_as names a dataframe that is already staged. `register_as_too_large`: The register_as result holds more rows than the staging budget (1,000,000 rows) allows on its own. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: DataCanvas is not configured in this deployment. `missing_table`: A table the SQL names is not staged — a df_ name that expired, was dropped to make room for newer dataframes, or is mistyped, or any other table name. `invalid_sql`: A SELECT fails to parse or prepare (syntax error, unknown column or function, bad expression). `sql_execution_error`: SELECT prepared but failed on the data. `non_select_statement`: The statement is not a SELECT, or cannot be parsed as one. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading, external-data, engine-setting, or dynamic SQL function the read-only gate refuses, or names current_schema unqualified, which DuckDB reads as the current_schema() function. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist (scans of staged tables, filters, joins, aggregates, set operations, sorts, window functions, CTEs, unnest). `system_catalog_access`: The SQL references a system catalog: information_schema, pg_catalog, sqlite_master, or a duckdb_*() function. `register_as_clash`: register_as names a dataframe that is already staged. `register_as_too_large`: The register_as result holds more rows than the staging budget (1,000,000 rows) allows on its own. Other values are possible when a failure originates below the handler."
- Changed
fdic_get_deposits11 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Positive inline preview count, bounded by the already-fetched branches or ranking. A larger set is staged whole as a dataframe when this deployment stages dataframes."New value: +"Positive count of rows per page, sliced from the already-fetched branches or ranking at offset. At offset 0 a larger set is also staged whole as a dataframe when this deployment stages dataframes." - changed
Input schema / properties / msa_code / descriptionPrevious value: -"Five-digit CBSA (metropolitan area) code, 10180–49740; branch rows from a state-level call carry msa_code values to reuse. Non-metropolitan branches have no code."New value: +"Five-digit CBSA (metropolitan area) code, 10180–49740; branch rows (returned when cert is given) carry msa_code values to reuse. Non-metropolitan branches have no code." - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Branches or ranked institutions to skip; pass next_offset from the previous page. Only offset 0 stages a dataframe.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / branches / descriptionPrevious value: -"Institution modes: branches in scope, main office first (preview)."New value: +"Institution modes: one page of the branches in scope by branch number (main office first), starting at offset." - changed
Output schema / properties / cap / descriptionPrevious value: -"The limit applied to the preview."New value: +"The limit applied to this page." - changed
Output schema / properties / dataset / descriptionPrevious value: -"The staged full collection; present only when it exceeded the preview and this deployment staged it as a dataframe."New value: +"The staged full collection; present only at offset 0 when it exceeded limit and this deployment staged it as a dataframe." - changed
Output schema / properties / institutions / descriptionPrevious value: -"Market mode: institutions ranked by deposits (preview)."New value: +"Market mode: one page of the institutions ranked by deposits (ties by CERT), starting at offset." - added
Output schema / properties / next_offsetAdded value: +{ + "description": "Offset of the next page; present while rows remain past this page.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when nothing matched, or where the full collection is staged."New value: +"Guidance when nothing matched, more pages remain, the page is past the end, or where the full collection is staged." - changed
Output schema / properties / shown / descriptionPrevious value: -"Rows in the preview."New value: +"Rows on this page." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the preview holds fewer rows than total_rows."New value: +"True when rows remain past this page (next_offset is set)."
- Added
fdic_get_institution_history - Changed
fdic_list_reference6 fields changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Which table to list: metrics (names, FDIC fields, units, basis, default set), bank_classes, failure_methods, insurance_funds, peer_asset_bands, or coverage (years and cadence of each dataset)."New value: +"Which table to list: metrics (names, FDIC fields, units, basis, default set), bank_classes, failure_methods, change_codes (FDIC structure-change codes with their event type and level), insurance_funds, peer_asset_bands, or coverage (years and cadence of each dataset)." - changed
Input schema / properties / topic / enumPrevious value: -[ - "metrics", - "bank_classes", - "failure_methods", - "insurance_funds", - "peer_asset_bands", - "coverage" -]New value: +[ + "metrics", + "bank_classes", + "failure_methods", + "change_codes", + "insurance_funds", + "peer_asset_bands", + "coverage" +] - changed
Output schema / properties / entries / items / properties / code / descriptionPrevious value: -"The value to pass or read back: metric name, class code, method code, fund, band, or dataset."New value: +"The value to pass or read back: metric name, class code, method code, change code, fund, band, or dataset." - added
Output schema / properties / entries / items / properties / event_typeAdded value: +{ + "description": "Event type fdic_get_institution_history gives an institution-level row with this code; every branch-level row is branch (change_codes).", + "enum": [ + "merger", + "failure_or_assistance", + "branch_purchase", + "name_change", + "relocation", + "charter_change", + "opening", + "closing", + "other", + "branch" + ], + "type": "string" +} - added
Output schema / properties / entries / items / properties / levelAdded value: +{ + "description": "Whether FDIC records the code on institution-level rows, branch-level rows, or both (change_codes).", + "enum": [ + "institution", + "branch", + "both" + ], + "type": "string" +} - changed
Output schema / properties / topic / enumPrevious value: -[ - "metrics", - "bank_classes", - "failure_methods", - "insurance_funds", - "peer_asset_bands", - "coverage" -]New value: +[ + "metrics", + "bank_classes", + "failure_methods", + "change_codes", + "insurance_funds", + "peer_asset_bands", + "coverage" +]
- Changed
fdic_query_financials10 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Positive inline preview count, bounded by the already-fetched panel. A larger panel is staged whole as a dataframe when this deployment stages dataframes."New value: +"Positive count of rows per page, sliced from the already-fetched panel at offset. At offset 0 a larger panel is also staged whole as a dataframe when this deployment stages dataframes." - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Fetched panel rows to skip; pass next_offset from the previous page. Only offset 0 stages a dataframe.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Metric to order the preview (and the staged table) by; added to metrics when absent. Omit to order by newest quarter, then CERT."New value: +"Metric to order the pages (and the staged table) by; added to metrics when absent. Omit to order by newest quarter, then CERT." - changed
Output schema / properties / cap / descriptionPrevious value: -"The limit applied to the preview."New value: +"The limit applied to this page." - changed
Output schema / properties / dataset / descriptionPrevious value: -"The staged full panel; present only when the panel exceeded the preview and this deployment staged it as a dataframe."New value: +"The staged full panel; present only at offset 0 when the panel exceeded limit and this deployment staged it as a dataframe." - added
Output schema / properties / next_offsetAdded value: +{ + "description": "Offset of the next page; present while fetched rows remain past this page.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance for zero matches, a capped panel, or where the full panel is staged."New value: +"Guidance for zero matches, more pages remaining, a page past the end, a capped panel, or where the full panel is staged." - changed
Output schema / properties / rows / descriptionPrevious value: -"Inline preview of the panel, sorted as requested."New value: +"One page of the fetched panel in the requested order, starting at offset." - changed
Output schema / properties / shown / descriptionPrevious value: -"Rows in the preview."New value: +"Rows on this page." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the preview holds fewer rows than were fetched."New value: +"True when fetched rows remain past this page (next_offset is set)."
- Changed
fdic_search_failures2 fields changed- changed
Input schema / properties / certs / descriptionPrevious value: -"Nonempty selection of at most 1000 raw CERTs; deduplicated before querying the first 50. deferred_certs holds the rest for another call. Events before 1977 carry no CERT."New value: +"Nonempty selection of at most 1000 raw CERTs; deduplicated before querying the first 50. deferred_certs holds the rest for another call. Most events before 1977, and every one before 1970, carry no CERT." - changed
Output schema / properties / failures / items / properties / cert / descriptionPrevious value: -"CERT of the failed institution; absent before 1977."New value: +"CERT of the failed institution; absent for most events before 1977."
7 tool updates
- Changed
fdic_compare_peers11 fields changed- changed
Input schema / properties / metrics / descriptionPrevious value: -"Up to 20 metric names (fdic_list_reference topic metrics). Omit for the default health set."New value: +"At most 1000 raw metric names. Deduplicated before querying the first 20; deferred_metrics holds the rest. Omit or pass [] for the default health set." - changed
Input schema / properties / metrics / maxItemsPrevious value: -20New value: +1000 - changed
Input schema / properties / peer_certs / descriptionPrevious value: -"An explicit peer list of up to 200 CERTs, in place of the band and state peer group — pass it without peer_asset_band and peer_state. Fewer than five peers still computes, with a notice."New value: +"Nonempty peer selection, at most 1000 raw CERTs, replacing band/state filters. Deduplicated before querying the first 200; deferred_certs holds the rest and marks the cohort incomplete. Fewer than five peers still computes, with a notice." - changed
Input schema / properties / peer_certs / maxItemsPrevious value: -200New value: +1000 - added
Input schema / properties / peer_certs / minItemsAdded value: +1 - added
Output schema / properties / deferred_certsAdded value: +{ + "description": "CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call.", + "items": { + "description": "Deferred CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / deferred_metricsAdded value: +{ + "description": "Metrics not queried; pass these as metrics in a new call.", + "items": { + "description": "Deferred metric.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / peer_cohort_incompleteAdded value: +{ + "description": "True when deferred peer CERTs were excluded from every statistic; rerun with deferred_certs as peer_certs or use a smaller cohort.", + "type": "boolean" +} - added
Output schema / properties / processed_certsAdded value: +{ + "description": "Deduplicated CERT selection actually queried; missing CERTs are a subset of these.", + "items": { + "description": "Processed CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / processed_metricsAdded value: +{ + "description": "Metrics actually queried, including automatic panel sort/filter metrics.", + "items": { + "description": "Processed metric.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / selection_noticeAdded value: +{ + "description": "Execution caps and how to retrieve deferred selections.", + "type": "string" +}
- Changed
fdic_dataframe_query12 fields changed- changed
Input schema / properties / preview / descriptionPrevious value: -"Rows to return inline (0–10,000); defaults to row_limit, and a value above row_limit is treated as row_limit. Set it low when register_as keeps the full result."New value: +"Rows to return inline; defaults to the effective row_limit and is clamped to it. Set it low when register_as keeps the full result." - changed
Input schema / properties / preview / maximumPrevious value: -10000New value: +9007199254740991 - changed
Input schema / properties / row_limit / descriptionPrevious value: -"Hard cap on rows materialized (1–10,000). A query matching more stops here and row_count_capped comes back true; use register_as to keep the whole result."New value: +"Requested materialization cap (default 1,000; hard input ceiling 1,000,000), clamped to the execution cap of 10,000. Without register_as, row_count_capped reports more matches; continue with ordered LIMIT/OFFSET pages. register_as keeps the whole result within the staging budget." - changed
Input schema / properties / row_limit / maximumPrevious value: -10000New value: +1000000 - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "columns", - "row_count", - "row_count_capped", - "rows" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "requested_row_limit", + "effective_row_limit", + "effective_preview", + "columns", + "row_count", + "row_count_capped", + "rows" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / effective_previewAdded value: +{ + "description": "Inline row cap after clamping preview to the effective row_limit.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / effective_row_limitAdded value: +{ + "description": "Effective row_limit, at most 10,000.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: DataCanvas is not configured in this deployment. `missing_table`: A table the SQL names is not staged — a df_ name that expired, was dropped to make room for newer dataframes, or is mistyped, or any other table name. `invalid_sql`: A SELECT fails to parse or prepare (syntax error, unknown column or function, bad expression). `sql_execution_error`: SELECT prepared but failed on the data. `non_select_statement`: The statement is not a SELECT, or cannot be parsed as one. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading or external-data table function such as read_csv or read_parquet. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist (scans of staged tables, filters, joins, aggregates, set operations, sorts, window functions, CTEs, unnest). `system_catalog_access`: The SQL references a system catalog: information_schema, pg_catalog, sqlite_master, or a duckdb_*() function. `register_as_clash`: register_as names a dataframe that is already staged. `register_as_too_large`: The register_as result holds more rows than the staging budget (1,000,000 rows) allows on its own. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_unavailable`: DataCanvas is not configured in this deployment. `missing_table`: A table the SQL names is not staged — a df_ name that expired, was dropped to make room for newer dataframes, or is mistyped, or any other table name. `invalid_sql`: A SELECT fails to parse or prepare (syntax error, unknown column or function, bad expression). `sql_execution_error`: SELECT prepared but failed on the data. `non_select_statement`: The statement is not a SELECT, or cannot be parsed as one. `multi_statement`: The SQL holds more than one statement. `denied_function`: The SQL calls a file-reading, external-data, engine-setting, or dynamic SQL function the read-only gate refuses. `plan_operator_not_allowed`: The query plan uses an operator outside the read-only allowlist (scans of staged tables, filters, joins, aggregates, set operations, sorts, window functions, CTEs, unnest). `system_catalog_access`: The SQL references a system catalog: information_schema, pg_catalog, sqlite_master, or a duckdb_*() function. `register_as_clash`: register_as names a dataframe that is already staged. `register_as_too_large`: The register_as result holds more rows than the staging budget (1,000,000 rows) allows on its own. Other values are possible when a failure originates below the handler." - added
Output schema / properties / requested_previewAdded value: +{ + "description": "Explicit preview before clamping; absent when omitted.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / requested_row_limitAdded value: +{ + "description": "Requested row_limit before the execution cap.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / row_count / descriptionPrevious value: -"Rows the query produced, up to row_limit; with register_as, the exact count of the new dataframe."New value: +"Rows the query produced, up to effective_row_limit; with register_as, the exact count of the new dataframe." - changed
Output schema / properties / row_count_capped / descriptionPrevious value: -"True when the query matched more rows than row_limit, so row_count is that cap."New value: +"True when the query matched more rows than effective_row_limit, so row_count is that cap."
- Changed
fdic_get_deposits2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Branches or ranked institutions returned inline (1–200). A larger set is also staged whole as a dataframe when this deployment stages dataframes."New value: +"Positive inline preview count, bounded by the already-fetched branches or ranking. A larger set is staged whole as a dataframe when this deployment stages dataframes." - changed
Input schema / properties / limit / maximumPrevious value: -200New value: +9007199254740991
- Changed
fdic_get_institution_financials8 fields changed- changed
Input schema / properties / metrics / descriptionPrevious value: -"Up to 25 metric names (fdic_list_reference topic metrics). Omit for the default health set: assets, deposits, uninsured deposits, equity, net income, ROA, ROE, net interest margin, efficiency, noncurrent-loan and charge-off rates, loans to deposits, and capital ratios."New value: +"At most 1000 raw metric names (fdic_list_reference topic metrics). Deduplicated before querying the first 25; deferred_metrics holds the rest. Omit or pass [] for the default health set." - changed
Input schema / properties / metrics / maxItemsPrevious value: -25New value: +1000 - changed
Input schema / properties / quarters / descriptionPrevious value: -"Most recent quarters to return (1–200; 200 covers the whole history back to 1984). Within from_date/to_date it caps the count."New value: +"Most recent quarters to return; accepts 1–10000, executes at most 200 within from_date/to_date. effective_quarters reports the applied count. Continue with to_date before the oldest returned quarter." - changed
Input schema / properties / quarters / maximumPrevious value: -200New value: +10000 - added
Output schema / properties / deferred_metricsAdded value: +{ + "description": "Metrics not queried; pass these as metrics in a new call.", + "items": { + "description": "Deferred metric.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / effective_quartersAdded value: +{ + "description": "Quarters execution cap applied, at most 200.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / processed_metricsAdded value: +{ + "description": "Metrics actually queried, including automatic panel sort/filter metrics.", + "items": { + "description": "Processed metric.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / selection_noticeAdded value: +{ + "description": "Execution caps and how to retrieve deferred selections.", + "type": "string" +}
- Changed
fdic_query_financials12 fields changed- changed
Input schema / properties / certs / descriptionPrevious value: -"Up to 100 CERTs to include; omit to screen every filer."New value: +"Nonempty selection, at most 1000 raw CERTs. Deduplicated before querying the first 100; deferred_certs holds the rest for another call. Omit to screen every filer." - changed
Input schema / properties / certs / maxItemsPrevious value: -100New value: +1000 - added
Input schema / properties / certs / minItemsAdded value: +1 - changed
Input schema / properties / limit / descriptionPrevious value: -"Rows returned inline (1–500). A panel with more rows is also staged whole as a dataframe when this deployment stages dataframes."New value: +"Positive inline preview count, bounded by the already-fetched panel. A larger panel is staged whole as a dataframe when this deployment stages dataframes." - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +9007199254740991 - changed
Input schema / properties / metrics / descriptionPrevious value: -"Up to 30 metric names (fdic_list_reference topic metrics) to return. Omit for the default health set."New value: +"At most 1000 raw metric names. Deduplicated before querying the first 30; deferred_metrics holds the rest. Sort/filter metrics are always added. Omit or pass [] for the default health set." - changed
Input schema / properties / metrics / maxItemsPrevious value: -30New value: +1000 - added
Output schema / properties / deferred_certsAdded value: +{ + "description": "CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call.", + "items": { + "description": "Deferred CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / deferred_metricsAdded value: +{ + "description": "Metrics not queried; pass these as metrics in a new call.", + "items": { + "description": "Deferred metric.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / processed_certsAdded value: +{ + "description": "Deduplicated CERT selection actually queried; missing CERTs are a subset of these.", + "items": { + "description": "Processed CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / processed_metricsAdded value: +{ + "description": "Metrics actually queried, including automatic panel sort/filter metrics.", + "items": { + "description": "Processed metric.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / selection_noticeAdded value: +{ + "description": "Execution caps and how to retrieve deferred selections.", + "type": "string" +}
- Changed
fdic_search_failures29 fields changed- changed
Input schema / properties / certs / descriptionPrevious value: -"Up to 50 CERTs of failed institutions. Events before 1977 carry no CERT."New value: +"Nonempty selection of at most 1000 raw CERTs; deduplicated before querying the first 50. deferred_certs holds the rest for another call. Events before 1977 carry no CERT." - changed
Input schema / properties / certs / maxItemsPrevious value: -50New value: +1000 - added
Input schema / properties / certs / minItemsAdded value: +1 - changed
Input schema / properties / limit / descriptionPrevious value: -"Events per page (1–200)."New value: +"Events per page; accepts 1–10000, executes at most 200. effective_limit reports the applied count; use next_offset to continue." - changed
Input schema / properties / limit / maximumPrevious value: -200New value: +10000 - changed
Input schema / properties / methods / maxItemsPrevious value: -11New value: +1000 - added
Input schema / properties / methods / minItemsAdded value: +1 - added
Output schema / properties / deferred_certsAdded value: +{ + "description": "CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call.", + "items": { + "description": "Deferred CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / effective_limitAdded value: +{ + "description": "Page size applied, at most 200.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / groups / items / properties / total_assets / descriptionPrevious value: -"Sum of total assets at the last report before failure, USD thousands; events with no recorded figure add nothing."New value: +"Sum of recorded assets, USD thousands; null when a nonempty set has no recorded amounts." - changed
Output schema / properties / groups / items / properties / total_assets / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / groups / items / properties / total_assets_missing_countAdded value: +{ + "description": "Events without assets; the sum covers only recorded values.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / groups / items / properties / total_deposits / descriptionPrevious value: -"Sum of total deposits, USD thousands."New value: +"Sum of recorded deposits, USD thousands; null when a nonempty set has no recorded amounts." - changed
Output schema / properties / groups / items / properties / total_deposits / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / groups / items / properties / total_deposits_missing_countAdded value: +{ + "description": "Events without deposits; the sum covers only recorded values.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / groups / items / requiredPrevious value: -[ - "key", - "count", - "total_assets", - "estimated_loss_total", - "estimated_loss_missing_count", - "total_deposits" -]New value: +[ + "key", + "count", + "total_assets", + "total_assets_missing_count", + "estimated_loss_total", + "estimated_loss_missing_count", + "total_deposits", + "total_deposits_missing_count" +] - added
Output schema / properties / processed_certsAdded value: +{ + "description": "Deduplicated CERT selection actually queried; missing CERTs are a subset of these.", + "items": { + "description": "Processed CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / selection_noticeAdded value: +{ + "description": "Execution caps and how to retrieve deferred selections.", + "type": "string" +} - changed
Output schema / properties / summary / properties / by_method / items / properties / total_assets / descriptionPrevious value: -"Sum of total assets at the last report before failure, USD thousands; events with no recorded figure add nothing."New value: +"Sum of recorded assets, USD thousands; null when a nonempty set has no recorded amounts." - changed
Output schema / properties / summary / properties / by_method / items / properties / total_assets / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / summary / properties / by_method / items / properties / total_assets_missing_countAdded value: +{ + "description": "Events without assets; the sum covers only recorded values.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / summary / properties / by_method / items / requiredPrevious value: -[ - "method", - "method_label", - "count", - "total_assets", - "estimated_loss_total", - "estimated_loss_missing_count" -]New value: +[ + "method", + "method_label", + "count", + "total_assets", + "total_assets_missing_count", + "estimated_loss_total", + "estimated_loss_missing_count" +] - changed
Output schema / properties / summary / properties / total_assets / descriptionPrevious value: -"Sum of total assets at the last report before failure, USD thousands; events with no recorded figure add nothing."New value: +"Sum of recorded assets, USD thousands; null when a nonempty set has no recorded amounts." - changed
Output schema / properties / summary / properties / total_assets / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / summary / properties / total_assets_missing_countAdded value: +{ + "description": "Events without assets; the sum covers only recorded values.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / summary / properties / total_deposits / descriptionPrevious value: -"Sum of total deposits, USD thousands."New value: +"Sum of recorded deposits, USD thousands; null when a nonempty set has no recorded amounts." - changed
Output schema / properties / summary / properties / total_deposits / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / summary / properties / total_deposits_missing_countAdded value: +{ + "description": "Events without deposits; the sum covers only recorded values.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / summary / requiredPrevious value: -[ - "count", - "total_assets", - "estimated_loss_total", - "estimated_loss_missing_count", - "total_deposits", - "by_method" -]New value: +[ + "count", + "total_assets", + "total_assets_missing_count", + "estimated_loss_total", + "estimated_loss_missing_count", + "total_deposits", + "total_deposits_missing_count", + "by_method" +]
- Changed
fdic_search_institutions11 fields changed- changed
Input schema / properties / bank_classes / maxItemsPrevious value: -8New value: +1000 - added
Input schema / properties / bank_classes / minItemsAdded value: +1 - changed
Input schema / properties / certs / descriptionPrevious value: -"Exact lookup by up to 50 CERTs; requested CERTs with no record come back in missing_certs."New value: +"Nonempty CERT selection, at most 1000 raw items. Deduplicated first; the first 50 are queried and the rest returned as deferred_certs. missing_certs covers only processed_certs." - changed
Input schema / properties / certs / maxItemsPrevious value: -50New value: +1000 - added
Input schema / properties / certs / minItemsAdded value: +1 - changed
Input schema / properties / limit / descriptionPrevious value: -"Institutions per page (1–100)."New value: +"Institutions per page; accepts 1–10000, executes at most 100. effective_limit reports the applied count; use next_offset to continue." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +10000 - added
Output schema / properties / deferred_certsAdded value: +{ + "description": "CERTs not queried; pass these as certs (peer_certs for comparisons) in a new call.", + "items": { + "description": "Deferred CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / effective_limitAdded value: +{ + "description": "Page size applied, at most 100.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / processed_certsAdded value: +{ + "description": "Deduplicated CERT selection actually queried; missing CERTs are a subset of these.", + "items": { + "description": "Processed CERT.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +} - added
Output schema / properties / selection_noticeAdded value: +{ + "description": "Execution caps and how to retrieve deferred selections.", + "type": "string" +}
9 tool updates
- First observed
fdic_compare_peers - First observed
fdic_dataframe_describe - First observed
fdic_dataframe_query - First observed
fdic_get_deposits - First observed
fdic_get_institution_financials - First observed
fdic_list_reference - First observed
fdic_query_financials - First observed
fdic_search_failures - First observed
fdic_search_institutions
Related MCP Connectors
Bank financials, branch locations, deposit data, and failure history from FDIC
Is this bank FDIC-insured, healthy and open? Bank profiles, ROA/ROE and failures from FDIC.
Community bank intelligence: FDIC financials, peer benchmarking, HMDA lending and CRA posture.
FDIC MCP — FDIC BankFind Suite API (free, no auth)
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables access to quarterly Call Report financials, bank health metrics, failed bank lists, branch maps, and supervisory designations for every US FDIC-insured bank, with no authentication required.452 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying US bank regulatory filings at line-item level: search institutions, retrieve labeled call reports, track specific items over time, compare banks, and inspect data coverage and code meanings, with amounts normalized to whole dollars.243 npmMIT

@pipeworx/fed-nicofficial
AlicenseNot gradedqualityBmaintenanceSearches U.S. banks and holding companies, and retrieves their ownership hierarchies and merger/acquisition histories from Federal Reserve NIC data.421 npmMIT- AlicenseAqualityCmaintenanceProvides programmatic access to the FDIC BankFind Suite API, enabling users to query public data on FDIC-insured financial institutions, bank failures, and branch locations. It supports advanced filtering for financial reports, demographics, and institutional history without requiring an API key.29140 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.