About
How Agentic Steam is built — and who built it.
Who built this
Built by an FPS enthusiast and 20-year Steam user based in the Seattle area. The whole stack — frontend, API, MCP server, Azure infrastructure, and CI/CD — was designed and shipped collaboratively with GitHub Copilot in agent mode. Every Bicep template, TypeScript handler, Python tool, and Tailwind class went through that loop; the human role was architectural direction, code review, and deciding what to ship next.
Capabilities that have shipped so far: Vega-Lite charts emitted by the agent (with PNG/SVG export), eight MCP tools wrapping the Steam Web API, daily Cosmos DB playtime snapshots with a history-aware chat path, deal-watcher and weekly-digest timer scaffolds, an onboarding guide page, full Sign in with Steam (OpenID 2.0 + HMAC-signed session cookies, locked CORS, Key Vault–backed session secret), and persisted chat history with a personalized signed-in empty state.
How it works
- 1. You either Sign in with Steam (OpenID 2.0 — no password leaves Steam) or paste any identifier (profile URL, vanity, SteamID64/2/3). Signed-in sessions are an HMAC-SHA256 cookie; legacy formats convert via pure BigInt arithmetic, vanity URLs hit the Steam Web API.
- 2. Your message is classified by gpt-5.4-nano (intent: library, wishlist, recommendation, deal, history…) so the main model gets only the tools it needs.
- 3. gpt-5.4-mini runs inside Azure AI Foundry and calls the Steam MCP server over MCP. The server exposes 8 tools (owned games, wishlist, recently-played, app details, player summary, achievements, app news, friends) with per-surface TTL caches.
- 4. If the question is about trends (“last two weeks”, “this month”), the API joins live Steam data with daily playtime_snapshots from Cosmos DB so the agent can show real deltas.
- 5. Charts come back as fenced vega-lite blocks; the page lazy-loads vega-embed and renders them inline next to the prose answer.
Components
- Azure AI FoundryHosted agent runtime, threads, and tool-calling loop
- GPT-5.4-miniPrimary planner & responder for chat turns
- GPT-5.4-nanoCheap intent classifier in front of the main model
- Model Context Protocol (MCP)Standard transport between the agent and Steam tools (8 tools, TTL caches per surface)
- Vega-LiteCharts emitted by the agent in fenced code blocks, rendered client-side
- Azure Functions (TypeScript)HTTP API: /chat, /chat/history, /resolve-steam-id, /playtime-history, /auth/{login,return,logout,me}, /health
- Azure Functions (timer)Daily playtime snapshots (06:15 UTC) + weekly digest scaffold (Sun 16:00 UTC)
- Azure Container AppsHosts the Python MCP server (FastMCP, mypy --strict)
- Steam Web APIOwned games, playtime, summaries, achievements, news, friends
- Steam OpenID 2.0Sign in with Steam — verified server-side via check_authentication
- Azure Cosmos DB (NoSQL)tracked_users, playtime_snapshots, chat_history, deal_watches, query_history, users, subscriptions (7 containers)
- Azure Cache for RedisHot path cache for Steam responses (owned games, vanity → SteamID64)
- Next.js 14 (App Router)Static-exported React frontend
- Tailwind CSSLiquid-glass component layer (backdrop-blur, aurora gradient)
- Azure Static Web AppsCDN hosting + routing rules for the SPA
- vega-embed (lazy)Loaded only when a chart block appears in a reply; PNG/SVG export menu enabled
- Persisted chat historySigned-in users’ turns saved to Cosmos and rehydrated on reload
- Signed-in greeting + skeletonPersonalized empty state with quick-action buttons; animated skeleton bubble while the model thinks
- OpenID 2.0 (Steam)No client secret needed; Steam asserts the SteamID64
- HMAC-SHA256 signed cookies30-day session, HttpOnly, Secure, SameSite=None
- Managed Identity → CosmosFunction App MI has Cosmos Built-in Data Contributor; no keys in env
- Locked CORSAllow-list driven by WEB_ORIGINS; supportCredentials=true on the Function App
- Azure Key VaultStores STEAM_API_KEY + SESSION_SECRET; surfaced via @Microsoft.KeyVault references
- Azure BicepInfrastructure-as-code for every resource above
- GitHub ActionsCI/CD: typecheck, test, build, deploy on push to main (4 workflows)
- Application InsightsTracing for the Functions API and MCP server
Usage so far
Counts come from the live Cosmos DB containers — one row per Steam ID looked up, and one row per user/assistant chat turn saved while signed in. Numbers refresh every minute.
Not affiliated with Valve
Agentic Steam is an independent personal project. It is not affiliated with, endorsed by, or sponsored by Valve Corporation. Steam, the Steam logo, and any related marks are trademarks of Valve Corporation. All game titles, artwork, screenshots, and store metadata belong to their respective rights holders. This site is a thin client over the public Steam Web API and Sign in with Steam (OpenID), used in accordance with their public terms.