Skip to main content
Glama

Case Shiller Metro Compare

case_shiller_metro_compare
Read-onlyIdempotent

Compare Case-Shiller home price indices across multiple US metros in one call (the 20-city composite). For each metro returns latest level, 3-month change, 12-month change, all-time peak, drawdown from peak, and a softening flag. Output also ranks metros softest → strongest. Use for "which metros are softening", "Case-Shiller for [list of cities]", "compare housing prices in X, Y, Z" queries — picks the right per-metro FRED series IDs (DNXRSA, PHXRSA, TPXRSA, etc.) so callers don't have to. Available metros: Atlanta, Boston, Charlotte, Chicago, Cleveland, Dallas, Denver, Detroit, Las Vegas, Los Angeles, Miami, Minneapolis, New York, Phoenix, Portland, San Diego, San Francisco, Seattle, Tampa, Washington DC. NOT A CURRENT-MARKET READ: Case-Shiller is monthly, published on a roughly two-month lag, and each value is a three-month moving average — so the newest observation is typically 90-120 days old and describes a trailing quarter. The freshness block states the exact age of the call you made.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
metrosYesMetro names, case-insensitive. Example: ["Denver", "Phoenix", "Tampa", "Charlotte"]. Pass any subset of the 20-city composite.
_fredKeyNoFRED API key (https://fred.stlouisfed.org/docs/api/api_key.html). Platform key used if omitted.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
metrosNoRanked metros from softest to strongest
freshnessNo
methodologyNo
softest_to_strongestNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed24 schema fields changed
    • removedOutput schema / properties / error
      Removed value: -{
      -  "description": "Error message if request failed",
      -  "type": "string"
      -}
    • addedOutput schema / properties / freshness
      Added value: +{
      +  "properties": {
      +    "age_days": {
      +      "type": "number"
      +    },
      +    "as_of": {
      +      "type": "string"
      +    },
      +    "cadence": {
      +      "type": "string"
      +    },
      +    "newest_observation_date": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "oldest_observation_date": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "release_schedule": {
      +      "type": "string"
      +    },
      +    "smoothing": {
      +      "type": "string"
      +    },
      +    "statement": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / methodology
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / metros / items / properties / all_time_peak
      Removed value: -{
      -  "description": "Highest value ever recorded",
      -  "type": "number"
      -}
    • addedOutput schema / properties / metros / items / properties / change_12m_pct
      Added value: +{
      +  "type": "number"
      +}
    • removedOutput schema / properties / metros / items / properties / change_12mo
      Removed value: -{
      -  "description": "12-month change in index points",
      -  "type": "number"
      -}
    • addedOutput schema / properties / metros / items / properties / change_3m_pct
      Added value: +{
      +  "type": "number"
      +}
    • removedOutput schema / properties / metros / items / properties / change_3mo
      Removed value: -{
      -  "description": "3-month change in index points",
      -  "type": "number"
      -}
    • removedOutput schema / properties / metros / items / properties / current
      Removed value: -{
      -  "description": "Latest Case-Shiller index value",
      -  "type": "number"
      -}
    • removedOutput schema / properties / metros / items / properties / drawdown_from_peak
      Removed value: -{
      -  "description": "Percent decline from all-time peak",
      -  "type": "number"
      -}
    • addedOutput schema / properties / metros / items / properties / drawdown_from_peak_pct
      Added value: +{
      +  "type": "number"
      +}
    • addedOutput schema / properties / metros / items / properties / latest_age_days
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / metros / items / properties / latest_date
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / metros / items / properties / latest_value
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / metros / items / properties / matched_name
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / metros / items / properties / metro
      Removed value: -{
      -  "description": "Metro name",
      -  "type": "string"
      -}
    • removedOutput schema / properties / metros / items / properties / pct_change_12mo
      Removed value: -{
      -  "description": "12-month percent change",
      -  "type": "number"
      -}
    • removedOutput schema / properties / metros / items / properties / pct_change_3mo
      Removed value: -{
      -  "description": "3-month percent change",
      -  "type": "number"
      -}
    • addedOutput schema / properties / metros / items / properties / peak_date
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / metros / items / properties / peak_value
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / metros / items / properties / requested
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / metros / items / properties / trend
      Removed value: -{
      -  "description": "Trend label based on recent values",
      -  "enum": [
      -    "rising",
      -    "falling",
      -    "stable"
      -  ],
      -  "type": "string"
      -}
    • removedOutput schema / properties / snapshot_date
      Removed value: -{
      -  "description": "Today's date in YYYY-MM-DD format",
      -  "type": "string"
      -}
    • addedOutput schema / properties / softest_to_strongest
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  2. Changed1 schema field changed
    • changedInput schema / examples
      Previous value: -[
      -  {
      -    "metros": [
      -      "Denver",
      -      "Phoenix",
      -      "Tampa",
      -      "Charlotte"
      -    ]
      -  },
      -  {
      -    "_fredKey": "your-housing-intel-api-key",
      -    "metros": [
      -      "San Francisco",
      -      "Los Angeles",
      -      "Seattle"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "metros": [
      +      "Denver",
      +      "Phoenix",
      +      "Tampa",
      +      "Charlotte"
      +    ]
      +  },
      +  {
      +    "metros": [
      +      "San Francisco",
      +      "Los Angeles",
      +      "Seattle"
      +    ]
      +  }
      +]
  3. Changed16 schema fields changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "metros": [
      +      "Denver",
      +      "Phoenix",
      +      "Tampa",
      +      "Charlotte"
      +    ]
      +  },
      +  {
      +    "_fredKey": "your-housing-intel-api-key",
      +    "metros": [
      +      "San Francisco",
      +      "Los Angeles",
      +      "Seattle"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "description": "Error message if request failed",
      +  "type": "string"
      +}
    • changedOutput schema / properties / metros / items / properties / all_time_peak / description
      Previous value: -"Peak index value in series history"New value: +"Highest value ever recorded"
    • removedOutput schema / properties / metros / items / properties / change_12m
      Removed value: -{
      -  "description": "12-month change in index points",
      -  "type": "number"
      -}
    • addedOutput schema / properties / metros / items / properties / change_12mo
      Added value: +{
      +  "description": "12-month change in index points",
      +  "type": "number"
      +}
    • removedOutput schema / properties / metros / items / properties / change_3m
      Removed value: -{
      -  "description": "3-month change in index points",
      -  "type": "number"
      -}
    • addedOutput schema / properties / metros / items / properties / change_3mo
      Added value: +{
      +  "description": "3-month change in index points",
      +  "type": "number"
      +}
    • changedOutput schema / properties / metros / items / properties / drawdown_from_peak / description
      Previous value: -"Percentage below all-time peak"New value: +"Percent decline from all-time peak"
    • addedOutput schema / properties / metros / items / properties / pct_change_12mo
      Added value: +{
      +  "description": "12-month percent change",
      +  "type": "number"
      +}
    • addedOutput schema / properties / metros / items / properties / pct_change_3mo
      Added value: +{
      +  "description": "3-month percent change",
      +  "type": "number"
      +}
    • changedOutput schema / properties / metros / items / properties / series_id / description
      Previous value: -"FRED series ID"New value: +"FRED series ID (e.g., DNXRSA)"
    • changedOutput schema / properties / metros / items / properties / softening / description
      Previous value: -"True if recent trend shows softening"New value: +"True if 12-month change is negative"
    • addedOutput schema / properties / metros / items / properties / trend
      Added value: +{
      +  "description": "Trend label based on recent values",
      +  "enum": [
      +    "rising",
      +    "falling",
      +    "stable"
      +  ],
      +  "type": "string"
      +}
    • removedOutput schema / properties / ranking_note
      Removed value: -{
      -  "description": "Explanation of ranking methodology",
      -  "type": "string"
      -}
    • changedOutput schema / properties / snapshot_date / description
      Previous value: -"ISO date of snapshot"New value: +"Today's date in YYYY-MM-DD format"
    • removedOutput schema / required
      Removed value: -[
      -  "snapshot_date",
      -  "metros"
      -]
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "metros": {
      +      "description": "Ranked metros from softest to strongest",
      +      "items": {
      +        "properties": {
      +          "all_time_peak": {
      +            "description": "Peak index value in series history",
      +            "type": "number"
      +          },
      +          "change_12m": {
      +            "description": "12-month change in index points",
      +            "type": "number"
      +          },
      +          "change_3m": {
      +            "description": "3-month change in index points",
      +            "type": "number"
      +          },
      +          "current": {
      +            "description": "Latest Case-Shiller index value",
      +            "type": "number"
      +          },
      +          "drawdown_from_peak": {
      +            "description": "Percentage below all-time peak",
      +            "type": "number"
      +          },
      +          "metro": {
      +            "description": "Metro name",
      +            "type": "string"
      +          },
      +          "series_id": {
      +            "description": "FRED series ID",
      +            "type": "string"
      +          },
      +          "softening": {
      +            "description": "True if recent trend shows softening",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "ranking_note": {
      +      "description": "Explanation of ranking methodology",
      +      "type": "string"
      +    },
      +    "snapshot_date": {
      +      "description": "ISO date of snapshot",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "snapshot_date",
      +    "metros"
      +  ],
      +  "type": "object"
      +}
  5. Added

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare it read-only, idempotent, and non-destructive. The description adds substantial behavioral context beyond that: the two-month publication lag, three-month moving average, typically 90-120 day old observations, and the `freshness` block that reports exact data age. It also discloses that it picks the correct per-metro FRED series IDs automatically.

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 long but every sentence earns its place: purpose, output metrics, example queries, available metro list, and a crucial freshness caveat. It is front-loaded with the core action and the most decision-relevant caveat is clearly flagged with 'NOT A CURRENT-MARKET READ.'

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?

Covers what the tool returns (metrics, ranking, freshness), which inputs are valid, why the data age is important, and how the caller benefits (no need to know FRED series IDs). Combined with the existing output schema and annotations, nothing an agent needs to call it 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 description coverage is 100%, so the baseline is 3. The description goes further by listing the 20 available metros, noting case-insensitivity, explicitly allowing any subset, and clarifying that series ID selection is handled for the caller. This adds genuine value beyond the schema's plain parameter 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 states a specific verb and resource: 'Compare Case-Shiller home price indices across multiple US metros in one call (the 20-city composite).' It lists the exact metrics returned and the query patterns it addresses, making it clearly distinct from sibling housing tools.

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?

Provides explicit example query phrasings ('which metros are softening', 'compare housing prices in X, Y, Z') and explicitly warns it is NOT a current-market read due to the monthly lag and moving-average nature. This gives clear when-to-use and when-not-to-use guidance without naming alternatives.

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.