Read-only search of upcoming SF Bay Area events: AI/tech, dance, music, arts, food, fitness.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
1-12 interests; each needs a query, category or topic
Calendar name shown in their calendar app, e.g. 'Salsa + AI nights'
Words; any event containing one is left out
Include kids'/teens'-only events (default false)
Include events only for older adults (senior-center programs, 55+ groups; default false)
Tool list last changed Oct 25, 2026.
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.
| Argument | Type | Description |
|---|---|---|
| name | string | Calendar name shown in their calendar app, e.g. 'Salsa + AI nights' |
| exclude | array | Words; any event containing one is left out |
| interests* | array | 1-12 interests; each needs a query, category or topic |
| include_kids | boolean | Include kids'/teens'-only events (default false) |
| include_seniors | boolean | Include events only for older adults (senior-center programs, 55+ groups; default false) |
{
"type": "object",
"required": [
"interests"
],
"properties": {
"name": {
"type": "string",
"description": "Calendar name shown in their calendar app, e.g. 'Salsa + AI nights'"
},
"exclude": {
"type": "array",
"items": {
"type": "string"
},
"description": "Words; any event containing one is left out"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "One city outside SF (case-insensitive)"
},
"days": {
"type": "array",
"items": {
"enum": [
"sun",
"mon",
"tue",
"wed",
"thu",
"fri",
"sat"
],
"type": "string"
},
"description": "Days of the week (default all)"
},
"free": {
"type": "boolean",
"description": "Only free events"
},
"near": {
"type": "string",
"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)."
},
"query": {
"type": "string",
"description": "Words that must ALL appear in the event's title/location/organizer/tags, e.g. 'salsa', 'hackathon', 'trail run'. Make separate interests for alternatives."
},
"scope": {
"enum": [
"sf",
"peninsula",
"south_bay",
"east_bay",
"north_bay",
"santa_cruz",
"bay_area",
"any"
],
"type": "string",
"description": "Area for this interest (default any)"
},
"times": {
"type": "array",
"items": {
"enum": [
"morning",
"afternoon",
"evening",
"late",
"allday"
],
"type": "string"
},
"description": "Start times, local: morning 5-12, afternoon 12-17, evening 17-21, late 21+; allday = no set time (fairs, exhibits). Default all"
},
"topic": {
"enum": [
"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"
],
"type": "string"
},
"category": {
"enum": [
"ai",
"dance",
"dating",
"entertainment",
"exercise",
"music",
"volunteer"
],
"type": "string"
},
"radius_km": {
"type": "number",
"description": "Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)"
},
"neighborhood": {
"type": "string",
"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."
}
}
},
"description": "1-12 interests; each needs a query, category or topic"
},
"include_kids": {
"type": "boolean",
"description": "Include kids'/teens'-only events (default false)"
},
"include_seniors": {
"type": "boolean",
"description": "Include events only for older adults (senior-center programs, 55+ groups; default false)"
}
}
}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 <band> playing" or "who plays at <venue>". 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.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max matches (default 10, max 25) |
| query* | string | Part of a name, e.g. 'khruangbin' |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"description": "Max matches (default 10, max 25)"
},
"query": {
"type": "string",
"description": "Part of a name, e.g. 'khruangbin'"
}
}
}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.
No arguments.
{
"type": "object",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| id* | string | 12-character event id |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "12-character event id"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| days | integer | Window in days (default 7, max 60) |
| near | string | 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 | integer | Max rows (default 50, max 100) |
| topic | string | |
| sector | string | 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 |
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.
| Argument | Type | Description |
|---|---|---|
| to | string | Latest date (default: none) |
| city | string | City, e.g. 'San Francisco' or another town in the Bay Area (case-insensitive) |
| free | boolean | Only free events (a listed free price, or an unpriced listing from a source whose events are free) |
| from | string | Earliest date (default: today) |
| near | string |
| string |
| 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 | string |
| radius_km | number | Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0) |
| biz_format | string | 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 | string | 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 | string | 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": "object",
"properties": {
"days": {
"type": "integer",
"description": "Window in days (default 7, max 60)"
},
"near": {
"type": "string",
"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)."
},
"limit": {
"type": "integer",
"description": "Max rows (default 50, max 100)"
},
"topic": {
"enum": [
"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"
],
"type": "string"
},
"sector": {
"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",
"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"
},
"audience": {
"enum": [
"general",
"kids",
"teens",
"seniors"
],
"type": "string",
"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."
},
"category": {
"enum": [
"ai",
"dance",
"dating",
"entertainment",
"exercise",
"music",
"volunteer"
],
"type": "string"
},
"radius_km": {
"type": "number",
"description": "Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)"
},
"biz_format": {
"enum": [
"referral_group",
"chamber",
"mixer",
"breakfast_lunch",
"workshop_training",
"conference_expo",
"career_fair",
"ce_credits",
"pitch_demo",
"committee_meeting"
],
"type": "string",
"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"
},
"neighborhood": {
"type": "string",
"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."
},
"changed_since": {
"type": "string",
"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."
}
}
}| 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 | integer | Max results (default 25, max 100) |
| match | string | 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 | string | 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 | string | 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 | string | 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 | string | Seasonal series tag, e.g. 'techweek27' (only when the site lists one) |
| sector | string | 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 | string | 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 | string | Scored category (the site's AI, Dance, Fun, Gym, Music, Singles, Volunteer tabs) |
| radius_km | number | Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0) |
| biz_format | string | 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 | string | 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 | string | 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": "object",
"properties": {
"to": {
"type": "string",
"description": "Latest date (default: none)"
},
"city": {
"type": "string",
"description": "City, e.g. 'San Francisco' or another town in the Bay Area (case-insensitive)"
},
"free": {
"type": "boolean",
"description": "Only free events (a listed free price, or an unpriced listing from a source whose events are free)"
},
"from": {
"type": "string",
"description": "Earliest date (default: today)"
},
"near": {
"type": "string",
"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)."
},
"limit": {
"type": "integer",
"description": "Max results (default 25, max 100)"
},
"match": {
"enum": [
"all",
"any",
"semantic"
],
"type": "string",
"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"
},
"query": {
"type": "string",
"description": "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": {
"enum": [
"sf",
"peninsula",
"south_bay",
"east_bay",
"north_bay",
"santa_cruz",
"beyond",
"bay_area",
"any"
],
"type": "string",
"description": "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": {
"enum": [
"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"
],
"type": "string",
"description": "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": {
"type": "string",
"description": "Seasonal series tag, e.g. 'techweek27' (only when the site lists one)"
},
"sector": {
"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",
"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"
},
"audience": {
"enum": [
"general",
"kids",
"teens",
"seniors"
],
"type": "string",
"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."
},
"category": {
"enum": [
"ai",
"dance",
"dating",
"entertainment",
"exercise",
"music",
"volunteer"
],
"type": "string",
"description": "Scored category (the site's AI, Dance, Fun, Gym, Music, Singles, Volunteer tabs)"
},
"radius_km": {
"type": "number",
"description": "Distance for near (default 1.5, max 50), or how far neighborhood reaches past its boundary (default 0)"
},
"biz_format": {
"enum": [
"referral_group",
"chamber",
"mixer",
"breakfast_lunch",
"workshop_training",
"conference_expo",
"career_fair",
"ce_credits",
"pitch_demo",
"committee_meeting"
],
"type": "string",
"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"
},
"neighborhood": {
"type": "string",
"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."
},
"changed_since": {
"type": "string",
"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."
}
}
}