Skip to main content
Glama

SFomo: Bay Area events

Server Details

Read-only search of upcoming SF Bay Area events: AI/tech, dance, music, arts, food, fitness.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.8/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct operation: standing calendar creation, performer lookup, coverage metadata, single-event detail by id, day-by-day browsing, and keyword search. Descriptions explicitly cross-reference the correct tool for each intent (e.g. 'for a one-off answer use search_events', 'for one event's details get_event'), leaving little room for misselection.

Naming Consistency5/5

All six tools follow a consistent snake_case verb_noun pattern: create_custom_calendar, find_performer, get_city, get_event, list_upcoming, search_events. Verbs (create/find/get/list/search) accurately reflect each operation.

Tool Count5/5

Six tools is well-scoped for a read-only event discovery service; each tool earns its place with no redundancy or padding. The surface covers discovery, detail, and personalization without bloat.

Completeness4/5

Core lifecycle is covered: metadata (get_city), discovery (search_events, list_upcoming, find_performer), detail (get_event), and a personalization path (create_custom_calendar). Minor gaps exist—no standalone venue-detail tool or performer/venue browsing beyond name matching—but agents can work around these via search_events and find_performer.

Available Tools

6 tools
create_custom_calendarCreate a custom calendarA
Read-onlyIdempotent
Inspect

Build a subscribable calendar of upcoming Bay Area events from the user's interests. Returns a link that opens the calendar on SF Events (open_on_sf_events; give the user this first), subscribe links (Google Calendar, Apple/Outlook webcal, plain .ics) and a preview. The calendar refreshes itself every few hours, so new matching events keep appearing. An event is included if it matches ANY interest and no exclude term. Nothing is stored by SF Events: the interests are encoded in the link itself. Interview the user first (see the custom_calendar prompt), check matches with search_events, and call this again to adjust. For a one-off answer rather than a standing calendar, use search_events. No sign-in; each client gets 30 calls a minute and 2,500 event rows an hour.

NameRequiredDescriptionDefault
nameNoCalendar name shown in their calendar app, e.g. 'Salsa + AI nights'
excludeNoWords; any event containing one is left out
interestsYes1-12 interests; each needs a query, category or topic
include_kidsNoInclude kids'/teens'-only events (default false)
include_seniorsNoInclude events only for older adults (senior-center programs, 55+ groups; default false)

Output Schema

NameRequiredDescription
nameNo
sampleNo
subscribeYesSubscribe links: Google Calendar, Apple/Outlook webcal, plain .ics
place_noteNo
attributionNo
how_it_worksNo
total_upcomingNo
events_next_7_daysNo
events_next_30_daysNo

TDQS

A4.9/5.0
Behavior5/5

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

Adds substantial behavior beyond annotations: returns open_on_sf_events, subscribe links, and a preview; refreshes every few hours; includes events matching ANY interest and no exclude term; and stores nothing because interests are encoded in the link. This also clarifies why readOnlyHint=true is consistent despite the create-style name.

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

Conciseness5/5

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

The description is dense but front-loaded, starting with what the tool builds and what it returns. Every sentence adds operational value: workflow, matching logic, storage behavior, alternatives, and rate limits.

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?

Given the annotations, complete schema coverage, and an output schema, the description is complete for correct invocation. It supplies the workflow and behavioral context an agent needs without redundantly explaining return shapes.

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 schema already carries detailed parameter meaning. The description adds useful cross-parameter semantics: interests combine with ANY logic and exclude terms act as a veto, which is not fully captured by 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?

States a specific verb and resource: build a subscribable calendar of upcoming Bay Area events from the user's interests. It clearly distinguishes this from search_events by contrasting a standing calendar with a one-off answer.

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?

Explicitly tells the agent to interview the user first, check matches with search_events, and call this again to adjust. It also names the alternative for one-off answers and states auth/rate-limit constraints, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_performerFind a performerA
Read-onlyIdempotent
Inspect

Find a performer, band, comedian or act in Bay Area by name (words in query must all match; case-insensitive) and get their upcoming events, top venues, genres or topics and the platforms that list them. Names come only from public event listings; there are no contact details. Use it for "when is playing" or "who plays at ". For events by topic or venue rather than by name, use search_events; use get_event with an id for one event's full listing. No sign-in; each client gets 30 calls a minute and 2,500 event rows an hour.

NameRequiredDescriptionDefault
limitNoMax matches (default 10, max 25)
queryYesPart of a name, e.g. 'khruangbin'

Output Schema

NameRequiredDescription
queryNo
matchedYes
matchesYes
coverageNoCoverage and accuracy page
attributionNo
data_generatedNoWhen this city's data was last published
directory_generatedNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description adds genuinely new behavioral context: data provenance (public event listings only), a negative guarantee (no contact details), no sign-in required, and hard rate limits (30 calls/min, 2,500 event rows/hour). These are exactly the operational facts an agent needs before calling at volume.

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?

Front-loaded with purpose and scope, and every sentence carries distinct information (scope, use cases, alternatives, limits). The opening sentence is dense with multiple clauses, which slightly slows scanning, but no content is redundant.

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?

Return values are covered by the output schema, so the description is right not to enumerate them; it instead covers provenance, access model, rate limits, and sibling routing. For a 2-parameter read tool, nothing an agent needs to call it correctly is missing.

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 would be 3, but the description adds matching semantics the schema lacks: all words in `query` must match and matching is case-insensitive. `limit` behavior is left entirely to the schema, which already documents default and max.

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 ('find a performer, band, comedian or act in Bay Area by name') plus exactly what comes back (upcoming events, top venues, genres/topics, listing platforms). It also names the sibling tools it is not (search_events, get_event), so an agent can route without opening a 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 concrete use cases ('when is <band> playing', 'who plays at <venue>') and explicit exclusions with the correct alternative named for each: search_events for topic/venue browsing, get_event for a single listing by id. Nothing about selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cityGet city coverageA
Read-onlyIdempotent
Inspect

Get what SF Events covers in Bay Area: how many upcoming events it lists and for which dates, when the data was last published, how many sources feed it, and upcoming events per category, topic, neighborhood and town. Call it before searching to pick valid category, topic, neighborhood and town values, or to tell a user what this site covers; it returns counts only, no events (use search_events or list_upcoming for those). Takes no arguments. No sign-in; each client gets 30 calls a minute and 2,500 event rows an hour.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
mcpNo
nameNo
siteNo
metroNo
townsNoUpcoming events per town, the busiest first (search_events `town`)
topicsNoUpcoming events per topic (search_events `topic`)
regionsNo
coverageNoCoverage and accuracy page
timezoneNo
last_dateNo
categoriesNoUpcoming events per category (search_events `category`)
first_dateNo
attributionNo
free_eventsNo
neighborhoodsNoUpcoming events per neighborhood (the `neighborhood` argument)
data_generatedNoWhen this city's data was last published
upcoming_eventsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive, closed-world, but the description adds operational context beyond them: takes no arguments, requires no sign-in, returns counts only, and states concrete rate limits (30 calls/minute, 2,500 event rows/hour). That rate-limit and auth disclosure is exactly the behavioral detail annotations cannot carry.

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?

Front-loads the return contents, then usage guidance, then constraints in a single dense paragraph with no filler sentences. It is information-rich rather than padded, though the run-on structure could be split for faster scanning.

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?

With an output schema present, the description needn't describe return format, and it covers everything else an agent needs: scope, what is excluded (events), when to call it, sibling alternatives, auth requirements, and rate limits. Complete for a zero-argument discovery tool.

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?

Zero parameters, so the baseline is 4; the description confirms this with 'Takes no arguments,' matching the empty schema. There is no parameter syntax to add meaning to, so nothing pushes it above the baseline.

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+resource ('Get what SF Events covers in Bay Area') and enumerates exactly what is returned: event counts, date range, last-published timestamp, source count, and per-category/topic/neighborhood/town breakdowns. It also explicitly distinguishes itself from siblings by noting it returns counts only, no events, pointing to search_events and list_upcoming for those.

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 explicit when-to-use ('Call it before searching to pick valid category, topic, neighborhood and town values, or to tell a user what this site covers') and an explicit when-not (no events here; use search_events or list_upcoming). Both the selection condition and the alternatives are named, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_eventGet one eventA
Read-onlyIdempotent
Inspect

Get the full listing for one upcoming event by the id that search_events, list_upcoming or find_performer returned: title, dates, venue, price (all-in, or "See tickets"), the original listing (link), every source that lists it and first_seen / last_seen / last_fetched dates. Ids stay the same while an event is listed; a past or removed event returns an error, so search again. No sign-in; each client gets 30 calls a minute and 2,500 event rows an hour.

NameRequiredDescriptionDefault
idYes12-character event id

Output Schema

NameRequiredDescription
eventYes
coverageNoCoverage and accuracy page
attributionNo
data_generatedNoWhen this city's data was last published

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real context beyond them: id stability while listed, error behavior for past/removed events, no sign-in required, and explicit rate limits (30 calls/minute, 2,500 event rows/hour). It also enumerates what the response contains, which is material for a read 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 purpose and id source are front-loaded, and the rate limits land at the end where an agent will look before bulk-calling. The middle field enumeration is long but each item is a distinct piece of return information, so nearly every clause earns its place.

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?

Despite an output schema existing, the description covers the full operational picture for a one-parameter read tool: id provenance, id lifetime, error semantics, auth, and throttling. Nothing an agent needs to invoke it correctly is missing.

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% and documents the single `id` parameter as a 12-character string, so the baseline is 3. The description adds genuine meaning: the id must come from one of three named search tools and remains stable while the event is listed.

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 ('Get the full listing for one upcoming event') and scopes it by the `id` parameter. It also names the three sibling tools that produce ids (search_events, list_upcoming, find_performer), so the agent can place it precisely in the workflow.

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?

Explicitly tells the agent where a valid id comes from, and covers the failure path: a past or removed event returns an error, so search again. That is concrete when-to-use and what-to-do-on-failure guidance rather than implied usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_upcomingList upcoming eventsA
Read-onlyIdempotent
Inspect

Browse the next N days of events day by day, with no search words. by_day counts every match per date, and when more events match than limit the rows are spread evenly across the days (earliest first within each day), so each day is represented. Use it for overviews like "what's happening this week"; for search words, free-only, a town or exact from/to dates use search_events, and for one event's details get_event. Optional filters: one category or topic, an audience, and a place: neighborhood keeps events inside a named area (radius_km widens it past the boundary), near ranks events by distance from a place or "lat,lon" within radius_km. No sign-in; each client gets 30 calls a minute and 2,500 event rows an hour.

NameRequiredDescriptionDefault
daysNoWindow in days (default 7, max 60)
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 rows (default 50, max 100)
topicNo
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.
categoryNo
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

NameRequiredDescription
noteNo
countYesEvents that matched in total
placeNo
shownYesEvents returned (at most limit)
by_dayNoMatches per date (YYYY-MM-DD), all of them, not just the rows shown
eventsYes
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

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds behavior the annotations cannot: no sign-in required, a concrete rate budget (30 calls/minute, 2,500 event rows/hour), and the non-obvious result-shaping rule that rows are spread evenly across days when matches exceed limit. It also discloses the failure mode that unmapped venues are dropped and counted in place.unplaced_events.

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?

Front-loaded with the core browse behavior and the by_day spreading rule, then the routing to siblings, then filters, then the access/rate note. Dense but nearly every sentence carries new information; the filter enumeration repeats ground the schema already covers.

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?

With 11 params, an output schema, and rich annotations, the description supplies what structured fields can't: rate limits, the even-spread semantics, and sibling routing. It stops short of explaining the interplay among all filters (e.g. combining neighborhood with topic or using changed_since for follow-up polling), which the schema carries alone.

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 82%, so the schema already does most of the work, but the description adds the key disambiguation an agent would otherwise miss: 'near' ranks by distance while 'neighborhood' restricts to an area, and radius_km means different things depending on which one is used. The summary of optional filters omits sector, biz_format, and changed_since, leaving those to 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?

States a specific verb and resource ('Browse the next N days of events day by day, with no search words') and immediately distinguishes itself from search_events and get_event by name. An agent can identify this as the browse-by-date-window tool without opening any 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 positive case ('overviews like what's happening this week') and explicit negative cases routed to alternatives: search words, free-only, a town or exact from/to dates go to search_events, single-event details go to get_event. Both sides of the use/don't-use decision are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_eventsSearch eventsA
Read-onlyIdempotent
Inspect

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.

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

NameRequiredDescription
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

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updates
    • Changedcreate_custom_calendar1 field changed
      • addedOutput schema / properties / sample / 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"
        +}
    • Changedfind_performer1 field changed
      • addedOutput schema / properties / matches / items / properties / next_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"
        +}
    • Changedget_event1 field changed
      • addedOutput schema / properties / event / 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"
        +}
    • Changedlist_upcoming1 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"
        +}
    • Changedsearch_events1 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. 3 tool updates
    • Changedcreate_custom_calendar1 field changed
      • changedInput schema / properties / interests / items / 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"
        +]
    • Changedlist_upcoming2 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"
        +  ]
        +}
    • Changedsearch_events2 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. 5 tool updates
    • Changedcreate_custom_calendar4 fields changed
      • changedInput schema / properties / interests / items / 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 / sample / 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 / sample / 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 / sample / items / properties / status_note
        Added value: +{
        +  "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"",
        +  "type": "string"
        +}
    • Changedfind_performer3 fields changed
      • addedOutput schema / properties / matches / items / properties / next_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 / matches / items / properties / next_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 / matches / items / properties / next_events / items / properties / status_note
        Added value: +{
        +  "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"",
        +  "type": "string"
        +}
    • Changedget_event3 fields changed
      • addedOutput schema / properties / event / 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 / event / 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 / event / properties / status_note
        Added value: +{
        +  "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"",
        +  "type": "string"
        +}
    • Changedlist_upcoming6 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 / 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"
        +}
    • Changedsearch_events7 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. 1 tool update
    • Changedsearch_events3 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. 5 tool updates
    • Changedcreate_custom_calendar1 field changed
      • addedOutput schema / properties / sample / 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"
        +  ]
        +}
    • Changedfind_performer1 field changed
      • addedOutput schema / properties / matches / items / properties / next_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"
        +  ]
        +}
    • Changedget_event1 field changed
      • addedOutput schema / properties / event / 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"
        +  ]
        +}
    • Changedlist_upcoming1 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"
        +  ]
        +}
    • Changedsearch_events1 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. 6 tool updates
    • Changedcreate_custom_calendar3 fields changed
      • addedInput schema / properties / include_seniors
        Added value: +{
        +  "description": "Include events only for older adults (senior-center programs, 55+ groups; default false)",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / interests / items / 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"
        +    },
        +    "events_next_30_days": {
        +      "type": "number"
        +    },
        +    "events_next_7_days": {
        +      "type": "number"
        +    },
        +    "how_it_works": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "place_note": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "sample": {
        +      "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"
        +    },
        +    "subscribe": {
        +      "description": "Subscribe links: Google Calendar, Apple/Outlook webcal, plain .ics",
        +      "type": "object"
        +    },
        +    "total_upcoming": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "subscribe"
        +  ],
        +  "type": "object"
        +}
    • Changedfind_performer1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "attribution": {
        +      "type": "string"
        +    },
        +    "coverage": {
        +      "description": "Coverage and accuracy page",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data_generated": {
        +      "description": "When this city's data was last published",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "directory_generated": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "matched": {
        +      "type": "number"
        +    },
        +    "matches": {
        +      "items": {
        +        "properties": {
        +          "events_listed": {
        +            "type": "number"
        +          },
        +          "genres": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "listed_on": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "next_date": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "next_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"
        +          },
        +          "recurring_dates": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "top_venues": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "topics": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "upcoming_events": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "query": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "matched",
        +    "matches"
        +  ],
        +  "type": "object"
        +}
    • Addedget_city
    • Changedget_event1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "attribution": {
        +      "type": "string"
        +    },
        +    "coverage": {
        +      "description": "Coverage and accuracy page",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "data_generated": {
        +      "description": "When this city's data was last published",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "event": {
        +      "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"
        +    }
        +  },
        +  "required": [
        +    "event"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_upcoming5 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 / 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"
        +    },
        +    "by_day": {
        +      "additionalProperties": {
        +        "type": "number"
        +      },
        +      "description": "Matches per date (YYYY-MM-DD), all of them, not just the rows shown",
        +      "type": "object"
        +    },
        +    "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"
        +    },
        +    "note": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "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"
        +}
    • Changedsearch_events6 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. 4 tool updates
    • Changedcreate_custom_calendar3 fields changed
      • addedInput schema / properties / interests / items / 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 / interests / items / 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 / interests / items / 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"
        +}
    • Addedfind_performer
    • Changedlist_upcoming4 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max rows (default 50, max 100)",
        +  "type": "integer"
        +}
      • 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"
        +}
    • Changedsearch_events3 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. 4 tool updates
    • Changedcreate_custom_calendar3 fields changed
      • changedInput schema / properties / interests / items / properties / city / description
        Previous value: -"One city outside SF, e.g. 'Oakland'"New value: +"One city outside SF (case-insensitive)"
      • changedInput schema / properties / interests / items / properties / times / description
        Previous value: -"Start times, Pacific: morning 5-12, afternoon 12-17, evening 17-21, late 21+; allday = no set time (fairs, exhibits). Default all"New value: +"Start times, local: morning 5-12, afternoon 12-17, evening 17-21, late 21+; allday = no set time (fairs, exhibits). Default all"
      • changedInput schema / properties / interests / items / 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"
        +]
    • Addedget_event
    • Changedlist_upcoming1 field 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",
        -  "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"
        +]
    • Changedsearch_events5 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. 1 tool update
    • Addedcreate_custom_calendar
  10. 2 tool updates
    • First observedlist_upcoming
    • First observedsearch_events

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables read-only discovery and planning of San Francisco Tech Week events, including searching by hosts, topics, dates, and building itineraries or calendar drafts.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying San Francisco Bay Area events from Funcheap, including event details, tags, and categories.
    10 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides AI agents with curated San Francisco Bay Area places, verified real-time events, and neighborhood-bound local concierge experiences, strictly limited to San Francisco, Oakland, and Berkeley.
    3
    216 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources