@cyanheads/treasury-fiscaldata-mcp-server
Provides SQL analytics over DuckDB-backed DataCanvas dataframes materialized from Treasury Fiscal Data queries.
Public Hosted Server: https://treasury-fiscaldata.caseyjhand.com/mcp
Overview
US Treasury Fiscal Data: the national debt, interest rates, exchange rates, and other federal fiscal datasets. Pull the headline numbers in one call, query any Fiscal Data endpoint directly, and run SQL over large pulls.
Tools
Tool | Description |
| Browse the curated catalog of 17 Treasury Fiscal Data endpoints with field names, descriptions, and update cadence |
| Query any Treasury Fiscal Data endpoint by path, field list, filters, sort, and page — with optional DataCanvas spill |
| Fetch national debt (Debt to the Penny) — latest record, specific date, or date-range series with optional DataCanvas spill |
| Average interest rates Treasury pays on outstanding securities by type — marketable issues, non-marketable series, and aggregate totals |
| Official Treasury statutory exchange rates for ~165 countries, published quarterly |
| List DataCanvas dataframes materialized by the treasury_* tools with schema, row count, and TTL |
| Run a single-statement SELECT against DataCanvas dataframes using standard DuckDB SQL |
| Delete a staged dataframe and its provenance (disabled unless |
Related MCP server: @cyanheads/eia-energy-mcp-server
Capability reference
treasury_list_datasets tool
Filter by category (
debt,interest_rates,exchange_rates,revenue_spending,savings_bonds,securities,other) or keyword search.Returns endpoint paths, fields, types, and update cadence from a bundled catalog, with no network call.
treasury_query_dataset tool
Query an endpoint with
{ field, operator, value }filters (eq,gt,gte,lt,lte,in), sort, and pagination:page_size1–10000 (default 100),page_numberstarts at 1.Returns rows, field labels,
total_count, andtotal_pages; error reasons areinvalid_endpoint,invalid_field,invalid_filter, andpage_out_of_range.Pass
canvas_idto stage the page for SQL analysis; the returnedcanvas_idis the assigned table name.
treasury_get_debt tool
mode=latestreturns the newest business-day record;mode=dateaccepts a YYYY-MM-DD date;mode=seriesaccepts a date range. Coverage begins 1993-04-01.Returns debt totals and a 20-row series preview; compare
retrieved_recordswithtotal_records. A missing date returnsno_data_for_date.Series staging starts above 500 rows or on request via
canvas_id; paging stops at 50,000 rows.
treasury_get_interest_rates tool
mode=latestreturns the newest month's rates, optionally filtered bysecurity_type;mode=seriesaccepts a date range.Rates are percentages, with available security types disclosed when a filter matches nothing; the series preview holds at most 20 rows.
Series staging starts above 200 rows or on request via
canvas_id.
treasury_get_exchange_rates tool
Quarterly official reporting rates in foreign currency units per 1 USD. Filter
countriesby exact name;mode=latestreturns one current row per currency andmode=seriesaccepts a date range.Each row carries
record_dateandeffective_date;mixed_record_datesflags a result spanning quarters. Series previews hold 20 rows;retrieved_recordsdiscloses progress againsttotal_records.Series staging starts above 500 rows or on request via
canvas_id; paging stops at 50,000 rows.country_not_founderror when a requested country has no records
treasury_dataframe_describe tool
Omit
nameto list the tenant's active dataframes, or supply one exact table name.Returns provenance, created/expiry timestamps, row count, and column schema;
truncated/max_rowsdisclose a capped source pull.Table expiry defaults to 24h after staging, configurable with
CANVAS_TTL_MS.
treasury_dataframe_query tool
Accepts one read-only SELECT;
row_limitdefaults to 1000 (max 10000) andpreviewmay not exceed it. System catalogs, external-file functions, and SQL mutations are denied.Returns rows and
row_count_capped; errors distinguishcanvas_unavailable,system_catalog_access,invalid_sql,missing_table, andinvalid_query_bounds.register_asmaterializes the full result as a new dataframe with a fresh TTL.
treasury_dataframe_drop tool
Accepts the exact
namefromtreasury_dataframe_describe, a data tool'scanvas_id, or query'sregistered_as; deletes that table and its provenance for the tenant.Returns
nameanddropped: true; an absent or expired table returnsmissing_tablewith guidance to list active tables.Disabled by default. Set
TREASURY_DATAFRAME_DROP_ENABLED=trueandCANVAS_PROVIDER_TYPE=duckdbto make it callable; the HTTP landing page shows the disabled tool and enable hint otherwise.
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Fiscal Data-specific:
All API values are strings;
"null"means no value. Treasury dataframe columns are VARCHAR — CAST to DECIMAL or DATE for arithmetic and date comparisons. DataCanvas requiresCANVAS_PROVIDER_TYPE=duckdb; configured canvas tools reportcanvas_unavailableotherwise.Curated catalog of 17 endpoints with field metadata — no discovery round-trip required; pass any endpoint path directly to
treasury_query_datasetfor datasets outside the catalogConvenience tools for the three most-queried datasets — national debt, interest rates, exchange rates
DataCanvas integration: large pulls register as
df_<id>dataframes queryable via DuckDB SQL, with automatic staging thresholds per toolNo API key required — the US Treasury Fiscal Data API is free and public
Agent-friendly output:
Provenance: filter-expression echo (
applied_filters) and field-label maps (field_labels) let agents verify what was sent and read raw field namesEnrichment notices: empty-result guidance, partial-country mismatches, canvas staging confirmations, and truncated-series warnings all name the next tool call
Graceful truncation: series and query results carry
truncated/retrieved_records/row_count_cappedfields instead of silently dropping rowsCanvas provenance: source tool, original query parameters, row count, and column schema surfaced by
treasury_dataframe_describe
Getting started
Connect Claude Code to the public instance:
claude mcp add --transport http treasury-fiscaldata-mcp-server https://treasury-fiscaldata.caseyjhand.com/mcpOr run it locally:
claude mcp add treasury-fiscaldata-mcp-server -- npx -y @cyanheads/treasury-fiscaldata-mcp-serverFor other MCP clients:
{
"mcpServers": {
"treasury-fiscaldata-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/treasury-fiscaldata-mcp-server"]
}
}
}No API key is required. DataCanvas is enabled by default in npm and Docker installs; CANVAS_PROVIDER_TYPE=none disables it. The portable Claude Desktop .mcpb bundle omits DuckDB native bindings and supports Treasury API queries with DataCanvas disabled. For Docker or a source build, see Running the server.
Configuration
Variable | Description | Default |
|
|
|
| Per-table TTL for DataCanvas dataframes in milliseconds. |
|
| Register |
|
| Transport: |
|
| Port for HTTP server. |
|
| HTTP session handling: |
|
| Auth mode: |
|
| Log level ( |
|
| Directory for log files (Node.js/Bun only). |
|
| Log failed-call arguments and results, redacted by key name. Secrets inside free-form values are not redacted. |
|
| Byte cap for each logged failed-call payload. |
|
| Enable OpenTelemetry spans and metrics. |
|
| Base OTLP endpoint for traces and metrics. | Unset |
| Explicit OTLP log endpoint; the base endpoint does not enable log export. | Unset |
See .env.example for the full list of optional overrides.
Running the server
Local development
Requires Bun v1.4.0 or higher to build; the installed server also runs on Node.js v24+.
git clone https://github.com/cyanheads/treasury-fiscaldata-mcp-server.git
cd treasury-fiscaldata-mcp-server && bun install
cp .env.example .envBuild and run:
bun run rebuild bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec bun run lint:deps # Detect unused and missing dependencies with Knip bun run verify:catalog # Probe every catalog endpoint and field against the live APIverify:catalogmakes live Fiscal Data requests and runs separately fromdevcheckand the test suite. Run it after editingsrc/services/fiscal-data/datasets.tsand before a release.Builds type-check and emit declarations with TypeScript, then use Bun to bundle server code as Node-compatible ESM in
dist/index.js. Package dependencies remain external, including the framework and DuckDB native bindings. The installed server runs on Node or Bun; building from source requires Bun. Dependency checks useknip.jsoncto cover source, scripts, and tests.
Docker
docker run --rm -p 3010:3010 ghcr.io/cyanheads/treasury-fiscaldata-mcp-server:latestThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/treasury-fiscaldata-mcp-server. A native build-host dependency stage cross-installs DuckDB bindings for the target architecture, preserves the release-age and security checks, and removes unused musl bindings. OpenTelemetry peers are installed at the framework's declared ranges — build with --build-arg OTEL_ENABLED=false to omit them.
To build locally, run docker build -t treasury-fiscaldata-mcp-server .. For stdio, use docker run -i --rm -e MCP_TRANSPORT_TYPE=stdio ghcr.io/cyanheads/treasury-fiscaldata-mcp-server:latest as the MCP client's launch command.
DataCanvas SQL workflow
Use the hosted endpoint, npm, or Docker for dataframe staging and SQL. Pass canvas_id to a data tool to stage its results, then use the returned minted df_<id> table identifier with treasury_dataframe_describe and treasury_dataframe_query. Treasury columns are VARCHAR: cast numeric and date columns before arithmetic, comparisons, or date operations. The input canvas_id enables staging; it does not name the output table.
Project structure
Directory | Purpose |
|
|
| Server-specific environment variable parsing and validation with Zod. |
| Tool definitions ( |
| Treasury Fiscal Data API client, embedded endpoint catalog, and types. |
| Adapter over the framework DataCanvas: |
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md and AGENTS.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageAll Treasury API values are strings — validate and CAST in downstream SQL; never fabricate missing fields
Register new tools via the arrays in
src/index.ts
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.
Treasury MCP — US Treasury Fiscal Data public API (free, no auth)
Treasury Fiscal MCP — US Treasury Fiscal Data API
Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.203 npm2Apache 2.0
- AlicenseNot gradedqualityBmaintenanceBrowse and query the U.S. Energy Information Administration API v2 — electricity, petroleum, natural gas, coal, forecasts, and more via MCP. STDIO or Streamable HTTP.603 npm3Apache 2.0
- AlicenseNot gradedqualityBmaintenanceSearch and fetch ~800K Federal Reserve economic time-series from the FRED API via MCP, with STDIO or Streamable HTTP transport.115 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables querying FDIC-insured institutions, their Call Report financials, peer comparisons, failure records, and deposit market share via MCP, over stdio or Streamable HTTP.412 npm2Apache 2.0