MCP server, CLI, and web dashboard for Ren'Py visual-novel development
Project description
RenForge
RenForge is an MCP (Model Context Protocol) server, CLI, and web dashboard for working with Ren'Py visual-novel projects.
It lets an AI agent — or a human via the dashboard — inspect a project, launch and drive a running game, read/write game state, capture screenshots, generate translations, find orphaned assets, run builds, and search Ren'Py's docs.
Status: alpha, actively developed. The core surfaces (MCP tools, in-game bridge, CLI, dashboard) are functional; APIs may still change.
|
|
|
| Story map — click a node to warp the running game | Asset audit — orphans, missing files, undefined images |
What it does
- Project inspection — summarize structure, scan scripts/labels/assets, parse lint output.
- Live game control — launch a project with an injected in-game bridge, then advance dialogue, list/select choices, evaluate expressions, get/set store variables, poll pushed events, and capture frames the model can literally see.
- Autopilot — auto-play the game across branches and report label coverage and crashes.
- Assets & translations — find orphaned/missing image+audio assets, list
languages, compute translation stats, generate/update
game/tl/<lang>/files, export dialogue as text. - Builds — package desktop distributions and web builds.
- Docs — search and read Ren'Py's offline documentation.
- Web dashboard — Starlette + WebSocket UI with a live story map, activity log, autopilot coverage, lint view, and game-state controls.
Quick start
Requires Python 3.11+. With uv installed, no setup is needed:
# Start the web dashboard on your project
uvx --from "renforge[ui]" renforge ui --project /path/to/your/game
Prefer pip? pip install "renforge[fastmcp,ui]" gives you the renforge CLI.
Use with your AI agent
The MCP server command is the same everywhere:
uvx --from "renforge[fastmcp]" renforge serve --project /path/to/your/game
| Client | Where to configure |
|---|---|
| Claude Code | claude mcp add (one command) |
| Claude Desktop | claude_desktop_config.json |
| Cursor | .cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Cline | cline_mcp_settings.json |
| Gemini CLI | ~/.gemini/settings.json |
| VS Code (Copilot) | .vscode/mcp.json |
| Zed | settings.json → context_servers |
| Codex CLI | ~/.codex/config.toml |
Claude Code
claude mcp add renforge -- uvx --from "renforge[fastmcp]" renforge serve --project /path/to/your/game
Claude Desktop, Cursor, Windsurf, Cline, Gemini CLI
These clients share the same mcpServers JSON shape — add this to the config
file listed in the table above:
{
"mcpServers": {
"renforge": {
"command": "uvx",
"args": [
"--from", "renforge[fastmcp]", "renforge",
"serve", "--project", "/path/to/your/game"
]
}
}
}
VS Code (GitHub Copilot)
.vscode/mcp.json in your workspace:
{
"servers": {
"renforge": {
"command": "uvx",
"args": [
"--from", "renforge[fastmcp]", "renforge",
"serve", "--project", "${workspaceFolder}"
]
}
}
}
Zed
In settings.json:
{
"context_servers": {
"renforge": {
"source": "custom",
"command": "uvx",
"args": [
"--from", "renforge[fastmcp]", "renforge",
"serve", "--project", "/path/to/your/game"
]
}
}
}
Codex CLI
In ~/.codex/config.toml:
[mcp_servers.renforge]
command = "uvx"
args = ["--from", "renforge[fastmcp]", "renforge", "serve", "--project", "/path/to/your/game"]
Don't have
uv? Replaceuvx --from "renforge[fastmcp]" renforgewithrenforgeafter apip install "renforge[fastmcp]".
Install (dev)
python -m venv .venv
source .venv/bin/activate
pip install -e ".[fastmcp]" # full MCP runtime (fastmcp)
pip install -e ".[ui]" # dashboard (starlette, uvicorn, watchfiles)
pip install -e ".[test]" # pytest
The base install only requires mcp>=1.0.0; the server falls back to a
compatibility mode with a clear message if fastmcp is not installed.
Usage
CLI
renforge --version
renforge inspect <project> # lightweight project summary (JSON)
renforge serve [--project .] # start the MCP server (stdio transport)
renforge ui --project <project> [--port 8765] # start the web dashboard
MCP server
renforge serve exposes the tools below to any MCP client. A subset:
renforge_inspect_project,renforge_scan_project,renforge_parse_lintrenforge_launch,renforge_stoprenforge_game_state,renforge_advance,renforge_list_choices,renforge_select_choice,renforge_eval,renforge_get_var,renforge_set_var,renforge_poll_events,renforge_screenshotrenforge_autopilotrenforge_assets,renforge_languages,renforge_translation_stats,renforge_generate_translations,renforge_export_dialoguerenforge_web_build,renforge_distributerenforge_search_docs,renforge_get_doc,renforge_list_docs
Live control
renforge_launch injects a bridge into <project>/game/ (removed on teardown)
and starts the game. Live tools require a display — under WSLg it works
directly; headless CI should wrap the call with xvfb-run.
Web dashboard
renforge ui --project <project> serves a dashboard (default 127.0.0.1:8765)
with a story map, activity log, autopilot coverage, lint view, and live game
controls over WebSocket.
Examples
A small sample project lives in examples/demo_game/.
Architecture
src/renforge/
cli.py # argparse entrypoint (inspect / serve / ui)
server.py # MCP app bootstrap + fallback + tool registration
bridge/ # in-game .rpy bridge, launcher, and client
tools/
live.py # running-game control (launch, eval, screenshot, ...)
project_ops.py # assets, translations, builds, docs
static.py # inspect / scan / parse-lint
ui/ # Starlette dashboard (server, ws, graph, activity, poller)
util/ # filesystem + subprocess helpers
sdk.py # Ren'Py SDK download/cache
scanner.py # script/label/asset scanning
lint.py # lint runner + parsing
autopilot.py # branch auto-play + coverage
translation.py # translation generation/stats
Packaging uses hatchling; the console script is
renforge = renforge.cli:main.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file renforge-0.1.1.tar.gz.
File metadata
- Download URL: renforge-0.1.1.tar.gz
- Upload date:
- Size: 613.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dbb62a7657f64a5064c42085ae7472d96063b12a22d2588c534426771a382988
|
|
| MD5 |
28ad11923aa6213bf5bec9f588cc794b
|
|
| BLAKE2b-256 |
60c2cb1cbe55f57a530157e0ecc931aba681fe1f4d9bc1ad446bd6bfcb27f2e0
|
Provenance
The following attestation bundles were made for renforge-0.1.1.tar.gz:
Publisher:
release.yml on alex-jordan547/renforge-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
renforge-0.1.1.tar.gz -
Subject digest:
dbb62a7657f64a5064c42085ae7472d96063b12a22d2588c534426771a382988 - Sigstore transparency entry: 2117249255
- Sigstore integration time:
-
Permalink:
alex-jordan547/renforge-mcp@716df1f720f395eeb968a446d1f8556976c7eebe -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/alex-jordan547
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@716df1f720f395eeb968a446d1f8556976c7eebe -
Trigger Event:
push
-
Statement type:
File details
Details for the file renforge-0.1.1-py3-none-any.whl.
File metadata
- Download URL: renforge-0.1.1-py3-none-any.whl
- Upload date:
- Size: 630.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3960b2dd5a2b4f735b2305b37a06132124a32de2ea6757e4dd01dba2a828cfdd
|
|
| MD5 |
6483130efe346b52a0d6f6373855298f
|
|
| BLAKE2b-256 |
9525cd93ae7574a50654de2cf60ec58b61f8830f3ee870226f196e3a8cc72ea9
|
Provenance
The following attestation bundles were made for renforge-0.1.1-py3-none-any.whl:
Publisher:
release.yml on alex-jordan547/renforge-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
renforge-0.1.1-py3-none-any.whl -
Subject digest:
3960b2dd5a2b4f735b2305b37a06132124a32de2ea6757e4dd01dba2a828cfdd - Sigstore transparency entry: 2117249399
- Sigstore integration time:
-
Permalink:
alex-jordan547/renforge-mcp@716df1f720f395eeb968a446d1f8556976c7eebe -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/alex-jordan547
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@716df1f720f395eeb968a446d1f8556976c7eebe -
Trigger Event:
push
-
Statement type: