Skip to main content
Glama

🎮 renpy-mcp — Ren'Py AI 原生开发助手

语言 / Languages: 简体中文 | English

一个 MCP(Model Context Protocol)服务器,让 AI Agent(Cursor、Claude 等)成为 Ren'Py 视觉小说的原生开发助手——读代码、写代码、查官方文档、自动修复、编译验证,全流程闭环。

基于 FastMCP 构建,内置 Ren'Py 中文官方文档(23 页 / 580KB),跨平台支持 Windows / macOS / Linux。

⭐ 如果这个项目帮到你,欢迎去仓库点个 Star 支持一下~ 👉 https://gitee.com/gdouage/renpy-mcp 你的一颗星,是个人开发者继续更新的最大动力 ❤️

仓库

gitee.com/gdouage/renpy-mcp

协议

MIT

作者

abbuibuibui

联系

3244940576@qq.com

文档来源

doc.renpy.cn


📌 项目介绍

Ren'Py 没有内置编辑器,开发者手动写 .rpy 文本文件再点「启动项目」测试。这个 MCP 让 AI 直接理解 Ren'Py 项目结构——不用你手动贴报错,AI 自己就能读代码、查文档、改代码、编译验证、自动修 bug。

能力

说明

读代码

列出全部 label / 读取指定 label 脚本 / 盘点角色立绘 screen 声明 / 查找 jump-call 调用关系

查文档

内置 23 页 Ren'Py 中文官方文档,关键词搜索返回相关段落,离线可用

写代码

往任意 .rpy 文件注入代码(8 种定位模式),自动建文件,保留 BOM

编译验证

编译 + lint 一次跑完,返回结构化错误(文件名 + 行号 + 消息)

自动修复

检测并修复 5 类常见问题:return True/False、缺 from 子句、BOM 不一致、漏标签、陈旧存档

翻译检查

列出所有语言 / 深度检查翻译覆盖(抓"只有字符串翻译、缺块翻译"的静默 bug)/ 校验语言选择器配置

存档管理

列出 / 清除 / 清除陈旧存档(修复 Could not find return label 报错)

素材管理

拷贝图片 / 字体 / 音频到项目,获取图片尺寸算立绘定位

通用 CLI

直接跑任意 Ren'Py 子命令(compile/lint/translate 等),自定义超时

跨平台

Windows / macOS / Linux 全支持,SDK 路径自动探测

核心流程:

查文档(search_docs) → 读代码(list_labels) → 写代码(exec_rpy) → 编译验证(check_project) → 自动修复(auto_fix)

Related MCP server: mcdev-mcp

🏗️ 项目架构

┌──────────────────────────────────────────────┐
│              AI Agent (Cursor / Claude)        │
│                  通过 MCP 协议调用               │
└──────────────────────┬───────────────────────┘
                       │
                       ▼
┌──────────────────────────────────────────────┐
│              renpy-mcp Server                  │
│              (FastMCP, 19 个工具)               │
├──────────┬──────────┬──────────┬──────────────┤
│  读代码   │  写代码   │  验证修复  │   文档知识库   │
│ (4 tools)│ (1 tool) │ (5 tools)│  (2 tools)  │
├──────────┴──────────┴──────────┴──────────────┤
│   翻译检查(3)  通用CLI(1)  存档(1)  素材(2)      │
├───────────────────────────────────────────────┤
│                  底层能力                       │
│  ┌─────────┐  ┌──────────┐  ┌───────────────┐  │
│  │ 正则解析 │  │ 文件读写  │  │ subprocess    │  │
│  │ .rpy文件 │  │ BOM安全  │  │ 调用Ren'Py SDK │  │
│  └─────────┘  └──────────┘  └───────────────┘  │
└──────────────────────────────────────────────┘
                       │
                       ▼
┌──────────────────────────────────────────────┐
│           Ren'Py SDK (renpy.py)               │
│     compile · lint · 项目文件 (.rpy/.rpyc)     │
└──────────────────────────────────────────────┘

目录结构:

renpy-mcp/
├── src/renpy_mcp/
│   ├── server.py              # MCP 服务入口 + 工具注册
│   ├── project.py             # 标签解析:list_labels / read_script / find_references / list_definitions
│   ├── executor.py            # 代码注入:exec_rpy(8种定位 + CJK字体)
│   ├── build.py               # 编译验证:compile / lint / check_project / manage_saves / run_renpy_command
│   ├── fixer.py               # 自动修复:auto_fix(5类修复器)
│   ├── assets.py              # 素材管理:copy_asset / get_image_size
│   ├── translation.py         # 翻译检查:list_translations / check_translation / check_language_picker
│   ├── docs_search.py         # 文档搜索:search_docs / list_doc_pages
│   ├── config.py              # SDK 路径配置(跨平台自动探测)
│   └── docs/                  # 内置官方文档(23页,580KB)
│       ├── quickstart.txt     # 快速入门
│       ├── screens.txt        # 界面语言(77KB)
│       ├── screen_actions.txt # 界面行为(60KB)
│       ├── transforms.txt     # 变换和ATL(43KB)
│       ├── gui.txt            # GUI定制化(44KB)
│       └── ...                # 共23个文档页面
├── AI_GUIDE.md                # AI Agent 操作规范
├── CHANGELOG.md               # 变更日志
├── pyproject.toml             # 包配置
├── LICENSE                    # MIT 协议
├── README.md                  # 中文(默认,Gitee 首页展示)
└── README.en.md               # English

🛠️ 技术栈

层级

技术

协议

MCP (Model Context Protocol)

框架

FastMCP

语言

Python 3.12+

文档解析

Python 标准库 html.parser

图片处理

Pillow

构建系统

setuptools

SDK 调用

subprocess 调用 Ren'Py SDK


🚀 快速开始

