Skip to main content
Glama

Find Sites

find_sites
Read-onlyIdempotent

FRONT DOOR CHECK — if the question spans more than one capability ("find 200MW near Dallas with fiber, then rank the markets"), call execute_plan(intent="<the user's question, unchanged>"). find_sites is the right single call when the user has NO site yet and wants candidates to start from — the first step of data center site selection. THE INVERSE QUERY: every other DC Hub siting tool needs a coordinate you already have — analyze_site scores one, get_composite_site_score grades one, rank_sites orders candidates YOU already enriched, find_alternatives needs a seed facility. This one answers "where should I even be looking?". Returns candidate SEARCH AREAS anchored on real HIFLD substations at or above min_voltage_kv, spatially de-duplicated by cluster_km so a dense metro yields distinct areas instead of 40 near-identical rows, each carrying measured distance to the nearest gas pipeline and fiber route plus state-grain moratorium context, and a next_calls handoff. ★ WHAT A CANDIDATE IS NOT: a search area is NOT a parcel, NOT a listing, and NOT land known to be for sale — DC Hub holds no land-ownership or availability data, and hosted parcel boundaries cover ONE county (Loudoun VA), so analyze_parcel will 404 on most of these points BY DESIGN. Read each as "start looking here", then score the coordinate with analyze_site. ★ READ constraint_coverage BEFORE CALLING THIS A SCREENED LIST: a constraint filters ONLY when its layer actually answered. If a layer errors, the set comes back UNFILTERED with applied:false plus a reason and an instead, the names repeated in top-level unapplied_constraints and an unapplied_constraints_warning — an unevaluable constraint is never a passed constraint. fiber_distance_km is a straight-line CHORD between a route's endpoints, NOT the true polyline path; its basis is stamped on every candidate and get_fiber_readiness at the coordinate is the engineered read. hazard/moratorium are STATE grain, never a site verdict. A geography is REQUIRED — pass state, or lat+lon (+radius_km); without one you get a legible 400 (error_code geography_required), never a nationwide scan. Free tier coarsens coordinates to ~11 km and withholds operator/capacity. Answers "where should I even be looking for 200 MW in Ohio" and "which areas near Dallas sit on 230kV with gas within 5 miles". Try: find_sites state=OH min_voltage_kv=230 max_gas_km=8 — or find_sites lat=39.04 lon=-77.48 radius_km=60 min_voltage_kv=500. Do NOT use to score a site you already have (analyze_site), to rank candidates you already enriched (rank_sites), to find similar FACILITIES to a known one (find_alternatives), or for interconnection-queue survivors (get_refined_queue).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latNoLatitude of a search centre, e.g. 39.04 — use with lon (+ radius_km) instead of state
lngNoAlias for lon — either name works
lonNoLongitude of a search centre, e.g. -77.48
limitNoMax results to return (1-500; default varies by tool)
stateNo2-letter US state to search, e.g. OH — required unless you pass lat + lon
latitudeNoAlias for lat — either name works
longitudeNoAlias for lon — either name works
radius_kmNoSearch radius in km around lat/lon (default 80, clamped 5-400); ignored in state mode
cluster_kmNoCollapse anchors within this many km into one candidate area (default 8, max 100). Raise it for broader coverage, lower it for denser results
max_gas_kmNoDrop candidates farther than this from the nearest gas pipeline. Applied ONLY if the gas layer answers — check constraint_coverage
max_fiber_kmNoDrop candidates farther than this from the nearest fiber route (CHORD approximation — see fiber_distance_basis). Applied ONLY if the fiber layer answers
min_voltage_kvNoOnly anchor on substations at or above this voltage in kV (default 115). 230+ for hyperscale, 500 for the largest campuses
exclude_moratoriumNotrue = drop candidates in a state with a published data-center moratorium. STATE grain, not jurisdiction grain

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
quotaNoCaller quota state (remaining calls, tier).
_entityNoPayload class (facility|market|iso_grid|queue_results|deal|report|response); branch on it.
citationNoHow to attribute DC Hub: {source, url, license, cite_as, retrieved_at}, or the attribution line as a string.
provenanceNoSource, method, as_of, verification_counts, license, cite_as; quote it when citing.
_front_doorNoFirst-tool hint: plan_query(intent) returns the ordered plan.
_return_loopNoNext-session delta call (get_changes).
site_evaluation_handoffNoFollow-up calls [{tool, parameters, why}] when the payload carries coordinates.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added
  2. Removed
  3. Added

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only cover safety (readOnly, idempotent, non-destructive), but the description discloses far more: constraint_coverage semantics, the unfiltered fallback with applied:false/warning, the chord-vs-polyline fiber caveat, state-grain hazard/moratorium, the geography_required 400, and free-tier coordinate coarsening. This is unusually rich behavioral context beyond structured fields.

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

Conciseness3/5

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

Front-loads the routing decision well, but is dense and partly redundant — the 'THE INVERSE QUERY' paragraph and the closing 'Do NOT use ...' sentence restate the same sibling list. Several clauses (free tier, hazard grain, chord caveat) could be consolidated without losing meaning.

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?

Given a 13-parameter, no-required-parameter tool with an output schema, the description covers input requirements (geography mandatory), constraint behavior, return shape, caveats, and handoffs. 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 coverage is 100%, so baseline 3, but the description adds semantics: '230+ for hyperscale, 500 for the largest campuses' for min_voltage_kv, the state-vs-lat/lon requirement, and two fully worked example invocations. It goes modestly beyond the schema's own parameter text.

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

Purpose5/5

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

States a specific verb and resource ('find_sites ... answers where should I even be looking') and defines the exact output — candidate search areas anchored on real HIFLD substations. It explicitly distinguishes itself from siblings (analyze_site, get_composite_site_score, rank_sites, find_alternatives, get_refined_queue) so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit selection rule: use find_sites when the user has NO site yet and wants candidates, and route multi-capability questions to execute_plan. It names the alternatives and the conditions that select them, plus concrete when-to-call examples ('200 MW in Ohio', 'areas near Dallas on 230kV with gas within 5 miles').

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.