Skip to main content
Glama

eia-energy-mcp-server

Describe EIA Route

eia_describe_route
Read-only

Returns metadata for a leaf route: available facets with their valid values, data column names and units, frequency options, and date range. Call this before eia_query_route to discover valid facet IDs, facet values, column IDs, and frequency codes. Each facet returns a capped window of its values with value_count and values_truncated alongside; pass facet and values_offset to page through the rest of one facet. To find a value by name in a large facet (plant, entity, and mine IDs run to thousands), pass values_query: each facet keeps only the values whose id, name, or alias contains it — on a balancing-authority facet, also a value whose ISO/RTO acronym does, so "ERCOT" finds ERCO — values_matched counts them, and values_offset pages the matches. A values_offset past the last value of a facet returns an empty window for it and a notice naming the count to page against. Facet values are fetched from separate EIA endpoints, merged, and cached per route for 24 hours, after which the next call fetches the route again; a facet whose values EIA did not return is left out of facets, named in unavailable_facets, and fetched again by the next call. When a refresh fails, the cached values are served instead, with a notice naming when they were fetched.

Input Schema

NameRequiredDescriptionDefault
facetNoRestrict the response to one facet by ID (e.g. "stateid"). Use with values_offset to page a facet whose values were truncated, or with values_query to find a value in it. Omit to get every facet.
routeYesLeaf route path (e.g. "electricity/retail-sales", "steo"). Discoverable via eia_browse_routes or eia_search_routes. Whitespace and slashes are normalized, then one complete leading v2 segment is removed: "/v2/electricity/retail-sales/" resolves to "electricity/retail-sales". Full URLs and /data suffixes are not normalized.
values_queryNoKeep only the facet values whose id, name, or alias contains this text, ignoring case (e.g. "palo verde" on plantCode). On the balancing-authority facets of electricity routes (respondent, fromba, toba, parent, balancing_authority_code), a value also matches when its ISO/RTO acronym contains the text: "ERCOT" finds ERCO, "CAISO" finds CISO, "SPP" finds SWPP and SWPW. A plain substring match, not a pattern or a ranked search. Applied to every facet in the response, before values_offset and the cap. Leading and trailing whitespace is ignored. Omit to list every value.
values_offsetNoIndex of the first facet value to return, applied to every facet in the response. Use the value named in a truncation hint to continue past the cap. With values_query, indexes the matching values.

Output Schema

NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
routeNoThe route path described.
facetsNoFilterable dimensions. Each facet has an ID and a window of its valid values. Restricted to one entry when the facet input is set. A facet named in unavailable_facets is left out.
noticeNoDefault-frequency date-range context, composed with the row field carrying the unit of each data column the route metadata gives no unit, the facet value lists EIA publishes partial, and guidance for exhausted facet windows, a values_query no value matched, unavailable facet values, or cached values served because their refresh failed.
date_rangeNoRoute metadata date range in the default-frequency context, not a bound across all frequencies.
descriptionNoHuman-readable description of the dataset.
frequenciesNoValid frequency options for eia_query_route.
data_columnsNoData columns available for this route.
values_queryNoThe values_query each facet was narrowed by, as matched after trimming. Absent when no values_query was sent.
values_offsetNoIndex of the first facet value returned, echoing the requested offset.
default_frequencyNoDefault frequency ID used when none is specified.
unavailable_facetsNoFacet IDs whose value lists EIA did not return after retries, left out of facets. Each ID still filters eia_query_route — only its values are missing. Call eia_describe_route again to re-fetch these lists alone. Absent when every facet is in facets.
default_date_formatNoPeriod format for the default frequency (e.g. "YYYY-MM").

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / values_query / description
      Previous value: -"Keep only the facet values whose id, name, or alias contains this text, ignoring case (e.g. \"palo verde\" on plantCode). A plain substring match, not a pattern or a ranked search. Applied to every facet in the response, before values_offset and the cap. Leading and trailing whitespace is ignored. Omit to list every value."New value: +"Keep only the facet values whose id, name, or alias contains this text, ignoring case (e.g. \"palo verde\" on plantCode). On the balancing-authority facets of electricity routes (respondent, fromba, toba, parent, balancing_authority_code), a value also matches when its ISO/RTO acronym contains the text: \"ERCOT\" finds ERCO, \"CAISO\" finds CISO, \"SPP\" finds SWPP and SWPW. A plain substring match, not a pattern or a ranked search. Applied to every facet in the response, before values_offset and the cap. Leading and trailing whitespace is ignored. Omit to list every value."
    • changedOutput schema / properties / data_columns / items / properties / units / description
      Previous value: -"Measurement units (e.g. \"cents per kilowatt-hour\")."New value: +"Measurement units (e.g. \"cents per kilowatt-hour\"). An empty string means the route metadata names no unit for this column; the notice then names the eia_query_route row field that holds its unit when a row has one, and a column whose rows have no such field has no unit."
    • changedOutput schema / properties / facets / items / properties / values / description
      Previous value: -"Valid values for this facet dimension, starting at values_offset and capped at EIA_FACET_VALUE_CAP. With values_query, only the matching values, in upstream order."New value: +"Valid values for this facet dimension, starting at values_offset and capped at the window size this server sets. With values_query, only the matching values, in upstream order."
    • changedOutput schema / properties / facets / items / properties / values_matched / description
      Previous value: -"Values of this facet whose id, name, or alias contains values_query — what values_offset indexes and values_truncated is measured against. One ID listed under two historical names counts twice. Present only when values_query is set."New value: +"Values of this facet whose id, name, or alias contains values_query — or, on a balancing-authority facet, whose ISO/RTO acronym does — what values_offset indexes and values_truncated is measured against. One ID listed under two historical names counts twice. Present only when values_query is set."
    • changedOutput schema / properties / notice / description
      Previous value: -"Default-frequency date-range context, composed with guidance for exhausted facet windows, a values_query no value matched, unavailable facet values, or cached values served because their refresh failed."New value: +"Default-frequency date-range context, composed with the row field carrying the unit of each data column the route metadata gives no unit, the facet value lists EIA publishes partial, and guidance for exhausted facet windows, a values_query no value matched, unavailable facet values, or cached values served because their refresh failed."
  2. Changed1 schema field changed
    • changedOutput schema / properties / notice / description
      Previous value: -"Default-frequency date-range context, composed with guidance for exhausted facet windows, a values_query no value matched, or unavailable facet values."New value: +"Default-frequency date-range context, composed with guidance for exhausted facet windows, a values_query no value matched, unavailable facet values, or cached values served because their refresh failed."
  3. Changed11 schema fields changed
    • changedInput schema / properties / facet / description
      Previous value: -"Restrict the response to one facet by ID (e.g. \"stateid\"). Use with values_offset to page a facet whose values were truncated. Omit to get every facet."New value: +"Restrict the response to one facet by ID (e.g. \"stateid\"). Use with values_offset to page a facet whose values were truncated, or with values_query to find a value in it. Omit to get every facet."
    • changedInput schema / properties / values_offset / description
      Previous value: -"Index of the first facet value to return, applied to every facet in the response. Use the value named in a truncation hint to continue past the cap."New value: +"Index of the first facet value to return, applied to every facet in the response. Use the value named in a truncation hint to continue past the cap. With values_query, indexes the matching values."
    • addedInput schema / properties / values_query
      Added value: +{
      +  "description": "Keep only the facet values whose id, name, or alias contains this text, ignoring case (e.g. \"palo verde\" on plantCode). A plain substring match, not a pattern or a ranked search. Applied to every facet in the response, before values_offset and the cap. Leading and trailing whitespace is ignored. Omit to list every value.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • 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. `route_not_found`: Route does not exist in the EIA taxonomy. `route_not_queryable`: Route is a category node with sub-routes, not a queryable leaf. `facet_not_found`: The facet input names an ID the route does not expose. `facet_unavailable`: The facet input names a facet whose value list EIA did not return after retries. `rate_limited`: EIA rate limit hit on the route metadata request, or on the value list the facet input names. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) on the route metadata request or the route-tree build. A value list the facet input names fails as facet_unavailable instead. 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 the route metadata request or the route-tree build in time: one attempt passed 45 s, or the call passed its 56 s deadline across retries. A value list that times out is named in unavailable_facets instead. `route_not_found`: Route does not exist in the EIA taxonomy. `route_not_queryable`: Route is a category node with sub-routes, not a queryable leaf. `facet_not_found`: The facet input names an ID the route does not expose. `facet_unavailable`: The facet input names a facet whose value list EIA did not return after retries. `rate_limited`: EIA rate limit hit on the route metadata request, or on the value list the facet input names. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) on the route metadata request or the route-tree build. A value list the facet input names fails as facet_unavailable instead. 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",
      -  "route_not_found",
      -  "route_not_queryable",
      -  "facet_not_found",
      -  "facet_unavailable",
      -  "rate_limited",
      -  "upstream_unreachable"
      -]New value: +[
      +  "upstream_invalid_response",
      +  "upstream_unavailable",
      +  "upstream_timeout",
      +  "route_not_found",
      +  "route_not_queryable",
      +  "facet_not_found",
      +  "facet_unavailable",
      +  "rate_limited",
      +  "upstream_unreachable"
      +]
    • changedOutput schema / properties / facets / items / properties / value_count / description
      Previous value: -"Total values this facet has upstream, independent of the returned window."New value: +"Total values this facet has upstream, independent of the returned window and of values_query."
    • changedOutput schema / properties / facets / items / properties / values / description
      Previous value: -"Valid values for this facet dimension, starting at values_offset and capped at EIA_FACET_VALUE_CAP."New value: +"Valid values for this facet dimension, starting at values_offset and capped at EIA_FACET_VALUE_CAP. With values_query, only the matching values, in upstream order."
    • addedOutput schema / properties / facets / items / properties / values_matched
      Added value: +{
      +  "description": "Values of this facet whose id, name, or alias contains values_query — what values_offset indexes and values_truncated is measured against. One ID listed under two historical names counts twice. Present only when values_query is set.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / facets / items / properties / values_truncated / description
      Previous value: -"True when values stops short of value_count. Call eia_describe_route again with this facet ID and values_offset set to values_offset + values.length for the next page."New value: +"True when values stops short of values_matched when values_query is set, otherwise of value_count. Call eia_describe_route again with this facet ID, the same values_query, and values_offset set to values_offset + values.length for the next page."
    • changedOutput schema / properties / notice / description
      Previous value: -"Default-frequency date-range context, composed with guidance for exhausted facet windows or unavailable facet values."New value: +"Default-frequency date-range context, composed with guidance for exhausted facet windows, a values_query no value matched, or unavailable facet values."
    • addedOutput schema / properties / values_query
      Added value: +{
      +  "description": "The values_query each facet was narrowed by, as matched after trimming. Absent when no values_query was sent.",
      +  "type": "string"
      +}
  4. Changed7 schema fields changed
    • changedInput schema / properties / route / description
      Previous value: -"Leaf route path (e.g. \"electricity/retail-sales\", \"steo\"). Discoverable via eia_browse_routes or eia_search_routes. Leading, trailing, and doubled slashes are stripped, so an EIA-doc spelling like \"/electricity/retail-sales/\" resolves to the same route."New value: +"Leaf route path (e.g. \"electricity/retail-sales\", \"steo\"). Discoverable via eia_browse_routes or eia_search_routes. Whitespace and slashes are normalized, then one complete leading v2 segment is removed: \"/v2/electricity/retail-sales/\" resolves to \"electricity/retail-sales\". Full URLs and /data suffixes are not normalized."
    • changedOutput schema / properties / date_range / description
      Previous value: -"Available date range for this route."New value: +"Route metadata date range in the default-frequency context, not a bound across all frequencies."
    • changedOutput schema / properties / date_range / properties / end / description
      Previous value: -"Latest available period."New value: +"Metadata end period for the default frequency; another frequency may extend later."
    • changedOutput schema / properties / date_range / properties / start / description
      Previous value: -"Earliest available period."New value: +"Metadata start period for the default frequency; another frequency may extend earlier."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `route_not_found`: Route does not exist in the EIA taxonomy. `route_not_queryable`: Route is a category node with sub-routes, not a queryable leaf. `facet_not_found`: The facet input names an ID the route does not expose. `facet_unavailable`: The facet input names a facet whose value list EIA did not return after retries. `rate_limited`: EIA rate limit hit on the route metadata request, or on the value list the facet input names. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) on the route metadata request or the route-tree build. A value list the facet input names fails as facet_unavailable instead. 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. `route_not_found`: Route does not exist in the EIA taxonomy. `route_not_queryable`: Route is a category node with sub-routes, not a queryable leaf. `facet_not_found`: The facet input names an ID the route does not expose. `facet_unavailable`: The facet input names a facet whose value list EIA did not return after retries. `rate_limited`: EIA rate limit hit on the route metadata request, or on the value list the facet input names. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) on the route metadata request or the route-tree build. A value list the facet input names fails as facet_unavailable instead. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "route_not_found",
      -  "route_not_queryable",
      -  "facet_not_found",
      -  "facet_unavailable",
      -  "rate_limited",
      -  "upstream_unreachable"
      -]New value: +[
      +  "upstream_invalid_response",
      +  "upstream_unavailable",
      +  "route_not_found",
      +  "route_not_queryable",
      +  "facet_not_found",
      +  "facet_unavailable",
      +  "rate_limited",
      +  "upstream_unreachable"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when values_offset lands past the last value of one or more facets — naming each emptied facet, its value_count, and its last valid offset — or when EIA did not return the value list of a facet named in unavailable_facets. Absent when neither applies."New value: +"Default-frequency date-range context, composed with guidance for exhausted facet windows or unavailable facet values."
  5. Changed5 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `route_not_found`: Route does not exist in the EIA taxonomy. `route_not_queryable`: Route is a category node with sub-routes, not a queryable leaf. `facet_not_found`: The facet input names an ID the route does not expose. `rate_limited`: EIA rate limit hit during facet fan-out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `route_not_found`: Route does not exist in the EIA taxonomy. `route_not_queryable`: Route is a category node with sub-routes, not a queryable leaf. `facet_not_found`: The facet input names an ID the route does not expose. `facet_unavailable`: The facet input names a facet whose value list EIA did not return after retries. `rate_limited`: EIA rate limit hit on the route metadata request, or on the value list the facet input names. `upstream_unreachable`: EIA could not be reached (connection refused or reset, DNS failure) on the route metadata request or the route-tree build. A value list the facet input names fails as facet_unavailable instead. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "route_not_found",
      -  "route_not_queryable",
      -  "facet_not_found",
      -  "rate_limited"
      -]New value: +[
      +  "route_not_found",
      +  "route_not_queryable",
      +  "facet_not_found",
      +  "facet_unavailable",
      +  "rate_limited",
      +  "upstream_unreachable"
      +]
    • changedOutput schema / properties / facets / description
      Previous value: -"Filterable dimensions. Each facet has an ID and a window of its valid values. Restricted to one entry when the facet input is set."New value: +"Filterable dimensions. Each facet has an ID and a window of its valid values. Restricted to one entry when the facet input is set. A facet named in unavailable_facets is left out."
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when values_offset lands past the last value of one or more facets — names each emptied facet, its value_count, and its last valid offset. Absent when every facet returned values."New value: +"Guidance when values_offset lands past the last value of one or more facets — naming each emptied facet, its value_count, and its last valid offset — or when EIA did not return the value list of a facet named in unavailable_facets. Absent when neither applies."
    • addedOutput schema / properties / unavailable_facets
      Added value: +{
      +  "description": "Facet IDs whose value lists EIA did not return after retries, left out of facets. Each ID still filters eia_query_route — only its values are missing. Call eia_describe_route again to re-fetch these lists alone. Absent when every facet is in facets.",
      +  "items": {
      +    "description": "Facet ID whose value list EIA did not return.",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  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": [
      +      "route",
      +      "description",
      +      "facets",
      +      "values_offset",
      +      "data_columns",
      +      "frequencies",
      +      "date_range",
      +      "default_frequency",
      +      "default_date_format"
      +    ]
      +  },
      +  {
      +    "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. Declared by this tool: `route_not_found`: Route does not exist in the EIA taxonomy. `route_not_queryable`: Route is a category node with sub-routes, not a queryable leaf. `facet_not_found`: The facet input names an ID the route does not expose. `rate_limited`: EIA rate limit hit during facet fan-out. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "route_not_found",
      +            "route_not_queryable",
      +            "facet_not_found",
      +            "rate_limited"
      +          ],
      +          "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: -[
      -  "route",
      -  "description",
      -  "facets",
      -  "values_offset",
      -  "data_columns",
      -  "frequencies",
      -  "date_range",
      -  "default_frequency",
      -  "default_date_format"
      -]
  7. Changed1 schema field changed
    • changedInput schema / properties / route / description
      Previous value: -"Leaf route path (e.g. \"electricity/retail-sales\", \"steo\"). Discoverable via eia_browse_routes or eia_search_routes."New value: +"Leaf route path (e.g. \"electricity/retail-sales\", \"steo\"). Discoverable via eia_browse_routes or eia_search_routes. Leading, trailing, and doubled slashes are stripped, so an EIA-doc spelling like \"/electricity/retail-sales/\" resolves to the same route."
  8. Changed1 schema field changed
    • changedOutput schema / properties / facets / items / properties / values / items / properties / name / description
      Previous value: -"Human-readable name."New value: +"Human-readable name. Falls back to the alias, then to the id, on the values EIA sends without one."
  9. Changed1 schema field changed
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Guidance when values_offset lands past the last value of one or more facets — names each emptied facet, its value_count, and its last valid offset. Absent when every facet returned values.",
      +  "type": "string"
      +}
  10. Changed9 schema fields changed
    • addedInput schema / properties / facet
      Added value: +{
      +  "description": "Restrict the response to one facet by ID (e.g. \"stateid\"). Use with values_offset to page a facet whose values were truncated. Omit to get every facet.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / values_offset
      Added value: +{
      +  "default": 0,
      +  "description": "Index of the first facet value to return, applied to every facet in the response. Use the value named in a truncation hint to continue past the cap.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / facets / description
      Previous value: -"Filterable dimensions. Each facet has an ID and a set of valid values."New value: +"Filterable dimensions. Each facet has an ID and a window of its valid values. Restricted to one entry when the facet input is set."
    • addedOutput schema / properties / facets / items / properties / value_count
      Added value: +{
      +  "description": "Total values this facet has upstream, independent of the returned window.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / facets / items / properties / values / description
      Previous value: -"Valid values for this facet dimension."New value: +"Valid values for this facet dimension, starting at values_offset and capped at EIA_FACET_VALUE_CAP."
    • addedOutput schema / properties / facets / items / properties / values_truncated
      Added value: +{
      +  "description": "True when values stops short of value_count. Call eia_describe_route again with this facet ID and values_offset set to values_offset + values.length for the next page.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / facets / items / required
      Previous value: -[
      -  "id",
      -  "description",
      -  "values"
      -]New value: +[
      +  "id",
      +  "description",
      +  "values",
      +  "value_count",
      +  "values_truncated"
      +]
    • addedOutput schema / properties / values_offset
      Added value: +{
      +  "description": "Index of the first facet value returned, echoing the requested offset.",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "route",
      -  "description",
      -  "facets",
      -  "data_columns",
      -  "frequencies",
      -  "date_range",
      -  "default_frequency",
      -  "default_date_format"
      -]New value: +[
      +  "route",
      +  "description",
      +  "facets",
      +  "values_offset",
      +  "data_columns",
      +  "frequencies",
      +  "date_range",
      +  "default_frequency",
      +  "default_date_format"
      +]
  11. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and openWorldHint=false, but the description goes well beyond them: per-route 24-hour caching, re-fetch on expiry, fallback to cached values with a notice when a refresh fails, unavailable_facets for facets EIA did not return, and an empty window plus notice when values_offset overshoots. These are non-obvious operational traits an agent could not infer from the structured fields.

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?

Front-loaded correctly, leading with what is returned and the sequencing advice before the paging and caching mechanics. It is long and occasionally restates schema text (the ERCOT/ERCO example appears in both), which costs a little, but each paragraph covers a distinct behavior rather than padding.

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 shape need not be described, yet the description still covers the failure and edge paths an agent must handle: truncation counters, empty windows, missing facets, and stale-cache notices. For a read-only metadata-discovery tool with four parameters, nothing essential 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% and the parameter descriptions are themselves detailed, so the baseline would be 3. The prose still adds framing the schema does not: that values_query applies to every facet in the response before offset and the cap, that values_offset pages matches as well as full value lists, and that offset applies uniformly across all returned facets rather than one.

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?

Opens with a specific verb and resource ("Returns metadata for a leaf route") and enumerates exactly what metadata: facets with valid values, column names and units, frequencies, date range. That vocabulary makes it clearly distinguishable from eia_query_route and eia_browse_routes, which an agent can separate without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit sequencing rule ("Call this before eia_query_route to discover valid facet IDs, facet values, column IDs, and frequency codes"), which is the strongest form of when-to-use guidance. It also names the condition that selects each optional parameter: facet plus values_offset to page a truncated facet, values_query to locate a value in a large facet.

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.