1. 环境要求

  • Python 3.12+

  • Ren'Py SDK 8.0+(用于编译和 lint)

  • 支持 MCP 的 AI 客户端(Cursor、Claude Desktop 等)

2. 获取代码

git clone https://gitee.com/gdouage/renpy-mcp.git
cd renpy-mcp

3. 安装

# 创建虚拟环境
python -m venv .venv

# Windows
.venv\Scripts\pip install -e .

# macOS / Linux
.venv/bin/pip install -e .

4. 配置 MCP 客户端

Cursor

添加到 ~/.cursor/mcp.json(不存在则创建):

{
  "mcpServers": {
    "renpy-mcp": {
      "command": "D:/absolute/path/to/renpy-mcp/.venv/Scripts/python.exe",
      "args": ["-m", "renpy_mcp.server"],
      "env": {
        "PYTHONPATH": "D:/absolute/path/to/renpy-mcp/src",
        "RENPY_SDK_PATH": "D:/absolute/path/to/renpy-sdk"
      }
    }
  }
}

Claude Desktop

添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "renpy-mcp": {
      "command": "/absolute/path/to/renpy-mcp/.venv/bin/python",
      "args": ["-m", "renpy_mcp.server"],
      "env": {
        "PYTHONPATH": "/absolute/path/to/renpy-mcp/src",
        "RENPY_SDK_PATH": "/absolute/path/to/renpy-sdk"
      }
    }
  }
}

注意: macOS / Linux 用 bin/python 替代 Scripts/python.exe。 设置 RENPY_SDK_PATH 指向你的 Ren'Py SDK 目录(如 renpy-8.5.3-sdk)。未设置时服务器会自动扫描常见路径。

5. 重启客户端 🎬

重启 Cursor / Claude Desktop,MCP 服务自动启动。AI 现在可以直接操作你的 Ren'Py 项目。


📡 19 个工具一览

读代码(4 个)

工具

功能

list_labels

列出全项目所有 label(可选 rich 模式:参数、jump 目标、call 目标、返回值)

read_script

读取指定 label 的完整代码块(BOM 安全)

find_references

查找全项目中对某 label/screen 的所有 jump/call 引用

list_definitions

盘点所有角色、立绘、transform、screen、default、define 声明

写代码(1 个)

工具

功能

exec_rpy

往任意 .rpy 文件注入代码(8 种定位:end/top/inside/after/before/replace/replace_all/自动建文件)

编译验证(3 个)

工具

功能

compile_project

编译 .rpy → .rpyc,抓语法错误(可强制清缓存)

lint_project

跑 Ren'Py lint 静态分析(查未定义变量、不可达代码等)

check_project

一次跑完编译 + lint(编译不过则跳过 lint)

自动修复(2 个)

工具

功能

auto_fix

自动检测并修复 5 类问题,修复后重新编译验证

list_fixers

列出所有可用修复器

auto_fix 支持的 5 类修复:

修复器

类型

做什么

return_values

改代码

return True/False → $ _label_result = True/False + return

missing_from

改代码

call xxx → call xxx from _call_xxx_N

bom_normalize

改代码

有 CJK 内容的文件加 BOM,没 CJK 的去 BOM

missing_labels

只报告

检测 jump/call 到不存在的 label

stale_saves

只报告

检测 _reload-*/_tracesave-* 残留存档

存档管理(1 个)

工具

功能

manage_saves

list(列出存档)/ clear(全删)/ clear_stale(清陈旧存档)

素材管理(2 个)

工具

功能

copy_asset

拷贝图片/字体/音频到项目(自动补 game/ 前缀)

get_image_size

获取图片尺寸(算立绘定位 transform 用)

文档搜索(2 个)

工具

功能

search_docs

搜索内置 Ren'Py 中文官方文档(23 页),返回相关段落

list_doc_pages

列出所有可用文档页面

翻译检查(3 个)

工具

功能

list_translations

列出 game/tl/ 下所有语言,报告每个语言的文件数、对话块翻译数、字符串翻译条目数、GUI 文件齐全度,以及源语言(config.language)

check_translation

深度检查翻译覆盖。核心检测:某翻译文件只有 translate <lang> strings:(old/new)却没有 translate <lang> <hash>: 块翻译——Ren'Py 对话只认块翻译,字符串翻译不翻译对话,这种文件会让对话静默停留在源语言。还检测:重复 old 字符串(运行时报错)、未翻译的块、有对话却缺翻译文件的源文件

check_language_picker

校验 screens.rpy 语言选择器:检测"English"按钮误用 Language(None)(显示源文本)而非 Language("english")(应用翻译)、指向不存在 tl/ 文件夹的死按钮、已有翻译却缺按钮的情况

通用 CLI(1 个)

工具

功能

run_renpy

直接跑任意 Ren'Py CLI 子命令(compile / lint / translate / rtc 等),自定义超时。用于生成/刷新翻译文件(translate english)或编译超时时换一条路


📝 典型工作流

场景 1:接手陌生项目

list_labels(rich=True)    → 看全项目结构和跳转关系
list_definitions()         → 看有哪些角色/立绘/screen
read_script("start")      → 读入口标签代码
find_references("chapter_01") → 看谁调用了这个标签

场景 2:写新功能

search_docs("Movie")      → 查官方文档怎么播放视频
exec_rpy(...)              → 根据文档写正确的代码
check_project(force=True)  → 编译 + lint 验证

场景 3:遇到报错自动修复

auto_fix()                 → 自动检测并修复 5 类常见问题
manage_saves("clear_stale") → 清掉导致崩溃的陈旧存档

场景 4:重构前检查影响范围

find_references("arrow_round")  → 看谁调了它(12 处)
find_references("chapter_03")   → 没人调 = 死代码
find_references("typo_label")   → defined=False = 有 jump 指向不存在的标签

场景 5:多语言翻译排查("选了 English 还是中文")

list_translations()        → 看有哪些语言、每个语言翻译了多少
check_translation("english") → 抓"只有字符串翻译缺块翻译"的静默 bug
                             + 重复 old 字符串 + 缺翻译文件的源文件
check_language_picker()    → 校验"English"按钮是否误用 Language(None)
run_renpy("translate",["english"]) → 重新生成块翻译骨架

真实案例:一个章节的翻译文件被写成了字符串翻译格式(old/new),编译不报错, 但游戏里对话全是源语言——因为 Ren'Py 对话只认块翻译。check_translation 一眼就能抓到。


💡 设计说明

  • 文档离线可用:23 页官方文档打包在 src/renpy_mcp/docs/,不需要网络

  • BOM 安全:所有文件读写使用 utf-8-sig,不会漏掉第一行的 label

  • CJK 字体可选:exec_rpy 的 auto_cjk_font 默认关闭,不静默改 gui.rpy

  • SDK 自动探测:未设 RENPY_SDK_PATH 时自动扫描常见路径,按修改时间取最新

  • 修改类修复器保留 BOM:写入时检测原文件是否有 BOM,有则保留

  • 只读检查器不改代码:missing_labels 和 stale_saves 只报告不修改

  • 编译不卡死:subprocess 加 stdin=DEVNULL,超时可用 RENPY_SDK_PATH 环境变量旁的 RENPY_MCP_TIMEOUT 调整(默认 180s)

  • 翻译检查只读:check_translation / check_language_picker 只分析报告,绝不改你的翻译文件

  • 对话识别精准:统计源文件对话时只认已定义的 Character 变量名,不会把 color "#fff"、key "K_SPACE" 这类界面/样式属性行误判成对话


💬 反馈与贡献

如果这个项目对你有帮助,拜托:

  1. ⭐ 去仓库点个 Star:renpy-mcp

  2. 🐛 遇到问题提 Issue

  3. ✉️ 想交流可发邮件:3244940576@qq.com(作者:abbuibuibui)

也欢迎提交 Pull Request(请先说明改动目的与测试方式)~


📄 许可证

本项目基于 MIT License 开源。

Copyright (c) 2026 abbuibuibui

Available Tools

19 tools
tool_auto_fixA

Detect and repair common Ren'Py issues automatically, then re-compile to verify.

Runs a set of safe, targeted fixers on a project. Each fixer handles a specific class of problem. After applying fixes, re-compiles to verify the project still builds.

Available fixers: - "return_values": Convert return True/False in labels to global variable + bare return (fixes 'Could not find return label' errors) - "missing_from": Add from _call_<label>_<N> to call statements missing the from clause (fixes save/load issues) - "bom_normalize": Ensure .rpy files with CJK content have consistent BOM - "missing_labels": Detect jump/call to undefined labels (report only) - "stale_saves": Detect stale save files that may cause runtime errors

Args: project_path: Absolute path to the Ren'Py project root directory. fixes: List of fixer names to run. If None, runs all fixers.

Returns: dict with {ok, applied, skipped, applied_count, skipped_count, compile_before, compile_after}.

ParametersJSON Schema
NameRequiredDescriptionDefault
fixesNo
project_pathYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does well: it discloses the mutation is scoped ('safe, targeted fixers'), explains each fixer's concrete effect, and explicitly flags 'missing_labels' as report-only rather than a mutating fixer. It stops short of stating file backup/reversibility or permission requirements for a tool that edits project files.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose before the fixer catalog, and the bulleted fixer list earns its length because those names are otherwise undocumented in the schema. The trailing Returns block is redundant-free but slightly verbose against a short signature.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param mutating tool with no annotations and no output schema, the description covers purpose, both parameters, fixer semantics, and the return shape (ok/applied/skipped and before/after compile status). Only safety around editing files (backups, partial-failure behavior) is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: project_path is defined as the absolute project root and fixes as a list of fixer names with a None default meaning 'run all'. Critically, it enumerates the valid fixer names that the schema (which only types them as plain strings) does not constrain, which is the key semantic the caller needs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+outcome: detect and repair Ren'Py issues then re-compile to verify. The verb 'repair' differentiates it from siblings like tool_lint_project, tool_check_project, and tool_compile_project, which only diagnose or build.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Runs a set of safe, targeted fixers' and 'If None, runs all fixers' give implied usage context, and the instruction that it re-compiles afterward signals when it fits. However, it never explicitly contrasts itself with the sibling diagnostic tools (lint/check/list_fixers) or states when NOT to auto-fix, leaving the routing decision partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_check_language_pickerA

Verify the language picker in screens.rpy against tl/ folders and config.language.

Catches the common misconfiguration where the "English" button is wired to Language(None) (show source text) instead of Language("english") (apply the english translation) -- when the source language is not English, Language(None) shows the source (e.g. Chinese) text, so clicking "English" appears to do nothing.

Also detects: dead buttons pointing at tl/ folders that don't exist, and missing buttons for translations that do exist.

Args: project_path: Absolute path to the Ren'Py project root directory.

Returns: dict with {ok, source_language, available_languages, buttons, issues}.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does reasonably well: it enumerates the failure modes detected and lists the return keys (ok, source_language, available_languages, buttons, issues). It does not explicitly state that the check is non-mutating or whether it requires a valid compiled project, but the read-only nature is strongly implied by 'Verify' and the diagnostic framing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by the diagnostic detail and the args/returns blocks. The parenthetical explaining Language(None) vs Language("english") is long but earns its place by clarifying the exact bug being detected; nothing is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description appropriately documents the return dict keys, and it covers the sole argument. For a focused static-check tool this is close to complete, though it omits any note on prerequisites (e.g., whether the project must be compiled) or the shape of the 'issues' entries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema only gives the parameter name and type, so the description's 'Absolute path to the Ren'Py project root directory' adds real meaning (root directory, absolute requirement) that the schema lacks. With a single parameter fully explained, this is solid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: verifying the language picker in screens.rpy against tl/ folders and config.language. It is concrete enough to distinguish from generic file tools, but it never names the closely related siblings tool_check_translation or tool_list_translations, which an agent could plausibly confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage scenario: catching the misconfiguration where the English button appears to do nothing, plus the dead/missing button cases. It supplies context for when the tool is relevant but offers no explicit when-not-to-use guidance or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_check_projectA

