Point your AI at Fuzzy and just ask.
Connect
https://api.fuzzy.so/mcpIn Claude: Settings → Connectors → Add custom connector, paste the URL, leave credentials empty. In Claude Code:
claude mcp add --scope user --transport http fuzzy-radar https://api.fuzzy.so/mcpWhat you can ask
fuzzy_lookupResolve a name to one brand, retailer, operator or platform, with links and headline stats.
fuzzy_searchEvery entity matching a query.
fuzzy_brand_retailersRetailers carrying a brand, filterable by state.
fuzzy_brand_movementDoors a brand gained and lost between the last two scrapes.
fuzzy_brand_whitespaceDoors a competitor is in that a brand is not.
fuzzy_brand_top_productsA brand's products ranked by door count.
fuzzy_entity_detailFull stats for a known slug.
You: Where is STIIIZY that Heavy Hitters isn't?
Assistant: 1,164 doors, heaviest in CA (390) and MI (320). Heavy Hitters holds 608 doors against STIIIZY's 1,614.
MCP or the API?
Use MCP when a person asks in plain English and the model decides which calls to make. Use the REST API when you are writing code against a known shape. Something broken? Email developers tesouro com.
For agents: full setup details+ expand− collapse
Server
- URL:
https://api.fuzzy.so/mcp - Transport: streamable HTTP (remote). Nothing to install, no SDK.
- Auth: none. No API key, no OAuth, no account. Leave credential fields empty.
- Read-only. Every tool reads live Radar data.
Claude Code
claude mcp add --scope user --transport http fuzzy-radar https://api.fuzzy.so/mcpClaude (web, desktop, mobile)
Settings → Connectors → Add custom connector. Name: fuzzy-radar. URL: https://api.fuzzy.so/mcp. No credential.
Cursor and other JSON-configured clients
Add as a streamable HTTP server, e.g. in .cursor/mcp.json:
{
"mcpServers": {
"fuzzy-radar": {
"url": "https://api.fuzzy.so/mcp"
}
}
}Tool names
Clients prefix tools with the connector name you choose, not the server's. Clients that load tools lazily need a search for the bare name (e.g. fuzzy_lookup) before the first call.
Tools and inputs
fuzzy_lookup(query, type?)
fuzzy_search(query, type?, limit?)
fuzzy_brand_retailers(slug, state?, limit?)
fuzzy_brand_movement(slug)
fuzzy_brand_whitespace(brand, competitor, state?, limit?)
fuzzy_brand_top_products(slug, state?, category?, limit?)
fuzzy_entity_detail(type, slug)
type ∈ brands | retailers | operators | platforms
state = two-letter code, e.g. CAHow to use the results
- Start with
fuzzy_lookupto turn a name into a slug; check itsalternativesfor a name collision before trusting the match. - Copy the returned
linksverbatim when citing a figure. Do not build Fuzzy URLs by hand. - Read
lastScrapedAt: a figure more than a few days old is not current evidence. - Movement is menu presence over time, never sales.
Data limits
- Coverage is live dispensary menus on Dutchie and Jane, nationwide. Not Leafly, not a store's own site. A door count is a floor, not a census.
- “Current” means the last completed scrape of that retailer, not a point-of-sale feed. Scrapes run on their own cadence, not a fixed day.
lastSeenAtis when a listing was last scraped present.inStock: nullmeans the platform does not expose inventory; we never guess a number.- Issue rates are 0–1 fractions, not percentages. Figures drift with every scrape, so re-pull before quoting one.