Skip to main content
Glama

ferric-fred

CI License: MIT OR Apache-2.0 ferric-fred MCP server

A strongly-typed Rust client for FRED — the Federal Reserve Economic Data service from the Federal Reserve Bank of St. Louis — plus a CLI (with TUI charts) and an MCP server built on top of it.

ferric (iron oxide → rust) + FRED. Iron-clad, typed access to economic data.

Workspace

A Cargo workspace of three crates — each with its own README (the crates.io / docs.rs landing page) that carries the full usage detail:

Crate

Binary

What it is

Details

ferric-fred

Strongly-typed async FRED client

README · docs.rs

ferric-fred-cli

fred

Command-line tool with ratatui TUI charts

README

ferric-fred-mcp

fred-mcp

MCP server exposing FRED to MCP clients

README

Published versions (these badges are the source of truth — the crates version independently, so they can drift out of lockstep):

ferric-fred ferric-fred-cli ferric-fred-mcp

Consumers depend on the library by workspace path, so a breaking change in the library cannot compile-pass its consumers without updating them — that compile-time coupling is the primary "stay in sync" guarantee (versions are managed on top; see the ADRs).

Related MCP server: stooq-mcp

What it covers

The library wraps all of FRED's read endpoints — series and observations (including ALFRED point-in-time / vintage data via a real-time window), search, categories, releases (including the nested release-table tree, with optional inline observation values), sources, and tags — plus the GeoFRED / Maps API (regional data and the geographic shape files to map it, ADR-0025) — behind ergonomic builders, with newtype identifiers, typed enums for FRED's closed value sets, a non-panicking error taxonomy, and auto-pagination (Paginate::send_all walks an endpoint to exhaustion, Paginate::stream yields lazily; --all on the CLI). See ADR-0020 and ADR-0021.

GeoFRED support spans the library, CLI (fred geofred), and MCP (get_regional_data, get_series_data, get_series_group) layers. The one exception is the geographic shapes/file endpoint, which is library/CLI-only — a large projected-GeoJSON blob is poor ergonomics for an MCP tool caller (ADR-0025).

Pick an entry point:

  • Librarycargo add ferric-fred; typed async access from your own code. See the crate README and docs.rs.

  • CLI (fred) — cargo install ferric-fred-cli; search, show metadata, print or chart observations in the terminal, browse categories, releases, sources, and tags, and pull GeoFRED regional data and map shapes (fred geofred). See the crate README or fred <command> --help.

  • MCP server (fred-mcp) — cargo install ferric-fred-mcp; 34 tools over stdio covering the same read surface, for MCP-capable clients (ADR-0010). Each tool declares input and output schemas plus behavioural annotations (ADR-0023). See the crate README.

The MCP server is listed and scored on Glama:

ferric-fred MCP server

Development

A Nix flake provides a reproducible toolchain (nix develop, or direnv allow once), but the project builds with a plain Rust toolchain too — Nix supplies the environment, not the build (ADR-0008).

Contributor setup, the fmt/clippy/test/prose gate, the tracked git hooks, and the workflow for adding an endpoint live in CONTRIBUTING.md. CI (ci.yml) runs that same offline gate on every push and PR; a dormant live.yml runs the live FRED tests once an Infisical machine identity is configured (ADR-0016).

Benchmarks

