Skip to main content
Glama

Search NY dispensaries

search_dispensaries
Read-only

Search licensed New York State cannabis dispensaries (adult-use and medical). Free-text query is ranked and typo-tolerant (name, DBA, city, neighborhood, address, ZIP, license) and may include the site search operators (zip: city: county: neighborhood: brand: product: is:open|operating|delivery|micro|medical|verified|closed radius:N — quote multi-word values). Structured filters do the same thing explicitly. NOTE: brand filters against the PUBLIC availability preview (≤10 listed stores per brand); the result's brandAvailability block gives the true known count and, with city/county, how many stores there stock the brand even when none are listed — never conclude "nobody in X carries it" from an empty list. Sort by relevance (default with a query), distance (default when near is given), name, or recently_opened. Returns compact rows; each row has a citable url, Google rating/review count when known, openNow + hoursToday from posted hours (New York time), and a closure object (date, reason, temporary) when a shop has closed.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
zipNo5-digit ZIP code
cityNoExact city name, case-insensitive (e.g. "Buffalo")
nearNoFilter/sort by distance from a point (results gain a `distance` in miles)
sortNoDefault: relevance with a query, distance with near, otherwise name
brandNoOnly dispensaries stocking this brand (name or alias)
limitNoMax rows, default 10, cap 50
queryNoRanked, typo-tolerant search over name/DBA/city/neighborhood/address/ZIP/license; accepts operators, e.g. "housing works", "gotham zip:100", "brand:ayrloom is:open"
countyNoExact county name, case-insensitive
offsetNoRows to skip for paging: the result echoes `total` and `offset`, so request offset + limit for the next page
medicalNoOnly dispensaries serving medical patients
deliveryNoOnly dispensaries that offer delivery
open_nowNoOnly dispensaries open right now by posted hours
verifiedNoOnly owner-verified / claimed listings
neighborhoodNoNYC neighborhood name or slug
microbusinessNoOnly microbusiness licensees

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
notesNoCaveats about the filters applied
totalYesMatches before paging
offsetYes
sourceNoAttribution line — CC BY 4.0, cite the row url
dataUpdatedNoISO timestamp of the underlying directory export
dispensariesYes
brandAvailabilityNoPresent when a brand filter was applied. Never conclude "nobody carries it" from an empty list — read knownDispensaries / inCity.

