SFomo: Bay Area events
Server Details
Read-only search of upcoming SF Bay Area events: AI/tech, dance, music, arts, food, fitness.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 6 tools
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.
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.
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.
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 toolscreate_custom_calendarCreate a custom calendarARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Calendar name shown in their calendar app, e.g. 'Salsa + AI nights' | |
| exclude | No | Words; any event containing one is left out | |
| interests | Yes | 1-12 interests; each needs a query, category or topic | |
| include_kids | No | Include kids'/teens'-only events (default false) | |
| include_seniors | No | Include events only for older adults (senior-center programs, 55+ groups; default false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| sample | No | |
| subscribe | Yes | Subscribe links: Google Calendar, Apple/Outlook webcal, plain .ics |
| place_note | No | |
| attribution | No | |
| how_it_works | No | |
| total_upcoming | No | |
| events_next_7_days | No | |
| events_next_30_days | No |
TDQS
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.
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.
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.
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.
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.
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 performerARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches (default 10, max 25) | |
| query | Yes | Part of a name, e.g. 'khruangbin' |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | No | |
| matched | Yes | |
| matches | Yes | |
| coverage | No | Coverage and accuracy page |
| attribution | No | |
| data_generated | No | When this city's data was last published |
| directory_generated | No |
TDQS
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.
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.
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.
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.
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.
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 coverageARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mcp | No | |
| name | No | |
| site | No | |
| metro | No | |
| towns | No | Upcoming events per town, the busiest first (search_events `town`) |
| topics | No | Upcoming events per topic (search_events `topic`) |
| regions | No | |
| coverage | No | Coverage and accuracy page |
| timezone | No | |
| last_date | No | |
| categories | No | Upcoming events per category (search_events `category`) |
| first_date | No | |
| attribution | No | |
| free_events | No | |
| neighborhoods | No | Upcoming events per neighborhood (the `neighborhood` argument) |
| data_generated | No | When this city's data was last published |
| upcoming_events | Yes |
TDQS
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.
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.
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.
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.
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.
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 eventARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 12-character event id |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | |
| coverage | No | Coverage and accuracy page |
| attribution | No | |
| data_generated | No | When this city's data was last published |
TDQS
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.
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.
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.
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.
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.
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 eventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window in days (default 7, max 60) | |
| near | No | 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). | |
| limit | No | Max rows (default 50, max 100) | |
| topic | No | ||
| sector | No | 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 | |
| audience | No | 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. | |
| category | No | ||
| radius_km | No | Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0) | |
| biz_format | No | Kind of work event: referral_group (BNI etc.), chamber, mixer, breakfast_lunch, workshop_training, conference_expo, career_fair, ce_credits, pitch_demo, committee_meeting | |
| neighborhood | No | 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. | |
| changed_since | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | Events that matched in total |
| place | No | |
| shown | Yes | Events returned (at most limit) |
| by_day | No | Matches per date (YYYY-MM-DD), all of them, not just the rows shown |
| events | Yes | |
| changes | No | Only with changed_since |
| coverage | No | Coverage and accuracy page |
| attribution | No | |
| briefing_url | No | 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" |
| data_generated | No | When this city's data was last published |
TDQS
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.
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.
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.
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.
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.
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 eventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Latest date (default: none) | |
| city | No | City, e.g. 'San Francisco' or another town in the Bay Area (case-insensitive) | |
| free | No | Only free events (a listed free price, or an unpriced listing from a source whose events are free) | |
| from | No | Earliest date (default: today) | |
| near | No | 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). | |
| limit | No | Max results (default 25, max 100) | |
| match | No | 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 | |
| query | No | 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. | |
| scope | No | 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) | |
| topic | No | 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)) | |
| season | No | Seasonal series tag, e.g. 'techweek27' (only when the site lists one) | |
| sector | No | 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 | |
| audience | No | 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. | |
| category | No | Scored category (the site's AI, Dance, Fun, Gym, Music, Singles, Volunteer tabs) | |
| radius_km | No | Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0) | |
| biz_format | No | Kind of work event: referral_group (BNI etc.), chamber, mixer, breakfast_lunch, workshop_training, conference_expo, career_fair, ce_credits, pitch_demo, committee_meeting | |
| neighborhood | No | 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. | |
| changed_since | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Events that matched in total |
| place | No | |
| shown | Yes | Events returned (at most limit) |
| events | Yes | |
| search | No | How the query was read |
| changes | No | Only with changed_since |
| coverage | No | Coverage and accuracy page |
| attribution | No | |
| briefing_url | No | 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" |
| data_generated | No | When this city's data was last published |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
- Changed
create_custom_calendar1 field changed- added
Output schema / properties / sample / items / properties / venue_statusAdded 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" +}
- Changed
find_performer1 field changed- added
Output schema / properties / matches / items / properties / next_events / items / properties / venue_statusAdded 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" +}
- Changed
get_event1 field changed- added
Output schema / properties / event / properties / venue_statusAdded 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" +}
- Changed
list_upcoming1 field changed- added
Output schema / properties / events / items / properties / venue_statusAdded 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" +}
- Changed
search_events1 field changed- added
Output schema / properties / events / items / properties / venue_statusAdded 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" +}
3 tool updates
- Changed
create_custom_calendar1 field changed- changed
Input schema / properties / interests / items / properties / topic / enumPrevious 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" +]
- Changed
list_upcoming2 fields changed- changed
Input schema / properties / topic / enumPrevious 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" +] - added
Output schema / properties / briefing_urlAdded 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" + ] +}
- Changed
search_events2 fields changed- changed
Input schema / properties / topic / enumPrevious 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" +] - added
Output schema / properties / briefing_urlAdded 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" + ] +}
5 tool updates
- Changed
create_custom_calendar4 fields changed- changed
Input schema / properties / interests / items / properties / topic / enumPrevious 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" +] - added
Output schema / properties / sample / items / properties / changedAdded 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" + ] +} - added
Output schema / properties / sample / items / properties / event_statusAdded 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" +} - added
Output schema / properties / sample / items / properties / status_noteAdded value: +{ + "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"", + "type": "string" +}
- Changed
find_performer3 fields changed- added
Output schema / properties / matches / items / properties / next_events / items / properties / changedAdded 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" + ] +} - added
Output schema / properties / matches / items / properties / next_events / items / properties / event_statusAdded 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" +} - added
Output schema / properties / matches / items / properties / next_events / items / properties / status_noteAdded value: +{ + "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"", + "type": "string" +}
- Changed
get_event3 fields changed- added
Output schema / properties / event / properties / changedAdded 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" + ] +} - added
Output schema / properties / event / properties / event_statusAdded 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" +} - added
Output schema / properties / event / properties / status_noteAdded value: +{ + "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"", + "type": "string" +}
- Changed
list_upcoming6 fields changed- added
Input schema / properties / changed_sinceAdded 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" +} - changed
Input schema / properties / topic / enumPrevious 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" +] - added
Output schema / properties / changesAdded 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" +} - added
Output schema / properties / events / items / properties / changedAdded 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" + ] +} - added
Output schema / properties / events / items / properties / event_statusAdded 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" +} - added
Output schema / properties / events / items / properties / status_noteAdded value: +{ + "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"", + "type": "string" +}
- Changed
search_events7 fields changed- added
Input schema / properties / changed_sinceAdded 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" +} - changed
Input schema / properties / topic / descriptionPrevious 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))" - changed
Input schema / properties / topic / enumPrevious 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" +] - added
Output schema / properties / changesAdded 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" +} - added
Output schema / properties / events / items / properties / changedAdded 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" + ] +} - added
Output schema / properties / events / items / properties / event_statusAdded 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" +} - added
Output schema / properties / events / items / properties / status_noteAdded value: +{ + "description": "The source's own wording of event_status, e.g. \"Moved to The Warfield\"", + "type": "string" +}
1 tool update
- Changed
search_events3 fields changed- added
Input schema / properties / matchAdded 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" +} - changed
Input schema / properties / query / descriptionPrevious 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." - added
Output schema / properties / searchAdded 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 tool updates
- Changed
create_custom_calendar1 field changed- added
Output schema / properties / sample / items / properties / checked_liveAdded 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" + ] +}
- Changed
find_performer1 field changed- added
Output schema / properties / matches / items / properties / next_events / items / properties / checked_liveAdded 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" + ] +}
- Changed
get_event1 field changed- added
Output schema / properties / event / properties / checked_liveAdded 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" + ] +}
- Changed
list_upcoming1 field changed- added
Output schema / properties / events / items / properties / checked_liveAdded 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" + ] +}
- Changed
search_events1 field changed- added
Output schema / properties / events / items / properties / checked_liveAdded 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 tool updates
- Changed
create_custom_calendar3 fields changed- added
Input schema / properties / include_seniorsAdded value: +{ + "description": "Include events only for older adults (senior-center programs, 55+ groups; default false)", + "type": "boolean" +} - changed
Input schema / properties / interests / items / properties / topic / enumPrevious 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" +] - changed
Output 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" +}
- Changed
find_performer1 field changed- changed
Output 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" +}
- Added
get_city - Changed
get_event1 field changed- changed
Output 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" +}
- Changed
list_upcoming5 fields changed- added
Input schema / properties / audienceAdded 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" +} - added
Input schema / properties / biz_formatAdded 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" +} - added
Input schema / properties / sectorAdded 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" +} - changed
Input schema / properties / topic / enumPrevious 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" +] - changed
Output 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" +}
- Changed
search_events6 fields changed- added
Input schema / properties / audienceAdded 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" +} - added
Input schema / properties / biz_formatAdded 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" +} - added
Input schema / properties / sectorAdded 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" +} - changed
Input schema / properties / topic / descriptionPrevious 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)" - changed
Input schema / properties / topic / enumPrevious 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" +] - changed
Output 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" +}
4 tool updates
- Changed
create_custom_calendar3 fields changed- added
Input schema / properties / interests / items / properties / nearAdded 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" +} - added
Input schema / properties / interests / items / properties / neighborhoodAdded 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" +} - added
Input schema / properties / interests / items / properties / radius_kmAdded value: +{ + "description": "Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)", + "type": "number" +}
- Added
find_performer - Changed
list_upcoming4 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Max rows (default 50, max 100)", + "type": "integer" +} - added
Input schema / properties / nearAdded 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" +} - added
Input schema / properties / neighborhoodAdded 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" +} - added
Input schema / properties / radius_kmAdded value: +{ + "description": "Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)", + "type": "number" +}
- Changed
search_events3 fields changed- added
Input schema / properties / nearAdded 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" +} - added
Input schema / properties / neighborhoodAdded 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" +} - added
Input schema / properties / radius_kmAdded value: +{ + "description": "Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)", + "type": "number" +}
4 tool updates
- Changed
create_custom_calendar3 fields changed- changed
Input schema / properties / interests / items / properties / city / descriptionPrevious value: -"One city outside SF, e.g. 'Oakland'"New value: +"One city outside SF (case-insensitive)" - changed
Input schema / properties / interests / items / properties / times / descriptionPrevious 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" - changed
Input schema / properties / interests / items / properties / topic / enumPrevious 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" +]
- Added
get_event - Changed
list_upcoming1 field changed- changed
Input schema / properties / topic / enumPrevious 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" +]
- Changed
search_events5 fields changed- changed
Input schema / properties / city / descriptionPrevious 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)" - changed
Input schema / properties / scope / descriptionPrevious 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)" - changed
Input schema / properties / scope / enumPrevious 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" +] - changed
Input schema / properties / season / descriptionPrevious 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)" - changed
Input schema / properties / topic / enumPrevious 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" +]
1 tool update
- Added
create_custom_calendar
2 tool updates
- First observed
list_upcoming - First observed
search_events
Related MCP Connectors
Read-only search of upcoming local events worldwide: music, comedy, AI/tech, arts, food, sports.
Live events in 50 cities: AI/tech meetups, hackathons, conferences, concerts. Free, read-only.
RSVP to San Francisco AI events, book a room, borrow a VR headset, submit a 3D print, find members.
Free US local event search. No signup or API key; 90-day lookahead. Paid commercial and bulk access.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables read-only discovery and planning of San Francisco Tech Week events, including searching by hosts, topics, dates, and building itineraries or calendar drafts.1MIT
- AlicenseNot gradedqualityBmaintenanceLets AI agents discover and filter upcoming civic events and programming across San Francisco parks, plazas, and recreation centers by date range and keyword.6 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying San Francisco Bay Area events from Funcheap, including event details, tags, and categories.10 npmMIT

Dayplayofficial
AlicenseAqualityCmaintenanceProvides 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.3216 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.