Skip to main content
Glama

Changes in area

changes_in_area
Read-onlyIdempotent

Find what opened, closed, or changed in a named area or bounding box by comparing two Overture map releases, with counts and category breakdowns.

Instructions

What's opened or closed around here since a past Overture release.

Use this for "what's new around here", "what's closed since spring",
or any question with a time dimension — every other tool here answers
against a single, current snapshot of the data; this is the only tool
that compares two.

Area, exactly one of:
- place: a free-text area name ("Palo Alto"), resolved with this
  server's usual free-text area matching (prominence-ranked, "City,
  ST" suffix aware). The resolved division is echoed back as "area"
  on the response. A name
  matching several equally-ranked divisions returns {"error":
  "ambiguous_area", "candidates": [...]} rather than silently picking
  one; an unresolvable name returns {"error": "not_found"}. If the
  resolved division is too large to diff (bigger than this tool's
  per-side degree cap — countries, large regions), returns a
  {"error": "bad_request"} naming the area and suggesting a smaller
  one (a neighborhood or district instead of a whole city/region) or
  an explicit bbox.
- min_lon/min_lat/max_lon/max_lat: an explicit bbox (all four
  together, or none) — for when the caller already has coordinates
  rather than a name. Same size cap as the named-area path.

category, when given, filters both releases' scans identically before
diffing — see diff_places; a place that changed OUT of the category
between releases reads as "disappeared" from this filtered view, which
is the correct reading of "restaurants that changed", not a bug.

from_release/to_release: Overture release strings (YYYY-MM-DD.N). Omit
both to diff the previous release against the ACTIVE one — to_release
defaults to release.resolve_release(), the same release every other
tool in this conversation queries (env pins included), and
from_release defaults to the newest listed release older than it: an
adjacent, recent window. Not the oldest release Overture still serves
— years-old releases are schema-drifted enough that most compared
columns NULL out and everything reads as "changed"; pass explicit
releases for a wider window, and check "degraded_fields" on the
response when you do. Pass both to pick a
specific window; passing only one is a {"error": "bad_request"}. When
the release listing is reachable, an explicit release not in it is
also a {"error": "bad_request"} rather than a silent typo'd diff; when
the listing itself is unreachable (network trouble), explicit releases
are tried directly instead — they may still resolve even though the
list couldn't be built.

If neither release is given and no listed release is older than the
active one (a listing failure, or a world with only one live release),
this returns a structured {"error": "upstream_unavailable"} naming
whatever releases WERE found — never an empty diff that would read as
"nothing changed here" when the real answer is "the window couldn't be
built".

limit caps how many ranked rows each of appeared/disappeared/changed
carries (default 8, hard cap 25 — the same per-answer row bound every
other tool here uses); "counts" and the "*_by_category" breakdowns are
never reduced by it.

Returns a compact digest, not the full diff: headline "counts"
(appeared/disappeared/changed/unchanged, always exact within the
scanned bound), a `limit`-capped ranked slice of each of
appeared/disappeared/changed (id, name, category, confidence, lat,
lon — changed rows carry old_name/new_name and
old_category/new_category instead of name/category), a small
per-bucket "*_by_category" breakdown computed over everything the
scans saw (same denominator as "counts", not the limit-capped slice),
the "releases" window actually used, "degraded_fields" when either
release's schema is missing a compared column (that field was NULL on
that side, so treat "changed" with suspicion), and
"truncated"/"omitted_count" when more exists than fits
(omitted_count sums omissions across the three lists).

Honest framing (issue #309): a "notes" list is attached whenever it
applies — a disappearance may be delisting or data cleanup, not a
closure; an appearance may be newly-mapped, not newly-opened. Neither
claim is inferable from this data alone, so the digest says so rather
than implying otherwise.

Returns a structured {"error": ...} if upstream is unavailable or the
active places dataset is missing the id/bbox columns this tool depends
on, for either release.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNo
placeNo
max_latNo
max_lonNo
min_latNo
min_lonNo
categoryNo
to_releaseNo
from_releaseNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Install Server

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description's job is to add behavioral context — and it does so richly. It discloses structured error modes (ambiguous_area with candidates, not_found, bad_request for oversized areas and partial release pairs, upstream_unavailable), the default release window resolution, degraded_fields schema-drift behavior where 'everything reads as changed', truncation/omitted_count semantics, and the honest-framing 'notes' caveat that a disappearance may be data cleanup rather than a closure. This goes far beyond what annotations convey.

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

Conciseness4/5

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

Front-loaded with purpose and usage before parameter detail, and organized into clear paragraphs per parameter group. It is lengthy, but every section carries substantive content. Minor redundancy exists — degraded_fields is mentioned both in the release-window guidance and in the return-format section, and the final error paragraph restates upstream_unavailable behavior already described — but for a 9-parameter tool with 0% schema coverage, this depth is largely earned rather than padded.

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 tool of this complexity (9 params, release-window semantics, size caps, multiple error modes, nuanced return digest), the description covers every dimension an agent needs: parameter semantics, defaults, edge cases, error contracts, truncation behavior, and interpretive caveats about what appeared/disappeared actually mean. Even though an output schema exists, the description adds semantic nuance (exact counts, by_category denominators, degraded_fields warnings) that structured schemas cannot express. Nothing needed for correct invocation or result interpretation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden for all 9 parameters — and it does so exhaustively. place gets free-text resolution semantics plus ambiguous/not_found error behavior; the four bbox params get their all-or-none constraint and size cap; category gets its both-sides-identically filter semantics and the 'disappeared' interpretation; from_release/to_release get defaults, validation rules, and the partial-passing bad_request; limit gets its default (8), hard cap (25), and the fact that counts/by_category are never reduced by it. No parameter is left to schema inference.

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

Purpose5/5

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

Opens with a specific, verb-driven statement of what the tool does: 'What's opened or closed around here since a past Overture release.' It then explicitly distinguishes itself from every sibling: 'every other tool here answers against a single, current snapshot of the data; this is the only tool that compares two.' An agent can immediately tell this apart from compare_areas (two areas, one snapshot) and find_places (one snapshot, no time dimension).

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 concrete example queries ('what's new around here', 'what's closed since spring') and an explicit selection rule: any question with a time dimension belongs here because no other tool compares two releases. It also implicitly gives the when-not-to-use condition (single-snapshot questions should go elsewhere) and later warns against too-large areas, routing the caller to a neighborhood/district or bbox instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/chuofringer/placeroot'

If you have feedback or need assistance with the MCP directory API, please join our Discord server