🎮Agentic Steam

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. 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. 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. 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. 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. 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

AI & orchestration
  • Azure AI Foundry
    Hosted agent runtime, threads, and tool-calling loop
  • GPT-5.4-mini
    Primary planner & responder for chat turns
  • GPT-5.4-nano
    Cheap 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-Lite
    Charts emitted by the agent in fenced code blocks, rendered client-side
Backend
  • 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 Apps
    Hosts the Python MCP server (FastMCP, mypy --strict)
  • Steam Web API
    Owned games, playtime, summaries, achievements, news, friends
  • Steam OpenID 2.0
    Sign 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 Redis
    Hot path cache for Steam responses (owned games, vanity → SteamID64)
Frontend
  • Next.js 14 (App Router)
    Static-exported React frontend
  • Tailwind CSS
    Liquid-glass component layer (backdrop-blur, aurora gradient)
  • Azure Static Web Apps
    CDN 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 history
    Signed-in users’ turns saved to Cosmos and rehydrated on reload
  • Signed-in greeting + skeleton
    Personalized empty state with quick-action buttons; animated skeleton bubble while the model thinks
Auth & identity
  • OpenID 2.0 (Steam)
    No client secret needed; Steam asserts the SteamID64
  • HMAC-SHA256 signed cookies
    30-day session, HttpOnly, Secure, SameSite=None
  • Managed Identity → Cosmos
    Function App MI has Cosmos Built-in Data Contributor; no keys in env
  • Locked CORS
    Allow-list driven by WEB_ORIGINS; supportCredentials=true on the Function App
Platform & ops
  • Azure Key Vault
    Stores STEAM_API_KEY + SESSION_SECRET; surfaced via @Microsoft.KeyVault references
  • Azure Bicep
    Infrastructure-as-code for every resource above
  • GitHub Actions
    CI/CD: typecheck, test, build, deploy on push to main (4 workflows)
  • Application Insights
    Tracing for the Functions API and MCP server

Usage so far

Unique Steam profiles
Chat turns

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.