Performance tooling from the org Tech Radar pilot (ADR-0026, issue #42):

# Deserialization microbenches (divan) — the observations parse hot path.
cargo bench -p ferric-fred --bench deserialization
# Same workload under criterion (the divan-vs-criterion baseline).
cargo bench -p ferric-fred --bench deserialization_criterion

# Headless `fred chart` render cost (divan + ratatui TestBackend, no tty).
cargo bench -p ferric-fred-cli --bench render

# CLI wall-clock timing (hyperfine): startup + a live fetch-and-render.
# The fetch benchmark needs FRED_API_KEY; startup runs offline.
scripts/bench-cli.sh                    # add --json DIR to export hyperfine JSON

CI keeps the benches compiling on every PR (cargo bench --no-run), and a separate bench.yml uploads results to Bencher (hosted project ferric-fred) to track them over time and flag regressions on PRs. Bencher has no divan adapter, so it ingests the criterion mirror (rust_criterion) and hyperfine startup (shell_hyperfine); divan stays the fast local harness. BENCHER_API_TOKEN comes from Infisical, so the upload is a no-op until the machine identity is configured — see ADR-0026.

Secrets

The client reads a free FRED API key from the FRED_API_KEY environment variable (get one at https://fredaccount.stlouisfed.org/apikeys). Locally, secrets are injected via Infisical + direnv (ADR-0009):

cp .envrc.example .envrc     # local, git-ignored entry point
infisical login             # user auth (opens a browser)
infisical init              # link this dir → project
direnv allow                # load the shell + inject secrets on cd-in

Store the key with infisical secrets set FRED_API_KEY="…" --env=dev --path=/shared. No Infisical? Just set it directly in your git-ignored .envrc: export FRED_API_KEY="…" — the library only reads the env var and has no dependency on Infisical.

Architecture decisions

Design decisions are recorded as ADRs in docs/adr/. Start with the index.

License

Dual-licensed under MIT OR Apache-2.0, at your option — the Rust ecosystem default (ADR-0006). See LICENSE-MIT and LICENSE-APACHE. Unless you state otherwise, any contribution you submit is licensed under the same dual terms (see CONTRIBUTING.md).

This covers our code; FRED data itself is subject to the St. Louis Fed's terms of use, and you supply your own API key — the project ships no data and no key.

Available Tools

34 tools
get_categoryA
Read-onlyIdempotent

Fetch a FRED category by its id (0 is the root of the category tree): its name and parent category id.

ParametersJSON Schema
NameRequiredDescriptionDefault
category_idYesThe FRED category id (0 is the root of the category tree).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe category's identifier.
nameYesHuman-readable name, e.g. `"Trade Balance"`.
parent_idYesThe parent category's id. For the root category this is [`CategoryId::ROOT`] (`0`), which FRED may also omit entirely.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive. The description adds that id 0 is the root and that the returned data includes name and parent id, which is useful behavioral context beyond 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.

Conciseness5/5

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

A single sentence that front-loads the action and includes parenthetical detail without redundancy. Every word earns its place.

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?

Given the tool's simplicity, rich annotations, and an existing output schema, the description covers the essential usage context completely.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% coverage, describing category_id as the FRED category id with 0 as root. The description repeats the root information but adds no new parameter semantics.

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?

The description clearly states the verb 'fetch', the resource 'FRED category', and the input 'by its id', and specifies the output fields (name and parent category id). This distinguishes it from sibling tools that fetch children, related tags, or series.

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

Usage Guidelines4/5

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

It clearly implies usage when you have a category id and need its metadata, but does not explicitly mention alternatives or exclusions, so it stops short of full guidance.

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

get_category_childrenA
Read-onlyIdempotent

List the child categories of a FRED category (use id 0 for the top-level categories). The primary way to walk the category tree downward.

ParametersJSON Schema
NameRequiredDescriptionDefault
category_idYesThe FRED category id (0 is the root of the category tree).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesThe number of child categories returned.
childrenYesThe child categories.
category_idYesThe parent category whose children these are.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is clear. The description adds the tree-walking semantics and the role of id 0, providing some context beyond annotations, but no additional behavioral details like pagination or ordering.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the action and resource, and every word adds value. It is highly concise without being under-specified.

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 simple one-parameter read-only tool with full annotations and an output schema, the description is complete. It clearly explains the tool's purpose and the special root category case.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter description already explains the root id 0. The tool description adds no new parameter information beyond what the schema provides, hence baseline 3.

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?

The description uses specific verb 'List' and identifies the resource as 'child categories of a FRED category', with a clear note about id 0. It distinguishes from sibling tools by stating it is 'the primary way to walk the category tree downward'.

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

Usage Guidelines4/5

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

The description implies when to use the tool (to traverse down the category tree) and gives the special instruction for id 0. However, it does not explicitly mention alternatives or when-not-to-use, so it falls short of a perfect score.

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

get_category_seriesA
Read-onlyIdempotent

List the FRED series that belong to a category, with pagination metadata (total count, offset, limit). Supports ordering, sort direction, and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction.
limitNoMaximum number of series to return.
order_byNoField to order results by.
category_idYesThe FRED category id (0 is the root of the category tree).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of matches across all pages.
limitYesPage-size limit that FRED applied.
offsetYesOffset of this page into the full result set.
seriesYesThe matching series on this page. FRED names the array `seriess` (sic) on the wire; we read that but emit the correctly-spelled `series` on output.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds useful context about pagination metadata (total count, offset, limit) and supports ordering/sort/limit, which are not fully captured by the annotations. No contradictions with annotations.

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

Conciseness5/5

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

The description is a single, well-structured sentence that leads with the primary action and then lists key features. Every word contributes value, and there is no redundancy or filler.

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?

Given the tool's moderate complexity, the presence of annotations, a complete input schema, and an output schema, the description adequately covers the essential behavior. It mentions pagination and ordering, which are key aspects, and does not need to explain return values since an output schema exists.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, so parameters are already well-documented. The description adds a high-level summary of capabilities ('ordering, sort direction, result limit') but does not provide significant additional detail beyond the schema. The baseline of 3 is appropriate.

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?

The description clearly states the tool's purpose: to list FRED series belonging to a category. It uses specific verbs ('List') and identifies the resource ('FRED series that belong to a category'), which distinguishes it from sibling tools like get_category (category info) or get_category_children (subcategories).

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

Usage Guidelines4/5

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

The description provides clear context on when to use the tool (when you need series in a category) but does not explicitly mention alternatives or when not to use it. The purpose is unambiguous enough for an agent to infer usage, but it lacks the explicit exclusions or alternative tool references seen in higher-scoring examples.

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

get_category_tagsA
Read-onlyIdempotent

List the tags used by the series in a FRED category (the tag facets for browsing a category), with pagination metadata. Optionally filter by search text; supports sort direction and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction (tags are ordered by series count by default).
limitNoMaximum number of tags to return.
category_idYesThe FRED category id (0 is the root of the category tree).
search_textNoRestrict to tags matching this text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsYesThe tags on this page.
countYesTotal number of tags available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of tags skipped) for this page.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds functional details beyond annotations: it mentions pagination metadata, optional search text filtering, sort direction, and result limits. No contradictions with annotations.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the primary action ('List the tags'), and each clause adds relevant functional detail. No verbose or irrelevant content.

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

Completeness4/5

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

Given the read-only nature, complete parameter schema, and existing output schema, the description is sufficient. It covers the core purpose, optional filtering/pagination, and correct scope. Minor omission: category_id is not explicitly mentioned in the description, but schema handles it.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for all four parameters. The description summarizes search_text, sort, and limit functionality, which aligns with schema descriptions. It adds minor context about pagination metadata but does not significantly enhance understanding beyond the schema.

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?

The description clearly states the tool lists tags used by series in a FRED category, explicitly identifying it as tag facets for browsing a category. This specific verb+resource formulation distinguishes it from siblings like get_tags (global tags) and get_category_series (series within a category).

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

Usage Guidelines3/5

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

The phrase 'the tag facets for browsing a category' implies when this tool is appropriate, but it does not explicitly state when to use it versus alternatives or mention exclusions. No other tools are referenced as alternatives, so guidance remains implicit.

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

get_observationsA
Read-onlyIdempotent

Fetch a FRED series' observations (date/value pairs, each with its ALFRED real-time period). Supports an optional date range, a units transform, aggregation to a lower frequency, sort order, and a result limit. For point-in-time/vintage (ALFRED) data, set realtime_start/realtime_end (both together; same date = the series as known on that day) and/or vintage_dates.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoLatest observation date, `YYYY-MM-DD`.
sortNoSort order by date.
limitNoMaximum number of observations to return.
startNoEarliest observation date, `YYYY-MM-DD`.
unitsNoUnits transformation to apply.
frequencyNoFrequency to aggregate observations down to. FRED can only aggregate to a frequency **coarser than** the series' native one (e.g. a monthly series to quarterly or annual, never a coarser series to a finer one); asking for a finer or invalid frequency returns a FRED 400.
series_idYesThe FRED series id, e.g. `GNPCA` or `UNRATE`.
aggregationNoAggregation method — how observations are combined when aggregating to `frequency`. Requires `frequency`; supplying it without `frequency` is rejected (an invalid-params error), not silently ignored.
realtime_endNoALFRED: end of the real-time period, `YYYY-MM-DD`. Must be given together with `realtime_start`.
vintage_datesNoALFRED: specific revision dates to fetch, each `YYYY-MM-DD`. Each date selects that vintage of the series.
realtime_startNoALFRED: start of the real-time period, `YYYY-MM-DD` — the data as it was known then. Use the same value for `realtime_end` to snapshot the series as of one day (point-in-time). Must be given together with `realtime_end`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesThe number of observations returned.
series_idYesThe series the observations belong to.
observationsYesThe observations, in the requested sort order.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context about ALFRED point-in-time/vintage behavior and the constraint that realtime_start/realtime_end be used together, going beyond the annotations without contradicting them.

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

Conciseness5/5

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

Two sentences front-load the core purpose, then efficiently summarize optional capabilities and the special ALFRED case. Every sentence earns its place with no filler or redundancy.

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

Completeness4/5

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

For an 11-parameter read-only tool with an output schema, the description covers the primary function, optional transforms, and the critical ALFRED usage nuance. Parameter-level constraints live in the schema, so the description does not need to repeat them; the only notable gap is lack of sibling-tool differentiation.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains every parameter (units enums, aggregation method, realtime constraints, etc.). The description restates some high-level capabilities and adds a compound hint for realtime_start/realtime_end, but it does not materially add meaning beyond the rich schema, so baseline 3 is appropriate.

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

Purpose4/5

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

Description uses a specific verb ('Fetch') and clearly identifies the resource ('a FRED series' observations') with output described as date/value pairs plus ALFRED real-time periods. It is unambiguous but does not explicitly distinguish itself from sibling tools like get_series_data or get_series_vintagedates, so it misses the top score.

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

Usage Guidelines4/5

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

Provides clear context for when to use the tool (fetching observations with optional date range, units, aggregation, sort, limit) and gives explicit ALFRED guidance: realtime_start/realtime_end must be set together, and same date gives a point-in-time snapshot. It does not name alternative tools or state exclusions, so it stops short of a 5.

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

get_regional_dataA
Read-onlyIdempotent

GeoFRED / Maps: fetch a region cross-section for a series group — the value in every region (state, county, MSA, country, or BEA region) on a given date. All arguments are required: series_group id, region_type, date, units (a free-text measurement label FRED echoes into the title, e.g. Dollars), frequency, and season. The result nests everything under a top-level meta object (FRED's own envelope, mirrored faithfully): the dated per-region values live under meta.data, which maps each observation date to a list of {region, code, value, series_id}; alongside them sit the display labels meta.title, meta.units, meta.region, meta.seasonality, and meta.frequency (see the output schema for the full shape). Size caveat: FRED returns the full cross-section with no limit or paging, so region_type county or msa yields thousands of regions (a county cross-section can exceed 250,000 characters) — prefer state, bea, or country unless you need that granularity.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe date to report, `YYYY-MM-DD`.
unitsYesUnit-of-measurement label — free text that FRED echoes into the result title (e.g. `Dollars`), not a transformation code.
seasonYesSeasonal adjustment.
frequencyYesReporting frequency.
region_typeYesRegion granularity to break the data down to. FRED returns the full cross-section with no limit or paging, so `county` or `msa` returns thousands of regions (a `county` cross-section can exceed 250,000 characters); `state`, `bea`, and `country` are far smaller.
series_groupYesThe GeoFRED series-group id, e.g. `882`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaYesThe `meta` payload: the descriptive header plus the dated regional values.

TDQS

A4.5/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the readOnlyHint/idempotentHint annotations: all six arguments are required, the output is nested under a top-level meta object (mirroring FRED's envelope), and the API returns the full unpaged cross-section, which can exceed 250,000 characters for county. This is exactly the kind of detail that helps an agent anticipate response size and structure.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: purpose, required arguments, output structure, and a critical size warning. It is front-loaded with the core purpose and remains focused without redundant phrasing.

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?

With an output schema present and full parameter documentation, the description fills the remaining contextual gaps: the meta envelope layout, the unpaged nature of the response, and the practical size implications. It gives an agent everything needed to invoke the tool correctly and interpret the result.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all six parameters thoroughly (e.g., units being a free-text label, date format, region_type enum). The description restates that all arguments are required but does not add new parameter-level insights beyond what is in the schema, matching the baseline for full schema coverage.

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?

The description opens with a specific verb ('fetch') and precise resource ('region cross-section for a series group'), enumerating the region types (state, county, MSA, country, BEA). This clearly distinguishes it from the many series/data siblings in the tool list, such as get_series_data or get_observations.

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

Usage Guidelines4/5

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

The description clearly indicates when to use the tool: when a regional breakdown of a series group is needed for a specific date. The size caveat ('prefer state, bea, or country unless you need that granularity') provides practical guidance on region_type selection, but it does not explicitly name alternative tools or state when not to use it compared to siblings.

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

get_releaseA
Read-onlyIdempotent

Fetch a FRED data release by its id (e.g. 53 = Gross Domestic Product): its name, press-release flag, and link.

ParametersJSON Schema
NameRequiredDescriptionDefault
release_idYesThe FRED release id, e.g. 53 (Gross Domestic Product).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe release's identifier.
linkYesA link to the release on the source's site, when FRED provides one.
nameYesHuman-readable name, e.g. `"Gross Domestic Product"`.
press_releaseYesWhether the release is accompanied by a press release.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds the specific output fields and an example id, but does not disclose further behavioral traits such as error behavior or existence requirements. This is adequate for a simple read-only tool.

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

Conciseness5/5

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

The description is a single concise sentence that front-loads the action, provides an example, and lists the return fields. It is directly scannable and contains no unnecessary words or repetition.

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?

The tool is simple with one well-documented parameter, strong annotations, and an output schema. The description covers the core purpose and return fields sufficiently for an agent to select and invoke the tool correctly. No additional context is needed.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter release_id is fully described in the schema with a minimum value and an example. The description repeats the same example (53 = GDP) but adds no additional semantic meaning beyond what the schema already provides. With 100% schema coverage, the baseline score of 3 is appropriate.

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?

The description clearly states the action (fetch), the resource (a FRED data release by id), and the scope (returns its name, press-release flag, and link). This specific field list distinguishes it from sibling tools like get_release_series or get_release_dates that fetch related data rather than the release metadata itself.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives. It does not mention that this is for release metadata only, nor does it reference sibling tools like get_release_series or get_release_dates. The only implied usage is having a release id.

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

get_release_datesA
Read-onlyIdempotent

List the publication dates of ONE FRED release (its calendar), with pagination metadata. Oldest first by default; supports sort direction, a result limit, and including dates that have no data yet (e.g. scheduled future releases).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction by date (oldest first by default).
limitNoMaximum number of release dates to return.
release_idYesThe FRED release id, e.g. 82 (Employment Situation).
include_dates_with_no_dataNoInclude dates that have no data yet, e.g. scheduled future releases (omitted by default).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of release dates available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of dates skipped) for this page.
release_datesYesThe release dates on this page.

TDQS

A4.5/5.0
Behavior5/5

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

The description augments the annotations (readOnlyHint, openWorldHint, idempotentHint) with concrete behavioral details: pagination metadata, default ordering (oldest first), sort direction, result limit, and the ability to include future dates with no data. This goes beyond the structured hints and adds meaningful context.

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

Conciseness5/5

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

Two concise sentences front-load the main purpose and then enumerate supported features. Every word contributes value; no filler or redundant phrasing.

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?

The description covers the tool's scope, defaults, available options, and even hints at return content (pagination metadata). With an output schema present and strong annotations, the description sufficiently completes the picture for an agent to select and invoke the tool correctly.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all parameters. The description adds minor context (e.g., default sort order) but mostly restates what the schema already covers. Baseline 3 is appropriate because the description doesn't significantly enhance parameter meaning.

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?

The description uses a specific verb 'List' and clearly identifies the resource: 'publication dates of ONE FRED release (its calendar)'. It also distinguishes from siblings by explicitly limiting scope to a single release, contrasting with get_releases_dates which handles multiple releases.

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

Usage Guidelines4/5

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

The description implies when to use this tool—when you need the calendar for one specific FRED release—but does not explicitly name alternatives or state exclusions. It lacks a direct 'use this instead of X' statement, so it falls short of a 5 but provides clear contextual guidance.

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

get_releasesA
Read-onlyIdempotent

List FRED data releases (publications such as "Gross Domestic Product"), with pagination metadata. A browse axis parallel to categories. Supports sort direction and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction by release id.
limitNoMaximum number of releases to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of releases available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of releases skipped) for this page.
releasesYesThe releases on this page.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds behavioral context by mentioning 'pagination metadata' and describing the tool as a browse axis, which is beyond what annotations provide. No contradiction.

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

Conciseness5/5

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

Three concise sentences, front-loaded with the primary action. Each sentence adds value: purpose, analogy, capabilities. No unnecessary words.

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

Completeness4/5

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

Given the tool's simplicity (2 optional parameters, rich annotations, output schema present), the description covers the essential purpose and key features. It doesn't explain return values, but the output schema handles that. Minor gap: could clarify pagination metadata structure, but overall sufficient.

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

Parameters3/5

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 both parameters (sort and limit) with descriptions. The description adds little beyond stating 'Supports sort direction and a result limit', which doesn't provide additional semantic detail over the schema.

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?

The description clearly states the verb 'List' and resource 'FRED data releases', providing an example 'Gross Domestic Product'. It differentiates from sibling tools by describing it as a browse axis parallel to categories, thus distinguishing it from other release-related tools like get_release.

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

Usage Guidelines4/5

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

The description provides context for when to use this tool ('A browse axis parallel to categories'), implying it's for browsing releases similarly to category browsing. However, it lacks explicit exclusions or guidance on when to use alternatives like get_release or get_release_dates.

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

get_releases_datesA
Read-onlyIdempotent

List the publication dates of ALL FRED releases — a release calendar across FRED — with pagination metadata. Each entry names its release. Newest first by default; supports sort direction, a result limit, and including dates that have no data yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction by date (newest first by default).
limitNoMaximum number of release dates to return.
include_dates_with_no_dataNoInclude dates that have no data yet, e.g. scheduled future releases (omitted by default).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of release dates available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of dates skipped) for this page.
release_datesYesThe release dates on this page.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds behavioral details: pagination metadata, newest-first default, sort direction, result limit, and inclusion of future dates. No contradictions.

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

Conciseness5/5

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

Three sentences, front-loaded with the core purpose. Every sentence adds value without redundancy.

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?

Given the presence of an output schema and comprehensive annotations, the description covers all necessary context: scope, default behavior, and optional parameters.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. The description restates parameter purposes (sort direction, limit, include dates without data) but does not add new meaning beyond the schema.

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?

The description clearly states it lists publication dates of ALL FRED releases, functioning as a release calendar. The use of 'ALL' distinguishes it from sibling tools like 'get_release_dates' which likely filter by a specific release.

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

Usage Guidelines4/5

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

The description implies use for broad calendar view by emphasizing 'ALL FRED releases', indirectly distinguishing from siblings. No explicit when-not or alternative wording, but the context is clear enough.

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

get_release_seriesA
Read-onlyIdempotent

List the FRED series published in a release, with pagination metadata (total count, offset, limit). Supports ordering, sort direction, and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction.
limitNoMaximum number of series to return.
order_byNoField to order results by.
release_idYesThe FRED release id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of matches across all pages.
limitYesPage-size limit that FRED applied.
offsetYesOffset of this page into the full result set.
seriesYesThe matching series on this page. FRED names the array `seriess` (sic) on the wire; we read that but emit the correctly-spelled `series` on output.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds value by mentioning pagination metadata (total count, offset, limit) and ordering capabilities, providing behavioral context beyond 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.

Conciseness5/5

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

The description is a single, well-structured sentence that is front-loaded with the core action (list series) and additional behaviors (pagination, ordering). Every part is concise and relevant.

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

Completeness4/5

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

Given the tool has 4 parameters (1 required), an output schema exists, and the description covers purpose and primary behaviors, it is fairly complete. Minor gaps like error handling are acceptable for this type of tool.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description mentions parameters like ordering, sort direction, and limit. However, it does not add additional meaning beyond what the schema descriptions already provide. Baseline 3 is appropriate.

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?

The description clearly states the tool lists FRED series published in a release and mentions pagination metadata. It distinguishes itself from sibling tools by specifying the resource (series in a release) and the verb (list).

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

Usage Guidelines3/5

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

The description indicates the tool supports ordering, sort direction, and limit, but does not provide explicit guidance on when to use this versus alternatives like get_release or get_release_dates. Usage context is implied but no exclusions or when-not-to-use are given.

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

get_release_sourcesA
Read-onlyIdempotent

List the FRED data sources a release draws from (the reverse of get_source_releases). Returns the full unpaginated list wrapped as {count, sources}.

ParametersJSON Schema
NameRequiredDescriptionDefault
release_idYesThe FRED release id, e.g. 53 (Gross Domestic Product).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesThe number of sources returned.
sourcesYesThe sources.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, and nondestructive behavior. Description adds value by disclosing the unpaginated list and wrapping format as {count, sources}, which is beyond what annotations provide.

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

Conciseness5/5

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

Two concise sentences with no wasted words. Purpose is front-loaded, and format details follow efficiently.

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?

Given the low complexity, rich annotations, and presence of output schema, the description fully completes the picture by specifying the return format and unpaginated nature.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already describes the 'release_id' parameter sufficiently. Description adds no additional semantic detail beyond the schema.

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?

Description clearly states the action ('List'), the resource ('FRED data sources a release draws from'), and explicitly distinguishes from the sibling tool 'get_source_releases' by calling it the reverse.

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

Usage Guidelines4/5

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

Implicitly provides usage guidance by referencing the reverse operation, but lacks explicit when-to-use or when-not-to-use criteria.

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

get_release_tablesA
Read-onlyIdempotent

Fetch a FRED release's table tree — the nested layout (sections, tables, and the series rows beneath them) it uses to present its series. Optionally scope to the subtree rooted at one element id, and optionally fold each series row's observation value (at observation_date, or FRED's latest) into the tree via include_observation_values. Returns the tree as structured JSON, with each element's children nested under it. Note: element_id takes precedence over release_id — FRED resolves the element by its own id, so an element from another release yields that release's subtree. Note: each returned row's observation_date is FRED's display label (e.g. "Jun 2026"), not an ISO YYYY-MM-DD date like the inputs — it is not round-trippable back into any date parameter.

ParametersJSON Schema
NameRequiredDescriptionDefault
element_idNoReturn only the subtree rooted at this element id (omit for the whole tree). Takes precedence over `release_id`: FRED resolves the element by its own id, so if it belongs to a different release you get *that* release's subtree and `release_id` is effectively ignored. Pass an element that belongs to `release_id`.
release_idYesThe FRED release id, e.g. 10 (Consumer Price Index).
observation_dateNoObservation value as of this date, `YYYY-MM-DD`. Implies `include_observation_values`.
include_observation_valuesNoFold each series row's observation value into the tree (structure-only otherwise). FRED returns its latest value unless `observation_date` is set.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesThe name of the requested element, when a subtree was requested.
rootsYesThe root elements of the tree, ordered by element id. (FRED's redundant top-level `release_id` — a string, unlike the numeric one on each element — is dropped; the caller already knows it.) On the wire FRED names this `elements` (a flattened object keyed by id); we read that, keep only the tree's true roots, and re-serialize as a `roots` array (see `roots_from_map`).
element_idYesThe id of the requested element, when a subtree was requested.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint, non-destructive), the description adds valuable behavioral details: element_id overrides release_id, returned observation_date is a display label not ISO, and the date is not round-trippable. This fully informs the agent of non-obvious behavior.

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

Conciseness5/5

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

The description is concise yet comprehensive, using a few well-structured sentences. It front-loads the primary purpose, then covers options and caveats without unnecessary words. The two notes are placed appropriately.

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?

Given the tool's complexity (hierarchical tree, optional subtrees, observation inclusion, date caveat), the description fully covers what an agent needs to invoke it correctly. The output schema exists, so return value details are not required.

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

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3. The description adds significant extra meaning: element_id precedence and cross-release behavior, release_id example, observation_date format and implication, and include_observation_values default logic. This greatly aids correct parameter usage.

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?

The description clearly states 'Fetch a FRED release's table tree' with a specific verb and resource, and elaborates on the nested layout. It distinguishes itself from sibling tools like get_release_series by focusing on the hierarchical tree structure.

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

Usage Guidelines4/5

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

The description explains optional scoping and observation value inclusion, and provides important notes about element_id precedence and date format. However, it does not explicitly contrast with sibling tools or state when not to use.

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

get_release_tagsA
Read-onlyIdempotent

List the tags used by the series in a FRED release (the tag facets for browsing a release), with pagination metadata. Optionally filter by search text; supports sort direction and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction (tags are ordered by series count by default).
limitNoMaximum number of tags to return.
release_idYesThe FRED release id, e.g. 53 (Gross Domestic Product).
search_textNoRestrict to tags matching this text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsYesThe tags on this page.
countYesTotal number of tags available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of tags skipped) for this page.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. Description adds behavioral context: pagination metadata, optional search text, sort direction, and result limit. This goes beyond annotations to clarify filtering and output structure.

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

Conciseness5/5

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

Description is a single, well-structured sentence that front-loads the main purpose and lists optional filters efficiently. No unnecessary words, every clause adds value.

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

Completeness4/5

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

Given the presence of an output schema and rich annotations, the description covers the tool's core functionality and optional parameters. It does not discuss return details, but output schema handles that. Minor gap: could mention sorting default (tags ordered by series count), but that's in schema for 'sort' parameter.

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

Parameters3/5

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 each parameter. Description provides overall context ('pagination metadata') but does not add detail beyond what the schema provides for individual parameters. Baseline 3 is appropriate.

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

Purpose4/5

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

Description clearly states 'List the tags used by the series in a FRED release' with additional details like pagination metadata. However, it does not explicitly differentiate from sibling tools like get_release_related_tags, though the context 'tag facets for browsing a release' hints at its specific purpose.

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

Usage Guidelines3/5

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

Description implies usage: use when you need tags of a release with optional filters. But no explicit when-not or direct alternatives among siblings (e.g., get_tags vs get_release_tags). Usage context is implied but not explicit.

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

get_seriesA
Read-onlyIdempotent

Fetch metadata for a FRED series by its id (e.g. GNPCA, UNRATE): title, frequency, seasonal adjustment, units, observation date range, and popularity.

ParametersJSON Schema
NameRequiredDescriptionDefault
series_idYesThe FRED series id, e.g. `GNPCA` or `UNRATE`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe series identifier.
notesYesEditorial notes, when present.
titleYesHuman-readable title, e.g. `"Real Gross National Product"`.
unitsYesFree-form units description, e.g. `"Billions of Chained 2017 Dollars"`. This is descriptive text, *not* the closed-vocabulary units transform used in observation requests (modelled separately, later).
frequencyYesThe series' native reporting frequency.
popularityYesFRED popularity score (0–100).
last_updatedYesWhen FRED last updated the series, as FRED's raw timestamp string.
observation_endYesDate of the latest available observation.
observation_startYesDate of the earliest available observation.
seasonal_adjustmentYesWhether/how the series is seasonally adjusted.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds specific metadata fields returned, which is helpful behavioral context beyond 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.

Conciseness5/5

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

Single sentence, well-front-loaded with the verb 'Fetch metadata' and includes key details. No unnecessary words.

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?

Given the simple single-parameter tool and the presence of an output schema, the description adequately lists the returned metadata fields, making it complete for agent use.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description provides an example of series_id but does not add meaning beyond what the schema already states. Baseline 3 is appropriate.

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?

The description clearly states the tool fetches metadata for a FRED series by its id, listing specific metadata fields (title, frequency, etc.), distinguishing it from sibling tools that deal with categories, releases, or tags.

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

Usage Guidelines3/5

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

The description implies usage for retrieving series metadata but does not explicitly state when to use vs. alternatives or when not to use it. Sibling tools are listed but no comparison is made.

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

get_series_categoriesA
Read-onlyIdempotent

List the categories a FRED series belongs to (the reverse of get_category_series): given a series id, where it sits in the category tree.

ParametersJSON Schema
NameRequiredDescriptionDefault
series_idYesThe FRED series id, e.g. `GNPCA` or `UNRATE`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesThe number of categories returned.
categoriesYesThe categories the series belongs to.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds value beyond annotations by clarifying the tool is a reverse lookup and providing hierarchical context ('where it sits in the category tree'). No contradictions or omissions. Slight deduction because it could mention the output structure explicitly, but output schema reduces need.

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

Conciseness5/5

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

The description is a single, well-structured sentence. It starts with the action verb, includes the core purpose, and adds context efficiently. No unnecessary words.

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?

Given the tool has a single parameter, full annotations, an output schema, and a clear description that distinguishes it from siblings, the description is complete. It provides all needed context for an agent to select and invoke correctly.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the input schema provides a detailed description for series_id with examples. The tool description does not add extra parameter information, but that is acceptable since the schema fully covers it. Baseline of 3 is appropriate.

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?

The description uses the verb 'List' and explicitly states the action: 'list the categories a FRED series belongs to'. It also provides context by noting it's the reverse of get_category_series, clearly differentiating it from siblings. The purpose is specific and unambiguous.

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

Usage Guidelines4/5

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

The description gives clear usage context by naming the alternative tool (get_category_series) and explaining the reverse relationship. This helps the agent choose between them. However, it does not explicitly state when not to use this tool or provide exclusion criteria.

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

get_series_dataA
Read-onlyIdempotent

GeoFRED / Maps: fetch one regional series' values across regions, optionally over time. Give a regional series_id; with no date, FRED returns the most recent. Set date for a single date, or start_date for every date from then on. The result nests everything under a top-level meta object (FRED's own envelope, mirrored faithfully): the dated per-region values live under meta.data, which maps each observation date to a list of {region, code, value, series_id}; alongside them sit the display labels meta.title, meta.units, meta.region, meta.seasonality, and meta.frequency (see the output schema for the full shape).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoReport a single date, `YYYY-MM-DD` (default: the most recent).
series_idYesA regional FRED series id, e.g. `SMU56000000500000001`.
start_dateNoReport every date from this one onward, `YYYY-MM-DD`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaYesThe `meta` payload: the descriptive header plus the dated regional values.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent), the description details the return structure (meta object, data layout), default behavior (most recent date), and notes that results are mirrored faithfully. This adds significant context.

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