Run compile then lint in one call. Returns combined structured result.

If compile fails, returns immediately with compile errors (no point linting broken syntax). If compile passes, runs lint and merges warnings.

Args: project_path: Absolute path to the Ren'Py project root directory. force: If True, clear .rpyc cache before compiling (default True).

Returns: dict with {ok, compile_errors, lint_warnings, raw_output}.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
project_pathYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does reasonably well: it discloses the compile-fail short-circuit control flow and the side effect of force clearing the .rpyc cache before compiling. It omits any note on permissions, cost, or whether clearing the cache affects user data, which keeps it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Behavior is front-loaded in the first two sentences, with Args and Returns sections following a predictable structure. Slightly redundant (the compile-fail behavior appears before the Args block and could be tighter), but every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly documents the return shape (dict with ok, compile_errors, lint_warnings, raw_output). Combined with the short-circuit behavior and both parameters documented, it is largely complete, with only permission/error-mode details missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents both parameters: project_path as the absolute path to the Ren'Py project root, and force as clearing the .rpyc cache with default True. That is nearly complete semantic coverage, though it adds no guidance on edge cases such as relative paths.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific compound verb+resource: run compile then lint in one call, returning a combined result. This distinguishes it from the sibling tools tool_compile_project and tool_lint_project by making clear it is the merged operation, so an agent can select it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: 'in one call' and the short-circuit note ('if compile fails, returns immediately... no point linting broken syntax') tell the agent this is the combined path. However, it never explicitly says when to prefer this over calling tool_compile_project and tool_lint_project separately, nor names those alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_check_translationA

Deep-check translation coverage. Catches silent dialogue-not-translated bugs.

The most important check: a translation file that ONLY contains translate <lang> strings: (old/new pairs) but NO translate <lang> <hash>: block translations. Ren'Py does NOT translate say-statement dialogue via string translation -- only block translation does that. A string-only file leaves dialogue in the source language with no error.

Also detects: duplicate old strings (runtime error risk), untranslated block translations (active line still equals the source comment), and source files with dialogue that have no translation file at all.

Args: project_path: Absolute path to the Ren'Py project root directory. language: Language code to check (e.g. "english"). If None, checks all languages found under game/tl/.

Returns: dict with {ok, source_language, languages: [{code, issues, summary}]}. Issues have severity "error" | "warning" | "info".

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNo
project_pathYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the exact failure mode (string-only files silently leave dialogue untranslated), the runtime-error risk of duplicate old strings, and what it scans for. It does not state whether the check is read-only/local, but for a project-analysis tool that is a minor omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose and the headline bug, then the detail. The middle 'most important check' paragraph is somewhat verbose but every clause adds diagnostic value; nothing is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although there is no output schema and no annotations, the description explicitly documents the return dict shape ({ok, source_language, languages:[...]}) and issue severities. Combined with complete parameter docs, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: it specifies that project_path is an absolute path to the Ren'Py project root and that language is a language code whose None value triggers checking all languages under game/tl/. Both parameters and the default behavior are fully explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Deep-check translation coverage') and immediately narrows it with the concrete class of bug it catches. It is clearly distinguishable from sibling list/lint tools like tool_list_translations, which merely enumerate rather than diagnose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes a clear context ('Deep-check' vs the lighter tool_list_translations implied sibling) and explains why it matters (silent bugs left in source language). It does not explicitly name when to prefer it over tool_check_language_picker or tool_check_project, so exclusion guidance is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_compile_projectA

Compile a Ren'Py project (validate syntax).

Runs Ren'Py's compiler on all .rpy files. Returns structured errors with file paths and line numbers if compilation fails.

Args: project_path: Absolute path to the Ren'Py project root directory. force: If True, clear .rpyc cache before compiling (to pick up file changes).

Returns: dict with {ok: bool, errors: [{file, line, message}], raw_output: str}.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
project_pathYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and mostly succeeds: it says the compiler runs over all .rpy files and that failures produce structured errors with file paths and line numbers, and it explains what force does (clearing the .rpyc cache). It does not disclose that successful compilation writes .rpyc artifacts or any cost/duration characteristics, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then compact Args/Returns sections with no filler. Every line adds information an agent would otherwise have to guess.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by spelling out the return dict shape (ok, errors with file/line/message, raw_output). Combined with the full parameter documentation and error semantics, the definition is close to self-sufficient; only the missing sibling differentiation keeps it short of complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: project_path is pinned as an absolute path to the project root, and force is explained as clearing the .rpyc cache so file changes are picked up. Both parameters gain meaning beyond their bare schema types and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Compile a Ren'Py project') and adds scope ('validate syntax', 'all .rpy files'). However, it never distinguishes itself from closely related siblings such as tool_lint_project and tool_check_project, so the agent can't route between them from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance and no mention of alternatives. The implied 'validate syntax' framing hints at a pre-run check, but with three overlapping validation siblings (compile/lint/check) present, the absence of any disambiguation is a real gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_copy_assetA

Copy an asset file (image, font, audio) into a Ren'Py project.

Copies a file from anywhere on the system into the project's game directory. Automatically creates subdirectories as needed. Auto-prefixes 'game/' to dest if not already present.

Args: project_path: Absolute path to the Ren'Py project root directory. source: Absolute path to the source file on disk. dest: Relative path within project (e.g. "images/char_happy.png").