Schema Changelog

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

  1. Changed6 schema fields changed
    • changedInput schema / properties / near / description
      Previous value: -"Filter/sort by distance from a point"New value: +"Filter/sort by distance from a point (results gain a `distance` in miles)"
    • addedInput schema / properties / near / properties / lat / description
      Added value: +"Latitude in decimal degrees"
    • addedInput schema / properties / near / properties / lng / description
      Added value: +"Longitude in decimal degrees (negative in New York)"
    • changedInput schema / properties / near / properties / radius_miles / description
      Previous value: -"Default 25"New value: +"Search radius in miles, default 25"
    • addedInput schema / properties / sort / description
      Added value: +"Default: relevance with a query, distance with near, otherwise name"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "brandAvailability": {
      +      "additionalProperties": true,
      +      "description": "Present when a brand filter was applied. Never conclude \"nobody carries it\" from an empty list — read knownDispensaries / inCity.",
      +      "properties": {
      +        "brand": {
      +          "type": "string"
      +        },
      +        "inCity": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "city": {
      +              "type": "string"
      +            },
      +            "count": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "inCounty": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "count": {
      +              "type": "number"
      +            },
      +            "county": {
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "knownDispensaries": {
      +          "description": "How many stores actually stock the brand",
      +          "type": "number"
      +        },
      +        "listedDispensaries": {
      +          "type": "number"
      +        },
      +        "note": {
      +          "type": "string"
      +        },
      +        "tier": {
      +          "description": "preview (public: ≤10 stores listed) | full (signed-in /mcp/full)",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "brand",
      +        "tier",
      +        "listedDispensaries",
      +        "knownDispensaries"
      +      ],
      +      "type": "object"
      +    },
      +    "dataUpdated": {
      +      "description": "ISO timestamp of the underlying directory export",
      +      "type": "string"
      +    },
      +    "dispensaries": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "address": {
      +            "type": "string"
      +          },
      +          "city": {
      +            "type": "string"
      +          },
      +          "closure": {
      +            "additionalProperties": true,
      +            "description": "Present only when the shop has closed",
      +            "properties": {
      +              "announcedDate": {
      +                "type": "string"
      +              },
      +              "date": {
      +                "type": "string"
      +              },
      +              "notes": {
      +                "type": "string"
      +              },
      +              "reason": {
      +                "type": "string"
      +              },
      +              "temporary": {
      +                "type": "boolean"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "county": {
      +            "type": "string"
      +          },
      +          "dba": {
      +            "description": "Legal entity name",
      +            "type": "string"
      +          },
      +          "distance": {
      +            "description": "Miles from `near`, when a near point was given",
      +            "type": "number"
      +          },
      +          "googleRating": {
      +            "type": "number"
      +          },
      +          "googleReviewCount": {
      +            "type": "number"
      +          },
      +          "hoursToday": {
      +            "type": "string"
      +          },
      +          "id": {
      +            "description": "OCM license number (directory id)",
      +            "type": "string"
      +          },
      +          "isDeliveryOnly": {
      +            "type": "boolean"
      +          },
      +          "isMedical": {
      +            "type": "boolean"
      +          },
      +          "isMicrobusiness": {
      +            "type": "boolean"
      +          },
      +          "latitude": {
      +            "type": "number"
      +          },
      +          "licenseType": {
      +            "type": "string"
      +          },
      +          "longitude": {
      +            "type": "number"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "neighborhood": {
      +            "description": "NYC neighborhood, when applicable",
      +            "type": "string"
      +          },
      +          "offersDelivery": {
      +            "type": "boolean"
      +          },
      +          "openNow": {
      +            "description": "Open right now by posted hours (New York time); absent when hours are unknown",
      +            "type": "boolean"
      +          },
      +          "operationalStatus": {
      +            "description": "Active | Non-Operational | Unknown",
      +            "type": "string"
      +          },
      +          "phone": {
      +            "type": "string"
      +          },
      +          "retailDateOpened": {
      +            "description": "YYYY-MM-DD the shop opened to the public",
      +            "type": "string"
      +          },
      +          "state": {
      +            "type": "string"
      +          },
      +          "status": {
      +            "type": "string"
      +          },
      +          "tier": {
      +            "description": "open | coming-soon | delivery-only",
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "findweedny.com page — cite this",
      +            "type": "string"
      +          },
      +          "website": {
      +            "type": "string"
      +          },
      +          "zipCode": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "name",
      +          "url"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "notes": {
      +      "description": "Caveats about the filters applied",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "offset": {
      +      "type": "number"
      +    },
      +    "source": {
      +      "description": "Attribution line — CC BY 4.0, cite the row url",
      +      "type": "string"
      +    },
      +    "total": {
      +      "description": "Matches before paging",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "total",
      +    "offset",
      +    "dispensaries"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.7/5.0
Behavior5/5

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

With only readOnlyHint=true in annotations, the description carries the full burden and delivers substantially: typo-tolerant ranked search, the brand filter's ≤10-store public-preview limitation with the true count moved to brandAvailability, sort default behavior, and output traits (citable url, Google rating, New York-time hours, closure object). This context far exceeds what the annotation provides and is consistent with the read-only nature of the tool.

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

Conciseness4/5

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

The definition is long but each block earns its place: scope, operator syntax, the critical brand caveat, sort defaults, and output semantics. The final sentence describing return rows overlaps somewhat with the existing output schema, a minor redundancy. Front-loading is strong — purpose appears first and the riskiest nuance (brandAvailability) is positioned where it matters.

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

Completeness5/5

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

For a 15-parameter tool with a nested near object, the description covers all high-risk behaviors: operator syntax, the brand false-negative gotcha, sort defaults, and timezone semantics for hours. Pagination is already fully handled in the schema's offset description, and the existing output schema relieves the description of explaining return structure, which it only notes where context matters (citable url, timezone).

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

Parameters5/5

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

Schema description coverage is 100% (baseline 3), yet the description adds genuine value beyond the schema: it enumerates the full query operator syntax (zip:, city:, county:, neighborhood:, brand:, product:, is:open|operating|delivery|micro|medical|verified|closed, radius:N) that the schema only samples with examples, and it flags the brand filter's misleading-empty-list gotcha. It avoids redundantly re-describing simple parameters like zip or city.

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, "Search licensed New York State cannabis dispensaries (adult-use and medical)," states a specific verb, an exact resource, and geographic/regulatory scope. This clearly distinguishes it from siblings like get_dispensary (singular fetch by ID) and search_brands (brands instead of stores). The title reinforces the same purpose with no ambiguity.

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 operational context: sort defaults vary by input, structured filters mirror the free-text operators, and it warns the agent never to conclude a brand is absent from an empty list without checking brandAvailability. However, it never explicitly names alternatives or states when-not-to-use this tool versus get_dispensary or search_brands, so exclusions are left to inference.

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.

Resources