Conciseness5/5

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

The description is well-organized: purpose first, then parameter usage, then output structure. Every sentence provides essential information without redundancy.

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?

Given the output schema exists (referenced), the description covers the return format, default behavior, parameter semantics, and safety profile via annotations. It is fully adequate for a data-fetching tool.

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%, but the description adds value by explaining the interaction of date and start_date, and clarifies that no date returns the most recent. It also describes the series_id format with an example.

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?

The description starts with a specific verb ('fetch') and resource ('regional series values across regions'), clearly distinguishing it from sibling tools like get_series which retrieve metadata or search tags.

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

Usage Guidelines4/5

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

The description explains when to use each parameter (most recent, single date, date range) and gives an example series_id. It does not explicitly state alternatives but the context of regional maps makes it clear.

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

get_series_groupA
Read-onlyIdempotent

GeoFRED / Maps: fetch the series-group metadata for a regional series — pass a regional series_id and get the group it belongs to (title, region type, units, frequency, and the span of dates it covers).

ParametersJSON Schema
NameRequiredDescriptionDefault
series_idYesA regional FRED series id, e.g. `SMU56000000500000001`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleYesThe group's descriptive title, e.g. `"All Employees: Total Private"`.
unitsYesThe units as a display label, e.g. `"Thousands of Persons"`.
seasonYesThe seasonality, as FRED reports it here (a short code, e.g. `"NSA"`).
max_dateYesThe latest date the group has data for.
min_dateYesThe earliest date the group has data for.
frequencyYesThe frequency as a display label, e.g. `"Monthly"`.
region_typeYesThe region granularity as a display label, e.g. `"state"`.
series_groupYesThe group's identifier (FRED's own `series_group` field), e.g. `1223`.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. Description adds value by specifying the exact return fields (title, region type, units, frequency, span), which goes beyond what annotations provide. No behavioral contradictions.

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

Conciseness5/5

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

Single, well-structured sentence with front-loaded key information. Every word adds value; no fluff.

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 simple tool with one required parameter, high schema coverage, and an output schema, the description is entirely sufficient. It covers the tool's purpose, input, and output comprehensively.

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% with a clear description and example for series_id. Description adds context by explaining that the parameter must be a regional series_id and that the response depends on it, including a list of output fields. This is above the baseline of 3 because the description enriches understanding.

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?

Clearly states the verb (fetch), resource (series-group metadata), and scope (for a regional series). Distinguishes from siblings by explicitly mentioning 'GeoFRED / Maps' and 'regional series', which sets it apart from general series tools like get_series_data or get_series.

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

Usage Guidelines4/5

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

Describes what input to provide (a regional series_id) and what output to expect (group metadata). While not explicitly stating when not to use it or naming alternatives, the context of 'regional series' implicitly guides the agent to use this instead of general series tools.

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

get_series_releaseA
Read-onlyIdempotent

Fetch the release a FRED series belongs to (the reverse of get_release_series): given a series id, its publishing release.

ParametersJSON Schema
NameRequiredDescriptionDefault
series_idYesThe FRED series id, e.g. `GNPCA` or `UNRATE`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe release's identifier.
linkYesA link to the release on the source's site, when FRED provides one.
nameYesHuman-readable name, e.g. `"Gross Domestic Product"`.
press_releaseYesWhether the release is accompanied by a press release.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering safety and idempotency. The description adds no new behavioral details beyond confirming it fetches data. It does not contradict annotations.

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

Conciseness5/5

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

The description is a single, well-structured sentence that conveys the tool's purpose and relationship to a sibling tool without any unnecessary words. Every part is informative.

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?

Given the tool's low complexity (one required parameter, simple purpose), and availability of an output schema, the description is complete enough. It covers what the tool does and how it relates to another tool.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with one parameter (series_id) described in the schema. The description does not add extra meaning or constraints beyond what the schema provides, so baseline score applies.

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?

The description explicitly states the purpose: 'Fetch the release a FRED series belongs to', with a specific verb and resource. It also notes this is the reverse of get_release_series, distinguishing it from a sibling tool.

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

Usage Guidelines4/5

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

The description clearly indicates when to use this tool (given series id, find its release) and contrasts it with get_release_series, providing context on the relationship. While it doesn't explicitly state when not to use it, the context is sufficient.

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

get_series_search_tagsA
Read-onlyIdempotent

List the tags on the series matching a full-text search (its tag facets, for narrowing the search down), with pagination metadata. Optionally filter the tags by text; supports sort direction and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction (tags are ordered by series count by default).
limitNoMaximum number of tags to return.
search_textYesThe series search text, e.g. "unemployment rate". Must be non-empty.
tag_search_textNoRestrict to tags matching this text (FRED's `tag_search_text`).

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsYesThe tags on this page.
countYesTotal number of tags available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of tags skipped) for this page.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds context about pagination metadata and optional sorting/filtering, which is valuable beyond annotations. No contradictions.

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

