Skip to main content
Glama

SFomo: Bay Area events

Search events

search_events
Read-onlyIdempotent

Search every upcoming Bay Area event by words, dates, price, topic or place: dance, AI, music, arts, food, sports, comedy, exercise, volunteering, dating, business and professional networking. Use it whenever the question has search words, a date range ("this weekend": from/to), free-only, a town or an area; for a day-by-day overview of the next few days with no search words use list_upcoming, for one act by name find_performer. Words in query match the title, venue, performers, organizer or tags at the start of a word, singular or plural, with common synonyms (standup = stand-up, kids = children); by default all of them must match, with match "any" (or | / commas between them) any one does. A word that matches nothing is read as the closest word the events use, and search in the result says how the query was read. Dates are local (America/Los_Angeles), YYYY-MM-DD. Results come earliest first, at most limit; count says how many matched in total, so narrow the search rather than paging. get_city lists valid neighborhood, town, category and topic values. No sign-in; each client gets 30 calls a minute and 2,500 event rows an hour.

Input Schema

NameRequiredDescriptionDefault
toNoLatest date (default: none)
cityNoCity, e.g. 'San Francisco' or another town in the Bay Area (case-insensitive)
freeNoOnly free events (a listed free price, or an unpriced listing from a source whose events are free)
fromNoEarliest date (default: today)
nearNoEvents within radius_km of a place: a neighborhood, a town, a venue name, or "lat,lon". Results get distance_km, nearest first within each day. Use this for "near X"; use neighborhood for "in X". Unmapped venues are left out (counted in place.unplaced_events).
limitNoMax results (default 25, max 100)
matchNoall (default): every word in query must match; any: at least one word or |-separated phrase does (results with more matches are no different in order: earliest first); semantic: by meaning ("something romantic", "chill music outdoors"), from an embedding of query
queryNoFree text, e.g. 'salsa', 'hackathon', 'street fair'. Separate alternatives with | or commas ('salsa | bachata', 'comedy, improv'); keep a phrase together with quotes. A neighborhood or town after 'in'/'near' ('art openings in SoMa') becomes the place filter.
scopeNoGeography: one region (sf = SF, peninsula = Peninsula, south_bay = South Bay, east_bay = East Bay, north_bay = North Bay, santa_cruz = Santa Cruz, beyond = Farther), bay_area (sf, peninsula, south_bay, east_bay, north_bay), or any (default)
topicNoTopic (the site's Arts, Food, Learn, Sports tabs: e.g. comedy, film, food_drink, sports, talks, classes, markets, outdoors; business = chamber mixers, referral groups, small-business workshops, trade shows, career fairs; ai = AI events (the site's AI button); tech = developer, data, security, crypto, UX and tech-community events (the Tech button also includes ai and category ai))
seasonNoSeasonal series tag, e.g. 'techweek27' (only when the site lists one)
sectorNoIndustry a work event is for (only events with a work topic carry one; general networking has none): e.g. senior_care, healthcare, real_estate, finance_insurance, legal, tech
audienceNoWho the event is only for: kids, teens, seniors (older adults: senior-center programs, 55+ groups), or general (none of those). Default: no filter. Caregiver/aging talks for families and professionals are general.
categoryNoScored category (the site's AI, Dance, Fun, Gym, Music, Singles, Volunteer tabs)
radius_kmNoDistance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)
biz_formatNoKind of work event: referral_group (BNI etc.), chamber, mixer, breakfast_lunch, workshop_training, conference_expo, career_fair, ce_credits, pitch_demo, committee_meeting
neighborhoodNoOnly events in this San Francisco neighborhood (or town): Bayview, Bernal Heights, Castro, Chinatown, Excelsior, FiDi / South Beach, Glen Park, Golden Gate Park, Haight, Hayes Valley, Ingleside / Oceanview, Inner Richmond, Inner Sunset, Japantown, Lakeshore, Lincoln Park, Lone Mountain / USF, Marina, McLaren Park, Mission, Mission Bay, Nob Hill, Noe Valley, North Beach, Outer Mission, Outer Richmond, Pacific Heights, Portola, Potrero Hill, Presidio, Presidio Heights, Russian Hill, Seacliff, SoMa, Sunset / Parkside, Tenderloin, Treasure Island, Twin Peaks, Visitacion Valley, West of Twin Peaks, Western Addition. Sub-neighborhood and common names work too. Add radius_km to also take events within that distance of its centre. Events whose venue isn't mapped can't be placed and are left out; the response's place.unplaced_events counts them.
changed_sinceNoOnly events added or changed (title, date or time, venue, link, price, sold out, status) at or after this moment: YYYY-MM-DD (local) or an ISO date-time. To follow up later, pass the previous result's changes.synced_at; changes.removed then lists events taken down since.

