Skip to main content
Glama

KeyVex

get_annual_financial_disclosures

Read-only

Returns Form 278 (Public Financial Disclosure / Annual Financial Disclosure) filings — the annual snapshot members of Congress file each year showing assets, income sources, liabilities, transactions, gifts, outside positions, and (for spouse + dependent children) the same. The same filings are published free as news at https://keyvex.com/disclosures under 5 U.S.C. § 13107(c). SCOPE — v1 covers BOTH chambers: Senate (Senate eFD) and House (House Clerk). Filed by every senator and representative (and senior executive-branch officials, federal judges) by May 15 each year. Use this when the user asks about: a member's asset composition, outside income sources, board seats / outside positions, liabilities (mortgages, loans), or for news reporting on annual disclosures. CONTENT — when a filing's schedules were machine-parsed, content_parsed is true and the record carries structured assets (Schedule A) and liabilities arrays plus asset_count / liability_count. value_range / amount_range are the disclosed RANGES (e.g., '$50,001 - $100,000'), NOT point estimates — KeyVex does not collapse a range to a single number. SENATE rows carry the ranges verbatim. HOUSE rows are read from the House Clerk PDF by column position. On a House candidate or new-filer report, whose income prints in two columns ('current year to filing', 'preceding year'), income_range is empty — neither is the reporting period; report_url shows both. A row KeyVex could not read with confidence carries parse_unreliable: true, and for such rows report_url is authoritative. Net-worth roll-up is intentionally NOT provided (it would be a KeyVex-derived aggregate, not a disclosed value). When schedules are unavailable — Senate PAPER (scanned-image) filings, which carry no machine-readable text, or the occasional parse skip — content_parsed is false and coverage_note names the limitation; follow report_url to read the original. This honest coverage boundary is never a silent omission. Different from get_congressional_trades: PTRs are per-trade real-time notices (filed within 30-45 days), while Form 278 is the year-end balance-sheet snapshot. Combine both for the full activity + position view of a member. Report types: 'Annual' (yearly filing covering prior calendar year), 'New Filer' (initial disclosure on entering office), 'Termination' (final disclosure on leaving office), 'Combined' (annual+termination for filer who left mid-year), 'Amendment' (correction of a prior filing), 'Other' (rare).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax records to return (1-500). Default 50.
partyNoExact match on the record's party, where the party is the party the member held on the date of the record (a trade's transaction date, a disclosure's filing date); for a date outside the member's terms in office, the party of their nearest term (the last one before that date, or the first one after it). So party='Democrat' matches filings made while the filer was a Democrat. Empty on filings by candidates who never served.
sinceNoISO date (YYYY-MM-DD). Lower bound on the chosen sort_by field. Defaults to filtering by filing_date.
stateNoTwo-letter state code (e.g., 'CA', 'TX'). Exact match. Empty for candidate filings (the Senate eFD covers candidates too).
untilNoISO date (YYYY-MM-DD). Upper bound on the chosen sort_by field.
chamberNoFilter to one chamber ('senate' or 'house'). v1 covers both.
sort_byNoField to sort by. Default 'filing_date' (most recent filings first).
sort_orderNoSort direction. Default 'desc'.
bioguide_idNoFiler's bioguide_id (e.g., 'P000197' for Nancy Pelosi). Exact match. Most precise filter. A filing carries a bioguide_id only when exactly one member of Congress can be its filer: reports by candidates who never served carry none, and neither does a filing saved before its filer appeared in the member catalog. So for a brand-new member, cross-check with member_name.
filing_yearNoThe year of the FILING period being reported on (NOT the date filed). Most filers report the prior calendar year — e.g., a May 2026 Annual filing has filing_year=2025. New Filer reports cover the partial year up to filing.
member_nameNoSubstring match against the filer's full name (case-insensitive). E.g., 'Pelosi', 'Mitch McConnell'. Use bioguide_id when possible for precision.
report_typeNoFilter to one filing flavor. Default is unfiltered (returns all types).

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the read-only, non-destructive, open-world profile, and the description adds substantial behavior beyond that: content_parsed/coverage_note flags, parse_unreliable rows with report_url as authoritative, House vs Senate parsing differences, income_range empty cases, and the deliberate omission of net-worth roll-ups. This is exactly the added context the dimension rewards.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then organized into SCOPE, CONTENT, USE-this-when, and DIFFERENT-from blocks, so a long description is justified by the 12-parameter surface. A few sentences (the 'honest coverage boundary is never a silent omission' framing) lean rhetorical rather than informative, keeping it short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, no-output-schema, open-world disclosure tool, the description covers chambers, filing cadence, report types, parse reliability, data provenance, and the intentional coverage boundaries. Nothing an agent needs to call it correctly or interpret results is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 defines each report_type flavor ('Annual' covers prior calendar year, 'New Filer' initial disclosure, etc.) that the schema only labels as 'one filing flavor', and clarifies the range-vs-point-estimate semantics of value_range/amount_range. It does not add syntax detail for the remaining filters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (returns Form 278 annual financial disclosure filings), enumerates the content (assets, income sources, liabilities, transactions, gifts, outside positions) and explicitly differentiates from the sibling get_congressional_trades with a clear PTR-vs-year-end-snapshot contrast. An agent can identify this tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use this when the user asks about...' list (asset composition, outside income, board seats, liabilities, news reporting) plus a named alternative and a combine-both recommendation for the full activity+position view. Both when-to-use and the sibling relationship are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources