Skip to main content
Glama

eia-energy-mcp-server

Search EIA Routes

eia_search_routes
Read-only

Fuzzy text search across route names, descriptions, category labels, and the names of the data columns a route publishes. Resolves natural-language queries like "electricity retail sales by state" or "natural gas imports" to matching route paths, and a measure named only by its column — "nameplate capacity", "gross generation" — to the route that publishes it. Multi-term queries are also matched term by term, so combining a commodity, a metric, and a sector — "electricity price residential", "coal generation industrial sector" — reaches the route carrying that data even when no single entry reads like the whole phrase. A query spelling the end of a route path in words — "retail sales" for electricity/retail-sales — ranks that route first. STEO, SEDS, and Monthly Energy Review (total-energy) series names are indexed so queries like "crude oil production forecast", "motor gasoline total consumption", or "primary energy consumption total" also resolve — a Monthly Energy Review series also by its ID, such as "TETCBUS" — and so are facet values, so a fuel type or sector term like "wind" or "anthracite coal" resolves to the route that exposes it, with filter_hint carrying the filter to pass on. That includes the series and product names of the daily and weekly petroleum and natural-gas routes and the RTO balancing authorities, so benchmarks like "Henry Hub", "WTI crude spot price", "Cushing", or "Electric Reliability Council of Texas" resolve before any describe; a balancing authority also answers to its EIA code or its ISO/RTO acronym ("ERCO", "ERCOT", "CAISO", "SPP"). A legacy APIv1 series ID as the EIA website and Excel add-in write them — "PET.RWTC.W", "ELEC.PRICE.TX-RES.M" — is resolved through the EIA series lookup into one result with its route, filter_hint, frequency, and columns, ready for eia_query_route, without waiting on the index. Results include isLeaf so you know whether to browse further or query directly. Results with score > 0.72 are weak matches — try a more specific query or use eia_browse_routes to explore the taxonomy. The first call after server start waits 20-40s while the index warms, and at most 45s; later calls answer from the built index. Check indexComplete before reading anything into a short or empty result set.

Input Schema

NameRequiredDescriptionDefault
limitNoMaximum results to return. Default 10; a larger value returns at most 30 and says so. truncated says whether more matches exist.
queryYesFree-text search terms to match against route names and descriptions, or a legacy APIv1 series ID (e.g. "PET.RWTC.W": three or more dot-separated segments ending in a frequency code A, Q, M, W, D, H, HL, or 4; any case). Leading and trailing whitespace is ignored, and only the first 256 characters are searched.

Output Schema

NameRequiredDescriptionDefault
capNoMost results this call could return — limit, or 30 when limit was larger.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of results returned.
noticeNoDiscloses requested/effective limits when clamped and says when only the start of the query was searched; names a resolved series ID (saying so when EIA reports no rows for it), or says the lookup of a query shaped like one found nothing or failed (the results are then the text search); and gives guidance when no routes matched or more matches exist.
resultsNoRanked matches, best first.
indexGapsNoPresent only when indexComplete is false: route paths whose metadata could not be fetched (call eia_browse_routes on one to re-fetch it) and index passes that did not land ("steo_series", "seds_series", "total_energy_series", "facet_values"), which the next search retries.
truncatedNoTrue when more matches exist past the ones returned; false when these are all.
totalIndexedNoTotal entries in the search index: routes, STEO, SEDS, and Monthly Energy Review series names, and the facet values indexed at warm time, plus the facet values of every route described since the server started — so the count grows with describe calls.
indexCompleteNoTrue when this answer was ranked against the complete warm-time corpus. False means part of it is missing (see indexGaps) — results may be short, and a better match may exist that was never scored. Facet values folded in by eia_describe_route are additional and never count toward completeness. A resolved series ID is answered by EIA, not ranked, so it does not depend on this.
effectiveQueryNoQuery as searched — the submitted text with surrounding whitespace trimmed, cut to its first 256 characters.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedOutput schema / properties / indexGaps / description
      Previous value: -"Present only when indexComplete is false: route paths whose metadata could not be fetched (call eia_browse_routes on one to re-fetch it) and index passes that did not land (\"steo_series\", \"seds_series\", \"facet_values\"), which the next search retries."New value: +"Present only when indexComplete is false: route paths whose metadata could not be fetched (call eia_browse_routes on one to re-fetch it) and index passes that did not land (\"steo_series\", \"seds_series\", \"total_energy_series\", \"facet_values\"), which the next search retries."
    • changedOutput schema / properties / results / items / properties / filter_hint / description
      Previous value: -"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO and SEDS series results and facet-value results — fuel, sector, and RTO respondent values, and the series and product values of daily and weekly petroleum and natural-gas routes (e.g. {\"series\": \"RNGWHHD\"} on natural-gas/pri/fut) — and on a resolved series ID, where it holds every facet EIA maps the ID to, values as EIA writes them (e.g. {\"sectorid\": \"RES\", \"stateid\": \"TX\"}). Pass directly as filters (e.g. eia_query_route(route=\"seds\", filters=filter_hint))."New value: +"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO and SEDS series results ({\"seriesId\": ...}), Monthly Energy Review series results ({\"msn\": \"TETCBUS\"} on total-energy), and facet-value results — fuel, sector, and RTO balancing-authority values (found by name, EIA code, or ISO/RTO acronym: \"ERCOT\" gives {\"respondent\": \"ERCO\"} on electricity/rto/region-data), and the series and product values of daily and weekly petroleum and natural-gas routes (e.g. {\"series\": \"RNGWHHD\"} on natural-gas/pri/fut) — and on a resolved series ID, where it holds every facet EIA maps the ID to, values as EIA writes them (e.g. {\"sectorid\": \"RES\", \"stateid\": \"TX\"}). Pass directly as filters (e.g. eia_query_route(route=\"seds\", filters=filter_hint))."
    • changedOutput schema / properties / totalIndexed / description
      Previous value: -"Total entries in the search index: routes, STEO and SEDS series names, and the facet values indexed at warm time, plus the facet values of every route described since the server started — so the count grows with describe calls."New value: +"Total entries in the search index: routes, STEO, SEDS, and Monthly Energy Review series names, and the facet values indexed at warm time, plus the facet values of every route described since the server started — so the count grows with describe calls."
  2. Changed4 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum results to return (default 10). One call returns at most 30; a larger limit is served at 30, and truncated says whether more matches exist."New value: +"Maximum results to return. Default 10; a larger value returns at most 30 and says so. truncated says whether more matches exist."
    • removedInput schema / properties / limit / maximum
      Removed value: -9007199254740991
    • addedInput schema / properties / limit / multipleOf
      Added value: +1
    • changedInput schema / properties / limit / type
      Previous value: -"integer"New value: +"number"
  3. Changed11 schema fields changed
    • changedInput schema / properties / query / description
      Previous value: -"Free-text search terms to match against route names and descriptions. Leading and trailing whitespace is ignored."New value: +"Free-text search terms to match against route names and descriptions, or a legacy APIv1 series ID (e.g. \"PET.RWTC.W\": three or more dot-separated segments ending in a frequency code A, Q, M, W, D, H, HL, or 4; any case). Leading and trailing whitespace is ignored, and only the first 256 characters are searched."
    • changedOutput schema / properties / effectiveQuery / description
      Previous value: -"Query as searched — the submitted text with surrounding whitespace trimmed."New value: +"Query as searched — the submitted text with surrounding whitespace trimmed, cut to its first 256 characters."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `upstream_invalid_response`: EIA returned an unusable response body or a missing route or data envelope. `upstream_unavailable`: EIA answered with a retryable HTTP service failure. `rate_limited`: EIA rate limit hit (OVER_RATE_LIMIT) while building the route tree on the first call after server start. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) while building the route tree on the first call after server start. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_invalid_response`: EIA returned an unusable response body or a missing route or data envelope. `upstream_unavailable`: EIA answered with a retryable HTTP service failure. `upstream_timeout`: EIA did not answer in time while the first call after server start built the route tree. An index pass that times out does not fail the search; it is reported in indexGaps. `rate_limited`: EIA rate limit hit (OVER_RATE_LIMIT) while building the route tree on the first call after server start. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) while building the route tree on the first call after server start. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "upstream_invalid_response",
      -  "upstream_unavailable",
      -  "rate_limited",
      -  "upstream_unreachable"
      -]New value: +[
      +  "upstream_invalid_response",
      +  "upstream_unavailable",
      +  "upstream_timeout",
      +  "rate_limited",
      +  "upstream_unreachable"
      +]
    • changedOutput schema / properties / indexComplete / description
      Previous value: -"True when this answer was ranked against the complete corpus. False means part of it is missing (see indexGaps) — results may be short, and a better match may exist that was never scored."New value: +"True when this answer was ranked against the complete warm-time corpus. False means part of it is missing (see indexGaps) — results may be short, and a better match may exist that was never scored. Facet values folded in by eia_describe_route are additional and never count toward completeness. A resolved series ID is answered by EIA, not ranked, so it does not depend on this."
    • changedOutput schema / properties / notice / description
      Previous value: -"Discloses requested/effective limits when clamped, and guidance when no routes matched or more matches exist."New value: +"Discloses requested/effective limits when clamped and says when only the start of the query was searched; names a resolved series ID (saying so when EIA reports no rows for it), or says the lookup of a query shaped like one found nothing or failed (the results are then the text search); and gives guidance when no routes matched or more matches exist."
    • addedOutput schema / properties / results / items / properties / columns
      Added value: +{
      +  "description": "Data column IDs the series reads (e.g. [\"price\"]). Present only on a resolved series ID; pass as eia_query_route columns.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / results / items / properties / filter_hint / description
      Previous value: -"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO and SEDS series results and facet-value results — pass directly as filters (e.g. eia_query_route(route=\"seds\", filters=filter_hint))."New value: +"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO and SEDS series results and facet-value results — fuel, sector, and RTO respondent values, and the series and product values of daily and weekly petroleum and natural-gas routes (e.g. {\"series\": \"RNGWHHD\"} on natural-gas/pri/fut) — and on a resolved series ID, where it holds every facet EIA maps the ID to, values as EIA writes them (e.g. {\"sectorid\": \"RES\", \"stateid\": \"TX\"}). Pass directly as filters (e.g. eia_query_route(route=\"seds\", filters=filter_hint))."
    • addedOutput schema / properties / results / items / properties / frequency
      Added value: +{
      +  "description": "Frequency ID the series is published at (e.g. \"weekly\", \"local-hourly\"). Present only on a resolved series ID; pass as eia_query_route frequency.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / results / items / properties / score / description
      Previous value: -"Match score: 0 = exact, 1 = no match. Lower is better; above 0.72 the match is unreliable. On a multi-term query it is the better of the whole-phrase score and a per-term score that penalizes each query term the entry does not carry."New value: +"Match score: 0 = exact, 1 = no match. Lower is better; above 0.72 the match is unreliable. On a multi-term query it is the better of the whole-phrase score and a per-term score that penalizes each query term the entry does not carry. A resolved series ID scores 0."
    • changedOutput schema / properties / totalIndexed / description
      Previous value: -"Total entries in the search index (routes + STEO and SEDS series names + facet values)."New value: +"Total entries in the search index: routes, STEO and SEDS series names, and the facet values indexed at warm time, plus the facet values of every route described since the server started — so the count grows with describe calls."
  4. Changed4 schema fields changed
    • changedInput schema / properties / limit / maximum
      Previous value: -100New value: +9007199254740991
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: EIA rate limit hit (OVER_RATE_LIMIT) while building the route tree on the first call after server start. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) while building the route tree on the first call after server start. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_invalid_response`: EIA returned an unusable response body or a missing route or data envelope. `upstream_unavailable`: EIA answered with a retryable HTTP service failure. `rate_limited`: EIA rate limit hit (OVER_RATE_LIMIT) while building the route tree on the first call after server start. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) while building the route tree on the first call after server start. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "rate_limited",
      -  "upstream_unreachable"
      -]New value: +[
      +  "upstream_invalid_response",
      +  "upstream_unavailable",
      +  "rate_limited",
      +  "upstream_unreachable"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Present when no routes matched, or when more matches exist than were returned — says how to narrow or widen the search."New value: +"Discloses requested/effective limits when clamped, and guidance when no routes matched or more matches exist."
  5. Changed12 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum results to return (default 10, max 30)."New value: +"Maximum results to return (default 10). One call returns at most 30; a larger limit is served at 30, and truncated says whether more matches exist."
    • changedInput schema / properties / limit / maximum
      Previous value: -30New value: +100
    • changedInput schema / properties / query / description
      Previous value: -"Free-text search terms to match against route names and descriptions."New value: +"Free-text search terms to match against route names and descriptions. Leading and trailing whitespace is ignored."
    • changedOutput schema / properties / cap / description
      Previous value: -"The limit that was applied."New value: +"Most results this call could return — limit, or 30 when limit was larger."
    • changedOutput schema / properties / effectiveQuery / description
      Previous value: -"Query as submitted to the Fuse.js index."New value: +"Query as searched — the submitted text with surrounding whitespace trimmed."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: EIA rate limit hit (OVER_RATE_LIMIT) while building the route tree on the first call after server start. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) while building the route tree on the first call after server start. Other values are possible when a failure originates below the handler."
    • addedOutput schema / properties / error / properties / data / properties / reason / examples
      Added value: +[
      +  "rate_limited",
      +  "upstream_unreachable"
      +]
    • changedOutput schema / properties / indexGaps / description
      Previous value: -"Present only when indexComplete is false: route paths whose metadata could not be fetched (call eia_browse_routes on one to re-fetch it) and index passes that did not land (\"steo_series\", \"facet_values\")."New value: +"Present only when indexComplete is false: route paths whose metadata could not be fetched (call eia_browse_routes on one to re-fetch it) and index passes that did not land (\"steo_series\", \"seds_series\", \"facet_values\"), which the next search retries."
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint when no routes matched — suggests alternative queries or using eia_browse_routes."New value: +"Present when no routes matched, or when more matches exist than were returned — says how to narrow or widen the search."
    • changedOutput schema / properties / results / items / properties / filter_hint / description
      Previous value: -"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO series and facet-value results — pass directly as filters (e.g. eia_query_route(route=\"steo\", filters=filter_hint))."New value: +"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO and SEDS series results and facet-value results — pass directly as filters (e.g. eia_query_route(route=\"seds\", filters=filter_hint))."
    • changedOutput schema / properties / totalIndexed / description
      Previous value: -"Total entries in the search index (routes + STEO series names + facet values)."New value: +"Total entries in the search index (routes + STEO and SEDS series names + facet values)."
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when matches were capped at limit; more may exist."New value: +"True when more matches exist past the ones returned; false when these are all."
  6. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "results",
      +      "effectiveQuery",
      +      "totalIndexed",
      +      "indexComplete",
      +      "truncated",
      +      "shown",
      +      "cap"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode.",
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "results",
      -  "effectiveQuery",
      -  "totalIndexed",
      -  "indexComplete",
      -  "truncated",
      -  "shown",
      -  "cap"
      -]
  7. Changed1 schema field changed
    • changedOutput schema / properties / results / items / properties / score / description
      Previous value: -"Fuzzy match score: 0 = exact, 1 = no match. Lower is better; above 0.9 the match is unreliable."New value: +"Match score: 0 = exact, 1 = no match. Lower is better; above 0.72 the match is unreliable. On a multi-term query it is the better of the whole-phrase score and a per-term score that penalizes each query term the entry does not carry."
  8. Changed3 schema fields changed
    • addedOutput schema / properties / indexComplete
      Added value: +{
      +  "description": "True when this answer was ranked against the complete corpus. False means part of it is missing (see indexGaps) — results may be short, and a better match may exist that was never scored.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / indexGaps
      Added value: +{
      +  "description": "Present only when indexComplete is false: route paths whose metadata could not be fetched (call eia_browse_routes on one to re-fetch it) and index passes that did not land (\"steo_series\", \"facet_values\").",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "results",
      -  "effectiveQuery",
      -  "totalIndexed",
      -  "truncated",
      -  "shown",
      -  "cap"
      -]New value: +[
      +  "results",
      +  "effectiveQuery",
      +  "totalIndexed",
      +  "indexComplete",
      +  "truncated",
      +  "shown",
      +  "cap"
      +]
  9. Changed2 schema fields changed
    • changedOutput schema / properties / results / items / properties / filter_hint / description
      Previous value: -"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO series results — pass directly as filters (e.g. eia_query_route(route=\"steo\", filters=filter_hint))."New value: +"Pre-built filter for eia_query_route when a specific facet value is required. Present on STEO series and facet-value results — pass directly as filters (e.g. eia_query_route(route=\"steo\", filters=filter_hint))."
    • changedOutput schema / properties / totalIndexed / description
      Previous value: -"Total entries in the search index (routes + STEO series names)."New value: +"Total entries in the search index (routes + STEO series names + facet values)."
  10. Changed1 schema field changed
    • changedOutput schema / properties / results / items / properties / score / description
      Previous value: -"Fuzzy match score: 0 = exact, 1 = no match. Lower is better."New value: +"Fuzzy match score: 0 = exact, 1 = no match. Lower is better; above 0.9 the match is unreliable."
  11. Changed4 schema fields changed
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The limit that was applied.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Number of results returned.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when matches were capped at limit; more may exist.",
      +  "type": "boolean"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "results",
      -  "effectiveQuery",
      -  "totalIndexed"
      -]New value: +[
      +  "results",
      +  "effectiveQuery",
      +  "totalIndexed",
      +  "truncated",
      +  "shown",
      +  "cap"
      +]
  12. Changed5 schema fields changed
    • addedOutput schema / properties / effectiveQuery
      Added value: +{
      +  "description": "Query as submitted to the Fuse.js index.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Recovery hint when no routes matched — suggests alternative queries or using eia_browse_routes.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / totalIndexed
      Added value: +{
      +  "description": "Total entries in the search index (routes + STEO series names).",
      +  "type": "number"
      +}
    • removedOutput schema / properties / total_indexed
      Removed value: -{
      -  "description": "Total entries in the search index (routes + STEO series names).",
      -  "type": "number"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "results",
      -  "total_indexed"
      -]New value: +[
      +  "results",
      +  "effectiveQuery",
      +  "totalIndexed"
      +]
  13. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/openWorldHint annotations: it discloses cold-start latency (20-40s, capped at 45s), the isLeaf/truncated/indexComplete fields to check, the 0.72 weak-match threshold, the 30-result cap, and that legacy APIv1 IDs are resolved synchronously through a separate lookup. These are exactly the operational facts an agent needs before calling.

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

Conciseness3/5

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

The core purpose and the legacy-ID behavior are front-loaded, which is good, but the body is a long accumulation of example queries ("Henry Hub", "WTI crude spot price", "PET.RWTC.W", etc.) with overlapping claims about what is indexed. The examples are individually useful yet collectively repetitive, and the density makes the routing guidance harder to extract.

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?

An output schema exists, so return values need not be spelled out, yet the description still flags the result fields that change agent behavior (isLeaf, truncated, indexComplete, score). Combined with latency and ranking caveats, nothing needed to call this tool correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning about what the query matches (names, descriptions, category labels, column names, STEO/SEDS/MER series, facet values, ISO/RTO acronyms) and how multi-term queries are scored term by term. Limit behavior is partly covered by the schema's own description rather than repeated here.

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

Purpose5/5

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

States a specific verb and resource ("fuzzy text search across route names, descriptions, category labels, and ... data columns") and explains the resolution outcome (natural-language query → route path). It distinguishes itself from siblings by naming eia_query_route, eia_browse_routes, and the describe step, so an agent can place it in the workflow without opening other schemas.

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?

Gives clear routing guidance: use it before any describe to turn a phrase or legacy series ID into a route plus filter_hint, and fall back to eia_browse_routes when matches are weak (score > 0.72). It also covers the legacy-ID case that bypasses the index. It stops short of explicit when-not-to-use cases (e.g. when you already know the exact route path).

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.