Skip to main content
Glama

Find lots that match a list

screenLots

Find the lots in one live Bucky city that match a list. Pass city or geoDivisionId with thesis (plain words), criteria (square feet, dollars), or both; or pass a saved profileId. Returns countOutcome (exact, partial, at_least, estimate, or unavailable), screeningRunId, and selected lots ranked largest first with a pass, fail, or not_available verdict per filter. totalMatches is a compatibility value and can be returned-page size when the total is unavailable. Report a not_available filter; never present the count as filtered by it. The execution preserves selection for optional candidate assessment; assessment candidate counts are separate from search totals. Returns candidates, counted suggestions and savedMatches. Candidate/suggestion criteria use the same square-foot boundary as the input, including canonical registry values and strategies. Present these alternatives before asking to save. Pass the selected criteria with save=true only after explicit approval, without re-reading the thesis. Each lot has lotId for saveLot, address for getFeasibilitySnapshot and parcelExternalId for saveToProject. Assembly lots carry the same ids. At most 25 lots per call (limit, default 10). page says which matches these are (offset, returned, total, truncated); when truncated, call screenLots with page.next for the next lots. Paging reads only: it saves nothing and uses no list quota. save=true saves the list (write scope, counts against the plan list limit) and returns a CSV link of every match; the CSV needs a saved list, so links.csv is null without one.

Input Schema

NameRequiredDescriptionDefault
cityNoCity as the user said it, e.g. "Laval" or "Bedford, MA". Omit when you pass geoDivisionId or profileId.
saveNotrue saves the list to the account. Default false. Search execution history is recorded.
sortNoOrder of the returned lots across every match. Default lot_area_desc (largest first). land_value_per_buildable_asc / assessed_value_per_buildable_asc: lowest assessed land (or total) value per buildable sq ft first, for "cheapest land per buildable foot". Lots with no cited FSR or usable assessment come last.
limitNoLots to return. Default 10, at most 25 per call; page.next reads the next lots. countOutcome states whether the total is exact, partial, at_least (a lower bound), estimate (about), or unavailable.
cursorNoNext page of the same box. Copy page.next from the prior result: it carries the cursor with the box. Do not combine with thesis. Reads only; nothing is saved.
thesisNoThe list in plain words, e.g. "industrial lots over half an acre outside the floodplain".
contextYesExplain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution."
hygieneNoDefault true. Ad-hoc lists leave out public owners (owner_class), cap lot size at 5 acres and ignore assessed values under $100,000 where the city stores them, unless criteria set the same field. Each default is named in notes. false skips them. Ignored with profileId: a saved list runs as saved.
assemblyNoAssembly mode: also return candidate assemblies, 2 to maxLots adjacent lots that each pass criteria and together meet minCombinedAreaSqft and/or minCombinedFrontageFt. Use for "two or three adjacent lots that combine to 10,000 sf"; put per-lot limits in criteria and the combined size here, not in minAreaSqft.
criteriaNoStructured criteria. A field set here replaces the same field read from thesis.
saveNameNoName for a saved list.
profileIdNoSaved list id. Runs the saved city and criteria. Do not combine with city, thesis, or criteria.
geoDivisionIdNoDivision id, from an earlier screenLots or cityInventory result.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / typology / description
      Previous value: -"Current site use from site_typologies, not what can be built. Exact typology IDs; sector-only lots do not match."New value: +"Current site use from site_typologies, not what can be built. Exact typology IDs; sector-only lots do not match any_of. none_of keeps lots whose typology is unknown."
    • changedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / use_sector / description
      Previous value: -"Current site use from site_typologies, not what can be built. Sector IDs; includes sector-only assignments."New value: +"Current site use from site_typologies, not what can be built. Sector IDs; includes sector-only assignments. none_of keeps lots whose sector is unknown."
    • changedInput schema / properties / criteria / properties / typology / description
      Previous value: -"Current site use from site_typologies, not what can be built. Exact typology IDs; sector-only lots do not match."New value: +"Current site use from site_typologies, not what can be built. Exact typology IDs; sector-only lots do not match any_of. none_of keeps lots whose typology is unknown."
    • changedInput schema / properties / criteria / properties / use_sector / description
      Previous value: -"Current site use from site_typologies, not what can be built. Sector IDs; includes sector-only assignments."New value: +"Current site use from site_typologies, not what can be built. Sector IDs; includes sector-only assignments. none_of keeps lots whose sector is unknown."
  2. Changed18 schema fields changed
    • addedInput schema / properties / assembly
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Assembly mode: also return candidate assemblies, 2 to maxLots adjacent lots that each pass criteria and together meet minCombinedAreaSqft and/or minCombinedFrontageFt. Use for \"two or three adjacent lots that combine to 10,000 sf\"; put per-lot limits in criteria and the combined size here, not in minAreaSqft.",
      +  "properties": {
      +    "maxLots": {
      +      "description": "Most lots in one assembly, 2 to 5. Default 3.",
      +      "maximum": 5,
      +      "minimum": 2,
      +      "type": "integer"
      +    },
      +    "minCombinedAreaSqft": {
      +      "description": "Combined lot area the assembly must reach, in square feet.",
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "minCombinedFrontageFt": {
      +      "description": "Combined frontage the assembly must reach, in feet: the sum of derived lot widths, an estimate.",
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "sameZone": {
      +      "description": "same (default): every lot in one zone code. family: one zone family. any: zones may differ.",
      +      "enum": [
      +        "same",
      +        "family",
      +        "any"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / assessed_value_per_buildable
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Assessed total value (land and buildings) divided by the buildable floor area (lot area x the zone’s cited maximum FSR), in currency per square metre of floor area, inclusive bounds ($150 per sq ft = 1,614.59 per m²). Lots without a cited FSR or a usable assessment never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / assessed_value_per_buildable
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Assessed total value (land and buildings) divided by the buildable floor area (lot area x the zone’s cited maximum FSR), in currency per square metre of floor area, inclusive bounds ($150 per sq ft = 1,614.59 per m²). Lots without a cited FSR or a usable assessment never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / dwelling_count
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Dwellings on the lot, as the assessment roll states them (Montréal: nombre de logements). \"A single-family house\" is { min: 1, max: 1 }; \"duplex or triplex\" is { min: 2, max: 3 }. Lots whose roll states no count never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "min": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / land_value_per_buildable
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Assessed land value divided by the buildable floor area (lot area x the zone’s cited maximum FSR), in currency per square metre of floor area, inclusive bounds ($150 per sq ft = 1,614.59 per m²). Lots without a cited FSR, a land/improvement split or a usable assessment never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / lot_depth
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Metres. A frontage the city publishes, else the side of the lot outline's oriented bounding rectangle.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / lot_width
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Metres. A frontage the city publishes, else the side of the lot outline's oriented bounding rectangle.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / owner_class / description
      Previous value: -"Owner class of the titled parcels on the lot, from ParcelMap BC owner type: private, municipal, provincial, federal, crown_agency, mixed_ownership (as the source states), unclassified, and public (any of municipal, provincial, federal, crown_agency). A lot with parcels of several classes holds all of them, so none_of [\"public\"] also drops a lot that is partly public and any_of [\"private\"] keeps it. \"Not public land\" is { none_of: [\"public\"] }, which keeps lots whose owner class is unknown; any_of drops them. \"Private\" is the registered owner type, not a title search."New value: +"Owner class of the lot, from ParcelMap BC owner type or an open assessment roll: private, municipal, provincial (or state), federal, crown_agency (or public agency), public_other, institutional (religious, charitable, education, health), first_nations, mixed_ownership (as the source states), unclassified, and public (any of municipal, provincial, federal, crown_agency, public_other). Institutional and First Nations land is not public. A lot with parcels of several classes holds all of them, so none_of [\"public\"] also drops a lot that is partly public and any_of [\"private\"] keeps it. \"Not public land\" is { none_of: [\"public\"] }, which keeps lots whose owner class is unknown; any_of drops them. \"Private\" is the registered owner type, not a title search."
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / tax_exempt
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "true: the assessment roll classes the property as exempt from property tax (public, religious, charitable and similar owners). { is: false } keeps taxable lots only. Read from rolls that state both values; personal exemptions (senior, veteran) do not count.",
      +  "properties": {
      +    "is": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "is"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / dwelling_count
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Dwellings on the lot, as the assessment roll states them (Montréal: nombre de logements). \"A single-family house\" is { min: 1, max: 1 }; \"duplex or triplex\" is { min: 2, max: 3 }. Lots whose roll states no count never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "min": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / land_value_per_buildable
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Assessed land value divided by the buildable floor area (lot area x the zone’s cited maximum FSR), in currency per square metre of floor area, inclusive bounds ($150 per sq ft = 1,614.59 per m²). Lots without a cited FSR, a land/improvement split or a usable assessment never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / lot_depth
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Metres. A frontage the city publishes, else the side of the lot outline's oriented bounding rectangle.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / lot_width
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Metres. A frontage the city publishes, else the side of the lot outline's oriented bounding rectangle.",
      +  "properties": {
      +    "max": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 10000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / criteria / properties / owner_class / description
      Previous value: -"Owner class of the titled parcels on the lot, from ParcelMap BC owner type: private, municipal, provincial, federal, crown_agency, mixed_ownership (as the source states), unclassified, and public (any of municipal, provincial, federal, crown_agency). A lot with parcels of several classes holds all of them, so none_of [\"public\"] also drops a lot that is partly public and any_of [\"private\"] keeps it. \"Not public land\" is { none_of: [\"public\"] }, which keeps lots whose owner class is unknown; any_of drops them. \"Private\" is the registered owner type, not a title search."New value: +"Owner class of the lot, from ParcelMap BC owner type or an open assessment roll: private, municipal, provincial (or state), federal, crown_agency (or public agency), public_other, institutional (religious, charitable, education, health), first_nations, mixed_ownership (as the source states), unclassified, and public (any of municipal, provincial, federal, crown_agency, public_other). Institutional and First Nations land is not public. A lot with parcels of several classes holds all of them, so none_of [\"public\"] also drops a lot that is partly public and any_of [\"private\"] keeps it. \"Not public land\" is { none_of: [\"public\"] }, which keeps lots whose owner class is unknown; any_of drops them. \"Private\" is the registered owner type, not a title search."
    • addedInput schema / properties / criteria / properties / tax_exempt
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "true: the assessment roll classes the property as exempt from property tax (public, religious, charitable and similar owners). { is: false } keeps taxable lots only. Read from rolls that state both values; personal exemptions (senior, veteran) do not count.",
      +  "properties": {
      +    "is": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "is"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / cursor
      Added value: +{
      +  "description": "Next page of the same box. Copy page.next from the prior result: it carries the cursor with the box. Do not combine with thesis. Reads only; nothing is saved.",
      +  "maxLength": 1024,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / limit / description
      Previous value: -"Lots to return. Default 10. countOutcome states whether the total is exact, partial, at_least (a lower bound), estimate (about), or unavailable."New value: +"Lots to return. Default 10, at most 25 per call; page.next reads the next lots. countOutcome states whether the total is exact, partial, at_least (a lower bound), estimate (about), or unavailable."
    • addedInput schema / properties / sort
      Added value: +{
      +  "description": "Order of the returned lots across every match. Default lot_area_desc (largest first). land_value_per_buildable_asc / assessed_value_per_buildable_asc: lowest assessed land (or total) value per buildable sq ft first, for \"cheapest land per buildable foot\". Lots with no cited FSR or usable assessment come last.",
      +  "enum": [
      +    "lot_area_desc",
      +    "lot_area_asc",
      +    "land_value_per_buildable_asc",
      +    "assessed_value_per_buildable_asc"
      +  ],
      +  "type": "string"
      +}
  3. Changed4 schema fields changed
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / tract_rent_2br
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "CMHC Rental Market Survey average monthly rent for a 2-bedroom purpose-built rental unit in the census tract holding the lot centre, CAD, inclusive bounds. Lots in tracts CMHC does not publish never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "min": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / tract_rental_vacancy
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "CMHC Rental Market Survey vacancy rate, all bedroom types, purpose-built rental, in the census tract holding the lot centre, percent (1.5 = 1.5%), inclusive bounds. Lots in tracts CMHC does not publish never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / tract_rent_2br
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "CMHC Rental Market Survey average monthly rent for a 2-bedroom purpose-built rental unit in the census tract holding the lot centre, CAD, inclusive bounds. Lots in tracts CMHC does not publish never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "min": {
      +      "maximum": 100000,
      +      "minimum": 0,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / tract_rental_vacancy
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "CMHC Rental Market Survey vacancy rate, all bedroom types, purpose-built rental, in the census tract holding the lot centre, percent (1.5 = 1.5%), inclusive bounds. Lots in tracts CMHC does not publish never match.",
      +  "properties": {
      +    "max": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 100,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / limit / description
      Previous value: -"Lots to return. Default 10. countOutcome states whether the total is exact, partial, or unavailable."New value: +"Lots to return. Default 10. countOutcome states whether the total is exact, partial, at_least (a lower bound), estimate (about), or unavailable."
  5. Changed5 schema fields changed
    • addedInput schema / properties / criteria / properties / branches / items / properties / criteria / properties / owner_class
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Owner class of the titled parcels on the lot, from ParcelMap BC owner type: private, municipal, provincial, federal, crown_agency, mixed_ownership (as the source states), unclassified, and public (any of municipal, provincial, federal, crown_agency). A lot with parcels of several classes holds all of them, so none_of [\"public\"] also drops a lot that is partly public and any_of [\"private\"] keeps it. \"Not public land\" is { none_of: [\"public\"] }, which keeps lots whose owner class is unknown; any_of drops them. \"Private\" is the registered owner type, not a title search.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / owner_class
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Owner class of the titled parcels on the lot, from ParcelMap BC owner type: private, municipal, provincial, federal, crown_agency, mixed_ownership (as the source states), unclassified, and public (any of municipal, provincial, federal, crown_agency). A lot with parcels of several classes holds all of them, so none_of [\"public\"] also drops a lot that is partly public and any_of [\"private\"] keeps it. \"Not public land\" is { none_of: [\"public\"] }, which keeps lots whose owner class is unknown; any_of drops them. \"Private\" is the registered owner type, not a title search.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / hygiene
      Added value: +{
      +  "description": "Default true. Ad-hoc lists leave out public owners (owner_class), cap lot size at 5 acres and ignore assessed values under $100,000 where the city stores them, unless criteria set the same field. Each default is named in notes. false skips them. Ignored with profileId: a saved list runs as saved.",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / llm_model
      Removed value: -{
      -  "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess.",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "context",
      -  "llm_model"
      -]New value: +[
      +  "context"
      +]
  6. Changed5 schema fields changed
    • addedInput schema / properties / criteria / properties / branches
      Added value: +{
      +  "description": "Alternative strategies; nested registry values stay in canonical units.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "criteria": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "assessed_value": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "max": {
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "building_use": {
      +            "additionalProperties": false,
      +            "description": "What the lot is used for today, read from the assessor's use code: office, mixed_use, retail, hospitality, industrial, multifamily, two_to_four_family, single_family, institutional, civic, religious, parking, vacant_land, other. \"Commercial buildings, not houses or churches\" is { any_of: [\"office\", \"mixed_use\", \"retail\"] } or { none_of: [\"single_family\", \"two_to_four_family\", \"religious\", \"civic\"] }.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 20,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 20,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "contamination_risk": {
      +            "additionalProperties": false,
      +            "description": "true: a gas station or auto-service business (repair, body shop, car wash) is mapped on the lot. { is: false } excludes those lots. A risk flag from OpenStreetMap and city business licences, not a site investigation: it misses former and unmapped businesses.",
      +            "properties": {
      +              "is": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "is"
      +            ],
      +            "type": "object"
      +          },
      +          "existing_coverage_pct": {
      +            "additionalProperties": false,
      +            "description": "Building footprint area on the lot as a percentage of lot area, 0-100. An underbuilt screen is { max: 20 }. Footprints can be years old: check the city honesty note.",
      +            "properties": {
      +              "max": {
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "existing_use_class": {
      +            "additionalProperties": false,
      +            "description": "What stands on the lot: place_of_worship (church, temple, mosque, synagogue…), fuel_station, auto_service (repair, body, car wash), auto_sales (car dealer), else vacant, surface_parking or built. \"Vacant lots or surface parking\" is { any_of: [\"vacant\", \"surface_parking\"] }; \"gas stations\" is { any_of: [\"fuel_station\"] }; \"church sites\" is { any_of: [\"place_of_worship\"] }. Vacant means no building over 20 m² in any footprint source and no assessed building worth over 20% of the land. Québec lots without footprints use the assessment roll land-use code (CUBF 9100 = vacant). A mapped business on the lot wins over the footprint class. Fuel and auto-service sites are a contamination risk flag, not a site investigation.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "exterior_material": {
      +            "additionalProperties": false,
      +            "description": "The assessor's primary exterior wall as a family: masonry, wood, siding, stucco, concrete, metal, glass, other. \"Brick buildings\" is { any_of: [\"masonry\"] }.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "frequent_transit_distance": {
      +            "additionalProperties": false,
      +            "description": "Metres from the lot line to the nearest frequent bus stop or rapid-transit station.",
      +            "properties": {
      +              "max": {
      +                "maximum": 5000,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "maximum": 5000,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "hydrant_distance": {
      +            "additionalProperties": false,
      +            "description": "Metres from the lot line to the nearest fire hydrant.",
      +            "properties": {
      +              "max": {
      +                "maximum": 5000,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "maximum": 5000,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "improvement_land_ratio": {
      +            "additionalProperties": false,
      +            "description": "Building (improvement) value divided by land value, assessed or appraised, as a ratio: 0.25 = the building is worth a quarter of the land. A teardown screen is { max: 0.25 }.",
      +            "properties": {
      +              "max": {
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "lot_area": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "max": {
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "min_homes": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "min": {
      +                "maximum": 1000,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "named_area": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "format": "uuid",
      +                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +                  "type": "string"
      +                },
      +                "maxItems": 200,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "ocp_above_zoning": {
      +            "additionalProperties": false,
      +            "description": "true: the lot's Official Community Plan designation allows more housing than its current zone (both ranked 1 rural, 2 low density, 3 medium density, 4 high density or mixed-use centre): a rezoning candidate. { is: false } keeps lots where both are ranked and the OCP is not higher. Lots with an unranked zone or designation, no zone, or no designation match neither. A planning signal: a rezoning consistent with the OCP is more likely to be supported, but this is not a rezoning approval or the density zoning permits today.",
      +            "properties": {
      +              "is": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "is"
      +            ],
      +            "type": "object"
      +          },
      +          "overlay": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 20,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 20,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "ownership_form": {
      +            "additionalProperties": false,
      +            "description": "Ownership form: fee_simple (land title), strata_condo, co_op, leasehold, mixed. \"Land title only\" is { none_of: [\"strata_condo\", \"co_op\", \"leasehold\", \"mixed\"] }, which keeps lots whose form is unknown; any_of drops them.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "permitted_use": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "place_of_worship": {
      +            "additionalProperties": false,
      +            "description": "true: a church, temple, mosque, synagogue or other place of worship is mapped on the lot (OpenStreetMap, city heritage registers). { is: false } excludes those lots. Same lots as existing_use_class place_of_worship.",
      +            "properties": {
      +              "is": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "is"
      +            ],
      +            "type": "object"
      +          },
      +          "register_status": {
      +            "additionalProperties": false,
      +            "description": "Historic register status: individually_listed, contributing, non_contributing, in_district (inside a register district, building not yet mapped), not_listed. \"On the register\" is { any_of: [\"individually_listed\", \"contributing\"] }. Register status is a research lead, not tax-credit eligibility. The federal 20% credit needs a certified historic structure; building age alone qualifies for nothing (the 10% pre-1936 credit was repealed in 2017).",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "stories": {
      +            "additionalProperties": false,
      +            "description": "Above-grade stories: the assessor count where recorded (half stories are decimals, 1.5), otherwise estimated from building height at 3 m per storey. \"1-2 story\" is { max: 2 }.",
      +            "properties": {
      +              "max": {
      +                "maximum": 200,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "maximum": 200,
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "street": {
      +            "additionalProperties": false,
      +            "description": "Street names as the lot address carries them, upper case with the suffix abbreviated: \"STATE ST\", \"BANK ST\". { any_of: [...] } keeps lots on those streets. Matches the lot's address, not every street it touches: a corner lot counts once.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "subdivision_yield": {
      +            "additionalProperties": false,
      +            "description": "Lot area divided by the zone's minimum lot area: how many minimum-size lots the parcel could hold by area. \"Could be subdivided\" is { min: 2 }; \"into 3 lots\" is { min: 3 }. Ignores frontage, streets and lot shape: a candidate, not a subdivision approval.",
      +            "properties": {
      +              "max": {
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "min": {
      +                "minimum": 0,
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "titled_unit_count": {
      +            "additionalProperties": false,
      +            "description": "Titled units on the parcel: 1 for a land-title lot, the strata unit count otherwise.",
      +            "properties": {
      +              "max": {
      +                "maximum": 100000,
      +                "minimum": 1,
      +                "type": "integer"
      +              },
      +              "min": {
      +                "maximum": 100000,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "typology": {
      +            "additionalProperties": false,
      +            "description": "Current site use from site_typologies, not what can be built. Exact typology IDs; sector-only lots do not match.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "use_sector": {
      +            "additionalProperties": false,
      +            "description": "Current site use from site_typologies, not what can be built. Sector IDs; includes sector-only assignments.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "year_built": {
      +            "additionalProperties": false,
      +            "description": "Year the main building was built, inclusive bounds.",
      +            "properties": {
      +              "max": {
      +                "maximum": 2100,
      +                "minimum": 1600,
      +                "type": "integer"
      +              },
      +              "min": {
      +                "maximum": 2100,
      +                "minimum": 1600,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "zone_code": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 50,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "zone_family": {
      +            "additionalProperties": false,
      +            "description": "The zone's dominant use: residential, mixed, commercial, industrial, public, recreation, agricultural, forest. \"Zoned residential or mixed\" is { any_of: [\"residential\", \"mixed\"] }. Québec zones read the zone letter (H, M, C, I, P/U, R, A, F); other zones a family classified from the zone name and purpose. The family names the dominant use; the bylaw still decides which uses are permitted.",
      +            "properties": {
      +              "any_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              },
      +              "none_of": {
      +                "items": {
      +                  "maxLength": 256,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "maxItems": 10,
      +                "type": "array"
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "key": {
      +        "pattern": "^[a-z][a-z0-9_]{0,39}$",
      +        "type": "string"
      +      },
      +      "label": {
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "key",
      +      "label",
      +      "criteria"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 6,
      +  "type": "array"
      +}
    • changedInput schema / properties / profileId / description
      Previous value: -"Saved buy box id. Runs the saved city and criteria. Do not combine with city, thesis, or criteria."New value: +"Saved list id. Runs the saved city and criteria. Do not combine with city, thesis, or criteria."
    • changedInput schema / properties / save / description
      Previous value: -"true saves the buy box to the account. Default false. Search execution history is recorded."New value: +"true saves the list to the account. Default false. Search execution history is recorded."
    • changedInput schema / properties / saveName / description
      Previous value: -"Name for a saved box."New value: +"Name for a saved list."
    • changedInput schema / properties / thesis / description
      Previous value: -"The buy box in plain words, e.g. \"industrial lots over half an acre outside the floodplain\"."New value: +"The list in plain words, e.g. \"industrial lots over half an acre outside the floodplain\"."
  7. Changed2 schema fields changed
    • addedInput schema / properties / criteria / properties / typology
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Current site use from site_typologies, not what can be built. Exact typology IDs; sector-only lots do not match.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / use_sector
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Current site use from site_typologies, not what can be built. Sector IDs; includes sector-only assignments.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  8. Changed2 schema fields changed
    • changedInput schema / properties / criteria / properties / namedAreaIds / maxItems
      Previous value: -50New value: +200
    • addedInput schema / properties / criteria / properties / ocp_above_zoning
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "true: the lot's Official Community Plan designation allows more housing than its current zone (both ranked 1 rural, 2 low density, 3 medium density, 4 high density or mixed-use centre): a rezoning candidate. { is: false } keeps lots where both are ranked and the OCP is not higher. Lots with an unranked zone or designation, no zone, or no designation match neither. A planning signal: a rezoning consistent with the OCP is more likely to be supported, but this is not a rezoning approval or the density zoning permits today.",
      +  "properties": {
      +    "is": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "is"
      +  ],
      +  "type": "object"
      +}
  9. Changed1 schema field changed
    • addedInput schema / properties / criteria / properties / permitted_use
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  10. Changed3 schema fields changed
    • removedInput schema / properties / conversation_id
      Removed value: -{
      -  "description": "Echo the conversation_id from the server's previous response. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it.",
      -  "type": "string"
      -}
    • changedInput schema / properties / limit / description
      Previous value: -"Lots to return. Default 10. The total match count is always returned."New value: +"Lots to return. Default 10. countOutcome states whether the total is exact, partial, or unavailable."
    • changedInput schema / properties / save / description
      Previous value: -"true saves the buy box to the account. Default false: nothing is written."New value: +"true saves the buy box to the account. Default false. Search execution history is recorded."
  11. Changed2 schema fields changed
    • addedInput schema / properties / criteria / properties / hydrant_distance
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Metres from the lot line to the nearest fire hydrant.",
      +  "properties": {
      +    "max": {
      +      "maximum": 5000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 5000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / criteria / properties / stories / description
      Previous value: -"Above-grade stories of the main building as the assessor records them; half stories are decimals (1.5). \"1-2 story\" is { max: 2 }."New value: +"Above-grade stories: the assessor count where recorded (half stories are decimals, 1.5), otherwise estimated from building height at 3 m per storey. \"1-2 story\" is { max: 2 }."
  12. Changed6 schema fields changed
    • addedInput schema / properties / criteria / properties / building_use
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "What the lot is used for today, read from the assessor's use code: office, mixed_use, retail, hospitality, industrial, multifamily, two_to_four_family, single_family, institutional, civic, religious, parking, vacant_land, other. \"Commercial buildings, not houses or churches\" is { any_of: [\"office\", \"mixed_use\", \"retail\"] } or { none_of: [\"single_family\", \"two_to_four_family\", \"religious\", \"civic\"] }.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 20,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / exterior_material
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The assessor's primary exterior wall as a family: masonry, wood, siding, stucco, concrete, metal, glass, other. \"Brick buildings\" is { any_of: [\"masonry\"] }.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / register_status
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Historic register status: individually_listed, contributing, non_contributing, in_district (inside a register district, building not yet mapped), not_listed. \"On the register\" is { any_of: [\"individually_listed\", \"contributing\"] }. Register status is a research lead, not tax-credit eligibility. The federal 20% credit needs a certified historic structure; building age alone qualifies for nothing (the 10% pre-1936 credit was repealed in 2017).",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / stories
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Above-grade stories of the main building as the assessor records them; half stories are decimals (1.5). \"1-2 story\" is { max: 2 }.",
      +  "properties": {
      +    "max": {
      +      "maximum": 200,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 200,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / street
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Street names as the lot address carries them, upper case with the suffix abbreviated: \"STATE ST\", \"BANK ST\". { any_of: [...] } keeps lots on those streets. Matches the lot's address, not every street it touches: a corner lot counts once.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 50,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / thesis / maxLength
      Previous value: -500New value: +1500
  13. Changed2 schema fields changed
    • addedInput schema / properties / criteria / properties / frequent_transit_distance
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Metres from the lot line to the nearest frequent bus stop or rapid-transit station.",
      +  "properties": {
      +    "max": {
      +      "maximum": 5000,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "maximum": 5000,
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / criteria / properties / zone_family / description
      Previous value: -"The zone's dominant use from the Québec zone letter: residential (H), mixed (M), commercial (C), industrial (I), public (P, U), recreation (R), agricultural (A), forest (F). \"Zoned residential or mixed\" is { any_of: [\"residential\", \"mixed\"] }. Québec cities only. The letter names the dominant use; the zone grid still decides which uses are permitted."New value: +"The zone's dominant use: residential, mixed, commercial, industrial, public, recreation, agricultural, forest. \"Zoned residential or mixed\" is { any_of: [\"residential\", \"mixed\"] }. Québec zones read the zone letter (H, M, C, I, P/U, R, A, F); other zones a family classified from the zone name and purpose. The family names the dominant use; the bylaw still decides which uses are permitted."
  14. Changed3 schema fields changed
    • changedInput schema / properties / criteria / properties / improvement_land_ratio / description
      Previous value: -"Assessed building (improvement) value divided by land value, as a ratio: 0.25 = the building is worth a quarter of the land. A teardown screen is { max: 0.25 }."New value: +"Building (improvement) value divided by land value, assessed or appraised, as a ratio: 0.25 = the building is worth a quarter of the land. A teardown screen is { max: 0.25 }."
    • changedInput schema / properties / criteria / properties / overlayExcludeKinds / description
      Previous value: -"Overlay kinds a lot must be outside."New value: +"Overlay kinds a lot must not overlap. A lot passes only if it was evaluated for every excluded kind; an unevaluated kind is reported not_available."
    • changedInput schema / properties / criteria / properties / overlayKinds / description
      Previous value: -"Overlay kinds a lot must be inside."New value: +"Overlay kinds a lot must overlap by at least 1 m². A kind the city has not evaluated is reported not_available, never applied."
  15. Changed3 schema fields changed
    • changedInput schema / properties / criteria / properties / existing_use_class / description
      Previous value: -"What stands on the lot: place_of_worship (church, temple, mosque, synagogue…), fuel_station, auto_service (repair, body, car wash), auto_sales (car dealer), else vacant, surface_parking or built. \"Vacant lots or surface parking\" is { any_of: [\"vacant\", \"surface_parking\"] }; \"gas stations\" is { any_of: [\"fuel_station\"] }; \"church sites\" is { any_of: [\"place_of_worship\"] }. Vacant means no building over 20 m² in any footprint source and no assessed building worth over 20% of the land. A mapped business on the lot wins over the footprint class. Fuel and auto-service sites are a contamination risk flag, not a site investigation."New value: +"What stands on the lot: place_of_worship (church, temple, mosque, synagogue…), fuel_station, auto_service (repair, body, car wash), auto_sales (car dealer), else vacant, surface_parking or built. \"Vacant lots or surface parking\" is { any_of: [\"vacant\", \"surface_parking\"] }; \"gas stations\" is { any_of: [\"fuel_station\"] }; \"church sites\" is { any_of: [\"place_of_worship\"] }. Vacant means no building over 20 m² in any footprint source and no assessed building worth over 20% of the land. Québec lots without footprints use the assessment roll land-use code (CUBF 9100 = vacant). A mapped business on the lot wins over the footprint class. Fuel and auto-service sites are a contamination risk flag, not a site investigation."
    • addedInput schema / properties / criteria / properties / subdivision_yield
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Lot area divided by the zone's minimum lot area: how many minimum-size lots the parcel could hold by area. \"Could be subdivided\" is { min: 2 }; \"into 3 lots\" is { min: 3 }. Ignores frontage, streets and lot shape: a candidate, not a subdivision approval.",
      +  "properties": {
      +    "max": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / zone_family
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The zone's dominant use from the Québec zone letter: residential (H), mixed (M), commercial (C), industrial (I), public (P, U), recreation (R), agricultural (A), forest (F). \"Zoned residential or mixed\" is { any_of: [\"residential\", \"mixed\"] }. Québec cities only. The letter names the dominant use; the zone grid still decides which uses are permitted.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  16. Changed2 schema fields changed
    • changedInput schema / properties / criteria / properties / existing_use_class / description
      Previous value: -"What stands on the lot: fuel_station, auto_service (repair, body, car wash), auto_sales (car dealer), else vacant, surface_parking or built. \"Vacant lots or surface parking\" is { any_of: [\"vacant\", \"surface_parking\"] }; \"gas stations\" is { any_of: [\"fuel_station\"] }. Vacant means no building over 20 m² in any footprint source and no assessed building worth over 20% of the land. A mapped business on the lot wins over the footprint class. Fuel and auto-service sites are a contamination risk flag, not a site investigation."New value: +"What stands on the lot: place_of_worship (church, temple, mosque, synagogue…), fuel_station, auto_service (repair, body, car wash), auto_sales (car dealer), else vacant, surface_parking or built. \"Vacant lots or surface parking\" is { any_of: [\"vacant\", \"surface_parking\"] }; \"gas stations\" is { any_of: [\"fuel_station\"] }; \"church sites\" is { any_of: [\"place_of_worship\"] }. Vacant means no building over 20 m² in any footprint source and no assessed building worth over 20% of the land. A mapped business on the lot wins over the footprint class. Fuel and auto-service sites are a contamination risk flag, not a site investigation."
    • addedInput schema / properties / criteria / properties / place_of_worship
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "true: a church, temple, mosque, synagogue or other place of worship is mapped on the lot (OpenStreetMap, city heritage registers). { is: false } excludes those lots. Same lots as existing_use_class place_of_worship.",
      +  "properties": {
      +    "is": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "is"
      +  ],
      +  "type": "object"
      +}
  17. Changed7 schema fields changed
    • addedInput schema / properties / criteria / properties / contamination_risk
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "true: a gas station or auto-service business (repair, body shop, car wash) is mapped on the lot. { is: false } excludes those lots. A risk flag from OpenStreetMap and city business licences, not a site investigation: it misses former and unmapped businesses.",
      +  "properties": {
      +    "is": {
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "is"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / existing_coverage_pct
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Building footprint area on the lot as a percentage of lot area, 0-100. An underbuilt screen is { max: 20 }. Footprints can be years old: check the city honesty note.",
      +  "properties": {
      +    "max": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / existing_use_class
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "What stands on the lot: fuel_station, auto_service (repair, body, car wash), auto_sales (car dealer), else vacant, surface_parking or built. \"Vacant lots or surface parking\" is { any_of: [\"vacant\", \"surface_parking\"] }; \"gas stations\" is { any_of: [\"fuel_station\"] }. Vacant means no building over 20 m² in any footprint source and no assessed building worth over 20% of the land. A mapped business on the lot wins over the footprint class. Fuel and auto-service sites are a contamination risk flag, not a site investigation.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / improvement_land_ratio
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Assessed building (improvement) value divided by land value, as a ratio: 0.25 = the building is worth a quarter of the land. A teardown screen is { max: 0.25 }.",
      +  "properties": {
      +    "max": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "min": {
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / ownership_form
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Ownership form: fee_simple (land title), strata_condo, co_op, leasehold, mixed. \"Land title only\" is { none_of: [\"strata_condo\", \"co_op\", \"leasehold\", \"mixed\"] }, which keeps lots whose form is unknown; any_of drops them.",
      +  "properties": {
      +    "any_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    },
      +    "none_of": {
      +      "items": {
      +        "maxLength": 256,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "maxItems": 10,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / titled_unit_count
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Titled units on the parcel: 1 for a land-title lot, the strata unit count otherwise.",
      +  "properties": {
      +    "max": {
      +      "maximum": 100000,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "min": {
      +      "maximum": 100000,
      +      "minimum": 1,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / criteria / properties / year_built
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Year the main building was built, inclusive bounds.",
      +  "properties": {
      +    "max": {
      +      "maximum": 2100,
      +      "minimum": 1600,
      +      "type": "integer"
      +    },
      +    "min": {
      +      "maximum": 2100,
      +      "minimum": 1600,
      +      "type": "integer"
      +    }
      +  },
      +  "type": "object"
      +}
  18. Added

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations, it discloses that save=true writes a saved list, counts against the plan list limit, and returns a CSV link; paging is read-only and saves nothing; search execution history is recorded; hygiene defaults apply; and not_available filters must be reported. These are meaningful behavioral details that annotations alone do not provide.

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?

The description is front-loaded with purpose, but it then becomes a dense, run-on block covering returns, candidate assessment, save workflow, paging, IDs, and quotas. Most sentences carry information, but the lack of paragraph breaks and the cryptic clauses make it harder to scan than necessary.

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

Completeness4/5

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

For a complex 13-parameter tool with no output schema, the description does a good job describing the returned fields (countOutcome, screeningRunId, verdicts, totalMatches, candidates, suggestions, savedMatches, CSV link) and the save/paging behaviors. Some return structures remain only loosely specified, but the core behavioral contract is complete.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds valuable cross-parameter workflow semantics: city/geoDivisionId must be paired with thesis or criteria, profileId is an alternative saved-list mode, save requires explicit approval, and page.next drives paging. It stops short of fully explaining every nested criteria interaction, but it meaningfully exceeds the schema.

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 opening sentence states a specific verb and resource (find lots) and scope (one live Bucky city matching a list). It is clearly a screening/search tool, and the cross-references to saveLot, getFeasibilitySnapshot and saveToProject further distinguish it from siblings.

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?

The description gives clear invocation context: pass city or geoDivisionId with thesis, criteria, or both; or pass profileId; save only after explicit approval; use page.next when truncated. It does not explicitly name when to choose this over sibling tools like cityInventory or findPlacesByMarket, so it lacks exclusions/alternatives for a 5.

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.