GitHub - joshsymonds/savecraft.gg: Parse video game save files, serve structured game state to AI assistants via MCP

5 min read Original article ↗

Savecraft

MCP server for game save files.

Cloud Deploy Daemon Deploy Plugin Deploy Install Deploy Windows Tests

savecraft-demo.mp4

Savecraft watches your game saves, parses them into structured data, and serves it to AI assistants via MCP. Claude, ChatGPT, or Gemini can read your characters, gear, skills, and progress - real data, updated live.


Quick Start

1. Install the daemon

Linux / Steam Deck:

curl -sSL https://install.savecraft.gg | bash

Windows / Mac: download from install.savecraft.gg

2. Connect your AI

Sign in at my.savecraft.gg to get your MCP connector URL, then add it to your AI assistant's MCP settings (Claude, ChatGPT, Gemini).

The daemon auto-detects supported games and starts syncing. Ask your AI about your character, your build, or your last run - it already has the data.

How It Works

  ┌─────────────────────┐            ┌───────────────────────────┐
  │  Gaming Device      │   HTTPS    │  Cloudflare               │
  │                     │  ───────>  │                           │
  │  savecraftd         │   push     │  Push API ──> R2 Storage  │
  │  - fs watcher       │            │                           │
  │  - WASM plugin      │  <──────>  │  SourceHub DO (WebSocket) │
  │    runtime (wazero) │    WS      │                           │
  └─────────────────────┘            │  MCP Server ──> AI Tools  │
                                     └───────────────────────────┘
  ┌─────────────────────┐                       │
  │  Claude / ChatGPT / │   <──── MCP ──────────┘
  │  Gemini             │
  └─────────────────────┘
  1. Daemon watches your save files. Detects changes via fsnotify with debounce + hash dedup.
  2. WASM plugins parse saves into structured JSON. Sandboxed via wazero - plugins can't touch your filesystem or network. Ed25519 signed.
  3. AI reads your state through MCP tools. Section-level granularity - the AI fetches only what it needs to answer your question.

MCP Tools

Tool Description
list_games All games with saves, note titles, and reference modules with parameter schemas
get_save Summary, overview, sections, and notes for a save
get_section Section data from D1
refresh_save Request fresh data (daemon-backed or API-backed)
search_saves Full-text search across all saves and notes
get_note Full content of a user-attached note
create_note / update_note / delete_note Manage notes via AI conversation
query_reference Execute reference data computations (drop rates, build math)

Supported Games

Plugins are sandboxed WASM binaries that parse save files. They read raw bytes on stdin, emit structured JSON on stdout, and cannot access your filesystem or network. Each plugin is Ed25519 signed and verified before loading. Plugins can optionally ship a reference.wasm for server-side computation: drop calculators, gift databases, crop planners - deployed via Workers for Platforms.

Game Format Reference Modules Status Author
Clair Obscur: Expedition 33 Save file (WASM) Beta @joshsymonds
Diablo II: Resurrected .d2s / .d2i binary Drop Calculator Beta @joshsymonds
Magic: The Gathering Arena Player.log Rules Search, Card Search, Card Stats, Draft Advisor, Deck Health & Cut Advisor, Collection Diff, Mana Base, Draft Ratings Beta @joshsymonds
RimWorld Steam Workshop mod Surgery Calculator, Crop Optimizer, Combat Calculator, Material Lookup, Drug Analyzer, Raid Estimator, Gene Builder, Research Navigator Beta @joshsymonds
Stardew Valley XML save directory Gift Preferences, Crop Planner Beta @joshsymonds
World of Warcraft Battle.net API Beta @joshsymonds

Planned save-file parsers: Stellaris/CK3 (Clausewitz), Baldur's Gate 3 (.lsv), Elden Ring (.sl2), Civilization VI, Bethesda games (.ess)

Planned API adapters (no daemon required): Path of Exile 2, FFXIV

Planned mod integrations: Minecraft, Terraria (mod-as-device: mod pushes directly, no daemon), Factorio (mod-as-emitter: mod writes JSON, daemon relays)

Want to add a game? See the plugin development guide.

Project Structure

savecraft.gg/
├── cmd/savecraftd/       # Daemon entrypoint
├── internal/
│   ├── daemon/           # Orchestrator, domain types, interfaces
│   ├── runner/           # WASM plugin execution (wazero)
│   ├── watcher/          # Filesystem watcher (fsnotify + debounce)
│   ├── wsconn/           # WebSocket client (reconnecting)
│   ├── pluginmgr/        # Plugin download, verification, caching
│   ├── selfupdate/       # Daemon self-update mechanism
│   └── signing/          # Ed25519 plugin signature verification
├── worker/               # Cloudflare Worker + Durable Object (TypeScript)
├── reference/            # Reference Worker - WASI shim for server-side plugin computation (WfP)
├── web/                  # SvelteKit frontend
├── plugins/              # WASM plugin sources (parser + optional reference per game)
├── proto/                # Protobuf protocol definitions
├── install/              # Platform installers + systemd units
├── assets/               # Brand assets
└── docs/                 # Architecture docs

Development

Requires nix devenv + direnv. direnv allow activates the environment on cd.

just --list          # Show all targets
just test            # Run all tests (Go + Worker)
just check           # Lint, generate, test everything
just proto           # Regenerate Go + TypeScript from protobuf
just dev-worker      # Start Worker dev server (Miniflare)

See docs/overview.md for the system architecture, or browse docs/ for component-specific documentation.

Tech Stack

Component Technology
Daemon Go, wazero (WASM runtime), fsnotify, nhooyr.io/websocket
Cloud Cloudflare Workers, Durable Objects, R2, D1 (SQLite/FTS5)
Auth Clerk (OAuth, JWT, magic links)
Frontend SvelteKit, TypeScript
Plugins Go compiled to WASI Preview 1, ndjson stdout contract
Protocol Protobuf (buf codegen to Go + TypeScript)
Build just, nix devenv + direnv

Security

  • WASM sandboxed: Plugins cannot access filesystem, network, or environment. stdin in, JSON out.
  • Ed25519 signed: Every plugin binary is cryptographically signed. Tampered = refused.
  • Read-only daemon: Cannot modify your saves. Kernel-enforced on Linux via systemd sandboxing.
  • No filesystem exposure: AI sees structured JSON, never your local paths or files.
  • Private R2: No public bucket access. The Worker mediates all reads/writes, scoped to the authenticated user.

License

Apache License 2.0


savecraft.gg - by @joshsymonds · Privacy Policy