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 gives you the MCP server and CLI;
pip install "renforge[ui]" adds the dashboard.
Use with your AI agent
The MCP server command is the same everywhere:
uvx renforge serve
Every RenForge tool takes a project_path argument, so the agent passes your
game's path on each call — no path substitution in the configs below. Copy them
as-is. The optional --project flag on renforge serve still sets a default
project for activity logging.
| 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 mcp add or ~/.codex/config.toml |
Claude Code
claude mcp add renforge -- uvx renforge serve
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": ["renforge", "serve"]
}
}
}
VS Code (GitHub Copilot)
.vscode/mcp.json in your workspace:
{
"servers": {
"renforge": {
"command": "uvx",
"args": ["renforge", "serve"]
}
}
}
Zed
In settings.json:
{
"context_servers": {
"renforge": {
"source": "custom",
"command": "uvx",
"args": ["renforge", "serve"]
}
}
}
Codex CLI
codex mcp add renforge -- uvx renforge serve
Or edit ~/.codex/config.toml (on Windows: %USERPROFILE%\.codex\config.toml):
[mcp_servers.renforge]
command = "uvx"
args = ["renforge", "serve"]
Verify it works
After configuring your client, ask the agent:
Inspect my Ren'Py project at /path/to/game
The agent should call renforge_inspect_project with that path and return a
JSON summary of the project (labels, scripts, assets, and related metadata).
Windows / GUI clients: Desktop apps (Claude Desktop, Cursor, etc.) may not inherit your shell
PATH. Ifuvxis not found, setcommandto the absolute path ofuvx(for exampleC:\Users\you\.local\bin\uvx.exe).
Don't have
uv? Replaceuvx renforgewithrenforgeafter apip install renforge.
Install (dev)
python -m venv .venv
source .venv/bin/activate
pip install -e . # MCP runtime (includes fastmcp)
pip install -e ".[fastmcp]" # alias for the base install
pip install -e ".[ui]" # dashboard (starlette, uvicorn, watchfiles)
pip install -e ".[test]" # pytest
The server falls back to a compatibility mode with a clear message if
fastmcp is not installed (for example after a minimal manual install).
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.2.0.tar.gz.
File metadata
- Download URL: renforge-0.2.0.tar.gz
- Upload date:
- Size: 619.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 |
a8df1b8c2cc467e568c19b4b6482f74d24d3a0c08fef24c40f188b5043227279
|
|
| MD5 |
114b31d29489fe2cb44f019a5ab99283
|
|
| BLAKE2b-256 |
e1a3171b72a911c2df18d5485b5b97be959998fac99d875ea67fcae95d8a7e22
|
Provenance
The following attestation bundles were made for renforge-0.2.0.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.2.0.tar.gz -
Subject digest:
a8df1b8c2cc467e568c19b4b6482f74d24d3a0c08fef24c40f188b5043227279 - Sigstore transparency entry: 2138133610
- Sigstore integration time:
-
Permalink:
alex-jordan547/renforge-mcp@fe8e53b69825b98556ea6a79acddbc3cc4cf1900 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/alex-jordan547
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe8e53b69825b98556ea6a79acddbc3cc4cf1900 -
Trigger Event:
push
-
Statement type:
File details
Details for the file renforge-0.2.0-py3-none-any.whl.
File metadata
- Download URL: renforge-0.2.0-py3-none-any.whl
- Upload date:
- Size: 635.6 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 |
5f368efd89bfc5f65e083521cc587a13a88b807ea6a28390e982415697cd6cfc
|
|
| MD5 |
8ac520b70a564f26985b4b6e347ff42f
|
|
| BLAKE2b-256 |
df74cf152a8f813ed1fbf23d9af35d67efd1d5af646adf68fd2b3a591bb42474
|
Provenance
The following attestation bundles were made for renforge-0.2.0-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.2.0-py3-none-any.whl -
Subject digest:
5f368efd89bfc5f65e083521cc587a13a88b807ea6a28390e982415697cd6cfc - Sigstore transparency entry: 2138133643
- Sigstore integration time:
-
Permalink:
alex-jordan547/renforge-mcp@fe8e53b69825b98556ea6a79acddbc3cc4cf1900 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/alex-jordan547
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe8e53b69825b98556ea6a79acddbc3cc4cf1900 -
Trigger Event:
push
-
Statement type: