reinvent2026-mcp
README.md
# reinvent2026-mcp
An **MCP (Model Context Protocol) server for the AWS re:Invent 2026 session
catalog**. Attach it to any MCP client — **Claude Desktop, Kiro, Cursor, or
Codex** — (or a Strands agent) to search the full ~1,500-session catalog by
keyword *and* by meaning, look up venues and campus travel, and get the official
AWS links.
Author: **DD** · License: **MIT** ·
Repo: <https://github.com/dineshrajdhanapathyDD/reinvent2026-mcp>
> Not affiliated with AWS. Re:Route AI recommends; AWS re:Invent confirms.
> Official event info always links back to AWS.
---
## Highlights
- **Bundled real catalog** — ships the full **1,507-session** re:Invent 2026
catalog (scraped from the official public API), loaded on startup. Works
offline, no keys.
- **Semantic search** — find sessions by a natural-language goal
("build production AI agents hands-on"), not just keywords.
- **Venues & travel** — the six venues + walk/shuttle estimates.
- **Official links** — the source-of-truth AWS URLs.
- **Live refresh** — re-scrape the official catalog API with Playwright.
---
## Install
```bash
pip install reinvent2026-mcp
# optional: enable live scraping of the official catalog
pip install "reinvent2026-mcp[scrape]"
playwright install chromium
```
Run it directly:
```bash
reinvent2026-mcp # stdio MCP server
# or
python -m reinvent2026_mcp.server
```
---
## Tools
| Tool | Description |
|------|-------------|
| `catalog_status` | Active source + session count |
| `search_sessions` | Keyword/topic search (+ day/venue) |
| `semantic_search` | Meaning-based search from a natural-language goal |
| `get_session` | One session by id |
| `list_venues` | The six venues |
| `estimate_travel` | Walk vs. shuttle minutes between venues |
| `official_links` | Authoritative AWS re:Invent URLs |
| `refresh_catalog` | Scrape the official public API (Playwright) |
| `load_catalog` | Load a normalized catalog JSON file |
---
## Use it in your MCP client
The server speaks MCP over **stdio**. Add the snippet for your client, then
restart it and ask something like *"Find hands-on sessions to help me build
production AI agents at re:Invent."*
### Claude Desktop
Edit `claude_desktop_config.json`:
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"reinvent-2026": {
"command": "reinvent2026-mcp"
}
}
}
```
If `reinvent2026-mcp` isn't on PATH, use the module form:
```json
{
"mcpServers": {
"reinvent-2026": {
"command": "python",
"args": ["-m", "reinvent2026_mcp.server"]
}
}
}
```
Restart Claude Desktop; the tools appear under the 🔌 (MCP) menu.
### Kiro
Add to `.kiro/settings/mcp.json` (workspace) or `~/.kiro/settings/mcp.json`
(global):
```json
{
"mcpServers": {
"reinvent-2026": {
"command": "reinvent2026-mcp",
"disabled": false,
"autoApprove": [
"catalog_status", "search_sessions", "semantic_search",
"get_session", "list_venues", "estimate_travel", "official_links"
]
}
}
}
```
Reconnect from Kiro's **MCP Server** panel (no restart needed).
### Cursor
Edit `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project):
```json
{
"mcpServers": {
"reinvent-2026": {
"command": "reinvent2026-mcp"
}
}
}
```
Enable it in **Settings → MCP**, then use it from Cursor chat/agent.
### Codex (OpenAI Codex CLI)
Add to `~/.codex/config.toml`:
```toml
[mcp_servers.reinvent-2026]
command = "reinvent2026-mcp"
args = []
```
(Equivalent module form: `command = "python"`, `args = ["-m", "reinvent2026_mcp.server"]`.)
### Any Strands agent (Python)
```python
from mcp import StdioServerParameters
from strands import Agent
from strands.tools.mcp import MCPClient
client = MCPClient(lambda: StdioServerParameters(command="reinvent2026-mcp"))
client.start()
agent = Agent(tools=client.list_tools_sync())
agent("Find hands-on sessions to help me build production AI agents.")
```
---
## Example prompts
- "Search re:Invent for Amazon Bedrock chalk talks."
- "Semantic search: I want to secure my generative AI applications."
- "How long from The Venetian to MGM Grand — walk or shuttle?"
- "Give me the official re:Invent keynotes and security-focus links."
---
## How the scraper works
The catalog page loads its data from a **public JSON API**
(`POST https://catalog.awsevents.com/api/sessions`) that needs two profile
headers the page generates — **no login required**. `refresh_catalog` opens the
page once with Playwright, captures those headers, then pages through all
sessions and normalizes them.
The public catalog omits per-session times/rooms until nearer the event, so
day/time/venue are assigned deterministically (clearly estimated) to keep
scheduling usable; real published times can replace them without code changes.
Refresh the bundled data:
```bash
reinvent2026-refresh
```
> Automated access is governed by the event's terms of use. Keep it to your own
> personal planning.
---
## Data model
Each session: `id, title, topic, format, venue, room, day, start, end, level,
learning_mode, hands_on, abstract, official_url, catalog_url, match_score`.
Formats normalize to the canonical set (Breakout, Chalk Talk, Workshop, Builders'
Session, Code Talk, Lab, Lightning Talk, Gamified Learning, Exam Prep, Bootcamp,
Keynote), each mapped to a learning mode (Watch and Learn / Work Alongside
Experts / Build It Yourself / Certification).
---
## Development
```bash
git clone https://github.com/dineshrajdhanapathyDD/reinvent2026-mcp.git
cd reinvent2026-mcp
pip install -e ".[dev,scrape]"
pytest -q
```
## Releasing (maintainers)
CI runs the test suite on every push/PR (`.github/workflows/ci.yml`). To publish
a new version to PyPI, bump `version` in `pyproject.toml`, then tag:
```bash
git tag v0.1.0
git push origin v0.1.0
```
The `publish.yml` workflow builds and uploads to PyPI. It uses **PyPI Trusted
Publishing** (OIDC — no stored token); configure the publisher once on PyPI under
the project's *Publishing* settings (owner `dineshrajdhanapathyDD`, repo
`reinvent2026-mcp`, workflow `publish.yml`). Or set a `PYPI_API_TOKEN` repo secret
and uncomment the `password:` line in the workflow.
## What NOT to commit (kept out via .gitignore)
To keep the repo clean and safe, these are intentionally **hidden / ignored** and
should never be committed:
- Build artifacts: `build/`, `dist/`, `*.egg-info/`
- Python caches: `__pycache__/`, `*.pyc`, `.pytest_cache/`
- Virtual environments: `.venv/`, `venv/`
- Editor/OS files: `.DS_Store`, `.idea/`, `.vscode/`
- Secrets & local config: any `.env`, API tokens, PyPI/`.pypirc`, credentials
- Large raw scrape dumps and temporary/probe scripts (`_*.py`, `*_raw.json`)
If you fork or publish, double-check you are not committing credentials or a
`.pypirc`. Publish to PyPI with an API token, not a password.
## License
MIT © 2026 DD
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues