SF Tech Week MCP
by abishakkodi
README.md
# SF Tech Week MCP
An open-source, read-only MCP server for searching Tech Week calendar snapshots
for San Francisco and Los Angeles. It runs on Cloudflare Workers and returns the Tech Week URLs
already present in the source HTML.
The Worker root serves installation actions for Codex, Claude Code, Cursor, and
other MCP clients. Each action automatically uses the deployed origin. `/mcp`
continues to serve the protocol endpoint.
## Install page
Open the Worker root URL in a browser to get a copy-paste install action for
your client:
- **Codex** and **Claude** show the CLI command that registers this server.
- **Cursor** is a deep link that opens the Cursor app with the server
pre-filled.
- **Other** shows a JSON `mcpServers` block for any client that reads a config
file.
Every action targets the origin the page was served from, so the same page
works for a local `wrangler dev` run and for the deployed Worker. The page is
static: no analytics, no external requests, and a strict Content-Security-Policy
that only permits same-origin images.
## Tools
- Discovery: `search_events`, `find_events_by_hosts`, `list_facets`, `get_event`
- Evaluation: `compare_events`, `find_similar_events`, `find_alternatives`
- Planning: `summarize_day`, `find_networking_targets`, `build_itinerary`, `create_ics`
All tools are read-only and only read the bundled catalog snapshot, refreshed
every 12 hours (see Automated sync below) — none make outbound requests to
third-party sites. `create_ics` returns a draft and never writes to a
calendar. `build_itinerary` accepts free-time windows, keeping calendar
credentials and private event contents outside this public server.
- City filter: most discovery tools accept a `city` parameter:
- `"sf"` (default) searches the SF snapshot
- `"la"` searches the LA snapshot
- `"all"` includes both cities
The default is SF to preserve existing behavior; callers must opt into LA.
- `search_events` searches title, host, neighborhood, and labels; supports
curated `topic` (`hardware`, `fintech`, `climate`, `biotech`,
`developer-tools`, `security`) and `format` (`breakfast`, `lunch`, `dinner`,
`happy-hour`, `panel`, `workshop`, `summit`, `demo-day`, `hackathon`,
`fireside-chat`, `networking`) matching; and filters by exact dates,
start-time ranges, neighborhoods, `virtual_only`, and closed status. `topic`
matches across title/host/neighborhood/labels; `format` matches the title
only, since it's a phrasing signal ("... Happy Hour", "Workshop for ...")
rather than a subject-matter one.
- `hosts_any` matches any requested company against host attribution only, so
title-only mentions do not become false host matches. Each event also
reports a parsed `hosts` array (the comma-joined `host` string split into
individual companies) for exact per-company faceting.
- Each event reports `is_virtual`, derived from its neighborhood.
- Results include the exact Tech Week `event_url`, an RFC 3339 `starts_at`
timestamp, `America/Los_Angeles`, and whether the catalog knows the end time.
- All of the above — `hosts`, `is_virtual`, `matched_topics`, and
`matched_formats` — are computed entirely from the scraped listing table
(time, host, neighborhood, title, badges). Nothing here is fetched live from
an event's destination page.
- `event_url`'s redirect token is regenerated by Tech Week on every sync
(confirmed: old and new tokens both keep working, so a previously saved
link stays valid — the token just isn't reusable as a stable id). `event_id`
is therefore *not* derived from the URL; it's a hash of the event's
(date + time + title + host + neighborhood + city) identity, the same fields the
sync script uses to match "the same" event across scrapes. That keeps
`event_id` stable across syncs, so a value saved from one tool call still
resolves correctly in `get_event`/`compare_events`/etc. after the catalog
refreshes.
This MCP does not read private calendars. A calling agent can safely combine
its results with any separately installed calendar MCP or plugin.
For “Are there events hosted by Stripe, Anthropic, or OpenAI?”, an agent can
make one call:
```json
{
"hosts_any": ["Stripe", "Anthropic", "OpenAI"],
"limit": 100
}
```
Each event reports `matched_host_queries`, letting the agent explain which
requested company matched. Requested companies with no returned match can be
reported as having no hosted events in the snapshot.
## Agent workflows
For “Help me find and plan hardware-focused events for the week,” an agent can
call `search_events` with:
```json
{
"topic": "hardware",
"dates": [
"2026-10-05",
"2026-10-06",
"2026-10-07",
"2026-10-08",
"2026-10-09",
"2026-10-10",
"2026-10-11"
],
"limit": 100
}
```
For “Which events am I free to attend Wednesday afternoon?”, it can call:
```json
{
"dates": ["2026-10-07"],
"start_time_from": "12:00",
"start_time_to": "17:00",
"limit": 100
}
```
It can then compare each returned `starts_at` value with the user's calendar
through the available calendar MCP or plugin. The snapshot does not contain
event end times or travel durations, so the agent should describe availability
as tentative unless it obtains those details elsewhere.
The calendar data is a bundled snapshot (refreshed on a schedule; see below), so listings are not fetched live per request.
Opening an `event_url` lets Tech Week handle its own redirect to the RSVP
destination while retaining the original event attribution.
Event metadata is third-party content. The MCP labels it as untrusted data and
validates that every returned link is an HTTPS `www.tech-week.com/go/event/...`
URL.
The snapshots are for SF Tech Week 2026 (Oct 5–11) and LA Tech Week 2026 (Oct 12–18).
Calendar timestamps use `America/Los_Angeles` and the applicable October UTC offset.
## Requirements
- Node.js 22 or newer
- A Cloudflare account only when deploying
## Run locally
```sh
npm install
npm run start
```
Wrangler prints the local origin. Connect an MCP inspector or client to its
`/mcp` endpoint; the default is `http://localhost:8787/mcp`.
The health endpoint is available at `/health`.
## Validate
```sh
npm run check
```
This type-checks the Worker, runs the catalog tests, and creates a dry-run
Cloudflare deployment bundle.
## Deploy to Cloudflare Workers
Authenticate Wrangler, then deploy:
```sh
npx wrangler login
npm run deploy
```
The production MCP URL will be the deployed Worker URL followed by `/mcp`.
## Refresh the snapshot
### Automated sync with Grok Bot
We keep `techlist.cleaned.json` aligned with the live
[a16z Tech Week SF calendar](https://www.tech-week.com/calendar/sf) and
[LA calendar](https://www.tech-week.com/calendar/la) using a Grok Bot assistant
(**Tech Week MCP Updater**).
Twice a day at **6:00 AM and 6:00 PM America/Los_Angeles**, the bot:
1. Scrapes the live SF and LA calendars (full lists after scrolling; Firecrawl, with
Parallel as a fallback)
2. Rebuilds `techlist.cleaned.json` in the existing schema
3. Diffs against `main` using a stable event identity (date + time + title +
host + neighborhood + city)
4. If the file changed, cuts a branch from `main` and opens a pull request
(never commits straight to `main`)
5. Posts a short summary of adds and removals
The install-page “Explore N events” count defaults to SF and is derived from
`techlist.cleaned.json` at build time (events labeled `Closed` are excluded),
so updating the JSON is enough to refresh that homepage number after deploy. LA
is available via the MCP tools by passing `city: "la"`.
### Manual refresh
Replace `techlist.md` with a newly captured calendar HTML snapshot, then run:
```sh
python3 scripts/clean_events.py
npm run check
```
Review the generated diff before committing it. The extractor rejects event
links outside the expected Tech Week URL shape.
## Project policy
Code is available under the MIT License. The bundled Tech Week snapshot and
derived event data are third-party material and are excluded from that license;
see [NOTICE](NOTICE). Contributions are described in
[CONTRIBUTING.md](CONTRIBUTING.md), and security reports are covered by
[SECURITY.md](SECURITY.md).
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues