MCP server for US Treasury Fiscal Data — national debt, interest rates, exchange rates, and federal revenue/spending.
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 6 tools have clear verb-noun naming (treasury_get_*, treasury_list_*, treasury_dataframe_*) and detailed descriptions (150-400 chars). Input schemas are complete with types, enums, and constraints. However, output schemas are not explicitly documented in the tool definitions, responses are described narratively rather than as formal JSON Schema. Error handling guidance is minimal. Tool composition is excellent: tools chain naturally (list_datasets → query_dataset → dataframe_query), and responses include necessary IDs for downstream calls. Parameter descriptions are thorough and include format guidance (ISO 8601 dates, CAST requirements for VARCHAR columns).
List DataCanvas dataframes materialized by treasury_query_dataset, treasury_get_debt, treasury_get_interest_rates, and treasury_get_exchange_rates. Each entry surfaces source tool, query parameters, creation/expiry timestamps, row count, and column schema. Use this tool before treasury_dataframe_query to discover table names and column types. Requires CANVAS_PROVIDER_TYPE=duckdb.
Run a single-statement SELECT against DataCanvas dataframes registered by treasury_query_dataset, treasury_get_debt, treasury_get_interest_rates, and treasury_get_exchange_rates. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, and external-file table functions are rejected. System catalogs (information_schema, pg_catalog, sqlite_master, duckdb_*) are denied at the bridge layer. All Treasury dataframe columns are VARCHAR — CAST to DECIMAL or DATE for arithmetic and date comparisons. Use treasury_dataframe_describe to list available table names and column schemas before querying.
Fetch national debt (Debt to the Penny) — total public debt outstanding broken into publicly-held debt and intragovernmental holdings. Three modes: "latest" returns the most recent business day's record; "date" returns the record for a specific date (must be a business day — the API only records debt on days markets are open); "series" returns a date range, staging the full result as a DataCanvas table when canvas_id is set or the range matches more than 500 rows — read the table's column schema with treasury_dataframe_describe, then run SQL over it with treasury_dataframe_query. Records go back to 1993-04-01.
Output schemas not formally documented. Tool descriptions explain response structure narratively (e.g., 'returns the most recent day's record') but do not provide JSON Schema definitions. LLMs cannot reliably parse unstructured output or plan downstream tool calls without explicit field definitions.
Error handling lacks recovery guidance. Tool descriptions do not explain what to do if a date is not a business day, if a dataset endpoint is invalid, or if a SQL query fails. Errors should include actionable next steps (e.g., 'Invalid date: must be a business day. Try treasury_get_debt with mode=latest instead.').
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Official Treasury reporting exchange rates for ~165 countries — the rates US federal agencies are required to use when converting foreign currency to USD for official reporting. Published quarterly (March 31, June 30, Sep 30, Dec 31); mode "latest" returns the most recently published quarter. Rate is expressed as foreign currency units per 1 USD (e.g., a Japan-Yen rate of 159.41 means 1 USD = 159.41 JPY). These are NOT market exchange rates and are not suitable for financial transaction pricing. Mode "series" stages the result as a DataCanvas table when canvas_id is set or the range matches more than 500 rows — read the table's column schema with treasury_dataframe_describe, then run SQL over it with treasury_dataframe_query.
Average interest rates Treasury pays on its outstanding securities by security type. Answers "what is the government's cost of borrowing?" Covers every type Treasury reports — marketable issues, non-marketable series, and the aggregate totals — and which types it reports changes over the years, so omit security_type to see the ones a given period carries. Rates are percentages, not basis points. Updated monthly (end-of-month records). Mode "latest" returns the most recent month's rates for all or one security type; "series" returns a time history, staging the result as a DataCanvas table when canvas_id is set or the range matches more than 200 rows — read the table's column schema with treasury_dataframe_describe, then run SQL over it with treasury_dataframe_query.
Browse the curated catalog of US Treasury Fiscal Data API endpoints. Returns endpoint paths, field names, descriptions, and update cadence for each dataset. Use this tool before treasury_query_dataset to discover the correct endpoint path and field names — a typo in either causes a 400 error from the API. The catalog is a curated subset of the full API — pass any endpoint path directly to treasury_query_dataset to query datasets not listed here. The catalog covers debt, interest rates, exchange rates, revenue/spending, savings bonds, and securities datasets.
No pagination or result-limiting guidance for treasury_list_datasets. If the catalog grows large, responses could exceed context windows. Should document max result count and offer filtering (already present via category/search, but not explicitly capped).
treasury_dataframe_query accepts arbitrary SQL with only read-only enforcement at the bridge layer. While safe, the description could explicitly state that writes, DDL, and system catalog access are rejected, with examples of what fails. Currently relies on users reading the full description carefully.
Parameter 'canvas_id' in treasury_get_debt, treasury_get_interest_rates, and treasury_get_exchange_rates is described as 'set any non-empty value' but the actual behavior (server picks the table name) is not clearly separated from the parameter's role. Could be clearer: 'Set to any non-empty string to request staging; the server assigns the actual table name (df_XXXXX_XXXXX) and returns it in canvas_id.'