@cyanheads/treasury-fiscaldata-mcp-server
Provides SQL analytics over DuckDB-backed DataCanvas dataframes materialized from Treasury Fiscal Data queries.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@cyanheads/treasury-fiscaldata-mcp-serverWhat is the current national debt?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Public Hosted Server: https://treasury-fiscaldata.caseyjhand.com/mcp
Overview
US Treasury Fiscal Data — national debt, interest rates, exchange rates, and other fiscal datasets. Browse a curated catalog of 17 endpoints, query any endpoint directly, or stage large pulls as DuckDB dataframes for SQL analysis, from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
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
Public Hosted Instance
A public instance is available at https://treasury-fiscaldata.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"treasury-fiscaldata-mcp-server": {
"type": "streamable-http",
"url": "https://treasury-fiscaldata.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"treasury-fiscaldata-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/treasury-fiscaldata-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"treasury-fiscaldata-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/treasury-fiscaldata-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"treasury-fiscaldata-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/treasury-fiscaldata-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpDataCanvas SQL workflow
For large time-series pulls or multi-dataset analysis, use the DataCanvas SQL workflow:
Set
CANVAS_PROVIDER_TYPE=duckdbin your server environment.Call a data tool with a
canvas_id— e.g.,treasury_get_debtwithmode=seriesand acanvas_idvalue, ortreasury_query_datasetwithcanvas_id. The tool registers the results as adf_XXXXX_XXXXXdataframe and returns the table name.Inspect the schema with
treasury_dataframe_describe— lists column names, types (all VARCHAR for Treasury data), row count, and TTL.Query with SQL via
treasury_dataframe_query— standard DuckDB SELECT with joins, aggregates, window functions, and CTEs. CAST VARCHAR columns to DECIMAL or DATE for arithmetic.
-- Example: debt trend over the last year, month-end records only
SELECT
record_date,
CAST(tot_pub_debt_out_amt AS DECIMAL) / 1e12 AS total_debt_trillions
FROM df_xxxxx
WHERE CAST(record_date AS DATE) >= CURRENT_DATE - INTERVAL 1 YEAR
ORDER BY record_date DESCPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
No API key required — the US Treasury Fiscal Data API is free and public.
For DataCanvas SQL:
CANVAS_PROVIDER_TYPE=duckdb(DuckDB is bundled as@duckdb/node-api).
Installation
Clone the repository:
git clone https://github.com/cyanheads/treasury-fiscaldata-mcp-server.gitNavigate into the directory:
cd treasury-fiscaldata-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env as needed — no required vars; CANVAS_PROVIDER_TYPE=duckdb to enable SQLConfiguration
Variable | Description | Default |
| Set to |
|
| 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
Build 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 build -t treasury-fiscaldata-mcp-server .
docker run --rm -e CANVAS_PROVIDER_TYPE=duckdb -p 3010:3010 treasury-fiscaldata-mcp-serverThe 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.
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.
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 gradedqualityAmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.147 npm2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceBrowse and query the U.S. Energy Information Administration API v2 — electricity, petroleum, natural gas, coal, forecasts, and more via MCP. STDIO or Streamable HTTP.249 npm2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceSearch and fetch ~800K Federal Reserve economic time-series from the FRED API via MCP, with STDIO or Streamable HTTP transport.94 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceQuery FEMA disaster declarations, public assistance grants, housing aid, and NFIP flood insurance claims via MCP. Supports STDIO and Streamable HTTP.130 npm1Apache 2.0