RenForge MCP
Provides tools for inspecting and interacting with running Ren'Py projects, including reading/writing variables, evaluating expressions, and capturing screenshots.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@RenForge MCPtake a screenshot of the current scene"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.

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, send focused text/key/scroll input, 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.
Related MCP server: OpenWebGAL Assistant
Quick start
Requires Python 3.11+. With uv installed, no setup is needed:
# Start the web dashboard
uvx --from "renforge[ui]" renforge uiThen choose your game in the dashboard's project picker — no path to type. (Or
skip the picker with --project /path/to/your/game.)
Prefer a persistent install? pipx puts renforge on
your PATH in an isolated environment:
pipx install "renforge[ui]"
renforge uiOn managed systems (Debian/Ubuntu), plain pip install is blocked by
PEP 668 — use uvx or pipx instead.
Use with your AI agent
The complete operational reference is available in docs/MCP.md. This README keeps the installation examples below; the guide documents the full tool catalogue, safety guards, visual interaction, and troubleshooting.
The MCP server command is the same everywhere:
uvx renforge@latest serveThe @latest suffix makes uvx fetch the newest published RenForge on each
start instead of silently reusing a cached older build — so new tools land
without a manual uv cache clean. Drop it (uvx renforge serve) if you prefer
to pin whatever is already cached.
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 renforge -- uvx renforge@latest serveClaude 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@latest", "serve"]
}
}
}VS Code (GitHub Copilot)
.vscode/mcp.json in your workspace:
{
"servers": {
"renforge": {
"command": "uvx",
"args": ["renforge@latest", "serve"]
}
}
}Zed
In settings.json:
{
"context_servers": {
"renforge": {
"source": "custom",
"command": "uvx",
"args": ["renforge@latest", "serve"]
}
}
}Codex CLI
codex mcp add renforge -- uvx renforge@latest serveOr edit ~/.codex/config.toml (on Windows: %USERPROFILE%\.codex\config.toml):
[mcp_servers.renforge]
command = "uvx"
args = ["renforge@latest", "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? Runpipx install renforge, then replaceuvx renforge@latestwithrenforgein your config (andpipx upgrade renforgeto update).
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]" # pytestThe 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 dashboardMCP server
renforge serve exposes the tools below to any MCP client. A subset:
renforge_inspect_project,renforge_scan_project,renforge_parse_lintrenforge_info,renforge_context(discover the project selected in the dashboard)renforge_find_references,renforge_inspect_imagerenforge_launch,renforge_jump,renforge_new_game,renforge_stoprenforge_game_state,renforge_game_state_compact,renforge_inspect_screen,renforge_advance,renforge_control,renforge_send_input,renforge_saves,renforge_list_choices,renforge_select_choice,renforge_eval,renforge_get_var,renforge_set_var,renforge_poll_events,renforge_get_errors,renforge_wait_until,renforge_screenshotrenforge_list_ui_elements,renforge_click_element,renforge_click_at,renforge_find_image_on_screenrenforge_get_displayable_bounds,renforge_position_element,renforge_diff_screenshotsrenforge_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
Large-project calls are bounded at the tool boundary: renforge_scan_project
accepts sections, file_glob, symbol, offset, and limit, while
renforge_game_state_compact omits the full variable store unless
variable_names or variable_prefix is requested. The original
renforge_game_state remains backward compatible. renforge_screenshot and
renforge_inspect_image accept crop coordinates plus scale for close visual
inspection without a separate image-processing script. For visual interaction,
call renforge_list_ui_elements first: it returns visible controls, bounds,
semantic text, and a frame_id. Pass that id to renforge_click_element or
renforge_click_at so a stale screenshot cannot silently produce a wrong click.
renforge_find_image_on_screen locates a local PNG/template in the current
frame and returns bounds, center, and confidence; its result also includes a
frame_id suitable for the guarded click call. Template bounds are in
coordinate_space: "screenshot"; pass that value to renforge_click_at so
Ren'Py's logical coordinates are derived correctly even when WSLg scales the
captured image.
renforge_game_state keeps its default response unchanged. Pass
include=["metrics", "audio"] to opt into compact render/cache/window metrics
and registered-channel audio state; only those two include values are accepted.
Live control
renforge_launch injects a bridge into <project>/game/ (removed on teardown)
and starts the game. If the matching dashboard is running, MCP delegates launch
to that process so it inherits the dashboard's display environment; otherwise
it launches directly. Fully headless CI should wrap direct launches with
xvfb-run.
The dashboard publishes its selected project in a per-user local runtime
registry. Agents can call renforge_info or renforge_context first instead of
guessing the game path. renforge_jump resolves a label to file:line and
restarts through Ren'Py's supported warp path; renforge_new_game starts a
fresh process at the project's start label through that same path.
GOD-mode edit and branch check
Use real labels and visible choice text from your project in this compact launch-to-diagnostics loop:
project = "/path/to/game"
renforge_launch(project_path=project)
edit game/script.rpy
renforge_control(project_path=project, action="reload_script")
renforge_wait_until(project_path=project, label="edited_label", timeout=30.0)
renforge_screenshot(project_path=project)
renforge_saves(
project_path=project,
action="save",
slot="branch-a",
extra_info="after hot reload",
)
renforge_list_choices(project_path=project)
renforge_select_choice(project_path=project, text="Branch B")
renforge_wait_until(project_path=project, label="branch_b", timeout=30.0)
renforge_get_errors(project_path=project)renforge_screenshot returns the current frame as an image. The save call
creates a named checkpoint before selecting Branch B; use
renforge_saves(project_path=project, action="load", slot="branch-a") to return
to it. renforge_wait_until accepts exactly one of label, screen, or
expr, and timeout is capped at 120 seconds.
Web dashboard
renforge ui 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. Pick a project from the in-app project picker, or pass
--project <project> to open one directly.
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)
dashboard_client.py # private display-bound delegation to the dashboard
image_ops.py # local/live image crop and zoom primitives
navigation.py # shared label and file:line warp resolution
session_registry.py # dashboard-to-MCP active-project discovery
symbols.py # Ren'Py-aware token/reference lookup
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/statsPackaging uses hatchling; the console script is
renforge = renforge.cli:main.
License
MIT
This server cannot be installed
Maintenance
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/alex-jordan547/renforge-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server