Skip to main content
Glama

DC Hub — Data Center Site Selection & Colocation: Electricity, Power Grid, Gas, Fiber

Plan Query

plan_query
Read-onlyIdempotent

INSPECT-ONLY — returns the plan WITHOUT running it. For a real multi-step DC Hub question call execute_plan(intent="...") instead: it uses the SAME deterministic no-LLM planner and then RUNS the sequence server-side, returning the answers in one envelope. Reach for plan_query only to review, log, diff or audit a plan before executing it yourself. Deterministic keyword routing over the tool registry — no LLM, no network, same intent always returns the same plan (free). Returns _entity=query_plan {best_tool, intent_confidence + workflow_confidence (dual 0-1: question-read vs executability), reason, planner_rationale, recommended_sequence:[{step, tool, depends_on, estimated_calls, why, args_hint}], execution_waves (steps grouped into concurrency waves), execution_strategy.parallel_groups, execution_estimate {estimated_calls, estimated_latency_ms, parallelizable}, alternatives (each with when + rejected_because), coverage_notes, matched_classes} plus a versioned replay (schema_version 1): planner_version, decisions:[{id, step, kind, status, decision, rationale, decision_confidence, depends_on}], rejected:[{id, tool, reason}], execution_graph:{waves, parallel_groups} — auditable and machine-readable, safe to log and diff across versions. args_hint values in come from the named earlier step — substitute them, never invent them. Pass structured hints via context (lat/lon, iso, market, capacity_mw, candidate_id, state, since) to sharpen the plan. For a family-level browse use discover_tools. This tool plans — it never executes; tools/list stays canonical for schemas.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
intentYesNatural-language description of what you are trying to find out, e.g. "rank markets for a 200MW AI campus" or "how much power is available in ERCOT"
contextNoOptional structured hints: {lat, lon, iso, market, capacity_mw, candidate_id, state (2-letter), since} — sharpens args_hint values and routing (e.g. lat/lon boosts the site-analysis route)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okNotrue when the intent was routed
noteNoRouter disclaimer — deterministic keyword routing, tools/list stays canonical
quotaNoCaller quota state (remaining calls, tier) when available.
intentNoThe natural-language intent that was routed (echoed back)
reasonNoWhy the router chose best_tool — the matched keywords / context signals
replayNoFIRST-CLASS VERSIONED replay object (r-planner-v5.1, ChatGPT schema review): the planner's auditable decision trail — routing + per-step selection + rejections + concurrency graph, each decision with a stable id + status, keyed by planner_version so an agent can cite "Decision D2 selected rank_markets because…" and downstream tooling survives planner upgrades.
_entityNoPayload class discriminator (e.g. facility|market|iso_grid|queue_results|deal|report|response) — branch on this before parsing the rest.
chainingNoZero-drift chaining guidance (candidate_id contract) when the plan crosses get_refined_queue → analyze_site / rank_sites
citationNoMachine-readable citation: how to attribute DC Hub (dchub.cloud) for this payload. Normally an OBJECT {source, url, license, cite_as, retrieved_at}; a bare string is accepted and carries the attribution line itself.
best_toolNoThe single best first tool to call for this intent (exact name from tools/list)
confidenceNoDeterministic router confidence, 0-1 — same intent always yields the same score; low values mean the intent was ambiguous (check alternatives). Alias of intent_confidence (v1 back-compat).
provenanceNoCollection-level provenance block: {source, method, as_of, verification_counts, cite_url_template, license, cite_as}. Quote the verification level when citing.
_front_doorNoIn-band front-door hint (first workflow-entry tool of a session): call plan_query(intent) first for the ordered multi-step plan.
_return_loopNoSuggested next-session delta call (get_changes since=24h) so you pull only what changed.
alternativesNoAdjacent tools for nearby intents, including runner-up intent classes
intent_classNoThe matched intent class (market_ranking | capacity_search | market_comparison | grid_headroom | interconnection_queue | hosting_capacity | water_climate | site_analysis | deals_ma | fiber_power_pairing | fiber | price | incentives_tax | power_timeline | changes_delta | facility_search | unknown)
routing_hintNoADVISORY router: collapses 83 tools to one starting point, then names what lies outside DC Hub entirely. Deliberately carries no tool list, latency promise, confidence score, execution graph or planner version — those ride `replay` AFTER routing. Four fields specified by ChatGPT in the 2026-08-29 partner round; external_sources_recommended added on its own request in the 2026-08-30 briefing, because a source we do not own is not execution metadata.
coverage_notesNoTier/coverage caveats for the recommended tools (free-tier previews, depth gates, honest-unknown semantics)
parallelizableNotrue when at least one execution wave holds 2+ steps — the plan is not purely sequential
estimated_callsNoTotal estimated API calls for the whole plan (sum of per-step estimates)
execution_wavesNoThe execution graph as concurrency waves: array of arrays of step numbers; every step in a wave can run concurrently once earlier waves finish (derived from depends_on)
matched_classesNoEvery intent class that scored, with its score — the router's full deterministic trace
intent_confidenceNoHow confident the router is that it read the QUESTION right (0-1, deterministic) — driven by keyword score + margin over the runner-up class
planner_rationaleNoOne sentence on why the PLAN has this shape (ordering / parallelism / what mints what) — distinct from reason, which covers intent routing
execution_estimateNor-planner-v3 deterministic cost preview: {estimated_calls (plan NODE count — one per step; the top-level estimated_calls is the fan-out-weighted API-call total), estimated_latency_ms (sum over waves of the SLOWEST tool in each wave, from a static 3-tier table: heavy synthesis 3000ms / standard read 1200ms / light free read 500ms), parallelizable (any wave holds 2+ steps)}
execution_strategyNor-planner-v3 explicit strategy: {parallel_groups: string[][] — execution_waves rendered as TOOL-NAME arrays (e.g. [["get_grid_intelligence","get_interconnection_queue","get_refined_queue"]]), note: plan-only disclaimer — this tool only plans; execute the sequence yourself}
workflow_confidenceNoHow confident the router is that the plan can EXECUTE cleanly with the signals in hand (0-1, deterministic) — boosted by resolved context signals, docked for placeholder args the user must still supply; step-minted placeholders don't dock
recommended_sequenceNoOrdered tool sequence mirroring the DC Hub recipe for the matched intent class
site_evaluation_handoffNoPre-built follow-up calls (analyze_site / get_water_risk args) when the payload carries coordinates — an array of {tool, parameters, why} entries.
workflow_confidence_basisNoThe arithmetic behind workflow_confidence: {resolved_signals, minted_placeholders, user_supplied_placeholders}

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / routing_hint / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "advisory": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "States that this recommends an entry point and asserts nothing about success"
      -      },
      -      "best_path": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Where to start: `execute_plan` for a multi-capability question, or the one tool name for a single-capability lookup"
      -      },
      -      "expected_outputs": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "description": "An output CLASS to expect — not a tool name"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Bounded list of what the recommended path returns"
      -      },
      -      "problem": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "The matched intent class — the SAME closed enum as intent_class, so it is branchable, not free text"
      -      },
      -      "why": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Short deterministic rationale for that entry point"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "advisory": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "States that this recommends an entry point and asserts nothing about success"
      +      },
      +      "best_path": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Where to start: `execute_plan` for a multi-capability question, or the one tool name for a single-capability lookup"
      +      },
      +      "expected_outputs": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "An output CLASS to expect — not a tool name"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Bounded list of what the recommended path returns"
      +      },
      +      "external_sources_recommended": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "anyOf": [
      +                {
      +                  "additionalProperties": {},
      +                  "properties": {
      +                    "source_class": {
      +                      "anyOf": [
      +                        {
      +                          "type": "string"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ],
      +                      "description": "Closed enum: brokerage_research | market_analytics | financial_context | utility_or_iso_filing | operator_disclosure"
      +                    },
      +                    "why": {
      +                      "anyOf": [
      +                        {
      +                          "type": "string"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ],
      +                      "description": "What that class of source holds that DC Hub does not, quoting our own published limit"
      +                    }
      +                  },
      +                  "type": "object"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "What this question needs that DC Hub does NOT hold, named by SOURCE CLASS and never by vendor. An EMPTY array is an answer: DC Hub covers this class end to end."
      +      },
      +      "problem": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "The matched intent class — the SAME closed enum as intent_class, so it is branchable, not free text"
      +      },
      +      "why": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Short deterministic rationale for that entry point"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / routing_hint / description
      Previous value: -"ADVISORY four-field router: collapses 82 tools to one starting point. Deliberately carries no tool list, latency promise, confidence score, execution graph or planner version — those ride `replay` AFTER routing. Specified by ChatGPT in the 2026-08-29 partner round."New value: +"ADVISORY router: collapses 83 tools to one starting point, then names what lies outside DC Hub entirely. Deliberately carries no tool list, latency promise, confidence score, execution graph or planner version — those ride `replay` AFTER routing. Four fields specified by ChatGPT in the 2026-08-29 partner round; external_sources_recommended added on its own request in the 2026-08-30 briefing, because a source we do not own is not execution metadata."
  2. Changed1 schema field changed
    • addedOutput schema / properties / routing_hint
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "properties": {
      +        "advisory": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "States that this recommends an entry point and asserts nothing about success"
      +        },
      +        "best_path": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Where to start: `execute_plan` for a multi-capability question, or the one tool name for a single-capability lookup"
      +        },
      +        "expected_outputs": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "An output CLASS to expect — not a tool name"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Bounded list of what the recommended path returns"
      +        },
      +        "problem": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "The matched intent class — the SAME closed enum as intent_class, so it is branchable, not free text"
      +        },
      +        "why": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Short deterministic rationale for that entry point"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "ADVISORY four-field router: collapses 82 tools to one starting point. Deliberately carries no tool list, latency promise, confidence score, execution graph or planner version — those ride `replay` AFTER routing. Specified by ChatGPT in the 2026-08-29 partner round."
      +}
  3. Changed2 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedOutput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
  4. Changed8 schema fields changed
    • removedOutput schema / properties / citation / additionalProperties
      Removed value: -{}
    • addedOutput schema / properties / citation / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {},
      +    "type": "object"
      +  },
      +  {
      +    "type": "string"
      +  }
      +]
    • changedOutput schema / properties / citation / description
      Previous value: -"Machine-readable citation: how to attribute DC Hub (dchub.cloud) for this payload."New value: +"Machine-readable citation: how to attribute DC Hub (dchub.cloud) for this payload. Normally an OBJECT {source, url, license, cite_as, retrieved_at}; a bare string is accepted and carries the attribution line itself."
    • removedOutput schema / properties / citation / properties
      Removed value: -{}
    • removedOutput schema / properties / citation / type
      Removed value: -"object"
    • addedOutput schema / properties / replay / description
      Added value: +"FIRST-CLASS VERSIONED replay object (r-planner-v5.1, ChatGPT schema review): the planner's auditable decision trail — routing + per-step selection + rejections + concurrency graph, each decision with a stable id + status, keyed by planner_version so an agent can cite \"Decision D2 selected rank_markets because…\" and downstream tooling survives planner upgrades."
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking → 5.8 reversed-order timing vocabulary: \"timeline for power …\" reaches power_timeline on state-phrased asks while the ISO boost holds operator-phrased asks on grid_headroom → 5.9 replay.why_live_data, an additive per-class \"why this answer needed live data\" reason; routing unchanged → 5.10 why_live enum-ized: why_live_code from the canonical taxonomy why_live_reasons + phrase resolved from the snapshot; routing unchanged). Distinct from schema_version."New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking → 5.8 reversed-order timing vocabulary: \"timeline for power …\" reaches power_timeline on state-phrased asks while the ISO boost holds operator-phrased asks on grid_headroom → 5.9 replay.why_live_data, an additive per-class \"why this answer needed live data\" reason; routing unchanged → 5.10 why_live enum-ized: why_live_code from the canonical taxonomy why_live_reasons + phrase resolved from the snapshot; routing unchanged → 5.11 GEOGRAPHY SCOPING: a market_ranking intent naming a US state (or a city whose slug carries one) leads with site_selection_canvas region=<ST> — the only ranking tool with a state parameter; ai_capacity_index takes only horizon/limit and rank_markets region accepts only global/us/canada/eu/apac/americas, so both previously answered state-scoped questions nationally. _execConstraintIsoSet also resolves a named state to its ISO set, so the C1 constraint_check can finally fire on state-phrased intents). Distinct from schema_version."
    • removedOutput schema / required
      Removed value: -[
      -  "replay"
      -]
  5. Changed3 schema fields changed
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking → 5.8 reversed-order timing vocabulary: \"timeline for power …\" reaches power_timeline on state-phrased asks while the ISO boost holds operator-phrased asks on grid_headroom → 5.9 replay.why_live_data, an additive per-class \"why this answer needed live data\" reason; routing unchanged). Distinct from schema_version."New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking → 5.8 reversed-order timing vocabulary: \"timeline for power …\" reaches power_timeline on state-phrased asks while the ISO boost holds operator-phrased asks on grid_headroom → 5.9 replay.why_live_data, an additive per-class \"why this answer needed live data\" reason; routing unchanged → 5.10 why_live enum-ized: why_live_code from the canonical taxonomy why_live_reasons + phrase resolved from the snapshot; routing unchanged). Distinct from schema_version."
    • addedOutput schema / properties / replay / properties / why_live_code
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "ENUM (v5.10): why this plan needs LIVE data — one of the requires_* codes published in the canonical taxonomy (/api/v1/canon/taxonomy why_live_reasons). Enumerated so stamped replays aggregate (\"N% of executions needed live queue data\"); count THIS, not the phrase. Absent when intent_class=unknown."
      +}
    • addedOutput schema / properties / replay / properties / why_live_data
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Human phrase for why_live_code, resolved from the same canonical taxonomy — display it, never parse it. Additive at schema v1 (introduced 5.9 as class-keyed prose; enum-backed since 5.10)."
      +}
  6. Changed2 schema fields changed
    • changedOutput schema / properties / intent_class / description
      Previous value: -"The matched intent class (market_ranking | capacity_search | market_comparison | grid_headroom | interconnection_queue | hosting_capacity | water_climate | site_analysis | deals_ma | fiber_power_pairing | fiber | price | incentives_tax | changes_delta | facility_search | unknown)"New value: +"The matched intent class (market_ranking | capacity_search | market_comparison | grid_headroom | interconnection_queue | hosting_capacity | water_climate | site_analysis | deals_ma | fiber_power_pairing | fiber | price | incentives_tax | power_timeline | changes_delta | facility_search | unknown)"
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking → 5.8 reversed-order timing vocabulary: \"timeline for power …\" reaches power_timeline on state-phrased asks while the ISO boost holds operator-phrased asks on grid_headroom). Distinct from schema_version."New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking → 5.8 reversed-order timing vocabulary: \"timeline for power …\" reaches power_timeline on state-phrased asks while the ISO boost holds operator-phrased asks on grid_headroom → 5.9 replay.why_live_data, an additive per-class \"why this answer needed live data\" reason; routing unchanged). Distinct from schema_version."
  7. Changed1 schema field changed
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking). Distinct from schema_version."New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking → 5.8 reversed-order timing vocabulary: \"timeline for power …\" reaches power_timeline on state-phrased asks while the ISO boost holds operator-phrased asks on grid_headroom). Distinct from schema_version."
  8. Changed1 schema field changed
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal). Distinct from schema_version."New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal → 5.7 rank-vs-incentives arbitration: ranking language demotes the statutory class, \"rank markets by\" credits market_ranking). Distinct from schema_version."
  9. Changed3 schema fields changed
    • changedOutput schema / properties / intent_class / description
      Previous value: -"The matched intent class (market_ranking | grid_headroom | interconnection_queue | water_climate | site_analysis | deals_ma | fiber | price | changes_delta | facility_search | unknown)"New value: +"The matched intent class (market_ranking | capacity_search | market_comparison | grid_headroom | interconnection_queue | hosting_capacity | water_climate | site_analysis | deals_ma | fiber_power_pairing | fiber | price | incentives_tax | changes_delta | facility_search | unknown)"
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class). Distinct from schema_version."New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class → 5.6 the incentives_tax class + stateFromPlace arg signal). Distinct from schema_version."
    • changedOutput schema / properties / replay / properties / schema_version / description
      Previous value: -"Version of the REPLAY OBJECT SHAPE (field set) — independent of planner_version; pin THIS in an SDK. Bumps only on a breaking shape change, so the planner routing revs so far (5.1 → 5.5) have all left it at 1."New value: +"Version of the REPLAY OBJECT SHAPE (field set) — independent of planner_version; pin THIS in an SDK. Bumps only on a breaking shape change, so the planner routing revs so far (5.1 → 5.6) have all left it at 1."
  10. Changed2 schema fields changed
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 field renames → 5.2 new intent classes). Distinct from schema_version."New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 replay field renames → 5.2 capacity_search/market_comparison → 5.4 fiber_power_pairing → 5.5 the hosting_capacity distribution class). Distinct from schema_version."
    • changedOutput schema / properties / replay / properties / schema_version / description
      Previous value: -"Version of the REPLAY OBJECT SHAPE (field set) — independent of planner_version; pin THIS in an SDK. Bumps only on a breaking shape change, so a planner routing rev (5.1→5.2) leaves it untouched."New value: +"Version of the REPLAY OBJECT SHAPE (field set) — independent of planner_version; pin THIS in an SDK. Bumps only on a breaking shape change, so the planner routing revs so far (5.1 → 5.5) have all left it at 1."
  11. Changed1 schema field changed
    • addedOutput schema / properties / _front_door
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "In-band front-door hint (first workflow-entry tool of a session): call plan_query(intent) first for the ordered multi-step plan.",
      +  "properties": {},
      +  "type": "object"
      +}
  12. Changed7 schema fields changed
    • addedOutput schema / properties / replay / properties / compatibility
      Added value: +{
      +  "description": "The stability contract, published in-object: schema v1 is additive-only (no removals / semantic changes); planner_version may change routing/confidence/sequences/coverage without a schema bump; breaking changes only ever at a new schema_version. Pin schema_version, not planner_version."
      +}
    • removedOutput schema / properties / replay / properties / decision_log
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "because": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "The deterministic reason for the decision"
      -          },
      -          "confidence": {
      -            "anyOf": [
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  }
      -                ]
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "0-1 — intent_confidence for the routing decision, workflow_confidence for step decisions"
      -          },
      -          "decision": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "What the planner decided (route to a class / call a tool)"
      -          },
      -          "depends_on": {
      -            "description": "Step numbers this step depends on (step decisions only)"
      -          },
      -          "id": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "Stable decision id — D0 = routing decision, D1..Dn = per-step selections; cite as \"Decision D2\""
      -          },
      -          "kind": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "\"route\" (the intent→class decision) or \"step\" (a tool selection)"
      -          },
      -          "step": {
      -            "anyOf": [
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  }
      -                ]
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "0 for the routing decision, else the 1-based step number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "The ordered, auditable decision trail — one route decision + one per recommended step"
      -}
    • addedOutput schema / properties / replay / properties / decisions
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "decision": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "What the planner decided (route to a class / call a tool)"
      +          },
      +          "decision_confidence": {
      +            "anyOf": [
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  }
      +                ]
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "0-1 — intent_confidence for the routing decision, workflow_confidence for step decisions"
      +          },
      +          "depends_on": {
      +            "description": "Step numbers this step depends on (step decisions only)"
      +          },
      +          "id": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Stable decision id — D0 = routing decision, D1..Dn = per-step selections; cite as \"Decision D2\""
      +          },
      +          "kind": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "\"route\" (the intent→class decision) or \"step\" (a tool selection)"
      +          },
      +          "rationale": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "The deterministic reason for the decision"
      +          },
      +          "status": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Decision lifecycle — one of planned | running | completed | failed | skipped | cancelled. plan_query only ever emits \"planned\" (it never executes); the full enum is published now so consumers can code the whole lifecycle without an SDK bump later."
      +          },
      +          "step": {
      +            "anyOf": [
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  }
      +                ]
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "0 for the routing decision, else the 1-based step number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The ordered, auditable decision trail — one route decision + one per recommended step"
      +}
    • changedOutput schema / properties / replay / properties / intent / description
      Previous value: -"The routed intent (echoed)"New value: +"The routed intent (echoed) — duplicated so replay is self-contained"
    • changedOutput schema / properties / replay / properties / intent_class / description
      Previous value: -"The matched intent class"New value: +"The matched intent class (duplicated from plan_query.intent_class so replay deserializes alone)"
    • changedOutput schema / properties / replay / properties / planner_version / description
      Previous value: -"Semantic version of the planner that produced this trail — bump when routing/output changes so downstream tooling can pin a shape (r-planner-v5, ChatGPT orchestration feedback)"New value: +"Semantic version of the PLANNER BEHAVIOR (routing/output) — bumps when routing changes (e.g. 5.1 field renames → 5.2 new intent classes). Distinct from schema_version."
    • addedOutput schema / properties / replay / properties / schema_version
      Added value: +{
      +  "anyOf": [
      +    {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Version of the REPLAY OBJECT SHAPE (field set) — independent of planner_version; pin THIS in an SDK. Bumps only on a breaking shape change, so a planner routing rev (5.1→5.2) leaves it untouched."
      +}
  13. Changed3 schema fields changed
    • changedOutput schema / description
      Previous value: -"Deterministic query plan: best_tool + ordered recommended_sequence over the DC Hub tool registry — keyword/regex routing, no LLM, same intent → same plan — alongside the DC Hub envelope keys."New value: +"Deterministic query plan: best_tool + ordered recommended_sequence over the DC Hub tool registry — keyword/regex routing, no LLM, same intent → same plan — plus a versioned replay decision-trail, alongside the DC Hub envelope keys."
    • addedOutput schema / properties / replay
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "decision_log": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "additionalProperties": {},
      +            "properties": {
      +              "because": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "The deterministic reason for the decision"
      +              },
      +              "confidence": {
      +                "anyOf": [
      +                  {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "0-1 — intent_confidence for the routing decision, workflow_confidence for step decisions"
      +              },
      +              "decision": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "What the planner decided (route to a class / call a tool)"
      +              },
      +              "depends_on": {
      +                "description": "Step numbers this step depends on (step decisions only)"
      +              },
      +              "id": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Stable decision id — D0 = routing decision, D1..Dn = per-step selections; cite as \"Decision D2\""
      +              },
      +              "kind": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "\"route\" (the intent→class decision) or \"step\" (a tool selection)"
      +              },
      +              "step": {
      +                "anyOf": [
      +                  {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "0 for the routing decision, else the 1-based step number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The ordered, auditable decision trail — one route decision + one per recommended step"
      +    },
      +    "execution_graph": {
      +      "description": "{waves: number[][], parallel_groups: string[][]} — the concurrency graph the plan executes as"
      +    },
      +    "intent": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The routed intent (echoed)"
      +    },
      +    "intent_class": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The matched intent class"
      +    },
      +    "note": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "How to read + cite the replay; plan-only disclaimer"
      +    },
      +    "planner_version": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Semantic version of the planner that produced this trail — bump when routing/output changes so downstream tooling can pin a shape (r-planner-v5, ChatGPT orchestration feedback)"
      +    },
      +    "rejected": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "additionalProperties": {},
      +            "properties": {
      +              "id": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Stable rejection id (R1..Rn)"
      +              },
      +              "reason": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Why it was rejected — the deterministic rejected_because"
      +              },
      +              "tool": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "The tool/route the planner did NOT take"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Roads not taken, with reasons — the \"why not\" half of the audit trail"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / required
      Added value: +[
      +  "replay"
      +]
  14. Changed2 schema fields changed
    • addedOutput schema / properties / execution_estimate
      Added value: +{
      +  "description": "r-planner-v3 deterministic cost preview: {estimated_calls (plan NODE count — one per step; the top-level estimated_calls is the fan-out-weighted API-call total), estimated_latency_ms (sum over waves of the SLOWEST tool in each wave, from a static 3-tier table: heavy synthesis 3000ms / standard read 1200ms / light free read 500ms), parallelizable (any wave holds 2+ steps)}"
      +}
    • addedOutput schema / properties / execution_strategy
      Added value: +{
      +  "description": "r-planner-v3 explicit strategy: {parallel_groups: string[][] — execution_waves rendered as TOOL-NAME arrays (e.g. [[\"get_grid_intelligence\",\"get_interconnection_queue\",\"get_refined_queue\"]]), note: plan-only disclaimer — this tool only plans; execute the sequence yourself}"
      +}
  15. Changed10 schema fields changed
    • changedOutput schema / properties / alternatives / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "properties": {
      -        "tool": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Alternative tool name"
      -        },
      -        "when": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "When to prefer this tool over the recommended sequence"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "rejected_because": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Why the planner did NOT make this the primary route — the deterministic rejection reason"
      +        },
      +        "tool": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Alternative tool name"
      +        },
      +        "when": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "When to prefer this tool over the recommended sequence"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / confidence / description
      Previous value: -"Deterministic router confidence, 0-1 — same intent always yields the same score; low values mean the intent was ambiguous (check alternatives)"New value: +"Deterministic router confidence, 0-1 — same intent always yields the same score; low values mean the intent was ambiguous (check alternatives). Alias of intent_confidence (v1 back-compat)."
    • addedOutput schema / properties / estimated_calls
      Added value: +{
      +  "anyOf": [
      +    {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Total estimated API calls for the whole plan (sum of per-step estimates)"
      +}
    • addedOutput schema / properties / execution_waves
      Added value: +{
      +  "description": "The execution graph as concurrency waves: array of arrays of step numbers; every step in a wave can run concurrently once earlier waves finish (derived from depends_on)"
      +}
    • addedOutput schema / properties / intent_confidence
      Added value: +{
      +  "anyOf": [
      +    {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "How confident the router is that it read the QUESTION right (0-1, deterministic) — driven by keyword score + margin over the runner-up class"
      +}
    • addedOutput schema / properties / parallelizable
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "true when at least one execution wave holds 2+ steps — the plan is not purely sequential"
      +}
    • addedOutput schema / properties / planner_rationale
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "One sentence on why the PLAN has this shape (ordering / parallelism / what mints what) — distinct from reason, which covers intent routing"
      +}
    • changedOutput schema / properties / recommended_sequence / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "additionalProperties": {},
      -      "properties": {
      -        "args_hint": {
      -          "description": "Suggested arguments — values in <angle brackets> are produced by an earlier step (e.g. \"<metro_slug from step 1>\")"
      -        },
      -        "step": {
      -          "anyOf": [
      -            {
      -              "anyOf": [
      -                {
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "string"
      -                }
      -              ]
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "1-based step order"
      -        },
      -        "tool": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "Tool name (exact, from tools/list)"
      -        },
      -        "why": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "description": "What this step contributes to answering the intent"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "args_hint": {
      +          "description": "Suggested arguments — values in <angle brackets> are produced by an earlier step (e.g. \"<metro_slug from step 1>\")"
      +        },
      +        "depends_on": {
      +          "description": "Step numbers this step has a HARD DATA dependency on (it consumes a value they mint — slug, candidate_id, chosen ISO). Empty = can start immediately; user-supplied placeholders are not dependencies."
      +        },
      +        "estimated_calls": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "string"
      +                }
      +              ]
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Estimated API calls this step costs (fan-out steps like per-finalist reads are > 1)"
      +        },
      +        "step": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "string"
      +                }
      +              ]
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "1-based step order"
      +        },
      +        "tool": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "Tool name (exact, from tools/list)"
      +        },
      +        "why": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "What this step contributes to answering the intent"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / workflow_confidence
      Added value: +{
      +  "anyOf": [
      +    {
      +      "anyOf": [
      +        {
      +          "type": "number"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "How confident the router is that the plan can EXECUTE cleanly with the signals in hand (0-1, deterministic) — boosted by resolved context signals, docked for placeholder args the user must still supply; step-minted placeholders don't dock"
      +}
    • addedOutput schema / properties / workflow_confidence_basis
      Added value: +{
      +  "description": "The arithmetic behind workflow_confidence: {resolved_signals, minted_placeholders, user_supplied_placeholders}"
      +}
  16. Added

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds substantial context: deterministic keyword routing, no LLM, no network, same intent always returns the same plan, free, and 'never executes.' It also details the auditable replay structure and warns about args_hint substitution, going well beyond annotation basics. No contradiction with annotations.

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

Conciseness4/5

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

The description is long but front-loaded with the critical 'INSPECT-ONLY' caveat and usage rule. Detailed return-structure enumerations are somewhat redundant with the output schema, but they support the audit/log/diff use case and are organized; no sentence is filler, though it could be tightened.

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

Completeness5/5

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

For a complex planning tool with an output schema, the description covers all necessary decision points: what it does, what it does not do, when to use alternatives, determinism guarantees, output structure, and practical parameter hints. The pointer that tools/list stays canonical for schemas closes the loop on schema authority.

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 baseline is 3. The description adds useful operational meaning by explaining that context hints sharpen the plan and explicitly warning that <angle-bracket> args_hint values must be substituted from earlier steps, never invented. This extends beyond the 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 opens with 'INSPECT-ONLY — returns the plan WITHOUT running it,' a specific verb and resource with an explicit non-execution boundary. It immediately distinguishes itself from execute_plan and discover_tools, so an agent can tell siblings apart without opening schemas.

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?

It states exactly when to use this tool ('only to review, log, diff or audit a plan before executing it yourself') and names the alternatives with conditions: execute_plan for real multi-step questions, discover_tools for family-level browse. This is explicit when/when-not guidance with no inference required.

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.

TDQS

A4.1/5.0
Disambiguation4/5

Most tools have clearly distinct purposes despite some thematic overlap, and each description includes explicit 'Do NOT use' guidance to prevent misselection. However, a few pairs like search_intelligence vs semantic_search are nearly identical in function, and the sheer number of tools increases the chance of selecting the wrong one without careful reading.

Naming Consistency4/5

The vast majority of tools follow a predictable 'get_*' prefix for data reads, and many others use verb_noun patterns (analyze_*, rank_*, save_*, set_*). There are a handful of outliers like ai_capacity_index, grid_transition_radar, and site_selection_canvas that break the pattern, but overall the conventions are consistent enough for an agent to infer meaning.

Tool Count2/5

With 82 tools, this server is extremely heavy compared to typical MCP servers (3-15 tools). While the domain is broad, many tools serve narrow sub-purposes and could be consolidated (e.g., multiple site-scoring variants, multiple grid telemetry endpoints). The count overwhelms an agent's ability to choose efficiently and feels like over-fragmentation rather than necessary granularity.

Completeness4/5

The tool surface covers the full lifecycle of data-center siting intelligence: site analysis, grid, fiber, water, climate, tax, permitting, deals, news, saved-site management, and meta-planning. Minor gaps exist (e.g., no delete or update operations for saved sites), but the core workflows are well-supported and the descriptions are comprehensive.