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. Changed3 schema fields changed
    • changedOutput schema / properties / metros / items / properties / change_12m_pct / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / metros / items / properties / change_3m_pct / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / metros / items / properties / drawdown_from_peak_pct / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
  2. 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"
      +}
  3. 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"
      +    ]
      +  }
      +]
  4. 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"
      -]
  5. 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"
      +}
  6. Added

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, open-world, non-destructive, so the safety bar is met; the description goes well beyond by disclosing that the data is monthly, published on a ~two-month lag, each value is a three-month moving average, and the newest observation is typically 90-120 days old. It even points to the `freshness` block for exact age, which is the kind of staleness context an agent would otherwise get wrong.

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-loads purpose, then returns, then usage triggers, then the staleness caveat — a sensible order. It is somewhat long and the lag point is restated (two-month publish lag, three-month average, 90-120 day age), though for a tool prone to misuse as a current-market read the redundancy arguably 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?

With annotations covering the safety profile and an output schema present, the description need not explain return shapes but still summarizes them, and it flags the freshness field and data-lag caveat that materially affect interpretation. Nothing needed to invoke or correctly interpret this tool 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% for both parameters, so baseline would be 3. The description adds real value the schema lacks by enumerating all 20 valid metro names, which validates and constrains the `metros` array beyond the schema's vague "any subset of the 20-city composite".

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 (Compare) plus resource (Case-Shiller home price indices) and scope (multiple US metros, the 20-city composite), and enumerates exactly what is returned per metro. This is clearly distinguishable from siblings like housing_market_snapshot or housing_market_screen.

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 concrete trigger phrasings ("which metros are softening", "Case-Shiller for [list of cities]", "compare housing prices in X, Y, Z"), which is strong when-to-use guidance. It does not, however, name any sibling tool as the alternative for adjacent questions, so it stops short of explicit exclusions.

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.