Returns: dict with {ok, message, dest_path}.

ParametersJSON Schema
NameRequiredDescriptionDefault
destYes
sourceYes
project_pathYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose useful behavior: auto-creating subdirectories and auto-prefixing 'game/' to dest. It does not state whether an existing destination file is overwritten, whether failures are raised or returned via the ok flag, or any permission constraints — material gaps for a filesystem write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then structured Args/Returns blocks that are easy to scan. The second sentence partially restates the first, but overall it is well-organized with little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description supplies the return shape ({ok, message, dest_path}) as well as parameter formats, which covers most of what an agent needs. The remaining gap is overwrite/error semantics on an existing destination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates well by documenting all three parameters: project_path as an absolute path to the project root, source as an absolute on-disk path, and dest as a relative path within the project with an example. It adds the absolute-vs-relative distinction the bare schema lacks, though the project_path boundary (game dir vs root) could be stated more sharply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (copy) and resource (asset file) plus the target (a Ren'Py project), and names the asset kinds it handles (image, font, audio). It is unambiguous and distinguishable from the inspection/lint siblings like tool_lint_project or tool_read_script.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes the context of use ('copies a file from anywhere on the system into the project's game directory'), which implies when to reach for it. However, it never states when not to use it, what happens if the destination already exists, or how it relates to sibling tools, so guidance remains implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_exec_rpyA

Inject arbitrary Ren'Py code into a project file.

This is the universal "escape hatch" tool. Use it to write any Ren'Py script code: define characters, declare images, create screens, add dialogue to labels, write init python blocks, etc.

If the target file doesn't exist, it will be auto-created. BOM is preserved when overwriting an existing file that has one.

Args: project_path: Absolute path to the Ren'Py project root directory. file: Target .rpy file, relative to project_path (e.g. "game/script.rpy"). code: Raw Ren'Py script code to inject. position: Where to place the code: - "end": Append at end of file (default) - "top": Prepend at start of file - "inside:": Insert at end of a label block - "after:": Insert right after a label block ends - "before:": Insert right before a label definition - "replace:<old_text>": Replace first occurrence of old_text with code - "replace_all:<old_text>": Replace ALL occurrences of old_text with code auto_compile: Whether to run compile_project after writing (default True). auto_cjk_font: If True and code contains CJK text, auto-configure a CJK font in gui.rpy. Defaults to False to avoid surprising side effects.