Output Schema

NameRequiredDescriptionDefault
countYesEvents that matched in total
placeNo
shownYesEvents returned (at most limit)
eventsYes
searchNoHow the query was read
changesNoOnly with changed_since
coverageNoCoverage and accuracy page
attributionNo
briefing_urlNoThe dated weekly briefing for this week or next (counts plus picks per kind of event, #lane when the filters match one); null further out. Cite it for "what's on this week"
data_generatedNoWhen this city's data was last published

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / events / items / properties / venue_status
      Added value: +{
      +  "description": "Present only when location is empty, and says why (we never guess a venue): rsvp = the address is shared after RSVP/registration; tba = the venue isn't decided; hidden = the source shows the venue to its members only (Meetup stubs; /mcp leaves these out, so you won't see it here); title = the title names the place; text = the description names a place; unset = the host left it blank. Open the link for the venue",
      +  "enum": [
      +    "rsvp",
      +    "tba",
      +    "hidden",
      +    "title",
      +    "text",
      +    "unset"
      +  ],
      +  "type": "string"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / topic / enum
      Previous value: -[
      -  "arts",
      -  "books",
      -  "civic",
      -  "classes",
      -  "comedy",
      -  "community",
      -  "conferences",
      -  "culture",
      -  "faith",
      -  "family",
      -  "film",
      -  "food_drink",
      -  "games",
      -  "markets",
      -  "networking",
      -  "nightlife",
      -  "nonprofit",
      -  "outdoors",
      -  "science",
      -  "sports",
      -  "startup",
      -  "talks",
      -  "theater",
      -  "wellness",
      -  "wine",
      -  "business",
      -  "ai",
      -  "tech"
      -]New value: +[
      +  "arts",
      +  "books",
      +  "civic",
      +  "classes",
      +  "comedy",
      +  "community",
      +  "conferences",
      +  "culture",
      +  "faith",
      +  "family",
      +  "film",
      +  "food_drink",
      +  "games",
      +  "markets",
      +  "networking",
      +  "nightlife",
      +  "nonprofit",
      +  "outdoors",
      +  "science",
      +  "sports",
      +  "startup",
      +  "talks",
      +  "theater",
      +  "wellness",
      +  "wine",
      +  "business",
      +  "ai",
      +  "tech",
      +  "service_orgs"
      +]
    • addedOutput schema / properties / briefing_url
      Added value: +{
      +  "description": "The dated weekly briefing for this week or next (counts plus picks per kind of event, #lane when the filters match one); null further out. Cite it for \"what's on this week\"",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed7 schema fields changed
    • addedInput schema / properties / changed_since
      Added value: +{
      +  "description": "Only events added or changed (title, date or time, venue, link, price, sold out, status) at or after this moment: YYYY-MM-DD (local) or an ISO date-time. To follow up later, pass the previous result's changes.synced_at; changes.removed then lists events taken down since.",
      +  "type": "string"
      +}
    • changedInput schema / properties / topic / description
      Previous value: -"Topic (the site's Arts, Food, Learn, Sports tabs: e.g. comedy, film, food_drink, sports, talks, classes, markets, outdoors; business = chamber mixers, referral groups, small-business workshops, trade shows, career fairs)"New value: +"Topic (the site's Arts, Food, Learn, Sports tabs: e.g. comedy, film, food_drink, sports, talks, classes, markets, outdoors; business = chamber mixers, referral groups, small-business workshops, trade shows, career fairs; ai = AI events (the site's AI button); tech = developer, data, security, crypto, UX and tech-community events (the Tech button also includes ai and category ai))"
    • changedInput schema / properties / topic / enum
      Previous value: -[
      -  "arts",
      -  "books",
      -  "civic",
      -  "classes",
      -  "comedy",
      -  "community",
      -  "conferences",
      -  "culture",
      -  "faith",
      -  "family",
      -  "film",
      -  "food_drink",
      -  "games",
      -  "markets",
      -  "networking",
      -  "nightlife",
      -  "nonprofit",
      -  "outdoors",
      -  "science",
      -  "sports",
      -  "startup",
      -  "talks",
      -  "wellness",
      -  "wine",
      -  "business"
      -]New value: +[
      +  "arts",
      +  "books",
      +  "civic",
      +  "classes",
      +  "comedy",
      +  "community",
      +  "conferences",
      +  "culture",
      +  "faith",
      +  "family",
      +  "film",
      +  "food_drink",
      +  "games",
      +  "markets",
      +  "networking",
      +  "nightlife",
      +  "nonprofit",
      +  "outdoors",
      +  "science",
      +  "sports",
      +  "startup",
      +  "talks",
      +  "theater",
      +  "wellness",
      +  "wine",
      +  "business",
      +  "ai",
      +  "tech"
      +]
    • addedOutput schema / properties / changes
      Added value: +{
      +  "description": "Only with changed_since",
      +  "properties": {
      +    "note": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "removed": {
      +      "description": "Upcoming events taken down (cancelled, delisted or merged into another listing) since `since`, newest first, last two weeks at most",
      +      "items": {
      +        "properties": {
      +          "date": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "removed": {
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "removed"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "removed_count": {
      +      "description": "Total removals when more than are listed",
      +      "type": "number"
      +    },
      +    "since": {
      +      "type": "string"
      +    },
      +    "synced_at": {
      +      "description": "Pass this as changed_since next time to get only what changed after this answer",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "tracked_since": {
      +      "description": "When change tracking started for this city",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "since",
      +    "removed"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / events / items / properties / changed
      Added value: +{
      +  "description": "When we last saw the title, date or time, venue, link, price or status change (local ISO time); the first-seen day for older events",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / events / items / properties / event_status
      Added value: +{
      +  "description": "What a source says: postponed (no new date yet; listed on its original date), rescheduled (this is the new date), moved (to another venue; location is the new one), sold_out. Absent = scheduled as listed; cancelled events are left out",
      +  "enum": [
      +    "sold_out",
      +    "postponed",
      +    "rescheduled",
      +    "moved"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / events / items / properties / status_note
      Added value: +{
      +  "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"",
      +  "type": "string"
      +}
  4. Changed3 schema fields changed
    • addedInput schema / properties / match
      Added value: +{
      +  "description": "all (default): every word in query must match; any: at least one word or |-separated phrase does (results with more matches are no different in order: earliest first); semantic: by meaning (\"something romantic\", \"chill music outdoors\"), from an embedding of query",
      +  "enum": [
      +    "all",
      +    "any",
      +    "semantic"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / query / description
      Previous value: -"Free text, e.g. 'salsa', 'hackathon', 'street fair'"New value: +"Free text, e.g. 'salsa', 'hackathon', 'street fair'. Separate alternatives with | or commas ('salsa | bachata', 'comedy, improv'); keep a phrase together with quotes. A neighborhood or town after 'in'/'near' ('art openings in SoMa') becomes the place filter."
    • addedOutput schema / properties / search
      Added value: +{
      +  "description": "How the query was read",
      +  "properties": {
      +    "match": {
      +      "description": "all, any or semantic: how the query's words were combined",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "order": {
      +      "description": "\"best match first\" for match semantic (otherwise results are earliest first)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "place_from_query": {
      +      "description": "A neighborhood or town taken from the query and used as the place filter",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "read_as": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "description": "A word nothing matched, read as the closest word the events use",
      +      "type": "object"
      +    },
      +    "terms": {
      +      "description": "Each word or phrase searched, with the other forms that counted (synonyms)",
      +      "items": {
      +        "properties": {
      +          "also": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "term": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [],
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / events / items / properties / checked_live
      Added value: +{
      +  "description": "When we last opened the original listing and found it still matches (time, venue, not cancelled); local ISO time. Absent = not checked in the last two days",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  6. Changed6 schema fields changed
    • addedInput schema / properties / audience
      Added value: +{
      +  "description": "Who the event is only for: kids, teens, seniors (older adults: senior-center programs, 55+ groups), or general (none of those). Default: no filter. Caregiver/aging talks for families and professionals are general.",
      +  "enum": [
      +    "general",
      +    "kids",
      +    "teens",
      +    "seniors"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / biz_format
      Added value: +{
      +  "description": "Kind of work event: referral_group (BNI etc.), chamber, mixer, breakfast_lunch, workshop_training, conference_expo, career_fair, ce_credits, pitch_demo, committee_meeting",
      +  "enum": [
      +    "referral_group",
      +    "chamber",
      +    "mixer",
      +    "breakfast_lunch",
      +    "workshop_training",
      +    "conference_expo",
      +    "career_fair",
      +    "ce_credits",
      +    "pitch_demo",
      +    "committee_meeting"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / sector
      Added value: +{
      +  "description": "Industry a work event is for (only events with a work topic carry one; general networking has none): e.g. senior_care, healthcare, real_estate, finance_insurance, legal, tech",
      +  "enum": [
      +    "senior_care",
      +    "healthcare",
      +    "life_sciences",
      +    "real_estate",
      +    "finance_insurance",
      +    "legal",
      +    "tech",
      +    "defense_government",
      +    "trades_construction",
      +    "hospitality_food",
      +    "retail_ecommerce",
      +    "marketing_media",
      +    "nonprofit",
      +    "energy_climate",
      +    "hr_workforce",
      +    "creative_design"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / topic / description
      Previous value: -"Topic (the site's Arts, Food, Learn, Sports tabs: e.g. comedy, film, food_drink, sports, talks, classes, markets, outdoors)"New value: +"Topic (the site's Arts, Food, Learn, Sports tabs: e.g. comedy, film, food_drink, sports, talks, classes, markets, outdoors; business = chamber mixers, referral groups, small-business workshops, trade shows, career fairs)"
    • changedInput schema / properties / topic / enum
      Previous value: -[
      -  "arts",
      -  "books",
      -  "civic",
      -  "classes",
      -  "comedy",
      -  "community",
      -  "conferences",
      -  "culture",
      -  "faith",
      -  "family",
      -  "film",
      -  "food_drink",
      -  "games",
      -  "markets",
      -  "networking",
      -  "nightlife",
      -  "nonprofit",
      -  "outdoors",
      -  "science",
      -  "sports",
      -  "startup",
      -  "talks",
      -  "wellness",
      -  "wine"
      -]New value: +[
      +  "arts",
      +  "books",
      +  "civic",
      +  "classes",
      +  "comedy",
      +  "community",
      +  "conferences",
      +  "culture",
      +  "faith",
      +  "family",
      +  "film",
      +  "food_drink",
      +  "games",
      +  "markets",
      +  "networking",
      +  "nightlife",
      +  "nonprofit",
      +  "outdoors",
      +  "science",
      +  "sports",
      +  "startup",
      +  "talks",
      +  "wellness",
      +  "wine",
      +  "business"
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "attribution": {
      +      "type": "string"
      +    },
      +    "count": {
      +      "description": "Events that matched in total",
      +      "type": "number"
      +    },
      +    "coverage": {
      +      "description": "Coverage and accuracy page",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "data_generated": {
      +      "description": "When this city's data was last published",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "events": {
      +      "items": {
      +        "properties": {
      +          "audience": {
      +            "description": "kids, teens or seniors when the event is only for them",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "biz_formats": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "categories": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "city": {
      +            "description": "Town or city within the metro",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "date": {
      +            "description": "Local start date, YYYY-MM-DD",
      +            "type": "string"
      +          },
      +          "distance_km": {
      +            "description": "With near: distance from the place",
      +            "type": "number"
      +          },
      +          "end": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "first_seen": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "free": {
      +            "type": "boolean"
      +          },
      +          "id": {
      +            "description": "Stable 12-character id; pass it to get_event",
      +            "type": "string"
      +          },
      +          "last_fetched": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "last_seen": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "link": {
      +            "description": "The original listing; keep it and credit What's Up In",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "location": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "neighborhood": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "performers": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "possibly_free": {
      +            "type": "boolean"
      +          },
      +          "posted_by_sources": {
      +            "type": "number"
      +          },
      +          "price": {
      +            "description": "All-in price as the source states it, \"Free\", or \"See tickets\" when the source doesn't state the all-in total",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "recurring": {
      +            "description": "weekly, biweekly or monthly when the event is one date of a series",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "region": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "rv": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "sectors": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "sold_out": {
      +            "type": "boolean"
      +          },
      +          "sources": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "start": {
      +            "description": "Local start, ISO 8601, when the source gives a time",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "topics": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "title",
      +          "date"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "place": {
      +      "properties": {
      +        "center": {
      +          "items": {
      +            "type": "number"
      +          },
      +          "type": "array"
      +        },
      +        "kind": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "matched": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "note": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "radius_km": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "unplaced_events": {
      +          "description": "Events left out because their venue isn't mapped",
      +          "type": "number"
      +        }
      +      },
      +      "required": [],
      +      "type": "object"
      +    },
      +    "shown": {
      +      "description": "Events returned (at most limit)",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "count",
      +    "shown",
      +    "events"
      +  ],
      +  "type": "object"
      +}
  7. Changed3 schema fields changed
    • addedInput schema / properties / near
      Added value: +{
      +  "description": "Events within radius_km of a place: a neighborhood, a town, a venue name, or \"lat,lon\". Results get distance_km, nearest first within each day. Use this for \"near X\"; use neighborhood for \"in X\". Unmapped venues are left out (counted in place.unplaced_events).",
      +  "type": "string"
      +}
    • addedInput schema / properties / neighborhood
      Added value: +{
      +  "description": "Only events in this San Francisco neighborhood (or town): Bayview, Bernal Heights, Castro, Chinatown, Excelsior, FiDi / South Beach, Glen Park, Golden Gate Park, Haight, Hayes Valley, Ingleside / Oceanview, Inner Richmond, Inner Sunset, Japantown, Lakeshore, Lincoln Park, Lone Mountain / USF, Marina, McLaren Park, Mission, Mission Bay, Nob Hill, Noe Valley, North Beach, Outer Mission, Outer Richmond, Pacific Heights, Portola, Potrero Hill, Presidio, Presidio Heights, Russian Hill, Seacliff, SoMa, Sunset / Parkside, Tenderloin, Treasure Island, Twin Peaks, Visitacion Valley, West of Twin Peaks, Western Addition. Sub-neighborhood and common names work too. Add radius_km to also take events within that distance of its centre. Events whose venue isn't mapped can't be placed and are left out; the response's place.unplaced_events counts them.",
      +  "type": "string"
      +}
    • addedInput schema / properties / radius_km
      Added value: +{
      +  "description": "Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)",
      +  "type": "number"
      +}
  8. Changed5 schema fields changed
    • changedInput schema / properties / city / description
      Previous value: -"City outside SF, e.g. 'Oakland', 'Berkeley', 'San Jose' (case-insensitive)"New value: +"City, e.g. 'San Francisco' or another town in the Bay Area (case-insensitive)"
    • changedInput schema / properties / scope / description
      Previous value: -"Geography: SF, one Bay Area region, Santa Cruz County, the whole Bay Area (excludes Santa Cruz), or any (default)"New value: +"Geography: one region (sf = SF, peninsula = Peninsula, south_bay = South Bay, east_bay = East Bay, north_bay = North Bay, santa_cruz = Santa Cruz, beyond = Farther), bay_area (sf, peninsula, south_bay, east_bay, north_bay), or any (default)"
    • changedInput schema / properties / scope / enum
      Previous value: -[
      -  "sf",
      -  "peninsula",
      -  "south_bay",
      -  "east_bay",
      -  "north_bay",
      -  "santa_cruz",
      -  "bay_area",
      -  "any"
      -]New value: +[
      +  "sf",
      +  "peninsula",
      +  "south_bay",
      +  "east_bay",
      +  "north_bay",
      +  "santa_cruz",
      +  "beyond",
      +  "bay_area",
      +  "any"
      +]
    • changedInput schema / properties / season / description
      Previous value: -"Seasonal series tag, e.g. 'techweek26' for SF Tech Week 2026"New value: +"Seasonal series tag, e.g. 'techweek27' (only when the site lists one)"
    • changedInput schema / properties / topic / enum
      Previous value: -[
      -  "arts",
      -  "books",
      -  "civic",
      -  "classes",
      -  "comedy",
      -  "community",
      -  "conferences",
      -  "culture",
      -  "faith",
      -  "family",
      -  "film",
      -  "food_drink",
      -  "games",
      -  "markets",
      -  "networking",
      -  "nightlife",
      -  "nonprofit",
      -  "outdoors",
      -  "science",
      -  "sports",
      -  "startup",
      -  "talks",
      -  "wellness"
      -]New value: +[
      +  "arts",
      +  "books",
      +  "civic",
      +  "classes",
      +  "comedy",
      +  "community",
      +  "conferences",
      +  "culture",
      +  "faith",
      +  "family",
      +  "film",
      +  "food_drink",
      +  "games",
      +  "markets",
      +  "networking",
      +  "nightlife",
      +  "nonprofit",
      +  "outdoors",
      +  "science",
      +  "sports",
      +  "startup",
      +  "talks",
      +  "wellness",
      +  "wine"
      +]
  9. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare it a safe read (readOnlyHint, idempotentHint, destructiveHint=false), and the description still adds substantial operational context: prefix/singular-plural/synonym word matching, all-vs-any semantics, a fuzzy fallback whose interpretation is echoed in the result's `search` field, local America/Los_Angeles dates, earliest-first ordering, and rate limits (30 calls/minute, 2,500 rows/hour) with no sign-in. The count-vs-limit guidance ('narrow the search rather than paging') is a non-obvious pagination constraint stated up front.

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 essential framing — what it searches, when to use it, which siblings to prefer — is front-loaded in the first two sentences. The remainder is a dense run-on covering matching rules, ordering, paging and rate limits; almost all of it is useful, but the single unbroken block makes it harder to scan than it needs to be.

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 an 18-parameter, zero-required search tool with an output schema, the description covers what the schema cannot: matching semantics, timezone, result ordering, how to avoid paging, rate ceilings, and the pointer to get_city for enum values. An agent has everything needed to call it correctly and interpret the count/search fields.

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 coverage is 100%, so the baseline is 3; the description earns more by explaining the default all-words-must-match behavior, the `|`/comma alternative syntax, and the near-vs-neighborhood distinction for 'near X' vs 'in X'. It slightly duplicates what the `query` and `near` schema descriptions already say, which keeps it off a 5.

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?

States a specific verb and resource — 'Search every upcoming Bay Area event' — and immediately enumerates the facets it searches across (words, dates, price, topic, place). It explicitly names the sibling tools it is not: list_upcoming for day-by-day overviews and find_performer for a single act, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition ('whenever the question has search words, a date range, free-only, a town or an area') and names two concrete alternatives with the conditions that select them (list_upcoming, find_performer). It also points to get_city as the source for valid neighborhood, town, category and topic values, closing the value-discovery loop.

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