Conciseness5/5

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

Two concise sentences that front-load the main purpose and include key capabilities. No superfluous text.

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

Completeness4/5

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

With full schema coverage, output schema present, and strong annotations, the description is adequate. It could mention what pagination metadata includes, but the output schema likely covers that. Overall complete for the tool's complexity.

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

Parameters3/5

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 rephrases what the schema says (optional filter, sort, limit). It does not add new meaning or usage details beyond the schema descriptions.

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?

The description clearly states the tool lists tags on series matching a full-text search, with specific details like pagination and optional filters. It differentiates from siblings like get_series_tags (for a specific series) by focusing on search results.

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

Usage Guidelines4/5

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

The description implies usage for narrowing down search results via tags, and mentions optional filtering. It does not explicitly state when not to use or list alternatives, but the purpose is sufficiently clear for agent selection.

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

get_series_tagsA
Read-onlyIdempotent

List the tags attached to a FRED series (the reverse of get_tags_series): given a series id, what keywords classify it.

ParametersJSON Schema
NameRequiredDescriptionDefault
series_idYesThe FRED series id, e.g. `GNPCA` or `UNRATE`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsYesThe tags on this page.
countYesTotal number of tags available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of tags skipped) for this page.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds no behavioral context beyond what annotations provide, so it meets the baseline but adds little extra value.

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

Conciseness5/5

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

Two sentences, front-loaded with the main action and sibling reference. No wasted words.

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 simple tool with one parameter, comprehensive annotations, and an output schema (not shown but exists), the description is complete, including the reverse relationship hint.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description covers the single 'series_id' parameter with an example. Description does not add further parameter details, so baseline score of 3 is appropriate given 100% schema coverage.

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?

The description clearly states the action ('List the tags'), the resource ('FRED series'), and explicitly distinguishes from a sibling tool ('the reverse of get_tags_series').

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

Usage Guidelines4/5

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

The description provides a clear context by naming the sibling tool 'get_tags_series' as the reverse operation, implying when to use each. However, it does not include explicit when-not or alternative scenarios.

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

get_series_updatesA
Read-onlyIdempotent

List the FRED series updated most recently (a "what changed" feed, ordered by last-updated time), with pagination metadata. Optionally narrow to macro or regional series, or to a start_time/end_time update window (both required together, YYYY-MM-DDTHH:MM in FRED's timezone).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of series to return.
filterNoNarrow to a class of series: `all` (default), `macro`, or `regional`.
end_timeNoEnd of the update time window, same format. Must be given together with `start_time`.
start_timeNoStart of the update time window, `YYYY-MM-DDTHH:MM` in FRED's timezone (to the minute). Must be given together with `end_time`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of matches across all pages.
limitYesPage-size limit that FRED applied.
offsetYesOffset of this page into the full result set.
seriesYesThe matching series on this page. FRED names the array `seriess` (sic) on the wire; we read that but emit the correctly-spelled `series` on output.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds behavioral details beyond annotations: ordering by last-updated time, the mutual requirement of start_time and end_time, and the datetime format hint. No contradictions.

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

Conciseness5/5

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

Two sentences with no wasted words. The main purpose is front-loaded, and all additional detail is directly relevant.

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?

Given the tool's complexity (4 optional parameters, output schema present), the description fully covers purpose, filtering options, and time window constraints. No gaps.

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 description coverage is 100%, but the description adds value by explaining the filter enum values ('all', 'macro', 'regional') and the mutual requirement of start_time and end_time with format specificity.

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?

The description uses a specific verb 'List' and a clear resource 'FRED series', distinguishes from siblings by focusing on 'updated most recently', and mentions 'pagination metadata' which sets it apart from other series tools.

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

Usage Guidelines4/5

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

The description explains when to use ('a 'what changed' feed'), and provides guidance on optional narrowing with filter and time window. It explicitly states that start_time and end_time must be given together, but does not mention alternatives or when not to use.

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

get_series_vintagedatesA
Read-onlyIdempotent

List a FRED series' vintage dates — the dates on which it was revised or newly released, i.e. how the series looked at each point in time. Supports sort direction and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction (oldest first by default).
limitNoMaximum number of dates to return.
series_idYesThe FRED series id, e.g. `GNPCA` or `UNRATE`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of vintage dates available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of dates skipped) for this page.
vintage_datesYesThe vintage dates on this page, oldest first by default.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint. The description adds useful behavioral context: explains what vintage dates represent and mentions sort/limit support. No contradictions.

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

Conciseness5/5

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

Two concise sentences, front-loaded with purpose, no fluff. Every sentence adds value.

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

Completeness4/5

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

For a read-only list tool with output schema, the description covers what vintage dates are and mentions key parameters. Lacks typical use case examples but is sufficient.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and descriptions of parameters are already provided. The description only loosely references sort and limit without adding new meaning.

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?

Clearly states the verb 'list' and the resource 'vintage dates of a FRED series'. Adds context explaining that these are dates of revisions/new releases, which distinguishes it from other series tools like get_observations or get_series_updates.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like get_observations or get_series_updates. Does not specify prerequisites or exclusions.

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

get_sourceA
Read-onlyIdempotent

Fetch a FRED data source by its id (e.g. 18 = U.S. Bureau of Economic Analysis): its name and link.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_idYesThe FRED source id, e.g. 18 (U.S. Bureau of Economic Analysis).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesThe source's identifier.
linkYesA link to the source's site, when FRED provides one.
nameYesHuman-readable name, e.g. `"U.S. Bureau of Economic Analysis"`.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false. The description adds that it returns name and link, complementing the safe-read nature. No contradiction.

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

Conciseness5/5

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

Single sentence, no filler, front-loaded with the key action and resource. Every word is informative.

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?

Has output schema, schema coverage 100%, annotations complete. The description is sufficient for an agent to understand and invoke this simple lookup tool.

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 covers 100% with description of source_id. The description adds an example (18 = U.S. Bureau of Economic Analysis) and states the return fields, providing additional value beyond the schema.

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?

The description clearly states the verb 'Fetch', the resource 'FRED data source', and specifies the return fields 'name and link'. It distinguishes from siblings like get_sources (list all) or get_category (different entity).

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

Usage Guidelines4/5

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

The description explains usage by source ID with an example. While it doesn't explicitly say when not to use (e.g., for listing use get_sources), the context of sibling tools implies the correct use case.

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

get_source_releasesA
Read-onlyIdempotent

List the releases produced by a FRED data source, with pagination metadata. Supports sort direction and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction.
limitNoMaximum number of releases to return.
source_idYesThe FRED source id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of releases available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of releases skipped) for this page.
releasesYesThe releases on this page.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare read-only and idempotent behavior, so the burden is low. The description adds context about pagination metadata and sorting/limits, which enriches understanding beyond annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with the primary action, no wasted words. Efficient and clear.

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

Completeness4/5

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

For a simple list tool with full schema and annotations, the description adequately covers purpose and behavior. Lacks usage guidelines, but annotations and schema fill other gaps.

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

Parameters3/5

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 mentions pagination metadata and supports sort direction and limit, but does not add significant detail beyond the schema's existing descriptions.

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?

The description clearly states the tool lists releases for a FRED data source, with a specific verb and resource, and distinguishes from siblings by specifying 'produced by a FRED data source' rather than all releases.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives like get_releases or get_source. The description does not provide context for exclusion or mention sister tools.

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

get_sourcesA
Read-onlyIdempotent

List FRED data sources (the organizations that produce releases, e.g. the Bureau of Economic Analysis), with pagination metadata. Supports sort direction and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction by source id.
limitNoMaximum number of sources to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of sources available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of sources skipped) for this page.
sourcesYesThe sources on this page.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate readOnly, idempotent, not destructive. The description adds behavioral context about pagination metadata and support for sort direction/limit, which aligns with annotations. No contradictions.

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?

The description is a single concise sentence that covers the core purpose and key features. It is front-loaded with the main action and resource. Could be slightly improved with structured clarity, but overall efficient.

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

Completeness4/5

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

For a simple list tool with two parameters and an output schema, the description provides sufficient context: what is listed, with pagination metadata, and supported parameters. It is complete enough for an agent to understand the tool's behavior.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are fully described in the schema. The description simply echoes that sort direction and limit are supported, adding no additional semantic detail beyond what the schema provides.

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?

The description clearly states it lists FRED data sources, provides a concrete example (Bureau of Economic Analysis), and specifies it includes pagination metadata. This distinguishes it from sibling tools like get_source (singular) and get_source_releases.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool versus alternatives. It only describes what the tool does, with no exclusions or conditions. While sibling context suggests it is for listing all sources, no direct guidance is provided.

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

get_tagsA
Read-onlyIdempotent

Browse or search FRED's tag vocabulary (keywords such as "gdp", "quarterly", "nsa" used to classify series). Optionally filter by search text. Returns tags with their group, popularity, and series count.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction (tags are ordered by series count by default).
limitNoMaximum number of tags to return.
search_textNoRestrict to tags matching this text; omit to browse the whole vocabulary.

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsYesThe tags on this page.
countYesTotal number of tags available (across all pages).
limitYesThe page-size limit that was applied.
offsetYesThe offset (number of tags skipped) for this page.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. Description adds return details (group, popularity, series count) and filtering behavior, providing useful context beyond annotations.

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

Conciseness5/5

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

Two concise sentences with front-loaded main action. Every sentence adds value without redundancy.

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?

Given full schema coverage and presence of output schema, the description covers the tool's purpose, optional parameters, and return structure adequately for selection and invocation.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions already present. Description reiterates filtering by search text but does not add significant new semantics beyond what the schema provides.

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?

Clearly states 'Browse or search FRED's tag vocabulary' with specific verb-resource pair. Distinguishes from sibling tools like get_related_tags by focusing on the whole vocabulary with optional filtering.

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

Usage Guidelines4/5

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

Explains optional filtering by search text and return content. Implies browsing vs. filtering, but does not explicitly state when to use this tool versus sibling tag tools like get_category_tags.

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

get_tags_seriesA
Read-onlyIdempotent

List the FRED series carrying ALL of the given tags (faceted discovery), with pagination metadata. Supports ordering, sort direction, and a result limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction.
limitNoMaximum number of series to return.
order_byNoField to order results by.
tag_namesYesThe tag names; returns the series carrying *all* of them (e.g. `["gdp", "quarterly"]`). Must contain at least one tag.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of matches across all pages.
limitYesPage-size limit that FRED applied.
offsetYesOffset of this page into the full result set.
seriesYesThe matching series on this page. FRED names the array `seriess` (sic) on the wire; we read that but emit the correctly-spelled `series` on output.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive). The description adds behavioral context about pagination metadata and ordering/sort/limit capabilities, which helps the agent understand output shape and options beyond 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.

Conciseness5/5

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

The description is a single, information-dense sentence that introduces the action, the scope, and the key features. No wasted words.

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

Completeness4/5

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

Given the output schema and annotations, the description is sufficient. It explains the AND-tag behavior, pagination, and supported options, though it doesn't detail return fields beyond 'pagination metadata' (covered by output schema).

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover 100% of parameters, including tag_names semantics ('all' tags). The description mentions ordering and limit but doesn't add new semantics; baseline 3 is appropriate as schema does the heavy lifting.

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?

The description uses a specific verb ('List'), identifies the resource ('FRED series'), and specifies the filter ('carrying ALL of the given tags (faceted discovery)'). This clearly distinguishes it from siblings like get_series (all series) or get_series_tags (tags for a series).

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

Usage Guidelines4/5

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

It states a clear context: 'faceted discovery' for finding series by multiple tags. It does not explicitly list when not to use or name alternatives, but the 'ALL' qualifier differentiates it from tag search (get_related_tags) and series search.

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

search_seriesA
Read-onlyIdempotent

Search FRED for series matching text. Returns the matching series along with pagination metadata (total match count, offset, limit).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort direction.
textYesWords to search for, e.g. "unemployment rate". Must be non-empty.
limitNoMaximum number of results to return.
order_byNoField to order results by (default: search relevance).

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesTotal number of matches across all pages.
limitYesPage-size limit that FRED applied.
offsetYesOffset of this page into the full result set.
seriesYesThe matching series on this page. FRED names the array `seriess` (sic) on the wire; we read that but emit the correctly-spelled `series` on output.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare read-only, open-world, and idempotent behavior. The description adds pagination metadata details (total count, offset, limit), which is useful context beyond annotations, but no additional side-effect information or edge cases.

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

Conciseness5/5

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

Two concise sentences, front-loaded with purpose, no fluff. Every word earns its place.

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

Completeness4/5

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

For a read-only search tool with an output schema, annotations, and fully described parameters, the description is adequate. It covers core behavior and return metadata without needing to explain every option.

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

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with all parameters documented (text, limit, order_by, sort). The description doesn't add parameter-level detail beyond mentioning 'text' implicitly, so it stays at baseline.

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?

The description clearly states the verb 'Search', the resource 'FRED series', and the key parameter 'text'. It also mentions the return of pagination metadata, distinguishing it from tools like get_series (specific series retrieval) and other search-related tools for tags.

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

Usage Guidelines4/5

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

The context is clear: use this tool to find series by text. It doesn't explicitly name alternatives or exclusions, but the purpose strongly implies when to use it.

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. Dates show when Glama detected each change.

  1. 14 tool updatesv0.3.11
    • Addedget_category
    • Addedget_category_children
    • Addedget_category_related
    • Addedget_category_related_tags
    • Addedget_category_series
    • Addedget_category_tags
    • Addedget_observations
    • Addedget_regional_data
    • Addedget_related_tags
    • Addedget_release
    • Addedget_release_dates
    • Addedget_release_related_tags
    • Addedget_tags_series
    • Addedsearch_series
  2. 5 tool updatesv0.3.10
    • Removedget_category_children
    • Addedget_release_series
    • Addedget_source_releases
    • Removedget_tags_series
    • Removedsearch_series
  3. 14 tool updates
    • Removedget_category
    • Removedget_category_related
    • Removedget_category_related_tags
    • Removedget_category_series
    • Removedget_category_tags
    • Removedget_observations
    • Removedget_regional_data
    • Removedget_related_tags
    • Removedget_release
    • Removedget_release_dates
    • Removedget_release_related_tags
    • Removedget_release_series
    • Changedget_release_tables1 field changed
      • changedOutput schema / $defs / ReleaseTableElement / properties / observation_date / description
        Previous value: -"FRED's formatted label for the [`observation_value`](ReleaseTableElement::observation_value)\ndate, e.g. `\"Jun 2023\"` or `\"2023\"` — a display string keyed to the\nseries' frequency, **not** an ISO date (unlike the request's\n`observation_date`). `None` when values weren't requested or the element\ncarries no series."New value: +"FRED's formatted label for the [`observation_value`](ReleaseTableElement::observation_value)\ndate, e.g. `\"Jun 2023\"` or `\"2023\"` — a human-readable **display string**\nkeyed to the series' frequency, **not** an ISO `YYYY-MM-DD` date (unlike\nevery date *input*, including the request's `observation_date`). It is\ntherefore **not round-trippable**: it cannot be parsed deterministically\nor fed back into any date parameter. `None` when values weren't requested\nor the element carries no series."
    • Removedget_source_releases
  4. 9 tool updatesv0.3.9
    • Changedget_category_related_tags2 fields changed
      • changedInput schema / properties / tag_names / description
        Previous value: -"Seed tag names; returns the tags co-occurring, within the category, with\n*all* of them."New value: +"Seed tag names; returns the tags co-occurring, within the category, with\n*all* of them. Must contain at least one tag."
      • addedInput schema / properties / tag_names / minItems
        Added value: +1
    • Changedget_observations2 fields changed
      • changedInput schema / properties / aggregation / description
        Previous value: -"Aggregation method, used together with `frequency`."New value: +"Aggregation method — how observations are combined when aggregating to\n`frequency`. Requires `frequency`; on its own it is ignored."
      • changedInput schema / properties / frequency / description
        Previous value: -"Frequency to aggregate observations down to."New value: +"Frequency to aggregate observations down to. FRED can only aggregate to a\nfrequency **coarser than** the series' native one (e.g. a monthly series to\nquarterly or annual, never a coarser series to a finer one); asking for a\nfiner or invalid frequency returns a FRED 400."
    • Changedget_related_tags2 fields changed
      • changedInput schema / properties / tag_names / description
        Previous value: -"Seed tag names; returns the tags that co-occur with *all* of them."New value: +"Seed tag names; returns the tags that co-occur with *all* of them. Must\ncontain at least one tag."
      • addedInput schema / properties / tag_names / minItems
        Added value: +1
    • Changedget_release_related_tags2 fields changed
      • changedInput schema / properties / tag_names / description
        Previous value: -"Seed tag names; returns the tags co-occurring, within the release, with\n*all* of them."New value: +"Seed tag names; returns the tags co-occurring, within the release, with\n*all* of them. Must contain at least one tag."
      • addedInput schema / properties / tag_names / minItems
        Added value: +1
    • Changedget_release_tables2 fields changed
      • changedInput schema / properties / element_id / description
        Previous value: -"Return only the subtree rooted at this element id (omit for the whole\ntree)."New value: +"Return only the subtree rooted at this element id (omit for the whole\ntree). Takes precedence over `release_id`: FRED resolves the element by its\nown id, so if it belongs to a different release you get *that* release's\nsubtree and `release_id` is effectively ignored. Pass an element that\nbelongs to `release_id`."
      • changedOutput schema / properties / roots / description
        Previous value: -"The root elements of the tree, ordered by element id. (FRED's redundant\ntop-level `release_id` — a string, unlike the numeric one on each\nelement — is dropped; the caller already knows it.)\n\nOn the wire FRED names this `elements` (an object keyed by id); we read\nthat but re-serialize as a `roots` array, matching this field and the\nflattened shape."New value: +"The root elements of the tree, ordered by element id. (FRED's redundant\ntop-level `release_id` — a string, unlike the numeric one on each\nelement — is dropped; the caller already knows it.)\n\nOn the wire FRED names this `elements` (a flattened object keyed by id);\nwe read that, keep only the tree's true roots, and re-serialize as a\n`roots` array (see `roots_from_map`)."
    • Changedget_series_search_related_tags4 fields changed
      • changedInput schema / properties / search_text / description
        Previous value: -"The series search text, e.g. \"unemployment rate\"."New value: +"The series search text, e.g. \"unemployment rate\". Must be non-empty."
      • addedInput schema / properties / search_text / minLength
        Added value: +1
      • changedInput schema / properties / tag_names / description
        Previous value: -"Seed tag names; returns the tags co-occurring, among the matching series,\nwith *all* of them."New value: +"Seed tag names; returns the tags co-occurring, among the matching series,\nwith *all* of them. Must contain at least one tag."
      • addedInput schema / properties / tag_names / minItems
        Added value: +1
    • Changedget_series_search_tags2 fields changed
      • changedInput schema / properties / search_text / description
        Previous value: -"The series search text, e.g. \"unemployment rate\"."New value: +"The series search text, e.g. \"unemployment rate\". Must be non-empty."
      • addedInput schema / properties / search_text / minLength
        Added value: +1
    • Changedget_tags_series2 fields changed
      • changedInput schema / properties / tag_names / description
        Previous value: -"The tag names; returns the series carrying *all* of them (e.g.\n`[\"gdp\", \"quarterly\"]`)."New value: +"The tag names; returns the series carrying *all* of them (e.g.\n`[\"gdp\", \"quarterly\"]`). Must contain at least one tag."
      • addedInput schema / properties / tag_names / minItems
        Added value: +1
    • Changedsearch_series2 fields changed
      • changedInput schema / properties / text / description
        Previous value: -"Words to search for, e.g. \"unemployment rate\"."New value: +"Words to search for, e.g. \"unemployment rate\". Must be non-empty."
      • addedInput schema / properties / text / minLength
        Added value: +1
  5. 10 tool updatesv0.3.7
    • Changedget_category_series1 field changed
      • changedOutput schema / $defs / Series / description
        Previous value: -"Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement."New value: +"Metadata describing a FRED series (the `fred/series` endpoint).\n\nThis `series` metadata endpoint's own ALFRED fields (`realtime_start` /\n`realtime_end`) are still ignored on the wire (ADR-0005); point-in-time\n*observations* are supported via [`Observation`](crate::Observation) and\n[`ObservationsRequest::realtime`](crate::ObservationsRequest::realtime)\n(ADR-0024). `last_updated` is kept as FRED's raw string for now — FRED\nencodes it with a non-standard timezone offset (e.g. `2024-03-28 07:56:03-05`);\na typed datetime is a later refinement."
    • Changedget_observations7 fields changed
      • addedInput schema / properties / realtime_end
        Added value: +{
        +  "description": "ALFRED: end of the real-time period, `YYYY-MM-DD`. Must be given together\nwith `realtime_start`.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / realtime_start
        Added value: +{
        +  "description": "ALFRED: start of the real-time period, `YYYY-MM-DD` — the data as it was\nknown then. Use the same value for `realtime_end` to snapshot the series\nas of one day (point-in-time). Must be given together with `realtime_end`.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / vintage_dates
        Added value: +{
        +  "description": "ALFRED: specific revision dates to fetch, each `YYYY-MM-DD`. Each date\nselects that vintage of the series.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / Observation / description
        Previous value: -"A single observation in a FRED series: a calendar date and its value.\n\nFRED transmits the value as a string and encodes a *missing* value as the\nsentinel `\".\"`, which maps to `None`. Any other value parses to `Some(f64)`;\na non-`\".\"` value that fails to parse is a deserialization error, not a\nsilent `None` (see ADR-0004 and ADR-0005).\n\nOn *serialization* the value is emitted as a JSON number or `null` — typed\nJSON for consumers, not FRED's stringly-typed `\".\"` wire format."New value: +"A single observation in a FRED series: a calendar date, its value, and the\nreal-time period that value was current for (ALFRED — ADR-0024).\n\nFRED transmits the value as a string and encodes a *missing* value as the\nsentinel `\".\"`, which maps to `None`. Any other value parses to `Some(f64)`;\na non-`\".\"` value that fails to parse is a deserialization error, not a\nsilent `None` (see ADR-0004 and ADR-0005).\n\n[`realtime_start`](Observation::realtime_start) /\n[`realtime_end`](Observation::realtime_end) bound the period the value was the\ncurrent one — the ALFRED dimension. For a plain latest query FRED returns\ntoday for both; a point-in-time or `vintage_dates` query returns the period\nthe archived value held.\n\nOn *serialization* the value is emitted as a JSON number or `null` — typed\nJSON for consumers, not FRED's stringly-typed `\".\"` wire format."
      • addedOutput schema / $defs / Observation / properties / realtime_end
        Added value: +{
        +  "description": "End of the real-time period this value was current for (ALFRED). Equal to\ntoday for a latest query; the archived vintage's end otherwise.",
        +  "format": "date",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / Observation / properties / realtime_start
        Added value: +{
        +  "description": "Start of the real-time period this value was current for (ALFRED). Equal\nto today for a latest query; the archived vintage's start otherwise.",
        +  "format": "date",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / Observation / required
        Previous value: -[
        -  "date",
        -  "value"
        -]New value: +[
        +  "realtime_start",
        +  "realtime_end",
        +  "date",
        +  "value"
        +]
    • Addedget_regional_data
    • Changedget_release_series1 field changed
      • changedOutput schema / $defs / Series / description
        Previous value: -"Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement."New value: +"Metadata describing a FRED series (the `fred/series` endpoint).\n\nThis `series` metadata endpoint's own ALFRED fields (`realtime_start` /\n`realtime_end`) are still ignored on the wire (ADR-0005); point-in-time\n*observations* are supported via [`Observation`](crate::Observation) and\n[`ObservationsRequest::realtime`](crate::ObservationsRequest::realtime)\n(ADR-0024). `last_updated` is kept as FRED's raw string for now — FRED\nencodes it with a non-standard timezone offset (e.g. `2024-03-28 07:56:03-05`);\na typed datetime is a later refinement."
    • Changedget_release_tables5 fields changed
      • addedInput schema / properties / include_observation_values
        Added value: +{
        +  "description": "Fold each series row's observation value into the tree (structure-only\notherwise). FRED returns its latest value unless `observation_date` is set.",
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / observation_date
        Added value: +{
        +  "description": "Observation value as of this date, `YYYY-MM-DD`. Implies\n`include_observation_values`.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / $defs / ReleaseTableElement / properties / observation_date
        Added value: +{
        +  "default": null,
        +  "description": "FRED's formatted label for the [`observation_value`](ReleaseTableElement::observation_value)\ndate, e.g. `\"Jun 2023\"` or `\"2023\"` — a display string keyed to the\nseries' frequency, **not** an ISO date (unlike the request's\n`observation_date`). `None` when values weren't requested or the element\ncarries no series.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / $defs / ReleaseTableElement / properties / observation_value
        Added value: +{
        +  "default": null,
        +  "description": "The element's observation value at the request's `observation_date` (or\nFRED's latest), present only when the request set\n[`include_observation_values`](crate::ReleaseTablesRequest::include_observation_values).\n`None` for a structural (non-`series`) element, when values weren't\nrequested, or when FRED reports the value as missing (`\".\"`) — mirroring\n[`Observation`](crate::Observation)'s value handling.",
        +  "format": "double",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / ReleaseTableElement / required
        Previous value: -[
        -  "element_id",
        -  "release_id",
        -  "parent_id",
        -  "series_id",
        -  "type",
        -  "name",
        -  "line",
        -  "level",
        -  "children"
        -]New value: +[
        +  "element_id",
        +  "release_id",
        +  "parent_id",
        +  "series_id",
        +  "type",
        +  "name",
        +  "line",
        +  "level",
        +  "observation_value",
        +  "observation_date",
        +  "children"
        +]
    • Addedget_series_data
    • Addedget_series_group
    • Changedget_series_updates1 field changed
      • changedOutput schema / $defs / Series / description
        Previous value: -"Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement."New value: +"Metadata describing a FRED series (the `fred/series` endpoint).\n\nThis `series` metadata endpoint's own ALFRED fields (`realtime_start` /\n`realtime_end`) are still ignored on the wire (ADR-0005); point-in-time\n*observations* are supported via [`Observation`](crate::Observation) and\n[`ObservationsRequest::realtime`](crate::ObservationsRequest::realtime)\n(ADR-0024). `last_updated` is kept as FRED's raw string for now — FRED\nencodes it with a non-standard timezone offset (e.g. `2024-03-28 07:56:03-05`);\na typed datetime is a later refinement."
    • Changedget_tags_series1 field changed
      • changedOutput schema / $defs / Series / description
        Previous value: -"Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement."New value: +"Metadata describing a FRED series (the `fred/series` endpoint).\n\nThis `series` metadata endpoint's own ALFRED fields (`realtime_start` /\n`realtime_end`) are still ignored on the wire (ADR-0005); point-in-time\n*observations* are supported via [`Observation`](crate::Observation) and\n[`ObservationsRequest::realtime`](crate::ObservationsRequest::realtime)\n(ADR-0024). `last_updated` is kept as FRED's raw string for now — FRED\nencodes it with a non-standard timezone offset (e.g. `2024-03-28 07:56:03-05`);\na typed datetime is a later refinement."
    • Changedsearch_series1 field changed
      • changedOutput schema / $defs / Series / description
        Previous value: -"Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement."New value: +"Metadata describing a FRED series (the `fred/series` endpoint).\n\nThis `series` metadata endpoint's own ALFRED fields (`realtime_start` /\n`realtime_end`) are still ignored on the wire (ADR-0005); point-in-time\n*observations* are supported via [`Observation`](crate::Observation) and\n[`ObservationsRequest::realtime`](crate::ObservationsRequest::realtime)\n(ADR-0024). `last_updated` is kept as FRED's raw string for now — FRED\nencodes it with a non-standard timezone offset (e.g. `2024-03-28 07:56:03-05`);\na typed datetime is a later refinement."
  6. 31 tool updatesv0.3.6
    • Changedget_category1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "CategoryId": {
        +      "description": "A FRED category identifier — a numeric node in the category tree (the root is\n[`CategoryId::ROOT`], id `0`).\n\nA `Copy` newtype over `u32` so a category id can't be silently swapped for a\nparent id, a count, or an arbitrary number (ADR-0005). `#[serde(transparent)]`\ncarries it on the wire as the bare integer FRED sends.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "id": {
        +      "$ref": "#/$defs/CategoryId",
        +      "description": "The category's identifier."
        +    },
        +    "name": {
        +      "description": "Human-readable name, e.g. `\"Trade Balance\"`.",
        +      "type": "string"
        +    },
        +    "parent_id": {
        +      "$ref": "#/$defs/CategoryId",
        +      "default": 0,
        +      "description": "The parent category's id. For the root category this is\n[`CategoryId::ROOT`] (`0`), which FRED may also omit entirely."
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "parent_id"
        +  ],
        +  "type": "object"
        +}
    • Changedget_category_children1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Category": {
        +      "description": "A node in the FRED category tree (the `fred/category` and\n`fred/category/children` endpoints).",
        +      "properties": {
        +        "id": {
        +          "$ref": "#/$defs/CategoryId",
        +          "description": "The category's identifier."
        +        },
        +        "name": {
        +          "description": "Human-readable name, e.g. `\"Trade Balance\"`.",
        +          "type": "string"
        +        },
        +        "parent_id": {
        +          "$ref": "#/$defs/CategoryId",
        +          "default": 0,
        +          "description": "The parent category's id. For the root category this is\n[`CategoryId::ROOT`] (`0`), which FRED may also omit entirely."
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "parent_id"
        +      ],
        +      "type": "object"
        +    },
        +    "CategoryId": {
        +      "description": "A FRED category identifier — a numeric node in the category tree (the root is\n[`CategoryId::ROOT`], id `0`).\n\nA `Copy` newtype over `u32` so a category id can't be silently swapped for a\nparent id, a count, or an arbitrary number (ADR-0005). `#[serde(transparent)]`\ncarries it on the wire as the bare integer FRED sends.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "category_id": {
        +      "description": "The parent category whose children these are.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "children": {
        +      "description": "The child categories.",
        +      "items": {
        +        "$ref": "#/$defs/Category"
        +      },
        +      "type": "array"
        +    },
        +    "count": {
        +      "description": "The number of child categories returned.",
        +      "format": "uint",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "category_id",
        +    "count",
        +    "children"
        +  ],
        +  "type": "object"
        +}
    • Changedget_category_related1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Category": {
        +      "description": "A node in the FRED category tree (the `fred/category` and\n`fred/category/children` endpoints).",
        +      "properties": {
        +        "id": {
        +          "$ref": "#/$defs/CategoryId",
        +          "description": "The category's identifier."
        +        },
        +        "name": {
        +          "description": "Human-readable name, e.g. `\"Trade Balance\"`.",
        +          "type": "string"
        +        },
        +        "parent_id": {
        +          "$ref": "#/$defs/CategoryId",
        +          "default": 0,
        +          "description": "The parent category's id. For the root category this is\n[`CategoryId::ROOT`] (`0`), which FRED may also omit entirely."
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "parent_id"
        +      ],
        +      "type": "object"
        +    },
        +    "CategoryId": {
        +      "description": "A FRED category identifier — a numeric node in the category tree (the root is\n[`CategoryId::ROOT`], id `0`).\n\nA `Copy` newtype over `u32` so a category id can't be silently swapped for a\nparent id, a count, or an arbitrary number (ADR-0005). `#[serde(transparent)]`\ncarries it on the wire as the bare integer FRED sends.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "category_id": {
        +      "description": "The category whose related categories these are.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "count": {
        +      "description": "The number of related categories returned.",
        +      "format": "uint",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "related": {
        +      "description": "The related categories (often empty).",
        +      "items": {
        +        "$ref": "#/$defs/Category"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "category_id",
        +    "count",
        +    "related"
        +  ],
        +  "type": "object"
        +}
    • Changedget_category_related_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_category_series1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Frequency": {
        +      "type": "string"
        +    },
        +    "SeasonalAdjustment": {
        +      "type": "string"
        +    },
        +    "Series": {
        +      "description": "Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement.",
        +      "properties": {
        +        "frequency": {
        +          "$ref": "#/$defs/Frequency",
        +          "description": "The series' native reporting frequency."
        +        },
        +        "id": {
        +          "$ref": "#/$defs/SeriesId",
        +          "description": "The series identifier."
        +        },
        +        "last_updated": {
        +          "description": "When FRED last updated the series, as FRED's raw timestamp string.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Editorial notes, when present.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "observation_end": {
        +          "description": "Date of the latest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "observation_start": {
        +          "description": "Date of the earliest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "popularity": {
        +          "description": "FRED popularity score (0–100).",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "seasonal_adjustment": {
        +          "$ref": "#/$defs/SeasonalAdjustment",
        +          "description": "Whether/how the series is seasonally adjusted."
        +        },
        +        "title": {
        +          "description": "Human-readable title, e.g. `\"Real Gross National Product\"`.",
        +          "type": "string"
        +        },
        +        "units": {
        +          "description": "Free-form units description, e.g. `\"Billions of Chained 2017 Dollars\"`.\nThis is descriptive text, *not* the closed-vocabulary units transform\nused in observation requests (modelled separately, later).",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "observation_start",
        +        "observation_end",
        +        "frequency",
        +        "seasonal_adjustment",
        +        "units",
        +        "popularity",
        +        "notes",
        +        "last_updated"
        +      ],
        +      "type": "object"
        +    },
        +    "SeriesId": {
        +      "description": "A FRED series identifier, e.g. `GNPCA` or `UNRATE`.\n\nA newtype over `String` so a series id can't be silently swapped for another\nkind of identifier or an arbitrary string (see ADR-0005). Construction does\nno validation for now — FRED rejects malformed ids — but the newtype gives\nus a place to add it later without changing call sites.",
        +      "type": "string"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of matches across all pages.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "Page-size limit that FRED applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset of this page into the full result set.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "series": {
        +      "description": "The matching series on this page. FRED names the array `seriess` (sic) on\nthe wire; we read that but emit the correctly-spelled `series` on output.",
        +      "items": {
        +        "$ref": "#/$defs/Series"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "series",
        +    "count",
        +    "offset",
        +    "limit"
        +  ],
        +  "type": "object"
        +}
    • Changedget_category_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_observations1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Observation": {
        +      "description": "A single observation in a FRED series: a calendar date and its value.\n\nFRED transmits the value as a string and encodes a *missing* value as the\nsentinel `\".\"`, which maps to `None`. Any other value parses to `Some(f64)`;\na non-`\".\"` value that fails to parse is a deserialization error, not a\nsilent `None` (see ADR-0004 and ADR-0005).\n\nOn *serialization* the value is emitted as a JSON number or `null` — typed\nJSON for consumers, not FRED's stringly-typed `\".\"` wire format.",
        +      "properties": {
        +        "date": {
        +          "description": "The observation date. FRED dates are calendar dates with no time or zone,\nwhich [`NaiveDate`] models exactly.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "value": {
        +          "description": "The observation value; `None` when FRED reports it as missing (`\".\"`).",
        +          "format": "double",
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "date",
        +        "value"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "The number of observations returned.",
        +      "format": "uint",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "observations": {
        +      "description": "The observations, in the requested sort order.",
        +      "items": {
        +        "$ref": "#/$defs/Observation"
        +      },
        +      "type": "array"
        +    },
        +    "series_id": {
        +      "description": "The series the observations belong to.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "series_id",
        +    "count",
        +    "observations"
        +  ],
        +  "type": "object"
        +}
    • Changedget_related_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_release1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ReleaseId": {
        +      "description": "A FRED release identifier — the numeric id of a data release (a publication\nsuch as \"Gross Domestic Product\").\n\nA `Copy` newtype over `u32`, mirroring [`CategoryId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "id": {
        +      "$ref": "#/$defs/ReleaseId",
        +      "description": "The release's identifier."
        +    },
        +    "link": {
        +      "default": null,
        +      "description": "A link to the release on the source's site, when FRED provides one.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "description": "Human-readable name, e.g. `\"Gross Domestic Product\"`.",
        +      "type": "string"
        +    },
        +    "press_release": {
        +      "description": "Whether the release is accompanied by a press release.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "press_release",
        +    "link"
        +  ],
        +  "type": "object"
        +}
    • Changedget_release_dates1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ReleaseDate": {
        +      "description": "A single scheduled or historical release date, from the\n`fred/releases/dates` and `fred/release/dates` endpoints — the date a\nrelease was (or is scheduled to be) published.",
        +      "properties": {
        +        "date": {
        +          "description": "The date the release was, or is scheduled to be, published.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "release_id": {
        +          "$ref": "#/$defs/ReleaseId",
        +          "description": "The release this date belongs to."
        +        },
        +        "release_name": {
        +          "default": null,
        +          "description": "The release's name. `releases/dates` (which spans every release)\nincludes it; `release/dates` omits it, since the release is already\nfixed by the request.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "release_id",
        +        "release_name",
        +        "date"
        +      ],
        +      "type": "object"
        +    },
        +    "ReleaseId": {
        +      "description": "A FRED release identifier — the numeric id of a data release (a publication\nsuch as \"Gross Domestic Product\").\n\nA `Copy` newtype over `u32`, mirroring [`CategoryId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of release dates available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of dates skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "release_dates": {
        +      "description": "The release dates on this page.",
        +      "items": {
        +        "$ref": "#/$defs/ReleaseDate"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "release_dates"
        +  ],
        +  "type": "object"
        +}
    • Changedget_release_related_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_release_series1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Frequency": {
        +      "type": "string"
        +    },
        +    "SeasonalAdjustment": {
        +      "type": "string"
        +    },
        +    "Series": {
        +      "description": "Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement.",
        +      "properties": {
        +        "frequency": {
        +          "$ref": "#/$defs/Frequency",
        +          "description": "The series' native reporting frequency."
        +        },
        +        "id": {
        +          "$ref": "#/$defs/SeriesId",
        +          "description": "The series identifier."
        +        },
        +        "last_updated": {
        +          "description": "When FRED last updated the series, as FRED's raw timestamp string.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Editorial notes, when present.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "observation_end": {
        +          "description": "Date of the latest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "observation_start": {
        +          "description": "Date of the earliest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "popularity": {
        +          "description": "FRED popularity score (0–100).",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "seasonal_adjustment": {
        +          "$ref": "#/$defs/SeasonalAdjustment",
        +          "description": "Whether/how the series is seasonally adjusted."
        +        },
        +        "title": {
        +          "description": "Human-readable title, e.g. `\"Real Gross National Product\"`.",
        +          "type": "string"
        +        },
        +        "units": {
        +          "description": "Free-form units description, e.g. `\"Billions of Chained 2017 Dollars\"`.\nThis is descriptive text, *not* the closed-vocabulary units transform\nused in observation requests (modelled separately, later).",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "observation_start",
        +        "observation_end",
        +        "frequency",
        +        "seasonal_adjustment",
        +        "units",
        +        "popularity",
        +        "notes",
        +        "last_updated"
        +      ],
        +      "type": "object"
        +    },
        +    "SeriesId": {
        +      "description": "A FRED series identifier, e.g. `GNPCA` or `UNRATE`.\n\nA newtype over `String` so a series id can't be silently swapped for another\nkind of identifier or an arbitrary string (see ADR-0005). Construction does\nno validation for now — FRED rejects malformed ids — but the newtype gives\nus a place to add it later without changing call sites.",
        +      "type": "string"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of matches across all pages.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "Page-size limit that FRED applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset of this page into the full result set.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "series": {
        +      "description": "The matching series on this page. FRED names the array `seriess` (sic) on\nthe wire; we read that but emit the correctly-spelled `series` on output.",
        +      "items": {
        +        "$ref": "#/$defs/Series"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "series",
        +    "count",
        +    "offset",
        +    "limit"
        +  ],
        +  "type": "object"
        +}
    • Changedget_release_sources1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Source": {
        +      "description": "A FRED data source — the organization that produces releases (e.g. the\nBureau of Economic Analysis), from the `fred/source` and `fred/sources`\nendpoints.",
        +      "properties": {
        +        "id": {
        +          "$ref": "#/$defs/SourceId",
        +          "description": "The source's identifier."
        +        },
        +        "link": {
        +          "default": null,
        +          "description": "A link to the source's site, when FRED provides one.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "description": "Human-readable name, e.g. `\"U.S. Bureau of Economic Analysis\"`.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "link"
        +      ],
        +      "type": "object"
        +    },
        +    "SourceId": {
        +      "description": "A FRED source identifier — the numeric id of a data source (the organization\nthat produces a release, e.g. the Bureau of Economic Analysis).\n\nA `Copy` newtype over `u32`, mirroring [`ReleaseId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "The number of sources returned.",
        +      "format": "uint",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "sources": {
        +      "description": "The sources.",
        +      "items": {
        +        "$ref": "#/$defs/Source"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "sources"
        +  ],
        +  "type": "object"
        +}
    • Changedget_release_tables1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ReleaseElementId": {
        +      "description": "A FRED release-table element identifier — the numeric id of a node in a\nrelease's table tree (a section, table, or series row; see\n`fred/release/tables`).\n\nA `Copy` newtype over `u32`, mirroring [`ReleaseId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005). `Ord` lets the table\ndeserializer order its roots deterministically by id.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "ReleaseId": {
        +      "description": "A FRED release identifier — the numeric id of a data release (a publication\nsuch as \"Gross Domestic Product\").\n\nA `Copy` newtype over `u32`, mirroring [`CategoryId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "ReleaseTableElement": {
        +      "description": "A node in a release's table tree: a section, a table, or a series row. Nodes\nnest via [`children`](ReleaseTableElement::children) to arbitrary depth.",
        +      "properties": {
        +        "children": {
        +          "default": [],
        +          "description": "The child elements nested beneath this one (empty for a leaf).",
        +          "items": {
        +            "$ref": "#/$defs/ReleaseTableElement"
        +          },
        +          "type": "array"
        +        },
        +        "element_id": {
        +          "$ref": "#/$defs/ReleaseElementId",
        +          "description": "This element's id."
        +        },
        +        "level": {
        +          "description": "The element's depth as FRED reports it (`\"0\"` at the top). Mirrors the\nnesting of [`children`](ReleaseTableElement::children).",
        +          "type": "string"
        +        },
        +        "line": {
        +          "default": null,
        +          "description": "The element's line number within its table, when FRED provides one.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "description": "Human-readable label, e.g. `\"CPI for U.S. City Average\"`.",
        +          "type": "string"
        +        },
        +        "parent_id": {
        +          "anyOf": [
        +            {
        +              "$ref": "#/$defs/ReleaseElementId"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "default": null,
        +          "description": "The parent element's id, absent for a root."
        +        },
        +        "release_id": {
        +          "$ref": "#/$defs/ReleaseId",
        +          "description": "The release this element belongs to."
        +        },
        +        "series_id": {
        +          "anyOf": [
        +            {
        +              "$ref": "#/$defs/SeriesId"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "default": null,
        +          "description": "The series this element points to, for a `series`-type row. Absent for\nstructural elements (sections/tables), where FRED sends `null` or `\"\"`."
        +        },
        +        "type": {
        +          "description": "The element kind, e.g. `\"section\"`, `\"table\"`, or `\"series\"`. Kept as a\nstring (its vocabulary is open-ended and thinly documented; ADR-0017).",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "element_id",
        +        "release_id",
        +        "parent_id",
        +        "series_id",
        +        "type",
        +        "name",
        +        "line",
        +        "level",
        +        "children"
        +      ],
        +      "type": "object"
        +    },
        +    "SeriesId": {
        +      "description": "A FRED series identifier, e.g. `GNPCA` or `UNRATE`.\n\nA newtype over `String` so a series id can't be silently swapped for another\nkind of identifier or an arbitrary string (see ADR-0005). Construction does\nno validation for now — FRED rejects malformed ids — but the newtype gives\nus a place to add it later without changing call sites.",
        +      "type": "string"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "element_id": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/ReleaseElementId"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "default": null,
        +      "description": "The id of the requested element, when a subtree was requested."
        +    },
        +    "name": {
        +      "default": null,
        +      "description": "The name of the requested element, when a subtree was requested.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "roots": {
        +      "description": "The root elements of the tree, ordered by element id. (FRED's redundant\ntop-level `release_id` — a string, unlike the numeric one on each\nelement — is dropped; the caller already knows it.)\n\nOn the wire FRED names this `elements` (an object keyed by id); we read\nthat but re-serialize as a `roots` array, matching this field and the\nflattened shape.",
        +      "items": {
        +        "$ref": "#/$defs/ReleaseTableElement"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "element_id",
        +    "roots"
        +  ],
        +  "type": "object"
        +}
    • Changedget_release_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_releases1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Release": {
        +      "description": "A FRED data release — a publication such as \"Gross Domestic Product\", from\nthe `fred/release` and `fred/releases` endpoints.",
        +      "properties": {
        +        "id": {
        +          "$ref": "#/$defs/ReleaseId",
        +          "description": "The release's identifier."
        +        },
        +        "link": {
        +          "default": null,
        +          "description": "A link to the release on the source's site, when FRED provides one.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "description": "Human-readable name, e.g. `\"Gross Domestic Product\"`.",
        +          "type": "string"
        +        },
        +        "press_release": {
        +          "description": "Whether the release is accompanied by a press release.",
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "press_release",
        +        "link"
        +      ],
        +      "type": "object"
        +    },
        +    "ReleaseId": {
        +      "description": "A FRED release identifier — the numeric id of a data release (a publication\nsuch as \"Gross Domestic Product\").\n\nA `Copy` newtype over `u32`, mirroring [`CategoryId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of releases available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of releases skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "releases": {
        +      "description": "The releases on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Release"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "releases"
        +  ],
        +  "type": "object"
        +}
    • Changedget_releases_dates1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ReleaseDate": {
        +      "description": "A single scheduled or historical release date, from the\n`fred/releases/dates` and `fred/release/dates` endpoints — the date a\nrelease was (or is scheduled to be) published.",
        +      "properties": {
        +        "date": {
        +          "description": "The date the release was, or is scheduled to be, published.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "release_id": {
        +          "$ref": "#/$defs/ReleaseId",
        +          "description": "The release this date belongs to."
        +        },
        +        "release_name": {
        +          "default": null,
        +          "description": "The release's name. `releases/dates` (which spans every release)\nincludes it; `release/dates` omits it, since the release is already\nfixed by the request.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "release_id",
        +        "release_name",
        +        "date"
        +      ],
        +      "type": "object"
        +    },
        +    "ReleaseId": {
        +      "description": "A FRED release identifier — the numeric id of a data release (a publication\nsuch as \"Gross Domestic Product\").\n\nA `Copy` newtype over `u32`, mirroring [`CategoryId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of release dates available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of dates skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "release_dates": {
        +      "description": "The release dates on this page.",
        +      "items": {
        +        "$ref": "#/$defs/ReleaseDate"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "release_dates"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Frequency": {
        +      "type": "string"
        +    },
        +    "SeasonalAdjustment": {
        +      "type": "string"
        +    },
        +    "SeriesId": {
        +      "description": "A FRED series identifier, e.g. `GNPCA` or `UNRATE`.\n\nA newtype over `String` so a series id can't be silently swapped for another\nkind of identifier or an arbitrary string (see ADR-0005). Construction does\nno validation for now — FRED rejects malformed ids — but the newtype gives\nus a place to add it later without changing call sites.",
        +      "type": "string"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "frequency": {
        +      "$ref": "#/$defs/Frequency",
        +      "description": "The series' native reporting frequency."
        +    },
        +    "id": {
        +      "$ref": "#/$defs/SeriesId",
        +      "description": "The series identifier."
        +    },
        +    "last_updated": {
        +      "description": "When FRED last updated the series, as FRED's raw timestamp string.",
        +      "type": "string"
        +    },
        +    "notes": {
        +      "default": null,
        +      "description": "Editorial notes, when present.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "observation_end": {
        +      "description": "Date of the latest available observation.",
        +      "format": "date",
        +      "type": "string"
        +    },
        +    "observation_start": {
        +      "description": "Date of the earliest available observation.",
        +      "format": "date",
        +      "type": "string"
        +    },
        +    "popularity": {
        +      "description": "FRED popularity score (0–100).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "seasonal_adjustment": {
        +      "$ref": "#/$defs/SeasonalAdjustment",
        +      "description": "Whether/how the series is seasonally adjusted."
        +    },
        +    "title": {
        +      "description": "Human-readable title, e.g. `\"Real Gross National Product\"`.",
        +      "type": "string"
        +    },
        +    "units": {
        +      "description": "Free-form units description, e.g. `\"Billions of Chained 2017 Dollars\"`.\nThis is descriptive text, *not* the closed-vocabulary units transform\nused in observation requests (modelled separately, later).",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "title",
        +    "observation_start",
        +    "observation_end",
        +    "frequency",
        +    "seasonal_adjustment",
        +    "units",
        +    "popularity",
        +    "notes",
        +    "last_updated"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series_categories1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Category": {
        +      "description": "A node in the FRED category tree (the `fred/category` and\n`fred/category/children` endpoints).",
        +      "properties": {
        +        "id": {
        +          "$ref": "#/$defs/CategoryId",
        +          "description": "The category's identifier."
        +        },
        +        "name": {
        +          "description": "Human-readable name, e.g. `\"Trade Balance\"`.",
        +          "type": "string"
        +        },
        +        "parent_id": {
        +          "$ref": "#/$defs/CategoryId",
        +          "default": 0,
        +          "description": "The parent category's id. For the root category this is\n[`CategoryId::ROOT`] (`0`), which FRED may also omit entirely."
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "parent_id"
        +      ],
        +      "type": "object"
        +    },
        +    "CategoryId": {
        +      "description": "A FRED category identifier — a numeric node in the category tree (the root is\n[`CategoryId::ROOT`], id `0`).\n\nA `Copy` newtype over `u32` so a category id can't be silently swapped for a\nparent id, a count, or an arbitrary number (ADR-0005). `#[serde(transparent)]`\ncarries it on the wire as the bare integer FRED sends.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "categories": {
        +      "description": "The categories the series belongs to.",
        +      "items": {
        +        "$ref": "#/$defs/Category"
        +      },
        +      "type": "array"
        +    },
        +    "count": {
        +      "description": "The number of categories returned.",
        +      "format": "uint",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "categories"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series_release1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "ReleaseId": {
        +      "description": "A FRED release identifier — the numeric id of a data release (a publication\nsuch as \"Gross Domestic Product\").\n\nA `Copy` newtype over `u32`, mirroring [`CategoryId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "id": {
        +      "$ref": "#/$defs/ReleaseId",
        +      "description": "The release's identifier."
        +    },
        +    "link": {
        +      "default": null,
        +      "description": "A link to the release on the source's site, when FRED provides one.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "description": "Human-readable name, e.g. `\"Gross Domestic Product\"`.",
        +      "type": "string"
        +    },
        +    "press_release": {
        +      "description": "Whether the release is accompanied by a press release.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "press_release",
        +    "link"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series_search_related_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series_search_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series_updates1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Frequency": {
        +      "type": "string"
        +    },
        +    "SeasonalAdjustment": {
        +      "type": "string"
        +    },
        +    "Series": {
        +      "description": "Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement.",
        +      "properties": {
        +        "frequency": {
        +          "$ref": "#/$defs/Frequency",
        +          "description": "The series' native reporting frequency."
        +        },
        +        "id": {
        +          "$ref": "#/$defs/SeriesId",
        +          "description": "The series identifier."
        +        },
        +        "last_updated": {
        +          "description": "When FRED last updated the series, as FRED's raw timestamp string.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Editorial notes, when present.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "observation_end": {
        +          "description": "Date of the latest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "observation_start": {
        +          "description": "Date of the earliest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "popularity": {
        +          "description": "FRED popularity score (0–100).",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "seasonal_adjustment": {
        +          "$ref": "#/$defs/SeasonalAdjustment",
        +          "description": "Whether/how the series is seasonally adjusted."
        +        },
        +        "title": {
        +          "description": "Human-readable title, e.g. `\"Real Gross National Product\"`.",
        +          "type": "string"
        +        },
        +        "units": {
        +          "description": "Free-form units description, e.g. `\"Billions of Chained 2017 Dollars\"`.\nThis is descriptive text, *not* the closed-vocabulary units transform\nused in observation requests (modelled separately, later).",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "observation_start",
        +        "observation_end",
        +        "frequency",
        +        "seasonal_adjustment",
        +        "units",
        +        "popularity",
        +        "notes",
        +        "last_updated"
        +      ],
        +      "type": "object"
        +    },
        +    "SeriesId": {
        +      "description": "A FRED series identifier, e.g. `GNPCA` or `UNRATE`.\n\nA newtype over `String` so a series id can't be silently swapped for another\nkind of identifier or an arbitrary string (see ADR-0005). Construction does\nno validation for now — FRED rejects malformed ids — but the newtype gives\nus a place to add it later without changing call sites.",
        +      "type": "string"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of matches across all pages.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "Page-size limit that FRED applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset of this page into the full result set.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "series": {
        +      "description": "The matching series on this page. FRED names the array `seriess` (sic) on\nthe wire; we read that but emit the correctly-spelled `series` on output.",
        +      "items": {
        +        "$ref": "#/$defs/Series"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "series",
        +    "count",
        +    "offset",
        +    "limit"
        +  ],
        +  "type": "object"
        +}
    • Changedget_series_vintagedates1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of vintage dates available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of dates skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "vintage_dates": {
        +      "description": "The vintage dates on this page, oldest first by default.",
        +      "items": {
        +        "format": "date",
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "vintage_dates"
        +  ],
        +  "type": "object"
        +}
    • Changedget_source1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "SourceId": {
        +      "description": "A FRED source identifier — the numeric id of a data source (the organization\nthat produces a release, e.g. the Bureau of Economic Analysis).\n\nA `Copy` newtype over `u32`, mirroring [`ReleaseId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "id": {
        +      "$ref": "#/$defs/SourceId",
        +      "description": "The source's identifier."
        +    },
        +    "link": {
        +      "default": null,
        +      "description": "A link to the source's site, when FRED provides one.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "description": "Human-readable name, e.g. `\"U.S. Bureau of Economic Analysis\"`.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "name",
        +    "link"
        +  ],
        +  "type": "object"
        +}
    • Changedget_source_releases1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Release": {
        +      "description": "A FRED data release — a publication such as \"Gross Domestic Product\", from\nthe `fred/release` and `fred/releases` endpoints.",
        +      "properties": {
        +        "id": {
        +          "$ref": "#/$defs/ReleaseId",
        +          "description": "The release's identifier."
        +        },
        +        "link": {
        +          "default": null,
        +          "description": "A link to the release on the source's site, when FRED provides one.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "description": "Human-readable name, e.g. `\"Gross Domestic Product\"`.",
        +          "type": "string"
        +        },
        +        "press_release": {
        +          "description": "Whether the release is accompanied by a press release.",
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "press_release",
        +        "link"
        +      ],
        +      "type": "object"
        +    },
        +    "ReleaseId": {
        +      "description": "A FRED release identifier — the numeric id of a data release (a publication\nsuch as \"Gross Domestic Product\").\n\nA `Copy` newtype over `u32`, mirroring [`CategoryId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of releases available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of releases skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "releases": {
        +      "description": "The releases on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Release"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "releases"
        +  ],
        +  "type": "object"
        +}
    • Changedget_sources1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Source": {
        +      "description": "A FRED data source — the organization that produces releases (e.g. the\nBureau of Economic Analysis), from the `fred/source` and `fred/sources`\nendpoints.",
        +      "properties": {
        +        "id": {
        +          "$ref": "#/$defs/SourceId",
        +          "description": "The source's identifier."
        +        },
        +        "link": {
        +          "default": null,
        +          "description": "A link to the source's site, when FRED provides one.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "name": {
        +          "description": "Human-readable name, e.g. `\"U.S. Bureau of Economic Analysis\"`.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "name",
        +        "link"
        +      ],
        +      "type": "object"
        +    },
        +    "SourceId": {
        +      "description": "A FRED source identifier — the numeric id of a data source (the organization\nthat produces a release, e.g. the Bureau of Economic Analysis).\n\nA `Copy` newtype over `u32`, mirroring [`ReleaseId`]; `#[serde(transparent)]`\ncarries it as the bare integer FRED sends (ADR-0005).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of sources available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of sources skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "sources": {
        +      "description": "The sources on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Source"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "sources"
        +  ],
        +  "type": "object"
        +}
    • Changedget_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Tag": {
        +      "description": "A FRED tag — a keyword used to classify series (e.g. `gdp`, `quarterly`,\n`nsa`), from the `fred/tags`, `fred/series/tags`, and related endpoints.\n\nTags are identified by [`name`](Tag::name); there is no numeric id.",
        +      "properties": {
        +        "group_id": {
        +          "description": "The id of the group the tag belongs to (e.g. `\"gen\"` general, `\"geo\"`\ngeography, `\"freq\"` frequency, `\"seas\"` seasonal adjustment).",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "The tag's name, e.g. `\"gdp\"`.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Descriptive notes, when FRED provides them (may be absent or null).",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "popularity": {
        +          "description": "Relative popularity, 0–100.",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "series_count": {
        +          "description": "Number of series carrying this tag.",
        +          "format": "uint64",
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "name",
        +        "group_id",
        +        "notes",
        +        "popularity",
        +        "series_count"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of tags available (across all pages).",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "The page-size limit that was applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "The offset (number of tags skipped) for this page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "tags": {
        +      "description": "The tags on this page.",
        +      "items": {
        +        "$ref": "#/$defs/Tag"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "count",
        +    "offset",
        +    "limit",
        +    "tags"
        +  ],
        +  "type": "object"
        +}
    • Changedget_tags_series1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Frequency": {
        +      "type": "string"
        +    },
        +    "SeasonalAdjustment": {
        +      "type": "string"
        +    },
        +    "Series": {
        +      "description": "Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement.",
        +      "properties": {
        +        "frequency": {
        +          "$ref": "#/$defs/Frequency",
        +          "description": "The series' native reporting frequency."
        +        },
        +        "id": {
        +          "$ref": "#/$defs/SeriesId",
        +          "description": "The series identifier."
        +        },
        +        "last_updated": {
        +          "description": "When FRED last updated the series, as FRED's raw timestamp string.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Editorial notes, when present.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "observation_end": {
        +          "description": "Date of the latest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "observation_start": {
        +          "description": "Date of the earliest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "popularity": {
        +          "description": "FRED popularity score (0–100).",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "seasonal_adjustment": {
        +          "$ref": "#/$defs/SeasonalAdjustment",
        +          "description": "Whether/how the series is seasonally adjusted."
        +        },
        +        "title": {
        +          "description": "Human-readable title, e.g. `\"Real Gross National Product\"`.",
        +          "type": "string"
        +        },
        +        "units": {
        +          "description": "Free-form units description, e.g. `\"Billions of Chained 2017 Dollars\"`.\nThis is descriptive text, *not* the closed-vocabulary units transform\nused in observation requests (modelled separately, later).",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "observation_start",
        +        "observation_end",
        +        "frequency",
        +        "seasonal_adjustment",
        +        "units",
        +        "popularity",
        +        "notes",
        +        "last_updated"
        +      ],
        +      "type": "object"
        +    },
        +    "SeriesId": {
        +      "description": "A FRED series identifier, e.g. `GNPCA` or `UNRATE`.\n\nA newtype over `String` so a series id can't be silently swapped for another\nkind of identifier or an arbitrary string (see ADR-0005). Construction does\nno validation for now — FRED rejects malformed ids — but the newtype gives\nus a place to add it later without changing call sites.",
        +      "type": "string"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of matches across all pages.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "Page-size limit that FRED applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset of this page into the full result set.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "series": {
        +      "description": "The matching series on this page. FRED names the array `seriess` (sic) on\nthe wire; we read that but emit the correctly-spelled `series` on output.",
        +      "items": {
        +        "$ref": "#/$defs/Series"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "series",
        +    "count",
        +    "offset",
        +    "limit"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch_series1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$defs": {
        +    "Frequency": {
        +      "type": "string"
        +    },
        +    "SeasonalAdjustment": {
        +      "type": "string"
        +    },
        +    "Series": {
        +      "description": "Metadata describing a FRED series (the `fred/series` endpoint).\n\nALFRED vintage fields (`realtime_start` / `realtime_end`) are deferred for v1\nand ignored on the wire (ADR-0005). `last_updated` is kept as FRED's raw\nstring for now — FRED encodes it with a non-standard timezone offset (e.g.\n`2024-03-28 07:56:03-05`); a typed datetime is a later refinement.",
        +      "properties": {
        +        "frequency": {
        +          "$ref": "#/$defs/Frequency",
        +          "description": "The series' native reporting frequency."
        +        },
        +        "id": {
        +          "$ref": "#/$defs/SeriesId",
        +          "description": "The series identifier."
        +        },
        +        "last_updated": {
        +          "description": "When FRED last updated the series, as FRED's raw timestamp string.",
        +          "type": "string"
        +        },
        +        "notes": {
        +          "default": null,
        +          "description": "Editorial notes, when present.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "observation_end": {
        +          "description": "Date of the latest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "observation_start": {
        +          "description": "Date of the earliest available observation.",
        +          "format": "date",
        +          "type": "string"
        +        },
        +        "popularity": {
        +          "description": "FRED popularity score (0–100).",
        +          "format": "uint32",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "seasonal_adjustment": {
        +          "$ref": "#/$defs/SeasonalAdjustment",
        +          "description": "Whether/how the series is seasonally adjusted."
        +        },
        +        "title": {
        +          "description": "Human-readable title, e.g. `\"Real Gross National Product\"`.",
        +          "type": "string"
        +        },
        +        "units": {
        +          "description": "Free-form units description, e.g. `\"Billions of Chained 2017 Dollars\"`.\nThis is descriptive text, *not* the closed-vocabulary units transform\nused in observation requests (modelled separately, later).",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "observation_start",
        +        "observation_end",
        +        "frequency",
        +        "seasonal_adjustment",
        +        "units",
        +        "popularity",
        +        "notes",
        +        "last_updated"
        +      ],
        +      "type": "object"
        +    },
        +    "SeriesId": {
        +      "description": "A FRED series identifier, e.g. `GNPCA` or `UNRATE`.\n\nA newtype over `String` so a series id can't be silently swapped for another\nkind of identifier or an arbitrary string (see ADR-0005). Construction does\nno validation for now — FRED rejects malformed ids — but the newtype gives\nus a place to add it later without changing call sites.",
        +      "type": "string"
        +    }
        +  },
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "properties": {
        +    "count": {
        +      "description": "Total number of matches across all pages.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "limit": {
        +      "description": "Page-size limit that FRED applied.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset of this page into the full result set.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "series": {
        +      "description": "The matching series on this page. FRED names the array `seriess` (sic) on\nthe wire; we read that but emit the correctly-spelled `series` on output.",
        +      "items": {
        +        "$ref": "#/$defs/Series"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "series",
        +    "count",
        +    "offset",
        +    "limit"
        +  ],
        +  "type": "object"
        +}
  7. 31 tool updatesv0.3.2
    • First observedget_category
    • First observedget_category_children
    • First observedget_category_related
    • First observedget_category_related_tags
    • First observedget_category_series
    • First observedget_category_tags
    • First observedget_observations
    • First observedget_related_tags
    • First observedget_release
    • First observedget_release_dates
    • First observedget_release_related_tags
    • First observedget_release_series
    • First observedget_release_sources
    • First observedget_release_tables
    • First observedget_release_tags
    • First observedget_releases
    • First observedget_releases_dates
    • First observedget_series
    • First observedget_series_categories
    • First observedget_series_release
    • First observedget_series_search_related_tags
    • First observedget_series_search_tags
    • First observedget_series_tags
    • First observedget_series_updates
    • First observedget_series_vintagedates
    • First observedget_source
    • First observedget_source_releases
    • First observedget_sources
    • First observedget_tags
    • First observedget_tags_series
    • First observedsearch_series

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a distinct entity or operation (categories, series, tags, releases, sources, observations, regional data) with clear scoping. Even similar tools like get_<scope>_related_tags are differentiated by their context (all, category, release, search). No two tools appear to do the same thing.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case: get_<entity> or get_<entity>_<relationship>. The naming is predictable and systematic, making it easy for an agent to infer function from name.

Tool Count4/5

34 tools is on the higher side but appropriate for a comprehensive FRED API wrapper covering categories, series, releases, sources, tags, observations, and regional data. Each tool serves a distinct API endpoint, so the count is justified.

Completeness5/5

The tool set covers the full FRED API domain: browsing hierarchies (categories, releases, sources), searching series and tags, fetching observations, vintage dates, regional data, and updates. No obvious missing operations for a read-only data server.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    F
    maintenance
    A Model Context Protocol (MCP) server written in Rust that fetches stock price data from stooq.com.
    6
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that wraps the Federal Reserve Economic Data (FRED) API, providing access to over 800,000 economic time series like GDP and unemployment. It enables AI agents to search for data, retrieve metadata, and fetch historical observations directly from the St. Louis Fed.
    -
  • F
    license
    C
    quality
    D
    maintenance
    Enables users to query and explore economic data from FRED, supporting tools for searching series, retrieving observations, and browsing categories. It provides comprehensive access to financial datasets, including GeoFRED maps and raw endpoint passthrough for advanced research.
    40
    1
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/agpalindrome/ferric-fred'

If you have feedback or need assistance with the MCP directory API, please join our Discord server