Returns: dict with {ok, message, compile_result, font_setup?, cjk_warning?}.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
fileYes
positionNoend
auto_compileNo
project_pathYes
auto_cjk_fontNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses auto-creation of missing files, BOM preservation, that auto_compile triggers a compile after writing, and that auto_cjk_font causes font side effects, plus the return dict shape. It could go further on overwrite/replace semantics being destructive and any permission requirements, but the behavioral disclosure is substantially above baseline.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose, then uses a clean Args/Returns structure with the position modes listed inline. It is somewhat long, but nearly every sentence (auto-create, BOM, side effects) earns its place, so waste is minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description is complete: it covers file creation behavior, encoding handling, the full parameter surface, and explains the return dict keys. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it does: it defines each parameter and enumerates all seven 'position' modes (end/top/inside/after/before/replace/replace_all) with their exact meaning, plus the defaults and side-effect intent of auto_compile and auto_cjk_font. This adds meaning far beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('inject arbitrary Ren'Py code into a project file') and explicitly positions itself as the 'universal escape hatch' tool. An agent can immediately tell this apart from siblings like tool_auto_fix, tool_compile_project, and tool_read_script, which are narrower.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete use cases (define characters, declare images, create screens, add dialogue, write init python blocks) and frames itself as the fallback when other tools don't cover a need. It stops short of naming the specific siblings it supersedes or a when-not-to-use condition, so it is clear but not fully directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_find_referencesA

Find all jump/call references to a label or screen across the project.

Parses jump and call statements to build a reference map. Useful for refactoring (find all callers before renaming), detecting dead code (labels never jumped/called), and catching missing targets (jump to a label that doesn't exist).

Args: project_path: Absolute path to the Ren'Py project root directory. name: The label or screen name to search for (e.g. "arrow_round").

Returns: dict with {name, defined, definition, is_screen, callers, caller_count}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
project_pathYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it explains it parses jump and call statements to build a reference map, and that bad targets are detected. It stops short of noting analysis cost/limits or whether it reads the whole project, but behavior is substantially disclosed for a read-only analysis tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence, followed by a compact explanation of mechanism and use cases. The Args/Returns blocks are structured and skimmable; slightly verbose but every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description still tells the agent what the return dict contains (name, defined, definition, is_screen, callers, caller_count) and documents both required parameters. Nothing needed to invoke or interpret the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: project_path is documented as the absolute path to the Ren'Py project root, and name as the label/screen name to search for with a concrete example ("arrow_round"). Format and expected value are clear, though the accepted name formats (label vs screen syntax) could be tightened.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Find all jump/call references to a label or screen across the project') and scopes it clearly against siblings like tool_list_labels and tool_list_definitions by emphasizing references/callers rather than definitions. An agent can distinguish the tool's job without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use contexts: refactoring (find all callers before renaming), detecting dead code, and catching missing jump targets. This is clear usage context, though it does not explicitly name an alternative sibling tool or state when-not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_get_image_sizeA

Get dimensions and format of an image file.

Useful for calculating correct sprite positioning transforms. Supports absolute paths or paths relative to project_path.

Args: project_path: Absolute path to the Ren'Py project root directory. image_path: Path to image file (absolute, or relative to project_path).

Returns: dict with {ok, width, height, format, file_size}.

ParametersJSON Schema
NameRequiredDescriptionDefault
image_pathYes
project_pathYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses path-resolution behavior (absolute or relative to project_path) and the return shape including an 'ok' flag, which hints at failure handling, but it says nothing about permissions, error cases, or supported formats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two-sentence summary is front-loaded, and the Args/Returns blocks are compact and skimmable. Slight redundancy between the opening line and the argument notes, but nothing that wastes real space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with no output schema, the description supplies the return keys (ok, width, height, format, file_size) and path semantics, which covers what an agent needs to call and interpret it. Absent annotations on a read-only tool is the only real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: both parameters are documented, with project_path identified as the project root and image_path explicitly allowed to be absolute or relative to it. That is meaningfully more than the bare-string schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get dimensions and format of an image file'), which is unambiguous. It doesn't distinguish itself from any sibling, but the sibling list contains mostly unrelated tools, so the risk of confusion is low.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Useful for calculating correct sprite positioning transforms' implies a use context but names no condition, prerequisite, or alternative tool. An agent gets a hint about intent without guidance on when this tool is the right call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_lint_projectA

Run Ren'Py lint on a project (static analysis).

Checks for undefined variables, unreachable code, missing labels, etc. More thorough than compile but may produce false positives.

Args: project_path: Absolute path to the Ren'Py project root directory.

Returns: dict with {ok: bool, warnings: [{file, line, message}], raw_output: str}.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses a real behavioral trait (false positives are possible) and documents the return shape in lieu of an output schema, but says nothing about side effects, whether the project is modified, or runtime cost.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then a checks list, a sibling comparison, and clearly labeled Args/Returns sections. Every line earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no annotations and no output schema, the description covers purpose, scope of checks, sibling positioning, parameter meaning, and return structure. It omits only the safety/side-effect profile that annotations would normally supply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: 'Absolute path to the Ren'Py project root directory' adds path-type and root-directory semantics the bare schema property ('Project Path', string) lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run Ren'Py lint on a project (static analysis)') and enumerates what it detects (undefined variables, unreachable code, missing labels). It also distinguishes itself from the sibling tool_compile_project by noting it is 'more thorough than compile'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear comparative guidance against compile ('more thorough ... but may produce false positives'), which tells the agent when this is the better choice. It stops short of an explicit when-not rule or a mention of tool_check_project, another plausibly overlapping sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_list_definitionsA

Inventory all declarations in a Ren'Py project.

Scans all .rpy files and returns characters, images, transforms, screens, defaults, and defines. Useful for understanding project structure without reading every file.

Args: project_path: Absolute path to the Ren'Py project root directory.

Returns: dict with {characters, images, transforms, screens, defaults, defines}.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses scope ('scans all .rpy files') and the shape of the result, and the word 'Inventory'/'Scans' signals a non-mutating operation, but it never states read-only behavior, side effects, or performance cost explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by scope, use case, and Args/Returns blocks. The Returns section mildly duplicates the enumeration in the opening sentence, but overall it is well-organized with little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description usefully documents the return keys, and it defines the single required parameter. For a simple read-only inventory tool this covers what an agent needs, with only the safety profile left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage the description must compensate, and it does: 'project_path: Absolute path to the Ren'Py project root directory' adds the absolute-path requirement and the specific directory level, which the bare string schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Inventory all declarations in a Ren'Py project') and enumerates exactly which declaration types are returned, so the agent knows what it produces. It is distinguishable from siblings like tool_list_labels or tool_read_script, though it never explicitly contrasts itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Useful for understanding project structure without reading every file' implies a use case and implicitly positions it against file-reading siblings, but gives no explicit when-to-use/when-not-to or named alternatives. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_list_doc_pagesA

List all available documentation pages in the local docs index.

Returns a list of doc page names and their sizes. Use this to see what documentation is available before searching.

Returns: dict with {ok, pages: [{name, size}], total_pages, total_size}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It communicates that this is a local docs index listing and documents the return shape, but it does not explicitly state side-effect safety, permissions, or failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the core purpose. It is slightly redundant in mentioning the return contents twice, but overall it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only discovery tool with no output schema, the description provides the needed purpose, usage context, and return structure. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are not a meaningful gap. The baseline score for a parameterless tool applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List all available documentation pages in the local docs index.' It also distinguishes this discovery tool from search-oriented siblings by saying it should be used before searching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Use this to see what documentation is available before searching' gives clear usage context and implies the alternative search_docs flow. It does not explicitly name search_docs or state exclusions, so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_list_fixersA

List all available auto-fixers and their descriptions.

Returns a dict mapping fixer names to {description, modifies} info. Use this to see what auto_fix can do before running it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden; it discloses the return shape (dict of fixer names to {description, modifies} info), which is meaningful behavioral detail for a tool with no output schema. It does not explicitly state that the operation is side-effect free, but the 'List' framing and read-only nature make that low-risk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and resource, then the return shape, then the usage hint. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool with no output schema, the description supplies exactly the missing pieces: what is listed and the structure of the returned mapping. Nothing an agent needs to invoke it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies. There is nothing parameter-wise the description needs to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: listing all available auto-fixers plus their descriptions and 'modifies' metadata. No sibling tool covers the same resource, and the tie to tool_auto_fix makes its role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it ('before running' auto_fix) and names the related tool tool_auto_fix, which gives the agent a clear routing context. It stops short of stating when-not-to-use or any alternatives beyond auto_fix.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_list_labelsA

List all labels in a Ren'Py project.

Scans all .rpy files under project_path/game/ and returns label names, their source files, and line numbers.

Args: project_path: Absolute path to the Ren'Py project root directory. rich: If True, also parse each label's params, jumps, calls, and return-value status (slower, reads every label block).

ParametersJSON Schema
NameRequiredDescriptionDefault
richNo
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does well: it discloses that all .rpy files under project_path/game/ are scanned and that rich=True reads every label block and is slower. It also describes the returned fields, though it does not mention error behavior for invalid paths.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, followed by scan scope, return details, and parameter documentation. Every sentence adds useful information without waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists, the description still gives enough return-context to set expectations, and it explains both parameters thoroughly. For a two-parameter read tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it fully documents both parameters. project_path is defined as the absolute project root, and rich is explained with its exact extra parsing behavior and performance cost.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: list all labels in a Ren'Py project, with scope limited to .rpy files under project_path/game/. It is clear what the tool does, but it does not explicitly distinguish itself from the sibling tool_list_definitions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scanning scope and the rich parameter's cost tradeoff, which helps an agent decide whether to request detailed parsing. However, there is no explicit guidance on when to use this tool versus tool_list_definitions or tool_find_references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_list_translationsA

List all translation languages in a Ren'Py project.

Scans game/tl/ for language folders and reports, for each language: file count, dialogue block-translation count, string-translation entry count, and which GUI files (common/screens/options) are present. Also reports the project's source language (config.language).

Use this first to see what translations exist before checking them.

Args: project_path: Absolute path to the Ren'Py project root directory.

Returns: dict with {ok, source_language, tl_dir, languages: [{code, files, dialogue_blocks, string_entries, has_common, has_screens, has_options}]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_pathYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses that it scans game/tl/, enumerates exactly what is counted per language (files, dialogue blocks, string entries, GUI files), and surfaces the project source language. It doesn't state read-only behavior explicitly or what happens on a bad path, leaving a small gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded summary sentence followed by well-labeled Args and Returns blocks; each sentence conveys concrete information. The per-key return enumeration is slightly listy but earns its place given there is no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must describe return values — and it does, spelling out the dict shape including every language-level field and the source_language key. Combined with the Args entry, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter is merely typed as string, so the description's "Absolute path to the Ren'Py project root directory" is essential added meaning — it tells the agent the path must be absolute and must point at the project root, not a subfolder.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (translation languages in a Ren'Py project), and immediately scopes it by naming the scanned directory (game/tl/) and the per-language report contents. An agent can distinguish this from tool_check_translation, which validates, versus this, which enumerates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this first to see what translations exist before checking them" gives clear sequencing guidance toward a checking step, and the enumeration framing implies it precedes validation. It stops short of explicitly naming tool_check_translation as the alternative, so it's not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_manage_savesA

List, clear, or clear-stale Ren'Py save files.

Ren'Py stores saves under game/saves/. Stale saves (_reload-, _tracesave-) can retain old call stacks that cause 'Could not find return label' errors after script refactors.

Args: project_path: Absolute path to the Ren'Py project root directory. action: One of: - "list": list all save files with size + mtime - "clear": delete ALL save files (game restarts from 'start') - "clear_stale": delete only _reload-* and _tracesave-* files

Returns: dict with {ok, action, saves|deleted, message}.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNolist
project_pathYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does disclose the critical destructive behavior ('delete ALL save files', game restarts from 'start') versus the narrower stale-only deletion. It also outlines the return dict shape. Missing detail on whether deletion is reversible or needs confirmation, which keeps it at 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then a brief rationale paragraph, then structured Args/Returns. Every sentence adds information; nothing is repeated from the schema verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although there is no output schema, the Returns section names the response keys (ok, action, saves|deleted, message), and the destructive semantics plus param meanings are fully covered. Nothing an agent needs in order to invoke it safely is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate entirely, and it does: 'project_path' is defined as the absolute project root and 'action' is enumerated with list/clear/clear_stale plus the meaning of each mode. An agent can fill both params correctly from the prose alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb set and resource: 'List, clear, or clear-stale Ren'Py save files.' The three action semantics are spelled out precisely enough that an agent can distinguish this from the lint/compile/run siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when 'clear_stale' is the right choice (leftover _reload-*/_tracesave-* causing 'Could not find return label' after refactors) and warns that 'clear' restarts the game from 'start'. No explicit when-not or pointer to a sibling alternative, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_read_scriptA

Read the script content of a specific label.

Returns the complete Ren'Py script block under the given label, including all dialogue, menus, and nested logic.

Args: project_path: Absolute path to the Ren'Py project root directory. label_name: The label name to read (e.g. "start", "chapter_01").

ParametersJSON Schema
NameRequiredDescriptionDefault
label_nameYes
project_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. It does clarify the scope of what is returned (the entire block under the label, not just its signature), which is useful, but it says nothing about read-only semantics, behavior when the label does not exist, or whether jumps/includes are followed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then a short elaboration of the return value, then a compact args list. It is well within a reasonable size, with only mild redundancy between the opening sentence and the 'Returns the complete Ren'Py script block' sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no further explanation, and both parameters are given meaning. What is missing is the prerequisite that the label must exist and how to discover it, plus any note on error behavior for an unknown label – minor gaps for a read-only lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% – properties carry only bare titles ('Project Path', 'Label Name'), so the description must compensate, and it does: project_path is specified as an absolute path to the project root, and label_name is given concrete examples ('start', 'chapter_01'). It stops short of clarifying accepted path forms or whether nested/local labels are valid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read the script content of a specific label') and immediately elaborates the return scope ('complete Ren'Py script block ... including all dialogue, menus, and nested logic'). This clearly separates it from siblings like tool_list_labels or tool_find_references, which enumerate rather than return script bodies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use/when-not guidance and no prerequisites are stated. It never tells the agent that a label name must already be known (e.g. discovered via tool_list_labels) or how this differs from tool_list_definitions or tool_find_references for locating script content. Usage is only inferable from the purpose line.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_run_renpyA

Run an arbitrary Ren'Py CLI subcommand via the SDK's bundled Python.

Generic escape hatch for Ren'Py CLI subcommands without a dedicated wrapper. Useful for translate (generate/refresh translation files), rtc, add, or for running compile/lint with a custom timeout when the dedicated tools time out.

Examples:

  • command="translate", args=["english"] -> generate/refresh English translation files (creates block-translation skeletons).

  • command="compile" -> same as tool_compile_project.

  • command="lint" -> same as tool_lint_project.

Args: project_path: Absolute path to the Ren'Py project root directory. command: Ren'Py CLI subcommand (e.g. "compile", "lint", "translate"). args: Extra arguments after the command (e.g. ["english"] for translate). timeout: Override default timeout (seconds). Default via RENPY_MCP_TIMEOUT env var or 180.

Returns: dict with {ok, returncode, raw_output, errors}.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
commandYes
timeoutNo
project_pathYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden, and it does a fair amount: it discloses that commands run through the SDK's bundled Python, that translate 'creates block-translation skeletons' (a write side effect), the timeout default and its env-var override, and the return keys {ok, returncode, raw_output, errors}. It stops short of warning that arbitrary subcommands can mutate project files irreversibly, which matters for an open-ended executor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then scoping context, then worked examples, then Args/Returns. Structure is clean and every section is useful, though the compile/lint examples restate the escape-hatch framing already given in the first two sentences, adding mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description's explicit listing of return keys is necessary and present. All four params are covered and usage is disambiguated. The gap is the absence of any note about side effects, error semantics, or safety for an arbitrary-command executor with no annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents all four parameters: project_path (absolute project root), command (CLI subcommand), args (extra arguments with a concrete example), and timeout (override, default from RENPY_MCP_TIMEOUT or 180). This is richer than the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb+resource ('Run an arbitrary Ren'Py CLI subcommand') and immediately frames the scope as a 'generic escape hatch' for subcommands 'without a dedicated wrapper.' It explicitly contrasts itself with tool_compile_project and tool_lint_project, so an agent can distinguish it from siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use conditions: subcommands lacking a dedicated wrapper (translate, rtc, add), and the specific edge case of running compile/lint with a custom timeout when the dedicated tools time out. Alternatives are named and the selecting condition is stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_search_docsA

Search the bundled Ren'Py official documentation (Chinese, from doc.renpy.cn).

Searches through the local copy of the Ren'Py documentation and returns the most relevant sections. Works offline.

Use this BEFORE writing Ren'Py code if you're unsure about syntax, function names, or best practices. For example:

  • search_docs("Movie") to learn how to play videos

  • search_docs("screen") to understand screen language

  • search_docs("transform") to learn about ATL transforms

  • search_docs("call from") to understand call/from semantics

  • search_docs("存档") to find save/load documentation

  • search_docs("label return") to learn about label return mechanics

Args: query: Search query (supports both English and Chinese). max_results: Maximum number of results to return (default 5).

Returns: dict with {ok, query, results: [{file, title, snippet, score}], result_count}.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses meaningful traits beyond structured fields: the corpus is offline/local, the documentation is Chinese, and the return format is spelled out ({ok, query, results:[{file,title,snippet,score}], result_count}). Search is inherently non-destructive, so little else is needed, though ranking/scoring behavior is not explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by corpus/offline notes, trigger guidance, examples, and Arg/Return documentation. The example block is somewhat long but each example clarifies a real usage pattern; the only minor noise is the 'search_docs(...)' calls using a name shorter than the actual tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only search tool with no annotations and no output schema, the description covers what is needed: purpose, when to use it, both parameters, and the return structure. Nothing an agent needs to invoke it correctly is missing, though relative ranking behavior and result limits remain unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: query is documented as supporting both English and Chinese, and max_results as the maximum to return with a default of 5. It adds useful meaning over the bare schema but does not explain matching semantics, so it is good compensation rather than exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search), resource (bundled Ren'Py official documentation), and scope (local copy, Chinese, doc.renpy.cn, returns most relevant sections). An agent immediately understands this is semantic doc search, but the description never names or contrasts with the sibling tool_list_doc_pages, so sibling differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this BEFORE writing Ren'Py code if you're unsure about syntax, function names, or best practices' gives a clear trigger context, reinforced by six concrete query examples. It stops short of naming alternatives (e.g., tool_list_doc_pages) or stating when NOT to use it, so it is clear context without explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 19 tool updatesv0.4.0
    • First observedtool_auto_fix
    • First observedtool_check_language_picker
    • First observedtool_check_project
    • First observedtool_check_translation
    • First observedtool_compile_project
    • First observedtool_copy_asset
    • First observedtool_exec_rpy
    • First observedtool_find_references
    • First observedtool_get_image_size
    • First observedtool_lint_project
    • First observedtool_list_definitions
    • First observedtool_list_doc_pages
    • First observedtool_list_fixers
    • First observedtool_list_labels
    • First observedtool_list_translations
    • First observedtool_manage_saves
    • First observedtool_read_script
    • First observedtool_run_renpy
    • First observedtool_search_docs

TDQS

A4.1/5.0

Scored across 19 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but there is intentional overlap: run_renpy can duplicate compile/lint, check_project combines compile+lint, and exec_rpy is a universal write escape hatch. These overlaps are well-documented, so misselection risk is low but not zero.

Naming Consistency5/5

All 19 tools use the same tool_ prefix followed by snake_case verb_noun or verb_noun_phrase patterns. The convention is predictable throughout with no mixed casing or verb styles.

Tool Count4/5

19 tools is slightly above the typical 3-15 range, but the domain is broad (script editing, compilation, linting, assets, saves, docs, translation). Each tool appears to serve a meaningful purpose, though a few convenience tools could be merged.

Completeness4/5

The surface covers the core Ren'Py development lifecycle well: reading, writing, compiling, linting, fixing, assets, docs, saves, and translation checks. Minor gaps exist (e.g., asset deletion, direct label renaming/deletion), but exec_rpy and run_renpy provide escape hatches for most missing operations.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers