Skip to main content
Glama

Find lots that match a buy box

screenLots

Find the lots in one live Bucky city that match a buy box. Pass city or geoDivisionId with thesis (plain words), criteria (square feet, dollars), or both; or pass a saved profileId. Returns the total match count, the top lots ranked largest first with a pass, fail, or not_available verdict per filter, and every filter this city cannot apply. Report a not_available filter; never present the count as filtered by it. Each lot has address for getFeasibilitySnapshot and parcelExternalId for saveToProject. save=true saves the box (write scope) and returns a CSV link.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
cityNoCity as the user said it, e.g. "Laval" or "Bedford, MA". Omit when you pass geoDivisionId or profileId.
saveNotrue saves the buy box to the account. Default false: nothing is written.
limitNoLots to return. Default 10. The total match count is always returned.
thesisNoThe buy box 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."
criteriaNoStructured criteria. A field set here replaces the same field read from thesis.
saveNameNoName for a saved box.
llm_modelYesThe 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.
profileIdNoSaved buy box id. Runs the saved city and criteria. Do not combine with city, thesis, or criteria.
geoDivisionIdNoDivision id, from an earlier screenLots or cityInventory result.
conversation_idNoEcho 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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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 }."
  2. 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
  3. 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."
  4. 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."
  5. 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"
      +}
  6. 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"
      +}
  7. 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"
      +}
  8. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.